@xpert-ai/chatkit-types 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -275,6 +275,26 @@ function normalizeRequestLanguage(locale) {
275
275
  }
276
276
  return normalized;
277
277
  }
278
+ function normalizeThreadReference(value) {
279
+ if (!value || typeof value !== "object" || !("type" in value) || value.type !== "thread")
280
+ return null;
281
+ if (!("conversationId" in value) || !isLocator(value.conversationId) || !("threadId" in value) || !isLocator(value.threadId))
282
+ return null;
283
+ if ("label" in value && value.label !== void 0 && (typeof value.label !== "string" || value.label.length > 300))
284
+ return null;
285
+ if ("id" in value && value.id !== void 0 && !isLocator(value.id))
286
+ return null;
287
+ return {
288
+ type: "thread",
289
+ conversationId: value.conversationId.trim(),
290
+ threadId: value.threadId.trim(),
291
+ ..."label" in value && typeof value.label === "string" ? { label: value.label.trim() } : {},
292
+ ..."id" in value && typeof value.id === "string" ? { id: value.id.trim() } : {}
293
+ };
294
+ }
295
+ function isLocator(value) {
296
+ return typeof value === "string" && value.trim().length > 0 && value.length <= 128;
297
+ }
278
298
  const PET_ANIMATION_NAMES = [
279
299
  "idle",
280
300
  "running-right",
@@ -526,6 +546,63 @@ function getPinnedPetPosition(pin, size, viewport, padding) {
526
546
  }
527
547
  }
528
548
  const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT = "task_summary.open_resource";
549
+ function chatSkillUsageKey(usage) {
550
+ return JSON.stringify([
551
+ usage.source.type,
552
+ usage.source.id,
553
+ usage.skillId,
554
+ usage.version
555
+ ]);
556
+ }
557
+ function mergeChatSkillUsages(...groups) {
558
+ const usages = /* @__PURE__ */ new Map();
559
+ for (const group of groups) {
560
+ for (const usage of group ?? []) {
561
+ const key = chatSkillUsageKey(usage);
562
+ if (!usages.has(key)) usages.set(key, usage);
563
+ }
564
+ }
565
+ return [...usages.values()];
566
+ }
567
+ function normalizeChatSkillUsages(value) {
568
+ if (!Array.isArray(value)) return [];
569
+ const usages = [];
570
+ for (const item of value) {
571
+ if (!item || typeof item !== "object" || item.activation !== "read")
572
+ continue;
573
+ const { source } = item;
574
+ if (!source || typeof source !== "object" || !["workspace", "project", "assistant", "plugin"].includes(source.type) || typeof source.id !== "string" || !source.id.trim())
575
+ continue;
576
+ if (typeof item.skillId !== "string" || !item.skillId.trim() || typeof item.name !== "string" || !item.name.trim() || typeof item.version !== "string" || typeof item.toolCallId !== "string" || !item.toolCallId.trim() || typeof item.loadedAt !== "string" || !Number.isFinite(Date.parse(item.loadedAt)))
577
+ continue;
578
+ usages.push({
579
+ skillId: item.skillId,
580
+ name: item.name,
581
+ version: item.version,
582
+ source: { type: source.type, id: source.id },
583
+ activation: "read",
584
+ toolCallId: item.toolCallId,
585
+ ...typeof item.executionId === "string" && item.executionId ? { executionId: item.executionId } : {},
586
+ loadedAt: item.loadedAt
587
+ });
588
+ }
589
+ return mergeChatSkillUsages(usages);
590
+ }
591
+ function summarySkillUsages(summary) {
592
+ return summary && typeof summary === "object" && "version" in summary && summary.version === 1 && "skillUsages" in summary ? normalizeChatSkillUsages(summary.skillUsages) : [];
593
+ }
594
+ function getMessageSkillUsages(message) {
595
+ var _a;
596
+ const groups = [summarySkillUsages(message.taskSummary)];
597
+ if (Array.isArray(message.content)) {
598
+ for (const part of message.content) {
599
+ if ((part == null ? void 0 : part.type) === "component" && ((_a = part.data) == null ? void 0 : _a.status) === "success") {
600
+ groups.push(summarySkillUsages(part.data.taskSummary));
601
+ }
602
+ }
603
+ }
604
+ return mergeChatSkillUsages(...groups);
605
+ }
529
606
  const TOOL_OUTPUT_PRESENTATION_TYPE = "xpert.tool-output";
530
607
  const TOOL_OUTPUT_PRESENTATION_VERSION = 1;
531
608
  exports.CHAT_EVENT_TYPE_FOLLOW_UP_CONSUMED = constants.CHAT_EVENT_TYPE_FOLLOW_UP_CONSUMED;
@@ -546,7 +623,9 @@ exports.REQUEST_USER_INPUT_RESULT_TYPE = REQUEST_USER_INPUT_RESULT_TYPE;
546
623
  exports.REQUEST_USER_INPUT_TOOL_NAME = REQUEST_USER_INPUT_TOOL_NAME;
547
624
  exports.TOOL_OUTPUT_PRESENTATION_TYPE = TOOL_OUTPUT_PRESENTATION_TYPE;
548
625
  exports.TOOL_OUTPUT_PRESENTATION_VERSION = TOOL_OUTPUT_PRESENTATION_VERSION;
626
+ exports.chatSkillUsageKey = chatSkillUsageKey;
549
627
  exports.clampPetPosition = clampPetPosition;
628
+ exports.getMessageSkillUsages = getMessageSkillUsages;
550
629
  exports.getPinnedPetPosition = getPinnedPetPosition;
551
630
  exports.isClientToolInterrupt = isClientToolInterrupt;
552
631
  exports.isClientToolInterruptPayload = isClientToolInterruptPayload;
@@ -566,11 +645,14 @@ exports.isToolCallInterrupt = isToolCallInterrupt;
566
645
  exports.isToolCallInterruptPayload = isToolCallInterruptPayload;
567
646
  exports.isToolCallInterruptTask = isToolCallInterruptTask;
568
647
  exports.isToolCallRequest = isToolCallRequest;
648
+ exports.mergeChatSkillUsages = mergeChatSkillUsages;
569
649
  exports.mergePetSpriteAtlas = mergePetSpriteAtlas;
570
650
  exports.normalizeBoundsPadding = normalizeBoundsPadding;
651
+ exports.normalizeChatSkillUsages = normalizeChatSkillUsages;
571
652
  exports.normalizeHITLRequest = normalizeHITLRequest;
572
653
  exports.normalizePetOptions = normalizePetOptions;
573
654
  exports.normalizeRequestLanguage = normalizeRequestLanguage;
655
+ exports.normalizeThreadReference = normalizeThreadReference;
574
656
  exports.petSpriteAtlas = petSpriteAtlas;
575
657
  exports.resolveLocalizedText = resolveLocalizedText;
