@xpert-ai/chatkit-types 0.5.1 → 0.5.3
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 +38 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +34 -0
- package/dist/index.js +38 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -69,6 +69,30 @@ function normalizeHITLReviewConfig(value) {
|
|
|
69
69
|
...argsSchema ? { argsSchema } : {}
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
+
function normalizeHITLMCPElicitation(value) {
|
|
73
|
+
if (!isRecord(value) || value.kind !== "mcp_elicitation") return null;
|
|
74
|
+
const actionName = readStringField(value, "actionName");
|
|
75
|
+
const field = readRecordField(value, "field");
|
|
76
|
+
if (!actionName || !field) return null;
|
|
77
|
+
const name = readStringField(field, "name");
|
|
78
|
+
if (!name || field.type !== "boolean" || field.required !== true) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (field.title !== void 0 && typeof field.title !== "string") {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const title = readStringField(field, "title");
|
|
85
|
+
return {
|
|
86
|
+
kind: "mcp_elicitation",
|
|
87
|
+
actionName,
|
|
88
|
+
field: {
|
|
89
|
+
name,
|
|
90
|
+
type: "boolean",
|
|
91
|
+
required: true,
|
|
92
|
+
...title ? { title } : {}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
72
96
|
function normalizeHITLRequest(value) {
|
|
73
97
|
if (!isRecord(value)) return null;
|
|
74
98
|
const actionRequests = readArrayField(
|
|
@@ -90,13 +114,25 @@ function normalizeHITLRequest(value) {
|
|
|
90
114
|
const normalizedReviewConfigs = reviewConfigs.map(
|
|
91
115
|
normalizeHITLReviewConfig
|
|
92
116
|
);
|
|
93
|
-
if (normalizedActionRequests.some((request) => request === null) || normalizedReviewConfigs.some((
|
|
117
|
+
if (normalizedActionRequests.some((request) => request === null) || normalizedReviewConfigs.some((config2) => config2 === null)) {
|
|
94
118
|
return null;
|
|
95
119
|
}
|
|
96
|
-
|
|
120
|
+
const normalizedRequest = {
|
|
97
121
|
actionRequests: normalizedActionRequests,
|
|
98
122
|
reviewConfigs: normalizedReviewConfigs
|
|
99
123
|
};
|
|
124
|
+
const elicitation = normalizeHITLMCPElicitation(value.elicitation);
|
|
125
|
+
if (!elicitation || normalizedRequest.actionRequests.length !== 1) {
|
|
126
|
+
return normalizedRequest;
|
|
127
|
+
}
|
|
128
|
+
const action = normalizedRequest.actionRequests[0];
|
|
129
|
+
const config = normalizedRequest.reviewConfigs.find(
|
|
130
|
+
(reviewConfig) => reviewConfig.actionName === elicitation.actionName
|
|
131
|
+
);
|
|
132
|
+
if (!action || action.name !== elicitation.actionName || !config || typeof action.args[elicitation.field.name] !== "boolean" || !config.allowedDecisions.includes("approve") || !config.allowedDecisions.includes("reject")) {
|
|
133
|
+
return normalizedRequest;
|
|
134
|
+
}
|
|
135
|
+
return { ...normalizedRequest, elicitation };
|
|
100
136
|
}
|
|
101
137
|
function isClientToolRequest(value) {
|
|
102
138
|
return isRecord(value) && Array.isArray(value.clientToolCalls);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/pet.ts","../src/task-summary.ts","../src/tool-output.ts"],"sourcesContent":["import { 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}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\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 };\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\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 return {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/pet.ts","../src/task-summary.ts","../src/tool-output.ts"],"sourcesContent":["import { 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}\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 };\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":";;;;AAEO,MAAM,+BAA+B;AAErC,MAAM,iCAAiC;AAEvC,MAAM,uDACX;AACK,MAAM,gEACX;AAuDK,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAkLA,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,gBAAgB,CAAA;AAAA,EAAC;AAEvD;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;ACviBO,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;ACyCO,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;AC5WO,MAAM,4CACX;ACDK,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -351,6 +351,21 @@ export declare type ChatKitLayoutOptions = {
|
|
|
351
351
|
maxWidth?: number | string;
|
|
352
352
|
};
|
|
353
353
|
|
|
354
|
+
export declare type ChatKitMcpAppsOptions = {
|
|
355
|
+
/**
|
|
356
|
+
* URL of the host-owned MCP Apps sandbox proxy page. Web hosts must serve
|
|
357
|
+
* this page from an origin different from the ChatKit frame.
|
|
358
|
+
*/
|
|
359
|
+
sandboxProxyUrl?: string;
|
|
360
|
+
/**
|
|
361
|
+
* Host-approved dedicated domains. Exact hostnames and leading-wildcard
|
|
362
|
+
* entries such as `*.mcp-apps.example.com` are supported. A resource's
|
|
363
|
+
* `ui.domain` is never used unless it matches this list or the configured
|
|
364
|
+
* proxy URL hostname exactly.
|
|
365
|
+
*/
|
|
366
|
+
allowedDomains?: string[];
|
|
367
|
+
};
|
|
368
|
+
|
|
354
369
|
export declare interface ChatkitMessage {
|
|
355
370
|
status?: string;
|
|
356
371
|
content: TMessageItems | string;
|
|
@@ -430,6 +445,11 @@ export declare type ChatKitOptions = {
|
|
|
430
445
|
* @default disabled
|
|
431
446
|
*/
|
|
432
447
|
workbench?: ChatKitWorkbenchOptions;
|
|
448
|
+
/**
|
|
449
|
+
* MCP Apps web-host isolation. When omitted or invalid, ChatKit retains the
|
|
450
|
+
* credential-isolated opaque-origin iframe fallback.
|
|
451
|
+
*/
|
|
452
|
+
mcpApps?: ChatKitMcpAppsOptions;
|
|
433
453
|
/**
|
|
434
454
|
* Optional animated pet companion rendered by the ChatKit web component over
|
|
435
455
|
* the host page viewport.
|
|
@@ -1300,6 +1320,13 @@ export declare interface HITLApproveDecision {
|
|
|
1300
1320
|
type: 'approve';
|
|
1301
1321
|
}
|
|
1302
1322
|
|
|
1323
|
+
export declare interface HITLBooleanElicitationField {
|
|
1324
|
+
name: string;
|
|
1325
|
+
type: 'boolean';
|
|
1326
|
+
title?: string;
|
|
1327
|
+
required: true;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1303
1330
|
export declare type HITLDecision = HITLApproveDecision | HITLEditDecision | HITLRejectDecision | HITLRespondDecision;
|
|
1304
1331
|
|
|
1305
1332
|
export declare type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];
|
|
@@ -1315,6 +1342,12 @@ export declare type HITLInterruptPayload<TRequest extends HITLRequest = HITLRequ
|
|
|
1315
1342
|
|
|
1316
1343
|
export declare type HITLInterruptTask<TRequest extends HITLRequest = HITLRequest> = LangGraphInterruptTask<TRequest>;
|
|
1317
1344
|
|
|
1345
|
+
export declare interface HITLMCPElicitation {
|
|
1346
|
+
kind: 'mcp_elicitation';
|
|
1347
|
+
actionName: string;
|
|
1348
|
+
field: HITLBooleanElicitationField;
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1318
1351
|
export declare interface HITLRejectDecision {
|
|
1319
1352
|
type: 'reject';
|
|
1320
1353
|
message?: string;
|
|
@@ -1323,6 +1356,7 @@ export declare interface HITLRejectDecision {
|
|
|
1323
1356
|
export declare interface HITLRequest {
|
|
1324
1357
|
actionRequests: HITLActionRequest[];
|
|
1325
1358
|
reviewConfigs: HITLReviewConfig[];
|
|
1359
|
+
elicitation?: HITLMCPElicitation;
|
|
1326
1360
|
}
|
|
1327
1361
|
|
|
1328
1362
|
export declare interface HITLRespondDecision {
|
package/dist/index.js
CHANGED
|
@@ -67,6 +67,30 @@ function normalizeHITLReviewConfig(value) {
|
|
|
67
67
|
...argsSchema ? { argsSchema } : {}
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
|
+
function normalizeHITLMCPElicitation(value) {
|
|
71
|
+
if (!isRecord(value) || value.kind !== "mcp_elicitation") return null;
|
|
72
|
+
const actionName = readStringField(value, "actionName");
|
|
73
|
+
const field = readRecordField(value, "field");
|
|
74
|
+
if (!actionName || !field) return null;
|
|
75
|
+
const name = readStringField(field, "name");
|
|
76
|
+
if (!name || field.type !== "boolean" || field.required !== true) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (field.title !== void 0 && typeof field.title !== "string") {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const title = readStringField(field, "title");
|
|
83
|
+
return {
|
|
84
|
+
kind: "mcp_elicitation",
|
|
85
|
+
actionName,
|
|
86
|
+
field: {
|
|
87
|
+
name,
|
|
88
|
+
type: "boolean",
|
|
89
|
+
required: true,
|
|
90
|
+
...title ? { title } : {}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
70
94
|
function normalizeHITLRequest(value) {
|
|
71
95
|
if (!isRecord(value)) return null;
|
|
72
96
|
const actionRequests = readArrayField(
|
|
@@ -88,13 +112,25 @@ function normalizeHITLRequest(value) {
|
|
|
88
112
|
const normalizedReviewConfigs = reviewConfigs.map(
|
|
89
113
|
normalizeHITLReviewConfig
|
|
90
114
|
);
|
|
91
|
-
if (normalizedActionRequests.some((request) => request === null) || normalizedReviewConfigs.some((
|
|
115
|
+
if (normalizedActionRequests.some((request) => request === null) || normalizedReviewConfigs.some((config2) => config2 === null)) {
|
|
92
116
|
return null;
|
|
93
117
|
}
|
|
94
|
-
|
|
118
|
+
const normalizedRequest = {
|
|
95
119
|
actionRequests: normalizedActionRequests,
|
|
96
120
|
reviewConfigs: normalizedReviewConfigs
|
|
97
121
|
};
|
|
122
|
+
const elicitation = normalizeHITLMCPElicitation(value.elicitation);
|
|
123
|
+
if (!elicitation || normalizedRequest.actionRequests.length !== 1) {
|
|
124
|
+
return normalizedRequest;
|
|
125
|
+
}
|
|
126
|
+
const action = normalizedRequest.actionRequests[0];
|
|
127
|
+
const config = normalizedRequest.reviewConfigs.find(
|
|
128
|
+
(reviewConfig) => reviewConfig.actionName === elicitation.actionName
|
|
129
|
+
);
|
|
130
|
+
if (!action || action.name !== elicitation.actionName || !config || typeof action.args[elicitation.field.name] !== "boolean" || !config.allowedDecisions.includes("approve") || !config.allowedDecisions.includes("reject")) {
|
|
131
|
+
return normalizedRequest;
|
|
132
|
+
}
|
|
133
|
+
return { ...normalizedRequest, elicitation };
|
|
98
134
|
}
|
|
99
135
|
function isClientToolRequest(value) {
|
|
100
136
|
return isRecord(value) && Array.isArray(value.clientToolCalls);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/pet.ts","../src/task-summary.ts","../src/tool-output.ts"],"sourcesContent":["import { 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}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\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 };\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\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 return {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/pet.ts","../src/task-summary.ts","../src/tool-output.ts"],"sourcesContent":["import { 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}\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 };\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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"}
|