576
658
  exports.resolvePetCharacter = resolvePetCharacter;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/pet.ts","../src/task-summary.ts","../src/tool-output.ts"],"sourcesContent":["import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import { isHITLReviewDisplay, type HITLReviewDisplay } from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\n elicitation?: HITLMCPElicitation;\n}\n\nexport interface HITLApproveDecision {\n type: 'approve';\n}\n\nexport interface HITLEditDecision {\n type: 'edit';\n editedAction: HITLAction;\n}\n\nexport interface HITLRejectDecision {\n type: 'reject';\n message?: string;\n}\n\nexport interface HITLRespondDecision {\n type: 'respond';\n message: string;\n}\n\nexport type HITLDecision =\n | HITLApproveDecision\n | HITLEditDecision\n | HITLRejectDecision\n | HITLRespondDecision;\n\nexport interface HITLResponse {\n decisions: HITLDecision[];\n}\n\nexport type InterruptRequest =\n | ToolCallRequest\n | ClientToolRequest\n | HITLRequest;\n\nexport interface LangGraphInterrupt<TValue = unknown> {\n id: string;\n value: TValue;\n when?: string;\n resumable?: boolean;\n ns?: string[];\n}\n\nexport interface LangGraphInterruptTask<TValue = unknown> {\n id: string;\n name: string;\n path: Array<string | number>;\n interrupts: Array<LangGraphInterrupt<TValue>>;\n}\n\nexport interface LangGraphInterruptPayload<TValue = unknown> {\n tasks: Array<LangGraphInterruptTask<TValue>>;\n}\n\nexport type ClientToolInterrupt<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ClientToolInterruptTask<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ClientToolInterruptPayload<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type ToolCallInterrupt<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ToolCallInterruptTask<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ToolCallInterruptPayload<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type HITLInterrupt<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterrupt<TRequest>;\n\nexport type HITLInterruptTask<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptTask<TRequest>;\n\nexport type HITLInterruptPayload<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptPayload<TRequest>;\n\n/**\n * When an interrupt occurs during task execution, the system generates an InterruptPayload.\n *\n * Ordinary tool-call interrupts use `toolCalls`; ChatKit client-tool middleware\n * uses `clientToolCalls` so the UI can route those calls to the client.\n * Human-in-the-loop interrupts use `actionRequests` and `reviewConfigs` so\n * ChatKit can collect reviewer decisions and resume with `{ decisions }`.\n```json\n{\n \"type\": \"event\",\n \"event\": \"on_interrupt\",\n \"data\": {\n \"tasks\": [\n {\n \"id\": \"9c4d2ac5-8808-5b6f-855c-4d48aa3d77a7\",\n \"name\": \"Middleware_wPzR2bIXqE_after_model\",\n \"path\": [\"__pregel_pull\", \"Middleware_wPzR2bIXqE_after_model\"],\n \"interrupts\": [\n {\n \"id\": \"b42f7887d65e57ed11cf08b8927763db\",\n \"value\": {\n \"toolCalls\": [\n {\n \"name\": \"getUserStation\",\n \"args\": {\n \"input\": \"Query the site selected by the user\"\n },\n \"id\": \"call_00_swcaUjIaACXOHHaZyNmQB3Vm\",\n \"type\": \"tool_call\"\n }\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n */\nexport interface InterruptPayload extends LangGraphInterruptPayload<InterruptRequest> {}\n\nexport interface ClientToolMessageInput {\n content: unknown;\n name?: string;\n tool_call_id?: string;\n status?: 'success' | 'error';\n artifact?: unknown;\n}\n\nexport interface ClientToolResponse {\n toolMessages: ClientToolMessageInput[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readRecordField(\n value: Record<string, unknown>,\n ...keys: string[]\n): Record<string, unknown> | null {\n for (const key of keys) {\n const field = value[key];\n if (isRecord(field)) return field;\n }\n\n return null;\n}\n\nfunction readArrayField(value: Record<string, unknown>, ...keys: string[]) {\n for (const key of keys) {\n const field = value[key];\n if (Array.isArray(field)) return field;\n }\n\n return null;\n}\n\nfunction readStringField(\n value: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const field = value[key];\n if (typeof field === 'string' && field.trim()) return field;\n }\n\n return null;\n}\n\nexport function isHITLDecisionType(\n value: unknown,\n): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(\n value: unknown,\n): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(\n value: unknown,\n): HITLReviewConfig | null {\n if (!isRecord(value)) return null;\n\n const actionName = readStringField(value, 'actionName', 'action_name');\n const allowedDecisions = readArrayField(\n value,\n 'allowedDecisions',\n 'allowed_decisions',\n );\n if (!actionName || !allowedDecisions) return null;\n\n const normalizedDecisions = allowedDecisions.filter(isHITLDecisionType);\n if (normalizedDecisions.length !== allowedDecisions.length) return null;\n\n const argsSchema = readRecordField(value, 'argsSchema', 'args_schema');\n\n return {\n actionName,\n allowedDecisions: normalizedDecisions,\n ...(argsSchema ? { argsSchema } : {}),\n };\n}\n\nfunction normalizeHITLMCPElicitation(\n value: unknown,\n): HITLMCPElicitation | null {\n if (!isRecord(value) || value.kind !== 'mcp_elicitation') return null;\n\n const actionName = readStringField(value, 'actionName');\n const field = readRecordField(value, 'field');\n if (!actionName || !field) return null;\n\n const name = readStringField(field, 'name');\n if (!name || field.type !== 'boolean' || field.required !== true) {\n return null;\n }\n if (field.title !== undefined && typeof field.title !== 'string') {\n return null;\n }\n\n const title = readStringField(field, 'title');\n return {\n kind: 'mcp_elicitation',\n actionName,\n field: {\n name,\n type: 'boolean',\n required: true,\n ...(title ? { title } : {}),\n },\n };\n}\n\nexport function normalizeHITLRequest(value: unknown): HITLRequest | null {\n if (!isRecord(value)) return null;\n\n const actionRequests = readArrayField(\n value,\n 'actionRequests',\n 'action_requests',\n );\n const reviewConfigs = readArrayField(\n value,\n 'reviewConfigs',\n 'review_configs',\n );\n if (\n !actionRequests ||\n !reviewConfigs ||\n actionRequests.length === 0 ||\n reviewConfigs.length === 0\n ) {\n return null;\n }\n\n const normalizedActionRequests = actionRequests.map(\n normalizeHITLActionRequest,\n );\n const normalizedReviewConfigs = reviewConfigs.map(\n normalizeHITLReviewConfig,\n );\n if (\n normalizedActionRequests.some((request) => request === null) ||\n normalizedReviewConfigs.some((config) => config === null)\n ) {\n return null;\n }\n\n const normalizedRequest: HITLRequest = {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","export const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type ChatTaskSummaryResourceReference =\n | {\n type: 'message';\n messageId: string;\n }\n | {\n type: 'workspace_file';\n workspacePath: string;\n fileAssetId?: string;\n storageFileId?: string;\n }\n | {\n type: 'artifact';\n artifactId: string;\n }\n | {\n type: 'browser';\n serviceId?: string;\n url?: string;\n }\n | {\n type: 'url';\n url: string;\n };\n\nexport type ChatTaskSummaryOutputKind =\n | 'file'\n | 'image'\n | 'document'\n | 'spreadsheet'\n | 'presentation'\n | 'site'\n | 'url'\n | 'mcp_app';\n\nexport type ChatTaskSummaryOutputStatus =\n | 'pending'\n | 'running'\n | 'success'\n | 'error';\n\nexport type ChatTaskSummaryOutput = {\n id: string;\n kind: ChatTaskSummaryOutputKind;\n title: string;\n description?: string;\n status?: ChatTaskSummaryOutputStatus;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n"],"names":["config"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/thread-reference.ts","../src/pet.ts","../src/task-summary.ts","../src/skill-usage.ts","../src/tool-output.ts"],"sourcesContent":["import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import { isHITLReviewDisplay, type HITLReviewDisplay } from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\n elicitation?: HITLMCPElicitation;\n}\n\nexport interface HITLApproveDecision {\n type: 'approve';\n}\n\nexport interface HITLEditDecision {\n type: 'edit';\n editedAction: HITLAction;\n}\n\nexport interface HITLRejectDecision {\n type: 'reject';\n message?: string;\n}\n\nexport interface HITLRespondDecision {\n type: 'respond';\n message: string;\n}\n\nexport type HITLDecision =\n | HITLApproveDecision\n | HITLEditDecision\n | HITLRejectDecision\n | HITLRespondDecision;\n\nexport interface HITLResponse {\n decisions: HITLDecision[];\n}\n\nexport type InterruptRequest =\n | ToolCallRequest\n | ClientToolRequest\n | HITLRequest;\n\nexport interface LangGraphInterrupt<TValue = unknown> {\n id: string;\n value: TValue;\n when?: string;\n resumable?: boolean;\n ns?: string[];\n}\n\nexport interface LangGraphInterruptTask<TValue = unknown> {\n id: string;\n name: string;\n path: Array<string | number>;\n interrupts: Array<LangGraphInterrupt<TValue>>;\n}\n\nexport interface LangGraphInterruptPayload<TValue = unknown> {\n tasks: Array<LangGraphInterruptTask<TValue>>;\n}\n\nexport type ClientToolInterrupt<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ClientToolInterruptTask<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ClientToolInterruptPayload<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type ToolCallInterrupt<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ToolCallInterruptTask<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ToolCallInterruptPayload<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type HITLInterrupt<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterrupt<TRequest>;\n\nexport type HITLInterruptTask<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptTask<TRequest>;\n\nexport type HITLInterruptPayload<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptPayload<TRequest>;\n\n/**\n * When an interrupt occurs during task execution, the system generates an InterruptPayload.\n *\n * Ordinary tool-call interrupts use `toolCalls`; ChatKit client-tool middleware\n * uses `clientToolCalls` so the UI can route those calls to the client.\n * Human-in-the-loop interrupts use `actionRequests` and `reviewConfigs` so\n * ChatKit can collect reviewer decisions and resume with `{ decisions }`.\n```json\n{\n \"type\": \"event\",\n \"event\": \"on_interrupt\",\n \"data\": {\n \"tasks\": [\n {\n \"id\": \"9c4d2ac5-8808-5b6f-855c-4d48aa3d77a7\",\n \"name\": \"Middleware_wPzR2bIXqE_after_model\",\n \"path\": [\"__pregel_pull\", \"Middleware_wPzR2bIXqE_after_model\"],\n \"interrupts\": [\n {\n \"id\": \"b42f7887d65e57ed11cf08b8927763db\",\n \"value\": {\n \"toolCalls\": [\n {\n \"name\": \"getUserStation\",\n \"args\": {\n \"input\": \"Query the site selected by the user\"\n },\n \"id\": \"call_00_swcaUjIaACXOHHaZyNmQB3Vm\",\n \"type\": \"tool_call\"\n }\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n */\nexport interface InterruptPayload extends LangGraphInterruptPayload<InterruptRequest> {}\n\nexport interface ClientToolMessageInput {\n content: unknown;\n name?: string;\n tool_call_id?: string;\n status?: 'success' | 'error';\n artifact?: unknown;\n}\n\nexport interface ClientToolResponse {\n toolMessages: ClientToolMessageInput[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readRecordField(\n value: Record<string, unknown>,\n ...keys: string[]\n): Record<string, unknown> | null {\n for (const key of keys) {\n const field = value[key];\n if (isRecord(field)) return field;\n }\n\n return null;\n}\n\nfunction readArrayField(value: Record<string, unknown>, ...keys: string[]) {\n for (const key of keys) {\n const field = value[key];\n if (Array.isArray(field)) return field;\n }\n\n return null;\n}\n\nfunction readStringField(\n value: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const field = value[key];\n if (typeof field === 'string' && field.trim()) return field;\n }\n\n return null;\n}\n\nexport function isHITLDecisionType(\n value: unknown,\n): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(\n value: unknown,\n): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(\n value: unknown,\n): HITLReviewConfig | null {\n if (!isRecord(value)) return null;\n\n const actionName = readStringField(value, 'actionName', 'action_name');\n const allowedDecisions = readArrayField(\n value,\n 'allowedDecisions',\n 'allowed_decisions',\n );\n if (!actionName || !allowedDecisions) return null;\n\n const normalizedDecisions = allowedDecisions.filter(isHITLDecisionType);\n if (normalizedDecisions.length !== allowedDecisions.length) return null;\n\n const argsSchema = readRecordField(value, 'argsSchema', 'args_schema');\n\n return {\n actionName,\n allowedDecisions: normalizedDecisions,\n ...(argsSchema ? { argsSchema } : {}),\n };\n}\n\nfunction normalizeHITLMCPElicitation(\n value: unknown,\n): HITLMCPElicitation | null {\n if (!isRecord(value) || value.kind !== 'mcp_elicitation') return null;\n\n const actionName = readStringField(value, 'actionName');\n const field = readRecordField(value, 'field');\n if (!actionName || !field) return null;\n\n const name = readStringField(field, 'name');\n if (!name || field.type !== 'boolean' || field.required !== true) {\n return null;\n }\n if (field.title !== undefined && typeof field.title !== 'string') {\n return null;\n }\n\n const title = readStringField(field, 'title');\n return {\n kind: 'mcp_elicitation',\n actionName,\n field: {\n name,\n type: 'boolean',\n required: true,\n ...(title ? { title } : {}),\n },\n };\n}\n\nexport function normalizeHITLRequest(value: unknown): HITLRequest | null {\n if (!isRecord(value)) return null;\n\n const actionRequests = readArrayField(\n value,\n 'actionRequests',\n 'action_requests',\n );\n const reviewConfigs = readArrayField(\n value,\n 'reviewConfigs',\n 'review_configs',\n );\n if (\n !actionRequests ||\n !reviewConfigs ||\n actionRequests.length === 0 ||\n reviewConfigs.length === 0\n ) {\n return null;\n }\n\n const normalizedActionRequests = actionRequests.map(\n normalizeHITLActionRequest,\n );\n const normalizedReviewConfigs = reviewConfigs.map(\n normalizeHITLReviewConfig,\n );\n if (\n normalizedActionRequests.some((request) => request === null) ||\n normalizedReviewConfigs.some((config) => config === null)\n ) {\n return null;\n }\n\n const normalizedRequest: HITLRequest = {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","/** A live reference to a conversation branch, never a client-supplied transcript. */\nexport type ChatKitThreadReference = {\n type: 'thread';\n id?: string;\n label?: string;\n conversationId: string;\n threadId: string;\n};\n\nexport function normalizeThreadReference(\n value: unknown,\n): ChatKitThreadReference | null {\n if (\n !value ||\n typeof value !== 'object' ||\n !('type' in value) ||\n value.type !== 'thread'\n )\n return null;\n if (\n !('conversationId' in value) ||\n !isLocator(value.conversationId) ||\n !('threadId' in value) ||\n !isLocator(value.threadId)\n )\n return null;\n if (\n 'label' in value &&\n value.label !== undefined &&\n (typeof value.label !== 'string' || value.label.length > 300)\n )\n return null;\n if ('id' in value && value.id !== undefined && !isLocator(value.id))\n return null;\n return {\n type: 'thread',\n conversationId: value.conversationId.trim(),\n threadId: value.threadId.trim(),\n ...('label' in value && typeof value.label === 'string'\n ? { label: value.label.trim() }\n : {}),\n ...('id' in value && typeof value.id === 'string'\n ? { id: value.id.trim() }\n : {}),\n };\n}\n\nfunction isLocator(value: unknown): value is string {\n return (\n typeof value === 'string' && value.trim().length > 0 && value.length <= 128\n );\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","import type { ChatSkillUsage } from './skill-usage.js';\n\nexport const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type ChatTaskSummaryResourceReference =\n | {\n type: 'message';\n messageId: string;\n }\n | {\n type: 'workspace_file';\n workspacePath: string;\n fileAssetId?: string;\n storageFileId?: string;\n }\n | {\n type: 'artifact';\n artifactId: string;\n }\n | {\n type: 'browser';\n serviceId?: string;\n url?: string;\n }\n | {\n type: 'url';\n url: string;\n };\n\nexport type ChatTaskSummaryOutputKind =\n | 'file'\n | 'image'\n | 'document'\n | 'spreadsheet'\n | 'presentation'\n | 'site'\n | 'url'\n | 'mcp_app';\n\nexport type ChatTaskSummaryOutputStatus =\n | 'pending'\n | 'running'\n | 'success'\n | 'error';\n\nexport type ChatTaskSummaryOutput = {\n id: string;\n kind: ChatTaskSummaryOutputKind;\n title: string;\n description?: string;\n status?: ChatTaskSummaryOutputStatus;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n skillUsages?: ChatSkillUsage[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","/** Snapshot produced by the runtime after successfully loading skill instructions. */\nexport type ChatSkillUsage = {\n skillId: string;\n name: string;\n version: string;\n source: {\n type: 'workspace' | 'project' | 'assistant' | 'plugin';\n id: string;\n };\n activation: 'read';\n toolCallId: string;\n executionId?: string;\n loadedAt: string;\n};\n\nexport function chatSkillUsageKey(usage: ChatSkillUsage): string {\n return JSON.stringify([\n usage.source.type,\n usage.source.id,\n usage.skillId,\n usage.version,\n ]);\n}\n\n/** Merge only observations belonging to the same message. Keep the first read. */\nexport function mergeChatSkillUsages(\n ...groups: ReadonlyArray<readonly ChatSkillUsage[] | undefined>\n): ChatSkillUsage[] {\n const usages = new Map<string, ChatSkillUsage>();\n for (const group of groups) {\n for (const usage of group ?? []) {\n const key = chatSkillUsageKey(usage);\n if (!usages.has(key)) usages.set(key, usage);\n }\n }\n return [...usages.values()];\n}\n\n/** JSON boundary: allowlist fields rather than forwarding paths or raw tool data. */\nexport function normalizeChatSkillUsages(value: unknown): ChatSkillUsage[] {\n if (!Array.isArray(value)) return [];\n const usages: ChatSkillUsage[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object' || item.activation !== 'read')\n continue;\n const { source } = item;\n if (\n !source ||\n typeof source !== 'object' ||\n !['workspace', 'project', 'assistant', 'plugin'].includes(source.type) ||\n typeof source.id !== 'string' ||\n !source.id.trim()\n )\n continue;\n if (\n typeof item.skillId !== 'string' ||\n !item.skillId.trim() ||\n typeof item.name !== 'string' ||\n !item.name.trim() ||\n typeof item.version !== 'string' ||\n typeof item.toolCallId !== 'string' ||\n !item.toolCallId.trim() ||\n typeof item.loadedAt !== 'string' ||\n !Number.isFinite(Date.parse(item.loadedAt))\n )\n continue;\n usages.push({\n skillId: item.skillId,\n name: item.name,\n version: item.version,\n source: { type: source.type, id: source.id },\n activation: 'read',\n toolCallId: item.toolCallId,\n ...(typeof item.executionId === 'string' && item.executionId\n ? { executionId: item.executionId }\n : {}),\n loadedAt: item.loadedAt,\n });\n }\n return mergeChatSkillUsages(usages);\n}\n\nfunction summarySkillUsages(summary: unknown): ChatSkillUsage[] {\n return summary &&\n typeof summary === 'object' &&\n 'version' in summary &&\n summary.version === 1 &&\n 'skillUsages' in summary\n ? normalizeChatSkillUsages(summary.skillUsages)\n : [];\n}\n\n/** Works for both streamed tool components and persisted message summaries. */\nexport function getMessageSkillUsages(message: {\n content?: unknown;\n taskSummary?: unknown;\n}): ChatSkillUsage[] {\n const groups = [summarySkillUsages(message.taskSummary)];\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part?.type === 'component' && part.data?.status === 'success') {\n groups.push(summarySkillUsages(part.data.taskSummary));\n }\n }\n }\n return mergeChatSkillUsages(...groups);\n}\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n"],"names":["config"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -388,6 +388,14 @@ export declare type ChatKitMcpAppsOptions = {
388
388
  };
389
389
 
390
390
  export declare interface ChatkitMessage {
391
+ taskSummary?: TChatTaskSummaryContribution;
392
+ createdAt?: string | Date | null;
393
+ updatedAt?: string | Date | null;
394
+ historical?: boolean;
395
+ branching?: {
396
+ available: boolean;
397
+ reason?: 'message_not_complete' | 'checkpoint_unavailable' | 'graph_changed' | 'state_not_supported';
398
+ };
391
399
  status?: string;
392
400
  content: TMessageItems | string;
393
401
  reasoning?: TMessageContentReasoning[];
@@ -460,6 +468,11 @@ export declare type ChatKitOptions = {
460
468
  * Message list quick navigation controls.
461
469
  */
462
470
  messageNavigation?: ChatKitMessageNavigationOptions;
471
+ /** Message presentation only; never changes stored messages or model context. */
472
+ messagePresentation?: {
473
+ /** Collapse the process preceding each final assistant answer. Default: false. */
474
+ collapseProcess?: boolean;
475
+ };
463
476
  /**
464
477
  * Optional Xpert Remote Views workbench.
465
478
  *
@@ -568,6 +581,8 @@ export declare type ChatKitOptions = {
568
581
  promptsLayout?: 'cards' | 'list';
569
582
  };
570
583
  threadItemActions?: {
584
+ /** Show Branch in new chat when the server advertises a saved assistant boundary. Defaults to true. */
585
+ branch?: boolean;
571
586
  /**
572
587
  * Whether or not to show the response feedback buttons (thumbs up / thumbs
573
588
  * down) in the response view. When the user clicks on one of the buttons, the
@@ -779,7 +794,7 @@ export declare type ChatKitQuoteReference = ChatKitReferenceBase & {
779
794
  source?: string;
780
795
  };
781
796
 
782
- export declare type ChatKitReference = ChatKitCodeReference | ChatKitQuoteReference | ChatKitImageReference | ChatKitElementReference | ChatKitFileElementReference;
797
+ export declare type ChatKitReference = ChatKitThreadReference | ChatKitCodeReference | ChatKitQuoteReference | ChatKitImageReference | ChatKitElementReference | ChatKitFileElementReference;
783
798
 
784
799
  export declare type ChatKitReferenceBase = {
785
800
  id?: string;
@@ -924,6 +939,15 @@ export declare type ChatKitTheme = {
924
939
  };
925
940
  };
926
941
 
942
+ /** A live reference to a conversation branch, never a client-supplied transcript. */
943
+ export declare type ChatKitThreadReference = {
944
+ type: 'thread';
945
+ id?: string;
946
+ label?: string;
947
+ conversationId: string;
948
+ threadId: string;
949
+ };
950
+
927
951
  export declare type ChatKitWorkbenchClientCommandRequest = {
928
952
  commandKey: string;
929
953
  payload?: unknown;
@@ -1115,6 +1139,23 @@ export declare type ChatRequestStorageFileHandle = ChatRequestFileBase & {
1115
1139
  storageProvider?: string;
1116
1140
  };
1117
1141
 
1142
+ /** Snapshot produced by the runtime after successfully loading skill instructions. */
1143
+ export declare type ChatSkillUsage = {
1144
+ skillId: string;
1145
+ name: string;
1146
+ version: string;
1147
+ source: {
1148
+ type: 'workspace' | 'project' | 'assistant' | 'plugin';
1149
+ id: string;
1150
+ };
1151
+ activation: 'read';
1152
+ toolCallId: string;
1153
+ executionId?: string;
1154
+ loadedAt: string;
1155
+ };
1156
+
1157
+ export declare function chatSkillUsageKey(usage: ChatSkillUsage): string;
1158
+
1118
1159
  export declare type ChatTaskSummaryOpenResourceEffect = {
1119
1160
  resource: ChatTaskSummaryResourceReference;
1120
1161
  conversationId?: string;
@@ -1379,6 +1420,12 @@ export declare type Form = {
1379
1420
  direction?: 'row' | 'col';
1380
1421
  } & BoxBaseProps;
1381
1422
 
1423
+ /** Works for both streamed tool components and persisted message summaries. */
1424
+ export declare function getMessageSkillUsages(message: {
1425
+ content?: unknown;
1426
+ taskSummary?: unknown;
1427
+ }): ChatSkillUsage[];
1428
+
1382
1429
  export declare function getPinnedPetPosition(pin: ChatKitPetPin, size: PetSize, viewport: PetViewport, padding: ChatKitPetBoundsPadding): PetPosition;
1383
1430
 
1384
1431
  export declare type GrayscaleOptions = {
@@ -1714,6 +1761,9 @@ export declare type Markdown = {
1714
1761
  streaming?: boolean;
1715
1762
  };
1716
1763
 
1764
+ /** Merge only observations belonging to the same message. Keep the first read. */
1765
+ export declare function mergeChatSkillUsages(...groups: ReadonlyArray<readonly ChatSkillUsage[] | undefined>): ChatSkillUsage[];
1766
+
1717
1767
  export declare function mergePetSpriteAtlas(override?: ChatKitPetSpriteAtlas): PetSpriteAtlasDefinition;
1718
1768
 
1719
1769
  export declare type MessageContentImageUrl = {
@@ -1751,6 +1801,9 @@ export declare type ModelOption = {
1751
1801
 
1752
1802
  export declare function normalizeBoundsPadding(value?: number | Partial<ChatKitPetBoundsPadding>): ChatKitPetBoundsPadding;
1753
1803
 
1804
+ /** JSON boundary: allowlist fields rather than forwarding paths or raw tool data. */
1805
+ export declare function normalizeChatSkillUsages(value: unknown): ChatSkillUsage[];
1806
+
1754
1807
  export declare type NormalizedPetOptions = {
1755
1808
  character: ChatKitPetCharacter;
1756
1809
  position: Required<Pick<NonNullable<ChatKitPetOptions['position']>, 'draggable' | 'persist' | 'scale' | 'zIndex'>> & Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;
@@ -1765,6 +1818,8 @@ export declare function normalizePetOptions(pet: ChatKitOptions['pet'] | null):
1765
1818
 
1766
1819
  export declare function normalizeRequestLanguage(locale?: string | null): string | undefined;
1767
1820
 
1821
+ export declare function normalizeThreadReference(value: unknown): ChatKitThreadReference | null;
1822
+
1768
1823
  export declare const PET_ANIMATION_NAMES: readonly ["idle", "running-right", "running-left", "waving", "jumping", "failed", "waiting", "running", "review"];
1769
1824
 
1770
1825
  export declare type PetFrameAnimationDefinition = {
@@ -2146,6 +2201,7 @@ export declare type TChatTaskSummaryContribution = {
2146
2201
  todos?: ChatTaskSummaryTodos;
2147
2202
  outputs?: ChatTaskSummaryOutput[];
2148
2203
  sources?: ChatTaskSummarySource[];
2204
+ skillUsages?: ChatSkillUsage[];
2149
2205
  };
2150
2206
 
2151
2207
  /**
package/dist/index.js CHANGED
@@ -273,6 +273,26 @@ function normalizeRequestLanguage(locale) {
273
273
  }
274
274
  return normalized;
275
275
  }
276
+ function normalizeThreadReference(value) {
277
+ if (!value || typeof value !== "object" || !("type" in value) || value.type !== "thread")
278
+ return null;
279
+ if (!("conversationId" in value) || !isLocator(value.conversationId) || !("threadId" in value) || !isLocator(value.threadId))
280
+ return null;
281
+ if ("label" in value && value.label !== void 0 && (typeof value.label !== "string" || value.label.length > 300))
282
+ return null;
283
+ if ("id" in value && value.id !== void 0 && !isLocator(value.id))
284
+ return null;
285
+ return {
286
+ type: "thread",
287
+ conversationId: value.conversationId.trim(),
288
+ threadId: value.threadId.trim(),
289
+ ..."label" in value && typeof value.label === "string" ? { label: value.label.trim() } : {},
290
+ ..."id" in value && typeof value.id === "string" ? { id: value.id.trim() } : {}
291
+ };
292
+ }
293
+ function isLocator(value) {
294
+ return typeof value === "string" && value.trim().length > 0 && value.length <= 128;
295
+ }
276
296
  const PET_ANIMATION_NAMES = [
277
297
  "idle",
278
298
  "running-right",
@@ -524,6 +544,63 @@ function getPinnedPetPosition(pin, size, viewport, padding) {
524
544
  }
525
545
  }
526
546
  const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT = "task_summary.open_resource";
547
+ function chatSkillUsageKey(usage) {
548
+ return JSON.stringify([
549
+ usage.source.type,
550
+ usage.source.id,
551
+ usage.skillId,
552
+ usage.version
553
+ ]);
554
+ }
555
+ function mergeChatSkillUsages(...groups) {
556
+ const usages = /* @__PURE__ */ new Map();
557
+ for (const group of groups) {
558
+ for (const usage of group ?? []) {
559
+ const key = chatSkillUsageKey(usage);
560
+ if (!usages.has(key)) usages.set(key, usage);
561
+ }
562
+ }
563
+ return [...usages.values()];
564
+ }
565
+ function normalizeChatSkillUsages(value) {
566
+ if (!Array.isArray(value)) return [];
567
+ const usages = [];
568
+ for (const item of value) {
569
+ if (!item || typeof item !== "object" || item.activation !== "read")
570
+ continue;
571
+ const { source } = item;
572
+ if (!source || typeof source !== "object" || !["workspace", "project", "assistant", "plugin"].includes(source.type) || typeof source.id !== "string" || !source.id.trim())
573
+ continue;
574
+ if (typeof item.skillId !== "string" || !item.skillId.trim() || typeof item.name !== "string" || !item.name.trim() || typeof item.version !== "string" || typeof item.toolCallId !== "string" || !item.toolCallId.trim() || typeof item.loadedAt !== "string" || !Number.isFinite(Date.parse(item.loadedAt)))
575
+ continue;
576
+ usages.push({
577
+ skillId: item.skillId,
578
+ name: item.name,
579
+ version: item.version,
580
+ source: { type: source.type, id: source.id },
581
+ activation: "read",
582
+ toolCallId: item.toolCallId,
583
+ ...typeof item.executionId === "string" && item.executionId ? { executionId: item.executionId } : {},
584
+ loadedAt: item.loadedAt
585
+ });
586
+ }
587
+ return mergeChatSkillUsages(usages);
588
+ }
589
+ function summarySkillUsages(summary) {
590
+ return summary && typeof summary === "object" && "version" in summary && summary.version === 1 && "skillUsages" in summary ? normalizeChatSkillUsages(summary.skillUsages) : [];
591
+ }
592
+ function getMessageSkillUsages(message) {
593
+ var _a;
594
+ const groups = [summarySkillUsages(message.taskSummary)];
595
+ if (Array.isArray(message.content)) {
596
+ for (const part of message.content) {
597
+ if ((part == null ? void 0 : part.type) === "component" && ((_a = part.data) == null ? void 0 : _a.status) === "success") {
598
+ groups.push(summarySkillUsages(part.data.taskSummary));
599
+ }
600
+ }
601
+ }
602
+ return mergeChatSkillUsages(...groups);
603
+ }
527
604
  const TOOL_OUTPUT_PRESENTATION_TYPE = "xpert.tool-output";
528
605
  const TOOL_OUTPUT_PRESENTATION_VERSION = 1;
529
606
  export {
@@ -545,7 +622,9 @@ export {
545
622
  STATE_VARIABLE_HUMAN,
546
623
  TOOL_OUTPUT_PRESENTATION_TYPE,
547
624
  TOOL_OUTPUT_PRESENTATION_VERSION,
625
+ chatSkillUsageKey,
548
626
  clampPetPosition,
627
+ getMessageSkillUsages,
549
628
  getPinnedPetPosition,
550
629
  isClientToolInterrupt,
551
630
  isClientToolInterruptPayload,
@@ -565,11 +644,14 @@ export {
565
644
  isToolCallInterruptPayload,
566
645
  isToolCallInterruptTask,
567
646
  isToolCallRequest,
647
+ mergeChatSkillUsages,
568
648
  mergePetSpriteAtlas,
569
649
  normalizeBoundsPadding,
650
+ normalizeChatSkillUsages,
570
651
  normalizeHITLRequest,
571
652
  normalizePetOptions,
572
653
  normalizeRequestLanguage,
654
+ normalizeThreadReference,
573
655
  petSpriteAtlas,
574
656
  resolveLocalizedText,
575
657
  resolvePetCharacter
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/pet.ts","../src/task-summary.ts","../src/tool-output.ts"],"sourcesContent":["import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import { isHITLReviewDisplay, type HITLReviewDisplay } from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\n elicitation?: HITLMCPElicitation;\n}\n\nexport interface HITLApproveDecision {\n type: 'approve';\n}\n\nexport interface HITLEditDecision {\n type: 'edit';\n editedAction: HITLAction;\n}\n\nexport interface HITLRejectDecision {\n type: 'reject';\n message?: string;\n}\n\nexport interface HITLRespondDecision {\n type: 'respond';\n message: string;\n}\n\nexport type HITLDecision =\n | HITLApproveDecision\n | HITLEditDecision\n | HITLRejectDecision\n | HITLRespondDecision;\n\nexport interface HITLResponse {\n decisions: HITLDecision[];\n}\n\nexport type InterruptRequest =\n | ToolCallRequest\n | ClientToolRequest\n | HITLRequest;\n\nexport interface LangGraphInterrupt<TValue = unknown> {\n id: string;\n value: TValue;\n when?: string;\n resumable?: boolean;\n ns?: string[];\n}\n\nexport interface LangGraphInterruptTask<TValue = unknown> {\n id: string;\n name: string;\n path: Array<string | number>;\n interrupts: Array<LangGraphInterrupt<TValue>>;\n}\n\nexport interface LangGraphInterruptPayload<TValue = unknown> {\n tasks: Array<LangGraphInterruptTask<TValue>>;\n}\n\nexport type ClientToolInterrupt<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ClientToolInterruptTask<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ClientToolInterruptPayload<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type ToolCallInterrupt<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ToolCallInterruptTask<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ToolCallInterruptPayload<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type HITLInterrupt<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterrupt<TRequest>;\n\nexport type HITLInterruptTask<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptTask<TRequest>;\n\nexport type HITLInterruptPayload<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptPayload<TRequest>;\n\n/**\n * When an interrupt occurs during task execution, the system generates an InterruptPayload.\n *\n * Ordinary tool-call interrupts use `toolCalls`; ChatKit client-tool middleware\n * uses `clientToolCalls` so the UI can route those calls to the client.\n * Human-in-the-loop interrupts use `actionRequests` and `reviewConfigs` so\n * ChatKit can collect reviewer decisions and resume with `{ decisions }`.\n```json\n{\n \"type\": \"event\",\n \"event\": \"on_interrupt\",\n \"data\": {\n \"tasks\": [\n {\n \"id\": \"9c4d2ac5-8808-5b6f-855c-4d48aa3d77a7\",\n \"name\": \"Middleware_wPzR2bIXqE_after_model\",\n \"path\": [\"__pregel_pull\", \"Middleware_wPzR2bIXqE_after_model\"],\n \"interrupts\": [\n {\n \"id\": \"b42f7887d65e57ed11cf08b8927763db\",\n \"value\": {\n \"toolCalls\": [\n {\n \"name\": \"getUserStation\",\n \"args\": {\n \"input\": \"Query the site selected by the user\"\n },\n \"id\": \"call_00_swcaUjIaACXOHHaZyNmQB3Vm\",\n \"type\": \"tool_call\"\n }\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n */\nexport interface InterruptPayload extends LangGraphInterruptPayload<InterruptRequest> {}\n\nexport interface ClientToolMessageInput {\n content: unknown;\n name?: string;\n tool_call_id?: string;\n status?: 'success' | 'error';\n artifact?: unknown;\n}\n\nexport interface ClientToolResponse {\n toolMessages: ClientToolMessageInput[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readRecordField(\n value: Record<string, unknown>,\n ...keys: string[]\n): Record<string, unknown> | null {\n for (const key of keys) {\n const field = value[key];\n if (isRecord(field)) return field;\n }\n\n return null;\n}\n\nfunction readArrayField(value: Record<string, unknown>, ...keys: string[]) {\n for (const key of keys) {\n const field = value[key];\n if (Array.isArray(field)) return field;\n }\n\n return null;\n}\n\nfunction readStringField(\n value: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const field = value[key];\n if (typeof field === 'string' && field.trim()) return field;\n }\n\n return null;\n}\n\nexport function isHITLDecisionType(\n value: unknown,\n): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(\n value: unknown,\n): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(\n value: unknown,\n): HITLReviewConfig | null {\n if (!isRecord(value)) return null;\n\n const actionName = readStringField(value, 'actionName', 'action_name');\n const allowedDecisions = readArrayField(\n value,\n 'allowedDecisions',\n 'allowed_decisions',\n );\n if (!actionName || !allowedDecisions) return null;\n\n const normalizedDecisions = allowedDecisions.filter(isHITLDecisionType);\n if (normalizedDecisions.length !== allowedDecisions.length) return null;\n\n const argsSchema = readRecordField(value, 'argsSchema', 'args_schema');\n\n return {\n actionName,\n allowedDecisions: normalizedDecisions,\n ...(argsSchema ? { argsSchema } : {}),\n };\n}\n\nfunction normalizeHITLMCPElicitation(\n value: unknown,\n): HITLMCPElicitation | null {\n if (!isRecord(value) || value.kind !== 'mcp_elicitation') return null;\n\n const actionName = readStringField(value, 'actionName');\n const field = readRecordField(value, 'field');\n if (!actionName || !field) return null;\n\n const name = readStringField(field, 'name');\n if (!name || field.type !== 'boolean' || field.required !== true) {\n return null;\n }\n if (field.title !== undefined && typeof field.title !== 'string') {\n return null;\n }\n\n const title = readStringField(field, 'title');\n return {\n kind: 'mcp_elicitation',\n actionName,\n field: {\n name,\n type: 'boolean',\n required: true,\n ...(title ? { title } : {}),\n },\n };\n}\n\nexport function normalizeHITLRequest(value: unknown): HITLRequest | null {\n if (!isRecord(value)) return null;\n\n const actionRequests = readArrayField(\n value,\n 'actionRequests',\n 'action_requests',\n );\n const reviewConfigs = readArrayField(\n value,\n 'reviewConfigs',\n 'review_configs',\n );\n if (\n !actionRequests ||\n !reviewConfigs ||\n actionRequests.length === 0 ||\n reviewConfigs.length === 0\n ) {\n return null;\n }\n\n const normalizedActionRequests = actionRequests.map(\n normalizeHITLActionRequest,\n );\n const normalizedReviewConfigs = reviewConfigs.map(\n normalizeHITLReviewConfig,\n );\n if (\n normalizedActionRequests.some((request) => request === null) ||\n normalizedReviewConfigs.some((config) => config === null)\n ) {\n return null;\n }\n\n const normalizedRequest: HITLRequest = {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","export const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type ChatTaskSummaryResourceReference =\n | {\n type: 'message';\n messageId: string;\n }\n | {\n type: 'workspace_file';\n workspacePath: string;\n fileAssetId?: string;\n storageFileId?: string;\n }\n | {\n type: 'artifact';\n artifactId: string;\n }\n | {\n type: 'browser';\n serviceId?: string;\n url?: string;\n }\n | {\n type: 'url';\n url: string;\n };\n\nexport type ChatTaskSummaryOutputKind =\n | 'file'\n | 'image'\n | 'document'\n | 'spreadsheet'\n | 'presentation'\n | 'site'\n | 'url'\n | 'mcp_app';\n\nexport type ChatTaskSummaryOutputStatus =\n | 'pending'\n | 'running'\n | 'success'\n | 'error';\n\nexport type ChatTaskSummaryOutput = {\n id: string;\n kind: ChatTaskSummaryOutputKind;\n title: string;\n description?: string;\n status?: ChatTaskSummaryOutputStatus;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n"],"names":["config"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/thread-reference.ts","../src/pet.ts","../src/task-summary.ts","../src/skill-usage.ts","../src/tool-output.ts"],"sourcesContent":["import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import { isHITLReviewDisplay, type HITLReviewDisplay } from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\n elicitation?: HITLMCPElicitation;\n}\n\nexport interface HITLApproveDecision {\n type: 'approve';\n}\n\nexport interface HITLEditDecision {\n type: 'edit';\n editedAction: HITLAction;\n}\n\nexport interface HITLRejectDecision {\n type: 'reject';\n message?: string;\n}\n\nexport interface HITLRespondDecision {\n type: 'respond';\n message: string;\n}\n\nexport type HITLDecision =\n | HITLApproveDecision\n | HITLEditDecision\n | HITLRejectDecision\n | HITLRespondDecision;\n\nexport interface HITLResponse {\n decisions: HITLDecision[];\n}\n\nexport type InterruptRequest =\n | ToolCallRequest\n | ClientToolRequest\n | HITLRequest;\n\nexport interface LangGraphInterrupt<TValue = unknown> {\n id: string;\n value: TValue;\n when?: string;\n resumable?: boolean;\n ns?: string[];\n}\n\nexport interface LangGraphInterruptTask<TValue = unknown> {\n id: string;\n name: string;\n path: Array<string | number>;\n interrupts: Array<LangGraphInterrupt<TValue>>;\n}\n\nexport interface LangGraphInterruptPayload<TValue = unknown> {\n tasks: Array<LangGraphInterruptTask<TValue>>;\n}\n\nexport type ClientToolInterrupt<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ClientToolInterruptTask<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ClientToolInterruptPayload<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type ToolCallInterrupt<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ToolCallInterruptTask<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ToolCallInterruptPayload<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type HITLInterrupt<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterrupt<TRequest>;\n\nexport type HITLInterruptTask<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptTask<TRequest>;\n\nexport type HITLInterruptPayload<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptPayload<TRequest>;\n\n/**\n * When an interrupt occurs during task execution, the system generates an InterruptPayload.\n *\n * Ordinary tool-call interrupts use `toolCalls`; ChatKit client-tool middleware\n * uses `clientToolCalls` so the UI can route those calls to the client.\n * Human-in-the-loop interrupts use `actionRequests` and `reviewConfigs` so\n * ChatKit can collect reviewer decisions and resume with `{ decisions }`.\n```json\n{\n \"type\": \"event\",\n \"event\": \"on_interrupt\",\n \"data\": {\n \"tasks\": [\n {\n \"id\": \"9c4d2ac5-8808-5b6f-855c-4d48aa3d77a7\",\n \"name\": \"Middleware_wPzR2bIXqE_after_model\",\n \"path\": [\"__pregel_pull\", \"Middleware_wPzR2bIXqE_after_model\"],\n \"interrupts\": [\n {\n \"id\": \"b42f7887d65e57ed11cf08b8927763db\",\n \"value\": {\n \"toolCalls\": [\n {\n \"name\": \"getUserStation\",\n \"args\": {\n \"input\": \"Query the site selected by the user\"\n },\n \"id\": \"call_00_swcaUjIaACXOHHaZyNmQB3Vm\",\n \"type\": \"tool_call\"\n }\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n */\nexport interface InterruptPayload extends LangGraphInterruptPayload<InterruptRequest> {}\n\nexport interface ClientToolMessageInput {\n content: unknown;\n name?: string;\n tool_call_id?: string;\n status?: 'success' | 'error';\n artifact?: unknown;\n}\n\nexport interface ClientToolResponse {\n toolMessages: ClientToolMessageInput[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readRecordField(\n value: Record<string, unknown>,\n ...keys: string[]\n): Record<string, unknown> | null {\n for (const key of keys) {\n const field = value[key];\n if (isRecord(field)) return field;\n }\n\n return null;\n}\n\nfunction readArrayField(value: Record<string, unknown>, ...keys: string[]) {\n for (const key of keys) {\n const field = value[key];\n if (Array.isArray(field)) return field;\n }\n\n return null;\n}\n\nfunction readStringField(\n value: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const field = value[key];\n if (typeof field === 'string' && field.trim()) return field;\n }\n\n return null;\n}\n\nexport function isHITLDecisionType(\n value: unknown,\n): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(\n value: unknown,\n): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(\n value: unknown,\n): HITLReviewConfig | null {\n if (!isRecord(value)) return null;\n\n const actionName = readStringField(value, 'actionName', 'action_name');\n const allowedDecisions = readArrayField(\n value,\n 'allowedDecisions',\n 'allowed_decisions',\n );\n if (!actionName || !allowedDecisions) return null;\n\n const normalizedDecisions = allowedDecisions.filter(isHITLDecisionType);\n if (normalizedDecisions.length !== allowedDecisions.length) return null;\n\n const argsSchema = readRecordField(value, 'argsSchema', 'args_schema');\n\n return {\n actionName,\n allowedDecisions: normalizedDecisions,\n ...(argsSchema ? { argsSchema } : {}),\n };\n}\n\nfunction normalizeHITLMCPElicitation(\n value: unknown,\n): HITLMCPElicitation | null {\n if (!isRecord(value) || value.kind !== 'mcp_elicitation') return null;\n\n const actionName = readStringField(value, 'actionName');\n const field = readRecordField(value, 'field');\n if (!actionName || !field) return null;\n\n const name = readStringField(field, 'name');\n if (!name || field.type !== 'boolean' || field.required !== true) {\n return null;\n }\n if (field.title !== undefined && typeof field.title !== 'string') {\n return null;\n }\n\n const title = readStringField(field, 'title');\n return {\n kind: 'mcp_elicitation',\n actionName,\n field: {\n name,\n type: 'boolean',\n required: true,\n ...(title ? { title } : {}),\n },\n };\n}\n\nexport function normalizeHITLRequest(value: unknown): HITLRequest | null {\n if (!isRecord(value)) return null;\n\n const actionRequests = readArrayField(\n value,\n 'actionRequests',\n 'action_requests',\n );\n const reviewConfigs = readArrayField(\n value,\n 'reviewConfigs',\n 'review_configs',\n );\n if (\n !actionRequests ||\n !reviewConfigs ||\n actionRequests.length === 0 ||\n reviewConfigs.length === 0\n ) {\n return null;\n }\n\n const normalizedActionRequests = actionRequests.map(\n normalizeHITLActionRequest,\n );\n const normalizedReviewConfigs = reviewConfigs.map(\n normalizeHITLReviewConfig,\n );\n if (\n normalizedActionRequests.some((request) => request === null) ||\n normalizedReviewConfigs.some((config) => config === null)\n ) {\n return null;\n }\n\n const normalizedRequest: HITLRequest = {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","/** A live reference to a conversation branch, never a client-supplied transcript. */\nexport type ChatKitThreadReference = {\n type: 'thread';\n id?: string;\n label?: string;\n conversationId: string;\n threadId: string;\n};\n\nexport function normalizeThreadReference(\n value: unknown,\n): ChatKitThreadReference | null {\n if (\n !value ||\n typeof value !== 'object' ||\n !('type' in value) ||\n value.type !== 'thread'\n )\n return null;\n if (\n !('conversationId' in value) ||\n !isLocator(value.conversationId) ||\n !('threadId' in value) ||\n !isLocator(value.threadId)\n )\n return null;\n if (\n 'label' in value &&\n value.label !== undefined &&\n (typeof value.label !== 'string' || value.label.length > 300)\n )\n return null;\n if ('id' in value && value.id !== undefined && !isLocator(value.id))\n return null;\n return {\n type: 'thread',\n conversationId: value.conversationId.trim(),\n threadId: value.threadId.trim(),\n ...('label' in value && typeof value.label === 'string'\n ? { label: value.label.trim() }\n : {}),\n ...('id' in value && typeof value.id === 'string'\n ? { id: value.id.trim() }\n : {}),\n };\n}\n\nfunction isLocator(value: unknown): value is string {\n return (\n typeof value === 'string' && value.trim().length > 0 && value.length <= 128\n );\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","import type { ChatSkillUsage } from './skill-usage.js';\n\nexport const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type ChatTaskSummaryResourceReference =\n | {\n type: 'message';\n messageId: string;\n }\n | {\n type: 'workspace_file';\n workspacePath: string;\n fileAssetId?: string;\n storageFileId?: string;\n }\n | {\n type: 'artifact';\n artifactId: string;\n }\n | {\n type: 'browser';\n serviceId?: string;\n url?: string;\n }\n | {\n type: 'url';\n url: string;\n };\n\nexport type ChatTaskSummaryOutputKind =\n | 'file'\n | 'image'\n | 'document'\n | 'spreadsheet'\n | 'presentation'\n | 'site'\n | 'url'\n | 'mcp_app';\n\nexport type ChatTaskSummaryOutputStatus =\n | 'pending'\n | 'running'\n | 'success'\n | 'error';\n\nexport type ChatTaskSummaryOutput = {\n id: string;\n kind: ChatTaskSummaryOutputKind;\n title: string;\n description?: string;\n status?: ChatTaskSummaryOutputStatus;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n skillUsages?: ChatSkillUsage[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","/** Snapshot produced by the runtime after successfully loading skill instructions. */\nexport type ChatSkillUsage = {\n skillId: string;\n name: string;\n version: string;\n source: {\n type: 'workspace' | 'project' | 'assistant' | 'plugin';\n id: string;\n };\n activation: 'read';\n toolCallId: string;\n executionId?: string;\n loadedAt: string;\n};\n\nexport function chatSkillUsageKey(usage: ChatSkillUsage): string {\n return JSON.stringify([\n usage.source.type,\n usage.source.id,\n usage.skillId,\n usage.version,\n ]);\n}\n\n/** Merge only observations belonging to the same message. Keep the first read. */\nexport function mergeChatSkillUsages(\n ...groups: ReadonlyArray<readonly ChatSkillUsage[] | undefined>\n): ChatSkillUsage[] {\n const usages = new Map<string, ChatSkillUsage>();\n for (const group of groups) {\n for (const usage of group ?? []) {\n const key = chatSkillUsageKey(usage);\n if (!usages.has(key)) usages.set(key, usage);\n }\n }\n return [...usages.values()];\n}\n\n/** JSON boundary: allowlist fields rather than forwarding paths or raw tool data. */\nexport function normalizeChatSkillUsages(value: unknown): ChatSkillUsage[] {\n if (!Array.isArray(value)) return [];\n const usages: ChatSkillUsage[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object' || item.activation !== 'read')\n continue;\n const { source } = item;\n if (\n !source ||\n typeof source !== 'object' ||\n !['workspace', 'project', 'assistant', 'plugin'].includes(source.type) ||\n typeof source.id !== 'string' ||\n !source.id.trim()\n )\n continue;\n if (\n typeof item.skillId !== 'string' ||\n !item.skillId.trim() ||\n typeof item.name !== 'string' ||\n !item.name.trim() ||\n typeof item.version !== 'string' ||\n typeof item.toolCallId !== 'string' ||\n !item.toolCallId.trim() ||\n typeof item.loadedAt !== 'string' ||\n !Number.isFinite(Date.parse(item.loadedAt))\n )\n continue;\n usages.push({\n skillId: item.skillId,\n name: item.name,\n version: item.version,\n source: { type: source.type, id: source.id },\n activation: 'read',\n toolCallId: item.toolCallId,\n ...(typeof item.executionId === 'string' && item.executionId\n ? { executionId: item.executionId }\n : {}),\n loadedAt: item.loadedAt,\n });\n }\n return mergeChatSkillUsages(usages);\n}\n\nfunction summarySkillUsages(summary: unknown): ChatSkillUsage[] {\n return summary &&\n typeof summary === 'object' &&\n 'version' in summary &&\n summary.version === 1 &&\n 'skillUsages' in summary\n ? normalizeChatSkillUsages(summary.skillUsages)\n : [];\n}\n\n/** Works for both streamed tool components and persisted message summaries. */\nexport function getMessageSkillUsages(message: {\n content?: unknown;\n taskSummary?: unknown;\n}): ChatSkillUsage[] {\n const groups = [summarySkillUsages(message.taskSummary)];\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part?.type === 'component' && part.data?.status === 'success') {\n groups.push(summarySkillUsages(part.data.taskSummary));\n }\n }\n }\n return mergeChatSkillUsages(...groups);\n}\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n"],"names":["config"],"mappings":";;AAcA,SAAS,gBAAgB,OAAwC;AAC/D,SAAO,OAAO,UAAU,YAAa,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,KAC/F,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,SAAS,OAAO,SAAS,YAAY,SAAS,MAAS;AACvF;AAEO,SAAS,oBAAoB,OAA4C;AAC9E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,WAAW,UAAU,CAAC,gBAAgB,MAAM,KAAK,KAC1F,EAAE,aAAa,UAAU,CAAC,gBAAgB,MAAM,OAAO,KAAK,EAAE,cAAc,UAAU,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAAG,QAAO;AACjI,SAAO,MAAM,SAAS,MAAM,CAAC,YAAqB;AAChD,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,WAAW,YAAY,CAAC,gBAAgB,QAAQ,KAAK,KAAK,EAAE,UAAU,SAAU,QAAO;AACxI,YAAQ,QAAQ,MAAA;AAAA,MACd,KAAK;AAAQ,eAAO,UAAU,WAAW,gBAAgB,QAAQ,IAAI;AAAA,MACrE,KAAK;AAAQ,eAAO,UAAU,WAAW,OAAO,QAAQ,SAAS;AAAA,MACjE,KAAK;AAAS,eAAO,aAAa,WAAW,MAAM,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,MAAM,CAAC,WAAoB,OAAO,WAAW,QAAQ,KAClJ,UAAU,WAAW,MAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,KAAK,MAAM,CAAC,QAAiB,MAAM,QAAQ,GAAG,KAAK,IAAI,MAAM,CAAC,SAAkB,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,aAAc,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,CAAE,CAAC;AAAA,MAC5Q;AAAS,eAAO;AAAA,IAAA;AAAA,EAEpB,CAAC;AACH;AC5BO,MAAM,+BAA+B;AAErC,MAAM,iCAAiC;AAEvC,MAAM,uDACX;AACK,MAAM,gEACX;AAuDK,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmLA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,gBACP,UACG,MAC6B;AAChC,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,SAAS,KAAK,EAAG,QAAO;AAAA,EAC9B;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,UAAmC,MAAgB;AACzE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,UACG,MACY;AACf,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAA,EAAQ,QAAO;AAAA,EACxD;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,OAC2B;AAC3B,SACE,OAAO,UAAU,YAChB,oBAA0C,SAAS,KAAK;AAE7D;AAEA,SAAS,2BACP,OAC0B;AAC1B,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,OAAO,gBAAgB,OAAO,MAAM;AAC1C,QAAM,OAAO,gBAAgB,OAAO,QAAQ,WAAW;AACvD,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAE3B,QAAM,cACJ,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAE9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,gBAAgB,SAAY,EAAE,YAAA,IAAgB,CAAA;AAAA,IAClD,GAAI,oBAAoB,MAAM,OAAO,IAAI,EAAE,SAAS,MAAM,YAAY,CAAA;AAAA,EAAC;AAE3E;AAEA,SAAS,0BACP,OACyB;AACzB,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,aAAa,gBAAgB,OAAO,cAAc,aAAa;AACrE,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,MAAI,CAAC,cAAc,CAAC,iBAAkB,QAAO;AAE7C,QAAM,sBAAsB,iBAAiB,OAAO,kBAAkB;AACtE,MAAI,oBAAoB,WAAW,iBAAiB,OAAQ,QAAO;AAEnE,QAAM,aAAa,gBAAgB,OAAO,cAAc,aAAa;AAErE,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB;AAAA,IAClB,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,EAAC;AAEvC;AAEA,SAAS,4BACP,OAC2B;AAC3B,MAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,kBAAmB,QAAO;AAEjE,QAAM,aAAa,gBAAgB,OAAO,YAAY;AACtD,QAAM,QAAQ,gBAAgB,OAAO,OAAO;AAC5C,MAAI,CAAC,cAAc,CAAC,MAAO,QAAO;AAElC,QAAM,OAAO,gBAAgB,OAAO,MAAM;AAC1C,MAAI,CAAC,QAAQ,MAAM,SAAS,aAAa,MAAM,aAAa,MAAM;AAChE,WAAO;AAAA,EACT;AACA,MAAI,MAAM,UAAU,UAAa,OAAO,MAAM,UAAU,UAAU;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,gBAAgB,OAAO,OAAO;AAC5C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,MACV,GAAI,QAAQ,EAAE,UAAU,CAAA;AAAA,IAAC;AAAA,EAC3B;AAEJ;AAEO,SAAS,qBAAqB,OAAoC;AACvE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,MACE,CAAC,kBACD,CAAC,iBACD,eAAe,WAAW,KAC1B,cAAc,WAAW,GACzB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,2BAA2B,eAAe;AAAA,IAC9C;AAAA,EAAA;AAEF,QAAM,0BAA0B,cAAc;AAAA,IAC5C;AAAA,EAAA;AAEF,MACE,yBAAyB,KAAK,CAAC,YAAY,YAAY,IAAI,KAC3D,wBAAwB,KAAK,CAACA,YAAWA,YAAW,IAAI,GACxD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAiC;AAAA,IACrC,gBAAgB;AAAA,IAChB,eAAe;AAAA,EAAA;AAEjB,QAAM,cAAc,4BAA4B,MAAM,WAAW;AACjE,MAAI,CAAC,eAAe,kBAAkB,eAAe,WAAW,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,kBAAkB,eAAe,CAAC;AACjD,QAAM,SAAS,kBAAkB,cAAc;AAAA,IAC7C,CAAC,iBAAiB,aAAa,eAAe,YAAY;AAAA,EAAA;AAE5D,MACE,CAAC,UACD,OAAO,SAAS,YAAY,cAC5B,CAAC,UACD,OAAO,OAAO,KAAK,YAAY,MAAM,IAAI,MAAM,aAC/C,CAAC,OAAO,iBAAiB,SAAS,SAAS,KAC3C,CAAC,OAAO,iBAAiB,SAAS,QAAQ,GAC1C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,mBAAmB,YAAA;AACjC;AAEO,SAAS,oBACd,OAC4B;AAC5B,SAAO,SAAS,KAAK,KAAK,MAAM,QAAQ,MAAM,eAAe;AAC/D;AAEO,SAAS,kBAAkB,OAA0C;AAC1E,SAAO,SAAS,KAAK,KAAK,MAAM,QAAQ,MAAM,SAAS;AACzD;AAEO,SAAS,cAAc,OAAsC;AAClE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MACE,CAAC,MAAM,QAAQ,MAAM,cAAc,KACnC,CAAC,MAAM,QAAQ,MAAM,aAAa,GAClC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,qBAAqB,KAAK,MAAM;AACzC;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SACE,kBAAkB,KAAK,KACvB,oBAAoB,KAAK,KACzB,cAAc,KAAK;AAEvB;AAEO,SAAS,qBACd,OAC6B;AAC7B,SACE,SAAS,KAAK,KACd,OAAO,MAAM,OAAO,YACpB,OAAO,UAAU,eAAe,KAAK,OAAO,OAAO;AAEvD;AAEO,SAAS,yBACd,OACiC;AACjC,MACE,CAAC,SAAS,KAAK,KACf,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,SAAS,YACtB,CAAC,MAAM,QAAQ,MAAM,IAAI,KACzB,CAAC,MAAM,QAAQ,MAAM,UAAU,GAC/B;AACA,WAAO;AAAA,EACT;AAEA,SACE,MAAM,KAAK;AAAA,IACT,CAAC,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS;AAAA,EAAA,KACnD,MAAM,WAAW,MAAM,oBAAoB;AAEpD;AAEO,SAAS,4BACd,OACoC;AACpC,SACE,SAAS,KAAK,KACd,MAAM,QAAQ,MAAM,KAAK,KACzB,MAAM,MAAM,MAAM,wBAAwB;AAE9C;AAEO,SAAS,sBACd,OAC8B;AAC9B,SAAO,qBAAqB,KAAK,KAAK,oBAAoB,MAAM,KAAK;AACvE;AAEO,SAAS,0BACd,OACkC;AAClC,SACE,yBAAyB,KAAK,KAC9B,MAAM,WAAW,MAAM,qBAAqB;AAEhD;AAEO,SAAS,6BACd,OACqC;AACrC,SACE,4BAA4B,KAAK,KACjC,MAAM,MAAM,MAAM,yBAAyB;AAE/C;AAEO,SAAS,oBACd,OAC4B;AAC5B,SAAO,qBAAqB,KAAK,KAAK,kBAAkB,MAAM,KAAK;AACrE;AAEO,SAAS,wBACd,OACgC;AAChC,SACE,yBAAyB,KAAK,KAC9B,MAAM,WAAW,MAAM,mBAAmB;AAE9C;AAEO,SAAS,2BACd,OACmC;AACnC,SACE,4BAA4B,KAAK,KACjC,MAAM,MAAM,MAAM,uBAAuB;AAE7C;AAEO,SAAS,gBAAgB,OAAwC;AACtE,SAAO,qBAAqB,KAAK,KAAK,cAAc,MAAM,KAAK;AACjE;AAEO,SAAS,oBACd,OAC4B;AAC5B,SACE,yBAAyB,KAAK,KAAK,MAAM,WAAW,MAAM,eAAe;AAE7E;AAEO,SAAS,uBACd,OAC+B;AAC/B,SACE,4BAA4B,KAAK,KAAK,MAAM,MAAM,MAAM,mBAAmB;AAE/E;AC3iBO,SAAS,qBACd,OACA,WAAW,SACI;AACf,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAA;AACtB,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAM,YAAY;AAClB,QAAM,qBAAqB,SAAS,KAAA;AACpC,QAAM,sBAAsB,mBAAmB,QAAQ,MAAM,GAAG;AAChE,QAAM,iBAAiB,mBAAmB,MAAM,MAAM,EAAE,CAAC;AACzD,QAAM,gBAAgB,mBAAmB,YAAA,EAAc,WAAW,IAAI,IAClE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IAEF;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGN,aAAW,OAAO,eAAe;AAC/B,UAAM,YAAY,UAAU,GAAG;AAC/B,QAAI,OAAO,cAAc,YAAY,UAAU,QAAQ;AACrD,aAAO,UAAU,KAAA;AAAA,IACnB;AAAA,EACF;AAEA,aAAW,aAAa,OAAO,OAAO,SAAS,GAAG;AAChD,QAAI,OAAO,cAAc,YAAY,UAAU,QAAQ;AACrD,aAAO,UAAU,KAAA;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;ACtEO,SAAS,yBACd,QACoB;AACpB,QAAM,aAAa,iCAAQ;AAC3B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,WAAW,YAAA;AACzB,MAAI,UAAU,aAAa,UAAU,WAAW,UAAU,SAAS;AACjE,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ,UAAU,WAAW,UAAU,WAAW;AAC9D,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ,UAAU,SAAS;AACvC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;ACXO,SAAS,yBACd,OAC+B;AAC/B,MACE,CAAC,SACD,OAAO,UAAU,YACjB,EAAE,UAAU,UACZ,MAAM,SAAS;AAEf,WAAO;AACT,MACE,EAAE,oBAAoB,UACtB,CAAC,UAAU,MAAM,cAAc,KAC/B,EAAE,cAAc,UAChB,CAAC,UAAU,MAAM,QAAQ;AAEzB,WAAO;AACT,MACE,WAAW,SACX,MAAM,UAAU,WACf,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS;AAEzD,WAAO;AACT,MAAI,QAAQ,SAAS,MAAM,OAAO,UAAa,CAAC,UAAU,MAAM,EAAE;AAChE,WAAO;AACT,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,MAAM,eAAe,KAAA;AAAA,IACrC,UAAU,MAAM,SAAS,KAAA;AAAA,IACzB,GAAI,WAAW,SAAS,OAAO,MAAM,UAAU,WAC3C,EAAE,OAAO,MAAM,MAAM,KAAA,EAAK,IAC1B,CAAA;AAAA,IACJ,GAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,WACrC,EAAE,IAAI,MAAM,GAAG,KAAA,EAAK,IACpB,CAAA;AAAA,EAAC;AAET;AAEA,SAAS,UAAU,OAAiC;AAClD,SACE,OAAO,UAAU,YAAY,MAAM,OAAO,SAAS,KAAK,MAAM,UAAU;AAE5E;ACUO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,iBAAiB;AAAA,EAC5B,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE/C,iBAAiB;AAAA,MACf,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAEzD,gBAAgB;AAAA,MACd,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAEzD,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAErC,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE1C,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAEzD,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE/C,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE/C,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,EAC/C;AAEJ;AAEO,MAAM,mBAAmB;AAAA,EAC9B,OAAO,eAAe;AAAA,EACtB,QAAQ,eAAe;AACzB;AAEO,MAAM,6BAAsD;AAAA,EACjE,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,MAAM,0BAA0B;AAEhC,MAAM,8BAA8B;AAE3C,MAAM,wBAAwB;AAAA,EAC5B,MAAM;AAAA,EACN,KAAK;AACP;AAEA,MAAM,mBAAmB;AAAA,EACvB,KAAK;AAAA,EACL,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,SAAS,oBACP,MACA,UAC6B;AAC7B,SAAO;AAAA,IACL,MAAK,qCAAU,QAAO,KAAK;AAAA,IAC3B,SAAQ,qCAAU,WAAU,KAAK;AAAA,IACjC,iBACE,qCAAU,mBAAkB,SAAS,eAAe,SAAS,IACzD,SAAS,iBACT,KAAK;AAAA,EAAA;AAEf;AAEO,SAAS,oBACd,UAC0B;;AAC1B,QAAM,aAAa,CAAA;AAKnB,aAAW,QAAQ,qBAAqB;AACtC,eAAW,IAAI,IAAI;AAAA,MACjB,eAAe,WAAW,IAAI;AAAA,OAC9B,0CAAU,eAAV,mBAAuB;AAAA,IAAI;AAAA,EAE/B;AAEA,SAAO;AAAA,IACL,UAAS,qCAAU,YAAW,eAAe;AAAA,IAC7C,OAAM,qCAAU,SAAQ,eAAe;AAAA,IACvC,YAAW,qCAAU,cAAa,eAAe;AAAA,IACjD,aAAY,qCAAU,eAAc,eAAe;AAAA,IACnD;AAAA,EAAA;AAEJ;AAEA,SAAS,mBACP,WACqB;AACrB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,KAAK;AACjB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,KAC6B;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA;AAAA,EAEpB;AAEA,MAAI,IAAI,YAAY,OAAO;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,mBAAmB,IAAI,SAAS;AAAA,IAC3C,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,IAAI;AAAA,IAAA;AAAA,IAET,UAAU,IAAI,YAAY;AAAA,IAC1B,WAAW,IAAI,aAAa;AAAA,IAC5B,gBAAgB,IAAI,kBAAkB;AAAA,EAAA;AAE1C;AAEO,SAAS,oBACd,WAC6B;AAC7B,MAAI,CAAC,UAAU,KAAK;AAClB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,UAAU;AAAA,IACf,OAAO,oBAAoB,UAAU,KAAK;AAAA,EAAA;AAE9C;AAEO,SAAS,uBACd,OACyB;AACzB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EAEV;AAEA,SAAO;AAAA,IACL,MAAK,+BAAO,QAAO,2BAA2B;AAAA,IAC9C,QAAO,+BAAO,UAAS,2BAA2B;AAAA,IAClD,SAAQ,+BAAO,WAAU,2BAA2B;AAAA,IACpD,OAAM,+BAAO,SAAQ,2BAA2B;AAAA,EAAA;AAEpD;AAEO,SAAS,iBACd,UACA,MACA,UACA,SACa;AACb,QAAM,OAAO,QAAQ;AACrB,QAAM,OAAO,QAAQ;AACrB,QAAM,OAAO,KAAK,IAAI,MAAM,SAAS,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AACvE,QAAM,OAAO,KAAK,IAAI,MAAM,SAAS,SAAS,KAAK,SAAS,QAAQ,MAAM;AAE1E,SAAO;AAAA,IACL,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,SAAS,CAAC,CAAC;AAAA,IAC5C,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,SAAS,CAAC,CAAC;AAAA,EAAA;AAEhD;AAEO,SAAS,qBACd,KACA,MACA,UACA,SACa;AACb,QAAM,oBAAoB,SAAS,QAAQ,KAAK,SAAS;AACzD,QAAM,kBAAkB,SAAS,SAAS,KAAK,UAAU;AACzD,QAAM,QAAQ,SAAS,QAAQ,KAAK,QAAQ,QAAQ;AACpD,QAAM,SAAS,SAAS,SAAS,KAAK,SAAS,QAAQ;AAEvD,UAAQ,KAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,QAAQ,MAAM,GAAG,QAAQ,IAAA;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,kBAAkB,GAAG,QAAQ,IAAA;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,OAAO,GAAG,QAAQ,IAAA;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,QAAQ,MAAM,GAAG,eAAA;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,kBAAkB,GAAG,eAAA;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,OAAO,GAAG,eAAA;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,QAAQ,MAAM,GAAG,OAAA;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,kBAAkB,GAAG,OAAA;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AAAA,IACL;AACE,aAAO,iBAAiB,EAAE,GAAG,OAAO,GAAG,UAAU,MAAM,UAAU,OAAO;AAAA,EAAA;AAE9E;AC1WO,MAAM,4CACX;ACYK,SAAS,kBAAkB,OAA+B;AAC/D,SAAO,KAAK,UAAU;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,EAAA,CACP;AACH;AAGO,SAAS,wBACX,QACe;AAClB,QAAM,6BAAa,IAAA;AACnB,aAAW,SAAS,QAAQ;AAC1B,eAAW,SAAS,SAAS,IAAI;AAC/B,YAAM,MAAM,kBAAkB,KAAK;AACnC,UAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,KAAK;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ;AAC5B;AAGO,SAAS,yBAAyB,OAAkC;AACzE,MAAI,CAAC,MAAM,QAAQ,KAAK,UAAU,CAAA;AAClC,QAAM,SAA2B,CAAA;AACjC,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,KAAK,eAAe;AAC3D;AACF,UAAM,EAAE,WAAW;AACnB,QACE,CAAC,UACD,OAAO,WAAW,YAClB,CAAC,CAAC,aAAa,WAAW,aAAa,QAAQ,EAAE,SAAS,OAAO,IAAI,KACrE,OAAO,OAAO,OAAO,YACrB,CAAC,OAAO,GAAG,KAAA;AAEX;AACF,QACE,OAAO,KAAK,YAAY,YACxB,CAAC,KAAK,QAAQ,UACd,OAAO,KAAK,SAAS,YACrB,CAAC,KAAK,KAAK,KAAA,KACX,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,eAAe,YAC3B,CAAC,KAAK,WAAW,UACjB,OAAO,KAAK,aAAa,YACzB,CAAC,OAAO,SAAS,KAAK,MAAM,KAAK,QAAQ,CAAC;AAE1C;AACF,WAAO,KAAK;AAAA,MACV,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,QAAQ,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAA;AAAA,MACxC,YAAY;AAAA,MACZ,YAAY,KAAK;AAAA,MACjB,GAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,cAC7C,EAAE,aAAa,KAAK,YAAA,IACpB,CAAA;AAAA,MACJ,UAAU,KAAK;AAAA,IAAA,CAChB;AAAA,EACH;AACA,SAAO,qBAAqB,MAAM;AACpC;AAEA,SAAS,mBAAmB,SAAoC;AAC9D,SAAO,WACL,OAAO,YAAY,YACnB,aAAa,WACb,QAAQ,YAAY,KACpB,iBAAiB,UACf,yBAAyB,QAAQ,WAAW,IAC5C,CAAA;AACN;AAGO,SAAS,sBAAsB,SAGjB;;AACnB,QAAM,SAAS,CAAC,mBAAmB,QAAQ,WAAW,CAAC;AACvD,MAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,eAAW,QAAQ,QAAQ,SAAS;AAClC,WAAI,6BAAM,UAAS,iBAAe,UAAK,SAAL,mBAAW,YAAW,WAAW;AACjE,eAAO,KAAK,mBAAmB,KAAK,KAAK,WAAW,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACA,SAAO,qBAAqB,GAAG,MAAM;AACvC;AC1GO,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xpert-ai/chatkit-types",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "Type definitions for the ChatKit.",
5
5
  "sideEffects": false,
6
6
  "type": "module",