@xpert-ai/chatkit-types 0.6.3 → 0.7.0
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 +11 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +80 -0
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const constants = require("./constants.cjs");
|
|
4
4
|
require("@langchain/core/messages/tool");
|
|
5
|
+
function isApprovalHostReference(value) {
|
|
6
|
+
return !!value && typeof value === "object" && "kind" in value && typeof value.kind === "string" && value.kind.length > 0 && "id" in value && typeof value.id === "string" && value.id.length > 0 && "expiresAt" in value && typeof value.expiresAt === "number" && Number.isFinite(value.expiresAt);
|
|
7
|
+
}
|
|
5
8
|
function isLocalizedText(value) {
|
|
6
9
|
return typeof value === "string" || !!value && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((item) => typeof item === "string" || item === void 0);
|
|
7
10
|
}
|
|
@@ -131,9 +134,7 @@ function normalizeHITLRequest(value) {
|
|
|
131
134
|
const normalizedActionRequests = actionRequests.map(
|
|
132
135
|
normalizeHITLActionRequest
|
|
133
136
|
);
|
|
134
|
-
const normalizedReviewConfigs = reviewConfigs.map(
|
|
135
|
-
normalizeHITLReviewConfig
|
|
136
|
-
);
|
|
137
|
+
const normalizedReviewConfigs = reviewConfigs.map(normalizeHITLReviewConfig);
|
|
137
138
|
if (normalizedActionRequests.some((request) => request === null) || normalizedReviewConfigs.some((config2) => config2 === null)) {
|
|
138
139
|
return null;
|
|
139
140
|
}
|
|
@@ -141,6 +142,12 @@ function normalizeHITLRequest(value) {
|
|
|
141
142
|
actionRequests: normalizedActionRequests,
|
|
142
143
|
reviewConfigs: normalizedReviewConfigs
|
|
143
144
|
};
|
|
145
|
+
if (value.host !== void 0) {
|
|
146
|
+
if (!isApprovalHostReference(value.host)) return null;
|
|
147
|
+
normalizedRequest.host = value.host;
|
|
148
|
+
}
|
|
149
|
+
if (typeof value.toolCallId === "string")
|
|
150
|
+
normalizedRequest.toolCallId = value.toolCallId;
|
|
144
151
|
const elicitation = normalizeHITLMCPElicitation(value.elicitation);
|
|
145
152
|
if (!elicitation || normalizedRequest.actionRequests.length !== 1) {
|
|
146
153
|
return normalizedRequest;
|
|
@@ -847,6 +854,7 @@ exports.getFileActivityContribution = getFileActivityContribution;
|
|
|
847
854
|
exports.getLegacyFileActivityContribution = getLegacyFileActivityContribution;
|
|
848
855
|
exports.getMessageSkillUsages = getMessageSkillUsages;
|
|
849
856
|
exports.getPinnedPetPosition = getPinnedPetPosition;
|
|
857
|
+
exports.isApprovalHostReference = isApprovalHostReference;
|
|
850
858
|
exports.isClientToolInterrupt = isClientToolInterrupt;
|
|
851
859
|
exports.isClientToolInterruptPayload = isClientToolInterruptPayload;
|
|
852
860
|
exports.isClientToolInterruptTask = isClientToolInterruptTask;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/thread-reference.ts","../src/pet.ts","../src/task-summary.ts","../src/skill-usage.ts","../src/tool-output.ts","../src/file-activity-receipt.ts","../src/file-activity.ts","../src/file-change-lines.ts"],"sourcesContent":["import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import { isHITLReviewDisplay, type HITLReviewDisplay } from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\n elicitation?: HITLMCPElicitation;\n}\n\nexport interface HITLApproveDecision {\n type: 'approve';\n}\n\nexport interface HITLEditDecision {\n type: 'edit';\n editedAction: HITLAction;\n}\n\nexport interface HITLRejectDecision {\n type: 'reject';\n message?: string;\n}\n\nexport interface HITLRespondDecision {\n type: 'respond';\n message: string;\n}\n\nexport type HITLDecision =\n | HITLApproveDecision\n | HITLEditDecision\n | HITLRejectDecision\n | HITLRespondDecision;\n\nexport interface HITLResponse {\n decisions: HITLDecision[];\n}\n\nexport type InterruptRequest =\n | ToolCallRequest\n | ClientToolRequest\n | HITLRequest;\n\nexport interface LangGraphInterrupt<TValue = unknown> {\n id: string;\n value: TValue;\n when?: string;\n resumable?: boolean;\n ns?: string[];\n}\n\nexport interface LangGraphInterruptTask<TValue = unknown> {\n id: string;\n name: string;\n path: Array<string | number>;\n interrupts: Array<LangGraphInterrupt<TValue>>;\n}\n\nexport interface LangGraphInterruptPayload<TValue = unknown> {\n tasks: Array<LangGraphInterruptTask<TValue>>;\n}\n\nexport type ClientToolInterrupt<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ClientToolInterruptTask<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ClientToolInterruptPayload<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type ToolCallInterrupt<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ToolCallInterruptTask<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ToolCallInterruptPayload<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type HITLInterrupt<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterrupt<TRequest>;\n\nexport type HITLInterruptTask<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptTask<TRequest>;\n\nexport type HITLInterruptPayload<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptPayload<TRequest>;\n\n/**\n * When an interrupt occurs during task execution, the system generates an InterruptPayload.\n *\n * Ordinary tool-call interrupts use `toolCalls`; ChatKit client-tool middleware\n * uses `clientToolCalls` so the UI can route those calls to the client.\n * Human-in-the-loop interrupts use `actionRequests` and `reviewConfigs` so\n * ChatKit can collect reviewer decisions and resume with `{ decisions }`.\n```json\n{\n \"type\": \"event\",\n \"event\": \"on_interrupt\",\n \"data\": {\n \"tasks\": [\n {\n \"id\": \"9c4d2ac5-8808-5b6f-855c-4d48aa3d77a7\",\n \"name\": \"Middleware_wPzR2bIXqE_after_model\",\n \"path\": [\"__pregel_pull\", \"Middleware_wPzR2bIXqE_after_model\"],\n \"interrupts\": [\n {\n \"id\": \"b42f7887d65e57ed11cf08b8927763db\",\n \"value\": {\n \"toolCalls\": [\n {\n \"name\": \"getUserStation\",\n \"args\": {\n \"input\": \"Query the site selected by the user\"\n },\n \"id\": \"call_00_swcaUjIaACXOHHaZyNmQB3Vm\",\n \"type\": \"tool_call\"\n }\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n */\nexport interface InterruptPayload extends LangGraphInterruptPayload<InterruptRequest> {}\n\nexport interface ClientToolMessageInput {\n content: unknown;\n name?: string;\n tool_call_id?: string;\n status?: 'success' | 'error';\n artifact?: unknown;\n}\n\nexport interface ClientToolResponse {\n toolMessages: ClientToolMessageInput[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readRecordField(\n value: Record<string, unknown>,\n ...keys: string[]\n): Record<string, unknown> | null {\n for (const key of keys) {\n const field = value[key];\n if (isRecord(field)) return field;\n }\n\n return null;\n}\n\nfunction readArrayField(value: Record<string, unknown>, ...keys: string[]) {\n for (const key of keys) {\n const field = value[key];\n if (Array.isArray(field)) return field;\n }\n\n return null;\n}\n\nfunction readStringField(\n value: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const field = value[key];\n if (typeof field === 'string' && field.trim()) return field;\n }\n\n return null;\n}\n\nexport function isHITLDecisionType(\n value: unknown,\n): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(\n value: unknown,\n): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(\n value: unknown,\n): HITLReviewConfig | null {\n if (!isRecord(value)) return null;\n\n const actionName = readStringField(value, 'actionName', 'action_name');\n const allowedDecisions = readArrayField(\n value,\n 'allowedDecisions',\n 'allowed_decisions',\n );\n if (!actionName || !allowedDecisions) return null;\n\n const normalizedDecisions = allowedDecisions.filter(isHITLDecisionType);\n if (normalizedDecisions.length !== allowedDecisions.length) return null;\n\n const argsSchema = readRecordField(value, 'argsSchema', 'args_schema');\n\n return {\n actionName,\n allowedDecisions: normalizedDecisions,\n ...(argsSchema ? { argsSchema } : {}),\n };\n}\n\nfunction normalizeHITLMCPElicitation(\n value: unknown,\n): HITLMCPElicitation | null {\n if (!isRecord(value) || value.kind !== 'mcp_elicitation') return null;\n\n const actionName = readStringField(value, 'actionName');\n const field = readRecordField(value, 'field');\n if (!actionName || !field) return null;\n\n const name = readStringField(field, 'name');\n if (!name || field.type !== 'boolean' || field.required !== true) {\n return null;\n }\n if (field.title !== undefined && typeof field.title !== 'string') {\n return null;\n }\n\n const title = readStringField(field, 'title');\n return {\n kind: 'mcp_elicitation',\n actionName,\n field: {\n name,\n type: 'boolean',\n required: true,\n ...(title ? { title } : {}),\n },\n };\n}\n\nexport function normalizeHITLRequest(value: unknown): HITLRequest | null {\n if (!isRecord(value)) return null;\n\n const actionRequests = readArrayField(\n value,\n 'actionRequests',\n 'action_requests',\n );\n const reviewConfigs = readArrayField(\n value,\n 'reviewConfigs',\n 'review_configs',\n );\n if (\n !actionRequests ||\n !reviewConfigs ||\n actionRequests.length === 0 ||\n reviewConfigs.length === 0\n ) {\n return null;\n }\n\n const normalizedActionRequests = actionRequests.map(\n normalizeHITLActionRequest,\n );\n const normalizedReviewConfigs = reviewConfigs.map(\n normalizeHITLReviewConfig,\n );\n if (\n normalizedActionRequests.some((request) => request === null) ||\n normalizedReviewConfigs.some((config) => config === null)\n ) {\n return null;\n }\n\n const normalizedRequest: HITLRequest = {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","/** A live reference to a conversation branch, never a client-supplied transcript. */\nexport type ChatKitThreadReference = {\n type: 'thread';\n id?: string;\n label?: string;\n conversationId: string;\n threadId: string;\n};\n\nexport function normalizeThreadReference(\n value: unknown,\n): ChatKitThreadReference | null {\n if (\n !value ||\n typeof value !== 'object' ||\n !('type' in value) ||\n value.type !== 'thread'\n )\n return null;\n if (\n !('conversationId' in value) ||\n !isLocator(value.conversationId) ||\n !('threadId' in value) ||\n !isLocator(value.threadId)\n )\n return null;\n if (\n 'label' in value &&\n value.label !== undefined &&\n (typeof value.label !== 'string' || value.label.length > 300)\n )\n return null;\n if ('id' in value && value.id !== undefined && !isLocator(value.id))\n return null;\n return {\n type: 'thread',\n conversationId: value.conversationId.trim(),\n threadId: value.threadId.trim(),\n ...('label' in value && typeof value.label === 'string'\n ? { label: value.label.trim() }\n : {}),\n ...('id' in value && typeof value.id === 'string'\n ? { id: value.id.trim() }\n : {}),\n };\n}\n\nfunction isLocator(value: unknown): value is string {\n return (\n typeof value === 'string' && value.trim().length > 0 && value.length <= 128\n );\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","import type { ChatSkillUsage } from './skill-usage.js';\nimport type { ChatFileChange } from './file-activity.js';\n\nexport const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type FileChangeResource = {\n type: 'file_change';\n first: { artifactId: string; artifactVersionId: string };\n last: { artifactId: string; artifactVersionId: string };\n};\n\nexport type FileChangeSetResource = {\n type: 'file_change_set';\n messageId: string;\n changes: { workspacePath: string; resource?: FileChangeResource }[];\n};\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 artifactVersionId?: string;\n }\n | FileChangeResource\n | FileChangeSetResource\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 /** Only host-verified, explicitly presented files get message-end cards. */\n origin?: 'tool' | 'integration' | 'legacy';\n workspacePath?: string;\n mimeType?: string;\n size?: number;\n sha256?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n skillUsages?: ChatSkillUsage[];\n /** Presence marks the new semantic projection; old writes are never deliveries. */\n fileActivityVersion?: 1;\n fileActivityToolCallId?: string;\n fileChangeCoverage?: 'bounded' | 'partial' | 'unavailable';\n fileChanges?: ChatFileChange[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","/** Snapshot produced by the runtime after successfully loading skill instructions. */\nexport type ChatSkillUsage = {\n skillId: string;\n name: string;\n version: string;\n source: {\n type: 'workspace' | 'project' | 'assistant' | 'plugin';\n id: string;\n };\n activation: 'read';\n toolCallId: string;\n executionId?: string;\n loadedAt: string;\n};\n\nexport function chatSkillUsageKey(usage: ChatSkillUsage): string {\n return JSON.stringify([\n usage.source.type,\n usage.source.id,\n usage.skillId,\n usage.version,\n ]);\n}\n\n/** Merge only observations belonging to the same message. Keep the first read. */\nexport function mergeChatSkillUsages(\n ...groups: ReadonlyArray<readonly ChatSkillUsage[] | undefined>\n): ChatSkillUsage[] {\n const usages = new Map<string, ChatSkillUsage>();\n for (const group of groups) {\n for (const usage of group ?? []) {\n const key = chatSkillUsageKey(usage);\n if (!usages.has(key)) usages.set(key, usage);\n }\n }\n return [...usages.values()];\n}\n\n/** JSON boundary: allowlist fields rather than forwarding paths or raw tool data. */\nexport function normalizeChatSkillUsages(value: unknown): ChatSkillUsage[] {\n if (!Array.isArray(value)) return [];\n const usages: ChatSkillUsage[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object' || item.activation !== 'read')\n continue;\n const { source } = item;\n if (\n !source ||\n typeof source !== 'object' ||\n !['workspace', 'project', 'assistant', 'plugin'].includes(source.type) ||\n typeof source.id !== 'string' ||\n !source.id.trim()\n )\n continue;\n if (\n typeof item.skillId !== 'string' ||\n !item.skillId.trim() ||\n typeof item.name !== 'string' ||\n !item.name.trim() ||\n typeof item.version !== 'string' ||\n typeof item.toolCallId !== 'string' ||\n !item.toolCallId.trim() ||\n typeof item.loadedAt !== 'string' ||\n !Number.isFinite(Date.parse(item.loadedAt))\n )\n continue;\n usages.push({\n skillId: item.skillId,\n name: item.name,\n version: item.version,\n source: { type: source.type, id: source.id },\n activation: 'read',\n toolCallId: item.toolCallId,\n ...(typeof item.executionId === 'string' && item.executionId\n ? { executionId: item.executionId }\n : {}),\n loadedAt: item.loadedAt,\n });\n }\n return mergeChatSkillUsages(usages);\n}\n\nfunction summarySkillUsages(summary: unknown): ChatSkillUsage[] {\n return summary &&\n typeof summary === 'object' &&\n 'version' in summary &&\n summary.version === 1 &&\n 'skillUsages' in summary\n ? normalizeChatSkillUsages(summary.skillUsages)\n : [];\n}\n\n/** Works for both streamed tool components and persisted message summaries. */\nexport function getMessageSkillUsages(message: {\n content?: unknown;\n taskSummary?: unknown;\n}): ChatSkillUsage[] {\n const groups = [summarySkillUsages(message.taskSummary)];\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part?.type === 'component' && part.data?.status === 'success') {\n groups.push(summarySkillUsages(part.data.taskSummary));\n }\n }\n }\n return mergeChatSkillUsages(...groups);\n}\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n","import type { ChatFileChange } from './file-activity.js';\nimport { normalizeFileChanges, normalizeFileOutputs } from './file-activity.js';\nimport type { ChatTaskSummaryOutput, TChatTaskSummaryContribution } from './task-summary.js';\n\n/** Host-owned facts from a tool execution, never an additional tool invocation. */\nexport type FileActivityReceipt = {\n version: 1;\n receiptId: string;\n toolCallId: string;\n updatedAt: string;\n} & (\n | { kind: 'changes'; coverage: 'bounded' | 'partial' | 'unavailable'; fileChanges: ChatFileChange[] }\n | { kind: 'delivery'; status: 'success'; outputs: ChatTaskSummaryOutput[] }\n | { kind: 'delivery'; status: 'error'; error: string }\n);\n\nexport type TMessageContentFileActivity = {\n id: string;\n type: 'file_activity';\n data: FileActivityReceipt;\n messageId?: string;\n executionId?: string;\n agentKey?: string;\n parentExecutionId?: string;\n runId?: string;\n};\n\nexport function parseFileActivityContent(value: unknown): TMessageContentFileActivity | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as Partial<TMessageContentFileActivity>;\n if (part.type !== 'file_activity' || typeof part.id !== 'string' || !part.id || !part.data || typeof part.data !== 'object') return null;\n const data = part.data;\n if (data.version !== 1 || data.receiptId !== part.id || typeof data.toolCallId !== 'string' || !data.toolCallId\n || typeof data.updatedAt !== 'string' || !Number.isFinite(Date.parse(data.updatedAt))) return null;\n const base = { version: 1 as const, receiptId: part.id, toolCallId: data.toolCallId, updatedAt: data.updatedAt };\n let receipt: FileActivityReceipt;\n if (data.kind === 'changes' && ['bounded', 'partial', 'unavailable'].includes(data.coverage) && Array.isArray(data.fileChanges)) {\n const fileChanges = normalizeFileChanges(data.fileChanges);\n if (fileChanges.length !== data.fileChanges.length) return null;\n receipt = { ...base, kind: 'changes', coverage: data.coverage, fileChanges };\n } else if (data.kind === 'delivery' && data.status === 'success' && Array.isArray(data.outputs)) {\n const outputs = normalizeFileOutputs(data.outputs);\n if (outputs.length !== data.outputs.length) return null;\n receipt = { ...base, kind: 'delivery', status: 'success', outputs };\n } else if (data.kind === 'delivery' && data.status === 'error' && typeof data.error === 'string') {\n receipt = { ...base, kind: 'delivery', status: 'error', error: data.error };\n } else return null;\n return { id: part.id, type: 'file_activity', data: receipt,\n ...(typeof part.messageId === 'string' ? { messageId: part.messageId } : {}),\n ...(typeof part.executionId === 'string' ? { executionId: part.executionId } : {}),\n ...(typeof part.agentKey === 'string' ? { agentKey: part.agentKey } : {}),\n ...(typeof part.parentExecutionId === 'string' ? { parentExecutionId: part.parentExecutionId } : {}),\n ...(typeof part.runId === 'string' ? { runId: part.runId } : {}) };\n}\n\ntype LegacyStep = { id?: unknown; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } };\n/** Compatibility uses explicit metadata and the original call identity, never labels or ID suffixes. */\nexport function getLegacyFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as { id?: unknown; type?: unknown; data?: LegacyStep };\n const step = part.type === 'component' ? part.data : value as LegacyStep;\n if (!step || typeof step !== 'object') return null;\n const summary = step.taskSummary ?? step._meta?.['xpertai/taskSummary'];\n const id = part.id ?? step.id;\n return summary?.version === 1 && summary.fileActivityVersion === 1\n && typeof summary.fileActivityToolCallId === 'string' && Boolean(summary.fileActivityToolCallId)\n && typeof id === 'string' && id !== summary.fileActivityToolCallId ? summary : null;\n}\n\nexport function isFileActivityContent(value: unknown): boolean {\n return Boolean(value && typeof value === 'object' && 'type' in value && value.type === 'file_activity')\n || getLegacyFileActivityContribution(value) !== null;\n}\n\nexport function getFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n const part = parseFileActivityContent(value);\n if (!part) return getLegacyFileActivityContribution(value);\n const receipt = part.data;\n return { version: 1, fileActivityVersion: 1, fileActivityToolCallId: receipt.toolCallId,\n ...(receipt.kind === 'changes' ? { fileChanges: receipt.fileChanges, fileChangeCoverage: receipt.coverage }\n : receipt.status === 'success' ? { outputs: receipt.outputs } : {}) };\n}\n\n/** Receipts are immutable terminal facts; replay replaces by identity, never appends a second operation. */\nexport function upsertFileActivityContent<T>(content: T[], receipt: TMessageContentFileActivity): (T | TMessageContentFileActivity)[] {\n const index = content.findIndex((item) => parseFileActivityContent(item)?.id === receipt.id);\n if (index < 0) return [...content, receipt];\n const previous = parseFileActivityContent(content[index]);\n if (previous && Date.parse(previous.data.updatedAt) >= Date.parse(receipt.data.updatedAt)) return content;\n return content.map((item, position) => position === index ? receipt : item);\n}\n","import { getFileActivityContribution } from './file-activity-receipt.js';\nimport type { ChatTaskSummaryOutput, ChatTaskSummaryResourceReference, TChatTaskSummaryContribution } from './task-summary.js';\n\nexport type FileRevision = { sha256: string; size: number };\nexport type ChatFileChange = {\n id: string;\n workspacePath: string;\n title: string;\n operation: 'added' | 'modified' | 'deleted' | 'unknown';\n before?: FileRevision | null;\n after?: FileRevision | null;\n resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>;\n coverage: 'observed' | 'legacy';\n messageId?: string;\n startedAt?: string;\n updatedAt?: string;\n};\nexport type FileChangeLineStats =\n | { status: 'ready'; added: number; removed: number }\n | { status: 'unavailable' };\nexport type MessageFileChangeStats = {\n messageId: string;\n items: { workspacePath: string; resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>; stats: FileChangeLineStats }[];\n};\n/** Stable cache identity for a fixed review range; never identifies mutable workspace bytes. */\nexport function fileChangeRangeKey(resource: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>) {\n return JSON.stringify([resource.first.artifactId, resource.first.artifactVersionId, resource.last.artifactId, resource.last.artifactVersionId]);\n}\n\n/** Private review payload. Never include text/diffs in compact task summaries. */\nexport type FileChangeReport = {\n schema: 'xpert.file-change.v1';\n workspacePath: string;\n before: (FileRevision & { text?: string }) | null;\n after: (FileRevision & { text?: string }) | null;\n};\n\nconst writeTools = new Set(['sandbox_write_file', 'sandbox_append_file', 'sandbox_edit_file', 'sandbox_multi_edit_file']);\ntype Part = { id?: string; type?: string; data?: { tool?: string; status?: string; input?: { file_path?: string }; output?: string; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } } };\nexport type FileActivityMessage = { id?: string; content?: unknown; taskSummary?: TChatTaskSummaryContribution; updatedAt?: string | Date; createdAt?: string | Date };\n\nexport function normalizeFileChanges(value: unknown): ChatFileChange[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is ChatFileChange => {\n if (!item || typeof item !== 'object') return false;\n const change = item as Partial<ChatFileChange>;\n return typeof change.id === 'string' && typeof change.workspacePath === 'string' && typeof change.title === 'string'\n && ['added', 'modified', 'deleted', 'unknown'].includes(change.operation ?? '')\n && ['observed', 'legacy'].includes(change.coverage ?? '')\n && (!change.resource || (change.resource.type === 'file_change' && validVersion(change.resource.first) && validVersion(change.resource.last)))\n && validRevision(change.before) && validRevision(change.after);\n }).map(({ id, title, workspacePath, operation, before, after, resource, coverage, messageId, startedAt, updatedAt }) => ({\n id, title, workspacePath, operation, before: compactRevision(before), after: compactRevision(after), resource, coverage, messageId, startedAt, updatedAt,\n }));\n}\nfunction compactRevision(value: FileRevision | null | undefined) {\n return value ? { sha256: value.sha256, size: value.size } : value;\n}\nexport function normalizeFileOutputs(value: unknown): ChatTaskSummaryOutput[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n if (!item || typeof item !== 'object') return [];\n const output = compactOutput(item as ChatTaskSummaryOutput);\n return output ? [output] : [];\n });\n}\nfunction compactOutput(value: ChatTaskSummaryOutput): ChatTaskSummaryOutput | null {\n if (!value || typeof value.id !== 'string' || typeof value.title !== 'string'\n || !['file', 'image', 'document', 'spreadsheet', 'presentation', 'site', 'url', 'mcp_app'].includes(value.kind)\n || (value.status !== undefined && value.status !== 'success')) return null;\n const ref = value.resource;\n const resource: ChatTaskSummaryOutput['resource'] = ref?.type === 'artifact' && typeof ref.artifactId === 'string'\n ? { type: 'artifact', artifactId: ref.artifactId, ...(typeof ref.artifactVersionId === 'string' ? { artifactVersionId: ref.artifactVersionId } : {}) }\n : ref?.type === 'workspace_file' && typeof ref.workspacePath === 'string'\n ? { type: 'workspace_file', workspacePath: ref.workspacePath, fileAssetId: ref.fileAssetId, storageFileId: ref.storageFileId }\n : ref?.type === 'url' && typeof ref.url === 'string' ? { type: 'url', url: ref.url } : undefined;\n if (!resource) return null;\n const { id, kind, title, description, status, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt } = value;\n return { id, kind, title, description, status, resource, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt };\n}\nfunction validVersion(value: { artifactId?: string; artifactVersionId?: string } | undefined) {\n return Boolean(value && typeof value.artifactId === 'string' && typeof value.artifactVersionId === 'string');\n}\nfunction validRevision(value: FileRevision | null | undefined) {\n return value == null || (typeof value.sha256 === 'string' && /^[a-f0-9]{64}$/.test(value.sha256) && Number.isSafeInteger(value.size) && value.size >= 0);\n}\n\n/** Collapse observed operations to the net change, retaining immutable first/last review references. */\nexport function mergeFileChanges(items: ChatFileChange[]): ChatFileChange[] {\n const byPath = new Map<string, ChatFileChange>();\n for (const item of [...items].sort((a, b) => (a.startedAt ?? a.updatedAt ?? '').localeCompare(b.startedAt ?? b.updatedAt ?? ''))) {\n const previous = byPath.get(item.workspacePath);\n if (!previous || previous.coverage === 'legacy') { byPath.set(item.workspacePath, item); continue; }\n if (item.coverage === 'legacy') continue;\n const latest = (item.updatedAt ?? '') >= (previous.updatedAt ?? '') ? item : previous;\n const earliest = (item.startedAt ?? item.updatedAt ?? '') < (previous.startedAt ?? previous.updatedAt ?? '') ? item : previous;\n const before = earliest.before;\n const after = latest.after;\n byPath.set(item.workspacePath, {\n ...latest, before, after, startedAt: earliest.startedAt ?? earliest.updatedAt,\n operation: before === null ? 'added' : after === null ? 'deleted' : 'modified',\n resource: earliest.resource && latest.resource ? { type: 'file_change', first: earliest.resource.first, last: latest.resource.last } : latest.resource,\n });\n }\n return [...byPath.values()].filter((item) => item.coverage === 'legacy' || item.before?.sha256 !== item.after?.sha256)\n .sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));\n}\n\n/** Shared live/history projection. Proven tool writes move out of outputs, never filename-based classification. */\nexport function projectMessageFileActivity(message: FileActivityMessage, contribution: TChatTaskSummaryContribution): TChatTaskSummaryContribution {\n const parts = Array.isArray(message.content) ? message.content as Part[] : [];\n const observed: TChatTaskSummaryContribution[] = [];\n const legacyChanges: ChatFileChange[] = [];\n const legacyOutputIds = new Set<string>();\n const date = message.updatedAt ?? message.createdAt;\n const updatedAt = date instanceof Date ? date.toISOString() : date;\n const observedToolCalls = new Set(parts.flatMap((part) => {\n const summary = getFileActivityContribution(part) ?? part.data?.taskSummary ?? part.data?._meta?.['xpertai/taskSummary'];\n return summary?.fileActivityToolCallId ? [summary.fileActivityToolCallId] : [];\n }));\n for (const part of parts) {\n const receipt = getFileActivityContribution(part);\n if (receipt) { observed.push(receipt); continue; }\n if (part?.type !== 'component' || !part.data) continue;\n const data = part.data;\n const explicit = data.taskSummary ?? data._meta?.['xpertai/taskSummary'];\n if (explicit?.version === 1) observed.push(explicit);\n if (!writeTools.has(data.tool ?? '') || data.status !== 'success') continue;\n const path = data.input?.file_path;\n if (typeof path !== 'string' || !path || path.startsWith('/') || path.split('/').includes('..')) continue;\n legacyOutputIds.add(`workspace-file:${path}`);\n if (explicit?.fileActivityVersion === 1 || (part.id && observedToolCalls.has(part.id))) continue;\n // Historical receipts cannot prove a diff or even an actual write; label them honestly.\n legacyChanges.push({ id: `file-change:${path}`, title: path, workspacePath: path, operation: 'unknown', coverage: 'legacy', messageId: message.id, updatedAt });\n }\n if (!observed.length && !legacyOutputIds.size && !contribution.outputs?.length && !contribution.fileChanges?.length) return contribution;\n const outputs = [...(contribution.outputs ?? []), ...observed.flatMap((item) => item.outputs ?? [])];\n const byId = new Map<string, ChatTaskSummaryOutput>();\n for (const raw of outputs) {\n const output = compactOutput(raw);\n if (!output) continue;\n if (legacyOutputIds.has(output.id) && output.origin !== 'tool' && output.origin !== 'integration') continue;\n if ((byId.get(output.id)?.updatedAt ?? '') > (output.updatedAt ?? updatedAt ?? '')) continue;\n byId.set(output.id, { ...output, origin: output.origin ?? 'legacy', messageId: message.id ?? output.messageId, updatedAt: output.updatedAt ?? updatedAt });\n }\n const changes = mergeFileChanges([\n ...legacyChanges,\n ...normalizeFileChanges(contribution.fileChanges),\n ...observed.flatMap((item) => normalizeFileChanges(item.fileChanges)),\n ].map((item) => ({ ...item, messageId: message.id ?? item.messageId })));\n const coverage = [contribution.fileChangeCoverage, ...observed.map((item) => item.fileChangeCoverage)];\n const fileChangeCoverage = coverage.includes('unavailable') ? 'unavailable' : coverage.includes('partial') ? 'partial' : coverage.includes('bounded') ? 'bounded' : undefined;\n return { ...contribution, fileActivityVersion: 1, fileChangeCoverage, outputs: [...byId.values()], fileChanges: changes };\n}\n\nexport function parseFileChangeReport(value: unknown): FileChangeReport | null {\n if (!value || typeof value !== 'object') return null;\n const report = value as Partial<FileChangeReport>;\n const revision = (item: FileChangeReport['before'] | undefined) => item === null || Boolean(item && validRevision(item) && (item.text === undefined || (typeof item.text === 'string' && item.text.length <= 32768)));\n return report.schema === 'xpert.file-change.v1' && typeof report.workspacePath === 'string'\n && revision(report.before) && revision(report.after) ? report as FileChangeReport : null;\n}\n","import type { FileChangeLineStats, FileChangeReport } from './file-activity.js';\n\nconst MAX_DIFF_CELLS = 4_000_000;\n\n/** Exact line LCS with bounded CPU/memory. Unknown text never becomes zero changes. */\nexport function countFileChangeLines(report: FileChangeReport): FileChangeLineStats {\n if ((report.before && report.before.text === undefined) || (report.after && report.after.text === undefined)) return { status: 'unavailable' }\n const lines = (text: string) => text ? text.replace(/\\r\\n/g, '\\n').replace(/\\n$/, '').split('\\n') : []\n const before = lines(report.before?.text ?? ''), after = lines(report.after?.text ?? '')\n let start = 0, endBefore = before.length, endAfter = after.length\n while (start < endBefore && start < endAfter && before[start] === after[start]) start++\n while (endBefore > start && endAfter > start && before[endBefore - 1] === after[endAfter - 1]) { endBefore--; endAfter-- }\n const n = endBefore - start, m = endAfter - start\n if (n * m > MAX_DIFF_CELLS) return { status: 'unavailable' }\n let previous = new Uint32Array(m + 1), current = new Uint32Array(m + 1)\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < m; j++) current[j + 1] = before[start + i] === after[start + j] ? previous[j] + 1 : Math.max(previous[j + 1], current[j])\n ;[previous, current] = [current, previous]\n }\n return { status: 'ready', added: m - previous[m], removed: n - previous[m] }\n}\n"],"names":["config","_a","_c","_b"],"mappings":";;;;AAcA,SAAS,gBAAgB,OAAwC;AAC/D,SAAO,OAAO,UAAU,YAAa,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,KAC/F,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,SAAS,OAAO,SAAS,YAAY,SAAS,MAAS;AACvF;AAEO,SAAS,oBAAoB,OAA4C;AAC9E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,WAAW,UAAU,CAAC,gBAAgB,MAAM,KAAK,KAC1F,EAAE,aAAa,UAAU,CAAC,gBAAgB,MAAM,OAAO,KAAK,EAAE,cAAc,UAAU,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAAG,QAAO;AACjI,SAAO,MAAM,SAAS,MAAM,CAAC,YAAqB;AAChD,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,WAAW,YAAY,CAAC,gBAAgB,QAAQ,KAAK,KAAK,EAAE,UAAU,SAAU,QAAO;AACxI,YAAQ,QAAQ,MAAA;AAAA,MACd,KAAK;AAAQ,eAAO,UAAU,WAAW,gBAAgB,QAAQ,IAAI;AAAA,MACrE,KAAK;AAAQ,eAAO,UAAU,WAAW,OAAO,QAAQ,SAAS;AAAA,MACjE,KAAK;AAAS,eAAO,aAAa,WAAW,MAAM,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,MAAM,CAAC,WAAoB,OAAO,WAAW,QAAQ,KAClJ,UAAU,WAAW,MAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,KAAK,MAAM,CAAC,QAAiB,MAAM,QAAQ,GAAG,KAAK,IAAI,MAAM,CAAC,SAAkB,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,aAAc,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,CAAE,CAAC;AAAA,MAC5Q;AAAS,eAAO;AAAA,IAAA;AAAA,EAEpB,CAAC;AACH;AC5BO,MAAM,+BAA+B;AAErC,MAAM,iCAAiC;AAEvC,MAAM,uDACX;AACK,MAAM,gEACX;AAuDK,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmLA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,gBACP,UACG,MAC6B;AAChC,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,SAAS,KAAK,EAAG,QAAO;AAAA,EAC9B;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,UAAmC,MAAgB;AACzE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,UACG,MACY;AACf,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAA,EAAQ,QAAO;AAAA,EACxD;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,OAC2B;AAC3B,SACE,OAAO,UAAU,YAChB,oBAA0C,SAAS,KAAK;AAE7D;AAEA,SAAS,2BACP,OAC0B;AAC1B,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,OAAO,gBAAgB,OAAO,MAAM;AAC1C,QAAM,OAAO,gBAAgB,OAAO,QAAQ,WAAW;AACvD,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAE3B,QAAM,cACJ,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAE9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,gBAAgB,SAAY,EAAE,YAAA,IAAgB,CAAA;AAAA,IAClD,GAAI,oBAAoB,MAAM,OAAO,IAAI,EAAE,SAAS,MAAM,YAAY,CAAA;AAAA,EAAC;AAE3E;AAEA,SAAS,0BACP,OACyB;AACzB,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,aAAa,gBAAgB,OAAO,cAAc,aAAa;AACrE,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,MAAI,CAAC,cAAc,CAAC,iBAAkB,QAAO;AAE7C,QAAM,sBAAsB,iBAAiB,OAAO,kBAAkB;AACtE,MAAI,oBAAoB,WAAW,iBAAiB,OAAQ,QAAO;AAEnE,QAAM,aAAa,gBAAgB,OAAO,cAAc,aAAa;AAErE,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB;AAAA,IAClB,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,EAAC;AAEvC;AAEA,SAAS,4BACP,OAC2B;AAC3B,MAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,kBAAmB,QAAO;AAEjE,QAAM,aAAa,gBAAgB,OAAO,YAAY;AACtD,QAAM,QAAQ,gBAAgB,OAAO,OAAO;AAC5C,MAAI,CAAC,cAAc,CAAC,MAAO,QAAO;AAElC,QAAM,OAAO,gBAAgB,OAAO,MAAM;AAC1C,MAAI,CAAC,QAAQ,MAAM,SAAS,aAAa,MAAM,aAAa,MAAM;AAChE,WAAO;AAAA,EACT;AACA,MAAI,MAAM,UAAU,UAAa,OAAO,MAAM,UAAU,UAAU;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,gBAAgB,OAAO,OAAO;AAC5C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,MACV,GAAI,QAAQ,EAAE,UAAU,CAAA;AAAA,IAAC;AAAA,EAC3B;AAEJ;AAEO,SAAS,qBAAqB,OAAoC;AACvE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,MACE,CAAC,kBACD,CAAC,iBACD,eAAe,WAAW,KAC1B,cAAc,WAAW,GACzB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,2BAA2B,eAAe;AAAA,IAC9C;AAAA,EAAA;AAEF,QAAM,0BAA0B,cAAc;AAAA,IAC5C;AAAA,EAAA;AAEF,MACE,yBAAyB,KAAK,CAAC,YAAY,YAAY,IAAI,KAC3D,wBAAwB,KAAK,CAACA,YAAWA,YAAW,IAAI,GACxD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAiC;AAAA,IACrC,gBAAgB;AAAA,IAChB,eAAe;AAAA,EAAA;AAEjB,QAAM,cAAc,4BAA4B,MAAM,WAAW;AACjE,MAAI,CAAC,eAAe,kBAAkB,eAAe,WAAW,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,kBAAkB,eAAe,CAAC;AACjD,QAAM,SAAS,kBAAkB,cAAc;AAAA,IAC7C,CAAC,iBAAiB,aAAa,eAAe,YAAY;AAAA,EAAA;AAE5D,MACE,CAAC,UACD,OAAO,SAAS,YAAY,cAC5B,CAAC,UACD,OAAO,OAAO,KAAK,YAAY,MAAM,IAAI,MAAM,aAC/C,CAAC,OAAO,iBAAiB,SAAS,SAAS,KAC3C,CAAC,OAAO,iBAAiB,SAAS,QAAQ,GAC1C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,mBAAmB,YAAA;AACjC;AAEO,SAAS,oBACd,OAC4B;AAC5B,SAAO,SAAS,KAAK,KAAK,MAAM,QAAQ,MAAM,eAAe;AAC/D;AAEO,SAAS,kBAAkB,OAA0C;AAC1E,SAAO,SAAS,KAAK,KAAK,MAAM,QAAQ,MAAM,SAAS;AACzD;AAEO,SAAS,cAAc,OAAsC;AAClE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MACE,CAAC,MAAM,QAAQ,MAAM,cAAc,KACnC,CAAC,MAAM,QAAQ,MAAM,aAAa,GAClC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,qBAAqB,KAAK,MAAM;AACzC;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SACE,kBAAkB,KAAK,KACvB,oBAAoB,KAAK,KACzB,cAAc,KAAK;AAEvB;AAEO,SAAS,qBACd,OAC6B;AAC7B,SACE,SAAS,KAAK,KACd,OAAO,MAAM,OAAO,YACpB,OAAO,UAAU,eAAe,KAAK,OAAO,OAAO;AAEvD;AAEO,SAAS,yBACd,OACiC;AACjC,MACE,CAAC,SAAS,KAAK,KACf,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,SAAS,YACtB,CAAC,MAAM,QAAQ,MAAM,IAAI,KACzB,CAAC,MAAM,QAAQ,MAAM,UAAU,GAC/B;AACA,WAAO;AAAA,EACT;AAEA,SACE,MAAM,KAAK;AAAA,IACT,CAAC,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS;AAAA,EAAA,KACnD,MAAM,WAAW,MAAM,oBAAoB;AAEpD;AAEO,SAAS,4BACd,OACoC;AACpC,SACE,SAAS,KAAK,KACd,MAAM,QAAQ,MAAM,KAAK,KACzB,MAAM,MAAM,MAAM,wBAAwB;AAE9C;AAEO,SAAS,sBACd,OAC8B;AAC9B,SAAO,qBAAqB,KAAK,KAAK,oBAAoB,MAAM,KAAK;AACvE;AAEO,SAAS,0BACd,OACkC;AAClC,SACE,yBAAyB,KAAK,KAC9B,MAAM,WAAW,MAAM,qBAAqB;AAEhD;AAEO,SAAS,6BACd,OACqC;AACrC,SACE,4BAA4B,KAAK,KACjC,MAAM,MAAM,MAAM,yBAAyB;AAE/C;AAEO,SAAS,oBACd,OAC4B;AAC5B,SAAO,qBAAqB,KAAK,KAAK,kBAAkB,MAAM,KAAK;AACrE;AAEO,SAAS,wBACd,OACgC;AAChC,SACE,yBAAyB,KAAK,KAC9B,MAAM,WAAW,MAAM,mBAAmB;AAE9C;AAEO,SAAS,2BACd,OACmC;AACnC,SACE,4BAA4B,KAAK,KACjC,MAAM,MAAM,MAAM,uBAAuB;AAE7C;AAEO,SAAS,gBAAgB,OAAwC;AACtE,SAAO,qBAAqB,KAAK,KAAK,cAAc,MAAM,KAAK;AACjE;AAEO,SAAS,oBACd,OAC4B;AAC5B,SACE,yBAAyB,KAAK,KAAK,MAAM,WAAW,MAAM,eAAe;AAE7E;AAEO,SAAS,uBACd,OAC+B;AAC/B,SACE,4BAA4B,KAAK,KAAK,MAAM,MAAM,MAAM,mBAAmB;AAE/E;AC3iBO,SAAS,qBACd,OACA,WAAW,SACI;AACf,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAA;AACtB,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAM,YAAY;AAClB,QAAM,qBAAqB,SAAS,KAAA;AACpC,QAAM,sBAAsB,mBAAmB,QAAQ,MAAM,GAAG;AAChE,QAAM,iBAAiB,mBAAmB,MAAM,MAAM,EAAE,CAAC;AACzD,QAAM,gBAAgB,mBAAmB,YAAA,EAAc,WAAW,IAAI,IAClE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IAEF;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGN,aAAW,OAAO,eAAe;AAC/B,UAAM,YAAY,UAAU,GAAG;AAC/B,QAAI,OAAO,cAAc,YAAY,UAAU,QAAQ;AACrD,aAAO,UAAU,KAAA;AAAA,IACnB;AAAA,EACF;AAEA,aAAW,aAAa,OAAO,OAAO,SAAS,GAAG;AAChD,QAAI,OAAO,cAAc,YAAY,UAAU,QAAQ;AACrD,aAAO,UAAU,KAAA;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;ACtEO,SAAS,yBACd,QACoB;AACpB,QAAM,aAAa,iCAAQ;AAC3B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,WAAW,YAAA;AACzB,MAAI,UAAU,aAAa,UAAU,WAAW,UAAU,SAAS;AACjE,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ,UAAU,WAAW,UAAU,WAAW;AAC9D,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ,UAAU,SAAS;AACvC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;ACXO,SAAS,yBACd,OAC+B;AAC/B,MACE,CAAC,SACD,OAAO,UAAU,YACjB,EAAE,UAAU,UACZ,MAAM,SAAS;AAEf,WAAO;AACT,MACE,EAAE,oBAAoB,UACtB,CAAC,UAAU,MAAM,cAAc,KAC/B,EAAE,cAAc,UAChB,CAAC,UAAU,MAAM,QAAQ;AAEzB,WAAO;AACT,MACE,WAAW,SACX,MAAM,UAAU,WACf,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,SAAS;AAEzD,WAAO;AACT,MAAI,QAAQ,SAAS,MAAM,OAAO,UAAa,CAAC,UAAU,MAAM,EAAE;AAChE,WAAO;AACT,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,MAAM,eAAe,KAAA;AAAA,IACrC,UAAU,MAAM,SAAS,KAAA;AAAA,IACzB,GAAI,WAAW,SAAS,OAAO,MAAM,UAAU,WAC3C,EAAE,OAAO,MAAM,MAAM,KAAA,EAAK,IAC1B,CAAA;AAAA,IACJ,GAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,WACrC,EAAE,IAAI,MAAM,GAAG,KAAA,EAAK,IACpB,CAAA;AAAA,EAAC;AAET;AAEA,SAAS,UAAU,OAAiC;AAClD,SACE,OAAO,UAAU,YAAY,MAAM,OAAO,SAAS,KAAK,MAAM,UAAU;AAE5E;ACUO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,iBAAiB;AAAA,EAC5B,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE/C,iBAAiB;AAAA,MACf,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAEzD,gBAAgB;AAAA,MACd,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAEzD,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAErC,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE1C,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAEzD,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE/C,SAAS;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,IAE/C,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,EAC/C;AAEJ;AAEO,MAAM,mBAAmB;AAAA,EAC9B,OAAO,eAAe;AAAA,EACtB,QAAQ,eAAe;AACzB;AAEO,MAAM,6BAAsD;AAAA,EACjE,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,MAAM,0BAA0B;AAEhC,MAAM,8BAA8B;AAE3C,MAAM,wBAAwB;AAAA,EAC5B,MAAM;AAAA,EACN,KAAK;AACP;AAEA,MAAM,mBAAmB;AAAA,EACvB,KAAK;AAAA,EACL,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,SAAS,oBACP,MACA,UAC6B;AAC7B,SAAO;AAAA,IACL,MAAK,qCAAU,QAAO,KAAK;AAAA,IAC3B,SAAQ,qCAAU,WAAU,KAAK;AAAA,IACjC,iBACE,qCAAU,mBAAkB,SAAS,eAAe,SAAS,IACzD,SAAS,iBACT,KAAK;AAAA,EAAA;AAEf;AAEO,SAAS,oBACd,UAC0B;;AAC1B,QAAM,aAAa,CAAA;AAKnB,aAAW,QAAQ,qBAAqB;AACtC,eAAW,IAAI,IAAI;AAAA,MACjB,eAAe,WAAW,IAAI;AAAA,OAC9B,0CAAU,eAAV,mBAAuB;AAAA,IAAI;AAAA,EAE/B;AAEA,SAAO;AAAA,IACL,UAAS,qCAAU,YAAW,eAAe;AAAA,IAC7C,OAAM,qCAAU,SAAQ,eAAe;AAAA,IACvC,YAAW,qCAAU,cAAa,eAAe;AAAA,IACjD,aAAY,qCAAU,eAAc,eAAe;AAAA,IACnD;AAAA,EAAA;AAEJ;AAEA,SAAS,mBACP,WACqB;AACrB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,KAAK;AACjB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,KAC6B;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA;AAAA,EAEpB;AAEA,MAAI,IAAI,YAAY,OAAO;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,mBAAmB,IAAI,SAAS;AAAA,IAC3C,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,IAAI;AAAA,IAAA;AAAA,IAET,UAAU,IAAI,YAAY;AAAA,IAC1B,WAAW,IAAI,aAAa;AAAA,IAC5B,gBAAgB,IAAI,kBAAkB;AAAA,EAAA;AAE1C;AAEO,SAAS,oBACd,WAC6B;AAC7B,MAAI,CAAC,UAAU,KAAK;AAClB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,UAAU;AAAA,IACf,OAAO,oBAAoB,UAAU,KAAK;AAAA,EAAA;AAE9C;AAEO,SAAS,uBACd,OACyB;AACzB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,EAEV;AAEA,SAAO;AAAA,IACL,MAAK,+BAAO,QAAO,2BAA2B;AAAA,IAC9C,QAAO,+BAAO,UAAS,2BAA2B;AAAA,IAClD,SAAQ,+BAAO,WAAU,2BAA2B;AAAA,IACpD,OAAM,+BAAO,SAAQ,2BAA2B;AAAA,EAAA;AAEpD;AAEO,SAAS,iBACd,UACA,MACA,UACA,SACa;AACb,QAAM,OAAO,QAAQ;AACrB,QAAM,OAAO,QAAQ;AACrB,QAAM,OAAO,KAAK,IAAI,MAAM,SAAS,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AACvE,QAAM,OAAO,KAAK,IAAI,MAAM,SAAS,SAAS,KAAK,SAAS,QAAQ,MAAM;AAE1E,SAAO;AAAA,IACL,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,SAAS,CAAC,CAAC;AAAA,IAC5C,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,SAAS,CAAC,CAAC;AAAA,EAAA;AAEhD;AAEO,SAAS,qBACd,KACA,MACA,UACA,SACa;AACb,QAAM,oBAAoB,SAAS,QAAQ,KAAK,SAAS;AACzD,QAAM,kBAAkB,SAAS,SAAS,KAAK,UAAU;AACzD,QAAM,QAAQ,SAAS,QAAQ,KAAK,QAAQ,QAAQ;AACpD,QAAM,SAAS,SAAS,SAAS,KAAK,SAAS,QAAQ;AAEvD,UAAQ,KAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,QAAQ,MAAM,GAAG,QAAQ,IAAA;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,kBAAkB,GAAG,QAAQ,IAAA;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,OAAO,GAAG,QAAQ,IAAA;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,QAAQ,MAAM,GAAG,eAAA;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,kBAAkB,GAAG,eAAA;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,OAAO,GAAG,eAAA;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,QAAQ,MAAM,GAAG,OAAA;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,QACL,EAAE,GAAG,kBAAkB,GAAG,OAAA;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AAAA,IACL;AACE,aAAO,iBAAiB,EAAE,GAAG,OAAO,GAAG,UAAU,MAAM,UAAU,OAAO;AAAA,EAAA;AAE9E;ACzWO,MAAM,4CACX;ACWK,SAAS,kBAAkB,OAA+B;AAC/D,SAAO,KAAK,UAAU;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,EAAA,CACP;AACH;AAGO,SAAS,wBACX,QACe;AAClB,QAAM,6BAAa,IAAA;AACnB,aAAW,SAAS,QAAQ;AAC1B,eAAW,SAAS,SAAS,IAAI;AAC/B,YAAM,MAAM,kBAAkB,KAAK;AACnC,UAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,KAAK;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ;AAC5B;AAGO,SAAS,yBAAyB,OAAkC;AACzE,MAAI,CAAC,MAAM,QAAQ,KAAK,UAAU,CAAA;AAClC,QAAM,SAA2B,CAAA;AACjC,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,KAAK,eAAe;AAC3D;AACF,UAAM,EAAE,WAAW;AACnB,QACE,CAAC,UACD,OAAO,WAAW,YAClB,CAAC,CAAC,aAAa,WAAW,aAAa,QAAQ,EAAE,SAAS,OAAO,IAAI,KACrE,OAAO,OAAO,OAAO,YACrB,CAAC,OAAO,GAAG,KAAA;AAEX;AACF,QACE,OAAO,KAAK,YAAY,YACxB,CAAC,KAAK,QAAQ,UACd,OAAO,KAAK,SAAS,YACrB,CAAC,KAAK,KAAK,KAAA,KACX,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,eAAe,YAC3B,CAAC,KAAK,WAAW,UACjB,OAAO,KAAK,aAAa,YACzB,CAAC,OAAO,SAAS,KAAK,MAAM,KAAK,QAAQ,CAAC;AAE1C;AACF,WAAO,KAAK;AAAA,MACV,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,QAAQ,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAA;AAAA,MACxC,YAAY;AAAA,MACZ,YAAY,KAAK;AAAA,MACjB,GAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,cAC7C,EAAE,aAAa,KAAK,YAAA,IACpB,CAAA;AAAA,MACJ,UAAU,KAAK;AAAA,IAAA,CAChB;AAAA,EACH;AACA,SAAO,qBAAqB,MAAM;AACpC;AAEA,SAAS,mBAAmB,SAAoC;AAC9D,SAAO,WACL,OAAO,YAAY,YACnB,aAAa,WACb,QAAQ,YAAY,KACpB,iBAAiB,UACf,yBAAyB,QAAQ,WAAW,IAC5C,CAAA;AACN;AAGO,SAAS,sBAAsB,SAGjB;;AACnB,QAAM,SAAS,CAAC,mBAAmB,QAAQ,WAAW,CAAC;AACvD,MAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,eAAW,QAAQ,QAAQ,SAAS;AAClC,WAAI,6BAAM,UAAS,iBAAe,UAAK,SAAL,mBAAW,YAAW,WAAW;AACjE,eAAO,KAAK,mBAAmB,KAAK,KAAK,WAAW,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACA,SAAO,qBAAqB,GAAG,MAAM;AACvC;AC1GO,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;AC0BzC,SAAS,yBAAyB,OAAoD;AAC3F,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,OAAO;AACb,MAAI,KAAK,SAAS,mBAAmB,OAAO,KAAK,OAAO,YAAY,CAAC,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,KAAK,SAAS,SAAU,QAAO;AACpI,QAAM,OAAO,KAAK;AAClB,MAAI,KAAK,YAAY,KAAK,KAAK,cAAc,KAAK,MAAM,OAAO,KAAK,eAAe,YAAY,CAAC,KAAK,cAChG,OAAO,KAAK,cAAc,YAAY,CAAC,OAAO,SAAS,KAAK,MAAM,KAAK,SAAS,CAAC,EAAG,QAAO;AAChG,QAAM,OAAO,EAAE,SAAS,GAAY,WAAW,KAAK,IAAI,YAAY,KAAK,YAAY,WAAW,KAAK,UAAA;AACrG,MAAI;AACJ,MAAI,KAAK,SAAS,aAAa,CAAC,WAAW,WAAW,aAAa,EAAE,SAAS,KAAK,QAAQ,KAAK,MAAM,QAAQ,KAAK,WAAW,GAAG;AAC/H,UAAM,cAAc,qBAAqB,KAAK,WAAW;AACzD,QAAI,YAAY,WAAW,KAAK,YAAY,OAAQ,QAAO;AAC3D,cAAU,EAAE,GAAG,MAAM,MAAM,WAAW,UAAU,KAAK,UAAU,YAAA;AAAA,EACjE,WAAW,KAAK,SAAS,cAAc,KAAK,WAAW,aAAa,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC/F,UAAM,UAAU,qBAAqB,KAAK,OAAO;AACjD,QAAI,QAAQ,WAAW,KAAK,QAAQ,OAAQ,QAAO;AACnD,cAAU,EAAE,GAAG,MAAM,MAAM,YAAY,QAAQ,WAAW,QAAA;AAAA,EAC5D,WAAW,KAAK,SAAS,cAAc,KAAK,WAAW,WAAW,OAAO,KAAK,UAAU,UAAU;AAChG,cAAU,EAAE,GAAG,MAAM,MAAM,YAAY,QAAQ,SAAS,OAAO,KAAK,MAAA;AAAA,EACtE,MAAO,QAAO;AACd,SAAO;AAAA,IAAE,IAAI,KAAK;AAAA,IAAI,MAAM;AAAA,IAAiB,MAAM;AAAA,IACjD,GAAI,OAAO,KAAK,cAAc,WAAW,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,IACzE,GAAI,OAAO,KAAK,gBAAgB,WAAW,EAAE,aAAa,KAAK,YAAA,IAAgB,CAAA;AAAA,IAC/E,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAA,IAAa,CAAA;AAAA,IACtE,GAAI,OAAO,KAAK,sBAAsB,WAAW,EAAE,mBAAmB,KAAK,kBAAA,IAAsB,CAAA;AAAA,IACjG,GAAI,OAAO,KAAK,UAAU,WAAW,EAAE,OAAO,KAAK,UAAU,CAAA;AAAA,EAAC;AAClE;AAIO,SAAS,kCAAkC,OAAqD;;AACrG,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,OAAO;AACb,QAAM,OAAO,KAAK,SAAS,cAAc,KAAK,OAAO;AACrD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,UAAU,KAAK,iBAAe,UAAK,UAAL,mBAAa;AACjD,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,UAAO,mCAAS,aAAY,KAAK,QAAQ,wBAAwB,KAC5D,OAAO,QAAQ,2BAA2B,YAAY,QAAQ,QAAQ,sBAAsB,KAC5F,OAAO,OAAO,YAAY,OAAO,QAAQ,yBAAyB,UAAU;AACnF;AAEO,SAAS,sBAAsB,OAAyB;AAC7D,SAAO,QAAQ,SAAS,OAAO,UAAU,YAAY,UAAU,SAAS,MAAM,SAAS,eAAe,KACjG,kCAAkC,KAAK,MAAM;AACpD;AAEO,SAAS,4BAA4B,OAAqD;AAC/F,QAAM,OAAO,yBAAyB,KAAK;AAC3C,MAAI,CAAC,KAAM,QAAO,kCAAkC,KAAK;AACzD,QAAM,UAAU,KAAK;AACrB,SAAO;AAAA,IAAE,SAAS;AAAA,IAAG,qBAAqB;AAAA,IAAG,wBAAwB,QAAQ;AAAA,IAC3E,GAAI,QAAQ,SAAS,YAAY,EAAE,aAAa,QAAQ,aAAa,oBAAoB,QAAQ,aAC7F,QAAQ,WAAW,YAAY,EAAE,SAAS,QAAQ,YAAY,CAAA;AAAA,EAAC;AACvE;AAGO,SAAS,0BAA6B,SAAc,SAA2E;AACpI,QAAM,QAAQ,QAAQ,UAAU,CAAC,SAAA;;AAAS,2CAAyB,IAAI,MAA7B,mBAAgC,QAAO,QAAQ;AAAA,GAAE;AAC3F,MAAI,QAAQ,EAAG,QAAO,CAAC,GAAG,SAAS,OAAO;AAC1C,QAAM,WAAW,yBAAyB,QAAQ,KAAK,CAAC;AACxD,MAAI,YAAY,KAAK,MAAM,SAAS,KAAK,SAAS,KAAK,KAAK,MAAM,QAAQ,KAAK,SAAS,EAAG,QAAO;AAClG,SAAO,QAAQ,IAAI,CAAC,MAAM,aAAa,aAAa,QAAQ,UAAU,IAAI;AAC5E;ACjEO,SAAS,mBAAmB,UAA8E;AAC/G,SAAO,KAAK,UAAU,CAAC,SAAS,MAAM,YAAY,SAAS,MAAM,mBAAmB,SAAS,KAAK,YAAY,SAAS,KAAK,iBAAiB,CAAC;AAChJ;AAUA,MAAM,iCAAiB,IAAI,CAAC,sBAAsB,uBAAuB,qBAAqB,yBAAyB,CAAC;AAIjH,SAAS,qBAAqB,OAAkC;AACrE,MAAI,CAAC,MAAM,QAAQ,KAAK,UAAU,CAAA;AAClC,SAAO,MAAM,OAAO,CAAC,SAAiC;AACpD,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,UAAM,SAAS;AACf,WAAO,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,kBAAkB,YAAY,OAAO,OAAO,UAAU,YACvG,CAAC,SAAS,YAAY,WAAW,SAAS,EAAE,SAAS,OAAO,aAAa,EAAE,KAC3E,CAAC,YAAY,QAAQ,EAAE,SAAS,OAAO,YAAY,EAAE,MACpD,CAAC,OAAO,YAAa,OAAO,SAAS,SAAS,iBAAiB,aAAa,OAAO,SAAS,KAAK,KAAK,aAAa,OAAO,SAAS,IAAI,MACxI,cAAc,OAAO,MAAM,KAAK,cAAc,OAAO,KAAK;AAAA,EACjE,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,eAAe,WAAW,QAAQ,OAAO,UAAU,UAAU,WAAW,WAAW,iBAAiB;AAAA,IACvH;AAAA,IAAI;AAAA,IAAO;AAAA,IAAe;AAAA,IAAW,QAAQ,gBAAgB,MAAM;AAAA,IAAG,OAAO,gBAAgB,KAAK;AAAA,IAAG;AAAA,IAAU;AAAA,IAAU;AAAA,IAAW;AAAA,IAAW;AAAA,EAAA,EAC/I;AACJ;AACA,SAAS,gBAAgB,OAAwC;AAC/D,SAAO,QAAQ,EAAE,QAAQ,MAAM,QAAQ,MAAM,MAAM,SAAS;AAC9D;AACO,SAAS,qBAAqB,OAAyC;AAC5E,MAAI,CAAC,MAAM,QAAQ,KAAK,UAAU,CAAA;AAClC,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,QAAI,CAAC,QAAQ,OAAO,SAAS,iBAAiB,CAAA;AAC9C,UAAM,SAAS,cAAc,IAA6B;AAC1D,WAAO,SAAS,CAAC,MAAM,IAAI,CAAA;AAAA,EAC7B,CAAC;AACH;AACA,SAAS,cAAc,OAA4D;AACjF,MAAI,CAAC,SAAS,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,UAAU,YAChE,CAAC,CAAC,QAAQ,SAAS,YAAY,eAAe,gBAAgB,QAAQ,OAAO,SAAS,EAAE,SAAS,MAAM,IAAI,KAC1G,MAAM,WAAW,UAAa,MAAM,WAAW,UAAY,QAAO;AACxE,QAAM,MAAM,MAAM;AAClB,QAAM,YAA8C,2BAAK,UAAS,cAAc,OAAO,IAAI,eAAe,WACtG,EAAE,MAAM,YAAY,YAAY,IAAI,YAAY,GAAI,OAAO,IAAI,sBAAsB,WAAW,EAAE,mBAAmB,IAAI,kBAAA,IAAsB,CAAA,EAAC,KAChJ,2BAAK,UAAS,oBAAoB,OAAO,IAAI,kBAAkB,WAC7D,EAAE,MAAM,kBAAkB,eAAe,IAAI,eAAe,aAAa,IAAI,aAAa,eAAe,IAAI,cAAA,KAC7G,2BAAK,UAAS,SAAS,OAAO,IAAI,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,IAAI,IAAA,IAAQ;AAC3F,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,EAAE,IAAI,MAAM,OAAO,aAAa,QAAQ,QAAQ,eAAe,UAAU,MAAM,QAAQ,WAAW,cAAc;AACtH,SAAO,EAAE,IAAI,MAAM,OAAO,aAAa,QAAQ,UAAU,QAAQ,eAAe,UAAU,MAAM,QAAQ,WAAW,UAAA;AACrH;AACA,SAAS,aAAa,OAAwE;AAC5F,SAAO,QAAQ,SAAS,OAAO,MAAM,eAAe,YAAY,OAAO,MAAM,sBAAsB,QAAQ;AAC7G;AACA,SAAS,cAAc,OAAwC;AAC7D,SAAO,SAAS,QAAS,OAAO,MAAM,WAAW,YAAY,iBAAiB,KAAK,MAAM,MAAM,KAAK,OAAO,cAAc,MAAM,IAAI,KAAK,MAAM,QAAQ;AACxJ;AAGO,SAAS,iBAAiB,OAA2C;AAC1E,QAAM,6BAAa,IAAA;AACnB,aAAW,QAAQ,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,EAAE,aAAa,IAAI,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,GAAG;AAChI,UAAM,WAAW,OAAO,IAAI,KAAK,aAAa;AAC9C,QAAI,CAAC,YAAY,SAAS,aAAa,UAAU;AAAE,aAAO,IAAI,KAAK,eAAe,IAAI;AAAG;AAAA,IAAU;AACnG,QAAI,KAAK,aAAa,SAAU;AAChC,UAAM,UAAU,KAAK,aAAa,QAAQ,SAAS,aAAa,MAAM,OAAO;AAC7E,UAAM,YAAY,KAAK,aAAa,KAAK,aAAa,OAAO,SAAS,aAAa,SAAS,aAAa,MAAM,OAAO;AACtH,UAAM,SAAS,SAAS;AACxB,UAAM,QAAQ,OAAO;AACrB,WAAO,IAAI,KAAK,eAAe;AAAA,MAC7B,GAAG;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAO,WAAW,SAAS,aAAa,SAAS;AAAA,MACpE,WAAW,WAAW,OAAO,UAAU,UAAU,OAAO,YAAY;AAAA,MACpE,UAAU,SAAS,YAAY,OAAO,WAAW,EAAE,MAAM,eAAe,OAAO,SAAS,SAAS,OAAO,MAAM,OAAO,SAAS,KAAA,IAAS,OAAO;AAAA,IAAA,CAC/I;AAAA,EACH;AACA,SAAO,CAAC,GAAG,OAAO,OAAA,CAAQ,EAAE,OAAO,CAAC,SAAA;;AAAS,gBAAK,aAAa,cAAY,UAAK,WAAL,mBAAa,cAAW,UAAK,UAAL,mBAAY;AAAA,GAAM,EAClH,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,aAAa,EAAE,CAAC;AACxE;AAGO,SAAS,2BAA2B,SAA8B,cAA0E;;AACjJ,QAAM,QAAQ,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,UAAoB,CAAA;AAC3E,QAAM,WAA2C,CAAA;AACjD,QAAM,gBAAkC,CAAA;AACxC,QAAM,sCAAsB,IAAA;AAC5B,QAAM,OAAO,QAAQ,aAAa,QAAQ;AAC1C,QAAM,YAAY,gBAAgB,OAAO,KAAK,gBAAgB;AAC9D,QAAM,oBAAoB,IAAI,IAAI,MAAM,QAAQ,CAAC,SAAS;;AACxD,UAAM,UAAU,4BAA4B,IAAI,OAAKC,MAAA,KAAK,SAAL,gBAAAA,IAAW,kBAAeC,OAAAC,MAAA,KAAK,SAAL,gBAAAA,IAAW,UAAX,gBAAAD,IAAmB;AAClG,YAAO,mCAAS,0BAAyB,CAAC,QAAQ,sBAAsB,IAAI,CAAA;AAAA,EAC9E,CAAC,CAAC;AACF,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,4BAA4B,IAAI;AAChD,QAAI,SAAS;AAAE,eAAS,KAAK,OAAO;AAAG;AAAA,IAAU;AACjD,SAAI,6BAAM,UAAS,eAAe,CAAC,KAAK,KAAM;AAC9C,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK,iBAAe,UAAK,UAAL,mBAAa;AAClD,SAAI,qCAAU,aAAY,EAAG,UAAS,KAAK,QAAQ;AACnD,QAAI,CAAC,WAAW,IAAI,KAAK,QAAQ,EAAE,KAAK,KAAK,WAAW,UAAW;AACnE,UAAM,QAAO,UAAK,UAAL,mBAAY;AACzB,QAAI,OAAO,SAAS,YAAY,CAAC,QAAQ,KAAK,WAAW,GAAG,KAAK,KAAK,MAAM,GAAG,EAAE,SAAS,IAAI,EAAG;AACjG,oBAAgB,IAAI,kBAAkB,IAAI,EAAE;AAC5C,SAAI,qCAAU,yBAAwB,KAAM,KAAK,MAAM,kBAAkB,IAAI,KAAK,EAAE,EAAI;AAExF,kBAAc,KAAK,EAAE,IAAI,eAAe,IAAI,IAAI,OAAO,MAAM,eAAe,MAAM,WAAW,WAAW,UAAU,UAAU,WAAW,QAAQ,IAAI,WAAW;AAAA,EAChK;AACA,MAAI,CAAC,SAAS,UAAU,CAAC,gBAAgB,QAAQ,GAAC,kBAAa,YAAb,mBAAsB,WAAU,GAAC,kBAAa,gBAAb,mBAA0B,QAAQ,QAAO;AAC5H,QAAM,UAAU,CAAC,GAAI,aAAa,WAAW,CAAA,GAAK,GAAG,SAAS,QAAQ,CAAC,SAAS,KAAK,WAAW,CAAA,CAAE,CAAC;AACnG,QAAM,2BAAW,IAAA;AACjB,aAAW,OAAO,SAAS;AACzB,UAAM,SAAS,cAAc,GAAG;AAChC,QAAI,CAAC,OAAQ;AACb,QAAI,gBAAgB,IAAI,OAAO,EAAE,KAAK,OAAO,WAAW,UAAU,OAAO,WAAW,cAAe;AACnG,WAAK,UAAK,IAAI,OAAO,EAAE,MAAlB,mBAAqB,cAAa,OAAO,OAAO,aAAa,aAAa,IAAK;AACpF,SAAK,IAAI,OAAO,IAAI,EAAE,GAAG,QAAQ,QAAQ,OAAO,UAAU,UAAU,WAAW,QAAQ,MAAM,OAAO,WAAW,WAAW,OAAO,aAAa,WAAW;AAAA,EAC3J;AACA,QAAM,UAAU,iBAAiB;AAAA,IAC/B,GAAG;AAAA,IACH,GAAG,qBAAqB,aAAa,WAAW;AAAA,IAChD,GAAG,SAAS,QAAQ,CAAC,SAAS,qBAAqB,KAAK,WAAW,CAAC;AAAA,EAAA,EACpE,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,QAAQ,MAAM,KAAK,UAAA,EAAY,CAAC;AACvE,QAAM,WAAW,CAAC,aAAa,oBAAoB,GAAG,SAAS,IAAI,CAAC,SAAS,KAAK,kBAAkB,CAAC;AACrG,QAAM,qBAAqB,SAAS,SAAS,aAAa,IAAI,gBAAgB,SAAS,SAAS,SAAS,IAAI,YAAY,SAAS,SAAS,SAAS,IAAI,YAAY;AACpK,SAAO,EAAE,GAAG,cAAc,qBAAqB,GAAG,oBAAoB,SAAS,CAAC,GAAG,KAAK,OAAA,CAAQ,GAAG,aAAa,QAAA;AAClH;AAEO,SAAS,sBAAsB,OAAyC;AAC7E,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,SAAS;AACf,QAAM,WAAW,CAAC,SAAiD,SAAS,QAAQ,QAAQ,QAAQ,cAAc,IAAI,MAAM,KAAK,SAAS,UAAc,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,UAAU,MAAO;AACpN,SAAO,OAAO,WAAW,0BAA0B,OAAO,OAAO,kBAAkB,YAC9E,SAAS,OAAO,MAAM,KAAK,SAAS,OAAO,KAAK,IAAI,SAA6B;AACxF;AC/JA,MAAM,iBAAiB;AAGhB,SAAS,qBAAqB,QAA+C;;AAChF,MAAK,OAAO,UAAU,OAAO,OAAO,SAAS,UAAe,OAAO,SAAS,OAAO,MAAM,SAAS,OAAY,QAAO,EAAE,QAAQ,cAAA;AAC/H,QAAM,QAAQ,CAAC,SAAiB,OAAO,KAAK,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,IAAI,IAAI,CAAA;AACpG,QAAM,SAAS,QAAM,YAAO,WAAP,mBAAe,SAAQ,EAAE,GAAG,QAAQ,QAAM,YAAO,UAAP,mBAAc,SAAQ,EAAE;AACvF,MAAI,QAAQ,GAAG,YAAY,OAAO,QAAQ,WAAW,MAAM;AAC3D,SAAO,QAAQ,aAAa,QAAQ,YAAY,OAAO,KAAK,MAAM,MAAM,KAAK,EAAG;AAChF,SAAO,YAAY,SAAS,WAAW,SAAS,OAAO,YAAY,CAAC,MAAM,MAAM,WAAW,CAAC,GAAG;AAAE;AAAa;AAAA,EAAW;AACzH,QAAM,IAAI,YAAY,OAAO,IAAI,WAAW;AAC5C,MAAI,IAAI,IAAI,eAAgB,QAAO,EAAE,QAAQ,cAAA;AAC7C,MAAI,WAAW,IAAI,YAAY,IAAI,CAAC,GAAG,UAAU,IAAI,YAAY,IAAI,CAAC;AACtE,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,SAAQ,IAAI,CAAC,IAAI,OAAO,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,IAAI,KAAK,IAAI,SAAS,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC3I,KAAC,UAAU,OAAO,IAAI,CAAC,SAAS,QAAQ;AAAA,EAC7C;AACA,SAAO,EAAE,QAAQ,SAAS,OAAO,IAAI,SAAS,CAAC,GAAG,SAAS,IAAI,SAAS,CAAC,EAAA;AAC7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/approvals.ts","../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/thread-reference.ts","../src/pet.ts","../src/task-summary.ts","../src/skill-usage.ts","../src/tool-output.ts","../src/file-activity-receipt.ts","../src/file-activity.ts","../src/file-change-lines.ts"],"sourcesContent":["import type { HITLDecision, HITLRequest } from './interrupt.js';\n\n/** Opaque host resource reference; ChatKit never interprets resource-specific policy. */\nexport interface ApprovalHostReference {\n kind: string;\n id: string;\n expiresAt: number;\n}\nexport interface ApprovalDecisionRequest {\n request: HITLRequest;\n decisions: HITLDecision[];\n}\nexport interface ApprovalActionRequest {\n request: HITLRequest;\n action: 'settings';\n}\nexport interface ChatKitApprovalsOptions {\n /** Existing integrations keep the composer placement by default. */\n placement?: 'composer' | 'inline';\n onDecision?: (\n input: ApprovalDecisionRequest,\n ) => Promise<{ accepted: boolean }>;\n onAction?: (input: ApprovalActionRequest) => Promise<void> | void;\n}\nexport function isApprovalHostReference(\n value: unknown,\n): value is ApprovalHostReference {\n return (\n !!value &&\n typeof value === 'object' &&\n 'kind' in value &&\n typeof value.kind === 'string' &&\n value.kind.length > 0 &&\n 'id' in value &&\n typeof value.id === 'string' &&\n value.id.length > 0 &&\n 'expiresAt' in value &&\n typeof value.expiresAt === 'number' &&\n Number.isFinite(value.expiresAt)\n );\n}\n","import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import {\n isApprovalHostReference,\n type ApprovalHostReference,\n} from './approvals.js';\nimport {\n isHITLReviewDisplay,\n type HITLReviewDisplay,\n} from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n host?: ApprovalHostReference;\n toolCallId?: string;\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(value: unknown): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(value: unknown): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(value: unknown): 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(normalizeHITLReviewConfig);\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 if (value.host !== undefined) {\n if (!isApprovalHostReference(value.host)) return null;\n normalizedRequest.host = value.host;\n }\n if (typeof value.toolCallId === 'string')\n normalizedRequest.toolCallId = value.toolCallId;\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","/** A live reference to a conversation branch, never a client-supplied transcript. */\nexport type ChatKitThreadReference = {\n type: 'thread';\n id?: string;\n label?: string;\n conversationId: string;\n threadId: string;\n};\n\nexport function normalizeThreadReference(\n value: unknown,\n): ChatKitThreadReference | null {\n if (\n !value ||\n typeof value !== 'object' ||\n !('type' in value) ||\n value.type !== 'thread'\n )\n return null;\n if (\n !('conversationId' in value) ||\n !isLocator(value.conversationId) ||\n !('threadId' in value) ||\n !isLocator(value.threadId)\n )\n return null;\n if (\n 'label' in value &&\n value.label !== undefined &&\n (typeof value.label !== 'string' || value.label.length > 300)\n )\n return null;\n if ('id' in value && value.id !== undefined && !isLocator(value.id))\n return null;\n return {\n type: 'thread',\n conversationId: value.conversationId.trim(),\n threadId: value.threadId.trim(),\n ...('label' in value && typeof value.label === 'string'\n ? { label: value.label.trim() }\n : {}),\n ...('id' in value && typeof value.id === 'string'\n ? { id: value.id.trim() }\n : {}),\n };\n}\n\nfunction isLocator(value: unknown): value is string {\n return (\n typeof value === 'string' && value.trim().length > 0 && value.length <= 128\n );\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","import type { ChatSkillUsage } from './skill-usage.js';\nimport type { ChatFileChange } from './file-activity.js';\n\nexport const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type FileChangeResource = {\n type: 'file_change';\n first: { artifactId: string; artifactVersionId: string };\n last: { artifactId: string; artifactVersionId: string };\n};\n\nexport type FileChangeSetResource = {\n type: 'file_change_set';\n messageId: string;\n changes: { workspacePath: string; resource?: FileChangeResource }[];\n};\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 artifactVersionId?: string;\n }\n | FileChangeResource\n | FileChangeSetResource\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 /** Only host-verified, explicitly presented files get message-end cards. */\n origin?: 'tool' | 'integration' | 'legacy';\n workspacePath?: string;\n mimeType?: string;\n size?: number;\n sha256?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n skillUsages?: ChatSkillUsage[];\n /** Presence marks the new semantic projection; old writes are never deliveries. */\n fileActivityVersion?: 1;\n fileActivityToolCallId?: string;\n fileChangeCoverage?: 'bounded' | 'partial' | 'unavailable';\n fileChanges?: ChatFileChange[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","/** Snapshot produced by the runtime after successfully loading skill instructions. */\nexport type ChatSkillUsage = {\n skillId: string;\n name: string;\n version: string;\n source: {\n type: 'workspace' | 'project' | 'assistant' | 'plugin';\n id: string;\n };\n activation: 'read';\n toolCallId: string;\n executionId?: string;\n loadedAt: string;\n};\n\nexport function chatSkillUsageKey(usage: ChatSkillUsage): string {\n return JSON.stringify([\n usage.source.type,\n usage.source.id,\n usage.skillId,\n usage.version,\n ]);\n}\n\n/** Merge only observations belonging to the same message. Keep the first read. */\nexport function mergeChatSkillUsages(\n ...groups: ReadonlyArray<readonly ChatSkillUsage[] | undefined>\n): ChatSkillUsage[] {\n const usages = new Map<string, ChatSkillUsage>();\n for (const group of groups) {\n for (const usage of group ?? []) {\n const key = chatSkillUsageKey(usage);\n if (!usages.has(key)) usages.set(key, usage);\n }\n }\n return [...usages.values()];\n}\n\n/** JSON boundary: allowlist fields rather than forwarding paths or raw tool data. */\nexport function normalizeChatSkillUsages(value: unknown): ChatSkillUsage[] {\n if (!Array.isArray(value)) return [];\n const usages: ChatSkillUsage[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object' || item.activation !== 'read')\n continue;\n const { source } = item;\n if (\n !source ||\n typeof source !== 'object' ||\n !['workspace', 'project', 'assistant', 'plugin'].includes(source.type) ||\n typeof source.id !== 'string' ||\n !source.id.trim()\n )\n continue;\n if (\n typeof item.skillId !== 'string' ||\n !item.skillId.trim() ||\n typeof item.name !== 'string' ||\n !item.name.trim() ||\n typeof item.version !== 'string' ||\n typeof item.toolCallId !== 'string' ||\n !item.toolCallId.trim() ||\n typeof item.loadedAt !== 'string' ||\n !Number.isFinite(Date.parse(item.loadedAt))\n )\n continue;\n usages.push({\n skillId: item.skillId,\n name: item.name,\n version: item.version,\n source: { type: source.type, id: source.id },\n activation: 'read',\n toolCallId: item.toolCallId,\n ...(typeof item.executionId === 'string' && item.executionId\n ? { executionId: item.executionId }\n : {}),\n loadedAt: item.loadedAt,\n });\n }\n return mergeChatSkillUsages(usages);\n}\n\nfunction summarySkillUsages(summary: unknown): ChatSkillUsage[] {\n return summary &&\n typeof summary === 'object' &&\n 'version' in summary &&\n summary.version === 1 &&\n 'skillUsages' in summary\n ? normalizeChatSkillUsages(summary.skillUsages)\n : [];\n}\n\n/** Works for both streamed tool components and persisted message summaries. */\nexport function getMessageSkillUsages(message: {\n content?: unknown;\n taskSummary?: unknown;\n}): ChatSkillUsage[] {\n const groups = [summarySkillUsages(message.taskSummary)];\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part?.type === 'component' && part.data?.status === 'success') {\n groups.push(summarySkillUsages(part.data.taskSummary));\n }\n }\n }\n return mergeChatSkillUsages(...groups);\n}\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n","import type { ChatFileChange } from './file-activity.js';\nimport { normalizeFileChanges, normalizeFileOutputs } from './file-activity.js';\nimport type { ChatTaskSummaryOutput, TChatTaskSummaryContribution } from './task-summary.js';\n\n/** Host-owned facts from a tool execution, never an additional tool invocation. */\nexport type FileActivityReceipt = {\n version: 1;\n receiptId: string;\n toolCallId: string;\n updatedAt: string;\n} & (\n | { kind: 'changes'; coverage: 'bounded' | 'partial' | 'unavailable'; fileChanges: ChatFileChange[] }\n | { kind: 'delivery'; status: 'success'; outputs: ChatTaskSummaryOutput[] }\n | { kind: 'delivery'; status: 'error'; error: string }\n);\n\nexport type TMessageContentFileActivity = {\n id: string;\n type: 'file_activity';\n data: FileActivityReceipt;\n messageId?: string;\n executionId?: string;\n agentKey?: string;\n parentExecutionId?: string;\n runId?: string;\n};\n\nexport function parseFileActivityContent(value: unknown): TMessageContentFileActivity | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as Partial<TMessageContentFileActivity>;\n if (part.type !== 'file_activity' || typeof part.id !== 'string' || !part.id || !part.data || typeof part.data !== 'object') return null;\n const data = part.data;\n if (data.version !== 1 || data.receiptId !== part.id || typeof data.toolCallId !== 'string' || !data.toolCallId\n || typeof data.updatedAt !== 'string' || !Number.isFinite(Date.parse(data.updatedAt))) return null;\n const base = { version: 1 as const, receiptId: part.id, toolCallId: data.toolCallId, updatedAt: data.updatedAt };\n let receipt: FileActivityReceipt;\n if (data.kind === 'changes' && ['bounded', 'partial', 'unavailable'].includes(data.coverage) && Array.isArray(data.fileChanges)) {\n const fileChanges = normalizeFileChanges(data.fileChanges);\n if (fileChanges.length !== data.fileChanges.length) return null;\n receipt = { ...base, kind: 'changes', coverage: data.coverage, fileChanges };\n } else if (data.kind === 'delivery' && data.status === 'success' && Array.isArray(data.outputs)) {\n const outputs = normalizeFileOutputs(data.outputs);\n if (outputs.length !== data.outputs.length) return null;\n receipt = { ...base, kind: 'delivery', status: 'success', outputs };\n } else if (data.kind === 'delivery' && data.status === 'error' && typeof data.error === 'string') {\n receipt = { ...base, kind: 'delivery', status: 'error', error: data.error };\n } else return null;\n return { id: part.id, type: 'file_activity', data: receipt,\n ...(typeof part.messageId === 'string' ? { messageId: part.messageId } : {}),\n ...(typeof part.executionId === 'string' ? { executionId: part.executionId } : {}),\n ...(typeof part.agentKey === 'string' ? { agentKey: part.agentKey } : {}),\n ...(typeof part.parentExecutionId === 'string' ? { parentExecutionId: part.parentExecutionId } : {}),\n ...(typeof part.runId === 'string' ? { runId: part.runId } : {}) };\n}\n\ntype LegacyStep = { id?: unknown; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } };\n/** Compatibility uses explicit metadata and the original call identity, never labels or ID suffixes. */\nexport function getLegacyFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as { id?: unknown; type?: unknown; data?: LegacyStep };\n const step = part.type === 'component' ? part.data : value as LegacyStep;\n if (!step || typeof step !== 'object') return null;\n const summary = step.taskSummary ?? step._meta?.['xpertai/taskSummary'];\n const id = part.id ?? step.id;\n return summary?.version === 1 && summary.fileActivityVersion === 1\n && typeof summary.fileActivityToolCallId === 'string' && Boolean(summary.fileActivityToolCallId)\n && typeof id === 'string' && id !== summary.fileActivityToolCallId ? summary : null;\n}\n\nexport function isFileActivityContent(value: unknown): boolean {\n return Boolean(value && typeof value === 'object' && 'type' in value && value.type === 'file_activity')\n || getLegacyFileActivityContribution(value) !== null;\n}\n\nexport function getFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n const part = parseFileActivityContent(value);\n if (!part) return getLegacyFileActivityContribution(value);\n const receipt = part.data;\n return { version: 1, fileActivityVersion: 1, fileActivityToolCallId: receipt.toolCallId,\n ...(receipt.kind === 'changes' ? { fileChanges: receipt.fileChanges, fileChangeCoverage: receipt.coverage }\n : receipt.status === 'success' ? { outputs: receipt.outputs } : {}) };\n}\n\n/** Receipts are immutable terminal facts; replay replaces by identity, never appends a second operation. */\nexport function upsertFileActivityContent<T>(content: T[], receipt: TMessageContentFileActivity): (T | TMessageContentFileActivity)[] {\n const index = content.findIndex((item) => parseFileActivityContent(item)?.id === receipt.id);\n if (index < 0) return [...content, receipt];\n const previous = parseFileActivityContent(content[index]);\n if (previous && Date.parse(previous.data.updatedAt) >= Date.parse(receipt.data.updatedAt)) return content;\n return content.map((item, position) => position === index ? receipt : item);\n}\n","import { getFileActivityContribution } from './file-activity-receipt.js';\nimport type { ChatTaskSummaryOutput, ChatTaskSummaryResourceReference, TChatTaskSummaryContribution } from './task-summary.js';\n\nexport type FileRevision = { sha256: string; size: number };\nexport type ChatFileChange = {\n id: string;\n workspacePath: string;\n title: string;\n operation: 'added' | 'modified' | 'deleted' | 'unknown';\n before?: FileRevision | null;\n after?: FileRevision | null;\n resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>;\n coverage: 'observed' | 'legacy';\n messageId?: string;\n startedAt?: string;\n updatedAt?: string;\n};\nexport type FileChangeLineStats =\n | { status: 'ready'; added: number; removed: number }\n | { status: 'unavailable' };\nexport type MessageFileChangeStats = {\n messageId: string;\n items: { workspacePath: string; resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>; stats: FileChangeLineStats }[];\n};\n/** Stable cache identity for a fixed review range; never identifies mutable workspace bytes. */\nexport function fileChangeRangeKey(resource: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>) {\n return JSON.stringify([resource.first.artifactId, resource.first.artifactVersionId, resource.last.artifactId, resource.last.artifactVersionId]);\n}\n\n/** Private review payload. Never include text/diffs in compact task summaries. */\nexport type FileChangeReport = {\n schema: 'xpert.file-change.v1';\n workspacePath: string;\n before: (FileRevision & { text?: string }) | null;\n after: (FileRevision & { text?: string }) | null;\n};\n\nconst writeTools = new Set(['sandbox_write_file', 'sandbox_append_file', 'sandbox_edit_file', 'sandbox_multi_edit_file']);\ntype Part = { id?: string; type?: string; data?: { tool?: string; status?: string; input?: { file_path?: string }; output?: string; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } } };\nexport type FileActivityMessage = { id?: string; content?: unknown; taskSummary?: TChatTaskSummaryContribution; updatedAt?: string | Date; createdAt?: string | Date };\n\nexport function normalizeFileChanges(value: unknown): ChatFileChange[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is ChatFileChange => {\n if (!item || typeof item !== 'object') return false;\n const change = item as Partial<ChatFileChange>;\n return typeof change.id === 'string' && typeof change.workspacePath === 'string' && typeof change.title === 'string'\n && ['added', 'modified', 'deleted', 'unknown'].includes(change.operation ?? '')\n && ['observed', 'legacy'].includes(change.coverage ?? '')\n && (!change.resource || (change.resource.type === 'file_change' && validVersion(change.resource.first) && validVersion(change.resource.last)))\n && validRevision(change.before) && validRevision(change.after);\n }).map(({ id, title, workspacePath, operation, before, after, resource, coverage, messageId, startedAt, updatedAt }) => ({\n id, title, workspacePath, operation, before: compactRevision(before), after: compactRevision(after), resource, coverage, messageId, startedAt, updatedAt,\n }));\n}\nfunction compactRevision(value: FileRevision | null | undefined) {\n return value ? { sha256: value.sha256, size: value.size } : value;\n}\nexport function normalizeFileOutputs(value: unknown): ChatTaskSummaryOutput[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n if (!item || typeof item !== 'object') return [];\n const output = compactOutput(item as ChatTaskSummaryOutput);\n return output ? [output] : [];\n });\n}\nfunction compactOutput(value: ChatTaskSummaryOutput): ChatTaskSummaryOutput | null {\n if (!value || typeof value.id !== 'string' || typeof value.title !== 'string'\n || !['file', 'image', 'document', 'spreadsheet', 'presentation', 'site', 'url', 'mcp_app'].includes(value.kind)\n || (value.status !== undefined && value.status !== 'success')) return null;\n const ref = value.resource;\n const resource: ChatTaskSummaryOutput['resource'] = ref?.type === 'artifact' && typeof ref.artifactId === 'string'\n ? { type: 'artifact', artifactId: ref.artifactId, ...(typeof ref.artifactVersionId === 'string' ? { artifactVersionId: ref.artifactVersionId } : {}) }\n : ref?.type === 'workspace_file' && typeof ref.workspacePath === 'string'\n ? { type: 'workspace_file', workspacePath: ref.workspacePath, fileAssetId: ref.fileAssetId, storageFileId: ref.storageFileId }\n : ref?.type === 'url' && typeof ref.url === 'string' ? { type: 'url', url: ref.url } : undefined;\n if (!resource) return null;\n const { id, kind, title, description, status, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt } = value;\n return { id, kind, title, description, status, resource, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt };\n}\nfunction validVersion(value: { artifactId?: string; artifactVersionId?: string } | undefined) {\n return Boolean(value && typeof value.artifactId === 'string' && typeof value.artifactVersionId === 'string');\n}\nfunction validRevision(value: FileRevision | null | undefined) {\n return value == null || (typeof value.sha256 === 'string' && /^[a-f0-9]{64}$/.test(value.sha256) && Number.isSafeInteger(value.size) && value.size >= 0);\n}\n\n/** Collapse observed operations to the net change, retaining immutable first/last review references. */\nexport function mergeFileChanges(items: ChatFileChange[]): ChatFileChange[] {\n const byPath = new Map<string, ChatFileChange>();\n for (const item of [...items].sort((a, b) => (a.startedAt ?? a.updatedAt ?? '').localeCompare(b.startedAt ?? b.updatedAt ?? ''))) {\n const previous = byPath.get(item.workspacePath);\n if (!previous || previous.coverage === 'legacy') { byPath.set(item.workspacePath, item); continue; }\n if (item.coverage === 'legacy') continue;\n const latest = (item.updatedAt ?? '') >= (previous.updatedAt ?? '') ? item : previous;\n const earliest = (item.startedAt ?? item.updatedAt ?? '') < (previous.startedAt ?? previous.updatedAt ?? '') ? item : previous;\n const before = earliest.before;\n const after = latest.after;\n byPath.set(item.workspacePath, {\n ...latest, before, after, startedAt: earliest.startedAt ?? earliest.updatedAt,\n operation: before === null ? 'added' : after === null ? 'deleted' : 'modified',\n resource: earliest.resource && latest.resource ? { type: 'file_change', first: earliest.resource.first, last: latest.resource.last } : latest.resource,\n });\n }\n return [...byPath.values()].filter((item) => item.coverage === 'legacy' || item.before?.sha256 !== item.after?.sha256)\n .sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));\n}\n\n/** Shared live/history projection. Proven tool writes move out of outputs, never filename-based classification. */\nexport function projectMessageFileActivity(message: FileActivityMessage, contribution: TChatTaskSummaryContribution): TChatTaskSummaryContribution {\n const parts = Array.isArray(message.content) ? message.content as Part[] : [];\n const observed: TChatTaskSummaryContribution[] = [];\n const legacyChanges: ChatFileChange[] = [];\n const legacyOutputIds = new Set<string>();\n const date = message.updatedAt ?? message.createdAt;\n const updatedAt = date instanceof Date ? date.toISOString() : date;\n const observedToolCalls = new Set(parts.flatMap((part) => {\n const summary = getFileActivityContribution(part) ?? part.data?.taskSummary ?? part.data?._meta?.['xpertai/taskSummary'];\n return summary?.fileActivityToolCallId ? [summary.fileActivityToolCallId] : [];\n }));\n for (const part of parts) {\n const receipt = getFileActivityContribution(part);\n if (receipt) { observed.push(receipt); continue; }\n if (part?.type !== 'component' || !part.data) continue;\n const data = part.data;\n const explicit = data.taskSummary ?? data._meta?.['xpertai/taskSummary'];\n if (explicit?.version === 1) observed.push(explicit);\n if (!writeTools.has(data.tool ?? '') || data.status !== 'success') continue;\n const path = data.input?.file_path;\n if (typeof path !== 'string' || !path || path.startsWith('/') || path.split('/').includes('..')) continue;\n legacyOutputIds.add(`workspace-file:${path}`);\n if (explicit?.fileActivityVersion === 1 || (part.id && observedToolCalls.has(part.id))) continue;\n // Historical receipts cannot prove a diff or even an actual write; label them honestly.\n legacyChanges.push({ id: `file-change:${path}`, title: path, workspacePath: path, operation: 'unknown', coverage: 'legacy', messageId: message.id, updatedAt });\n }\n if (!observed.length && !legacyOutputIds.size && !contribution.outputs?.length && !contribution.fileChanges?.length) return contribution;\n const outputs = [...(contribution.outputs ?? []), ...observed.flatMap((item) => item.outputs ?? [])];\n const byId = new Map<string, ChatTaskSummaryOutput>();\n for (const raw of outputs) {\n const output = compactOutput(raw);\n if (!output) continue;\n if (legacyOutputIds.has(output.id) && output.origin !== 'tool' && output.origin !== 'integration') continue;\n if ((byId.get(output.id)?.updatedAt ?? '') > (output.updatedAt ?? updatedAt ?? '')) continue;\n byId.set(output.id, { ...output, origin: output.origin ?? 'legacy', messageId: message.id ?? output.messageId, updatedAt: output.updatedAt ?? updatedAt });\n }\n const changes = mergeFileChanges([\n ...legacyChanges,\n ...normalizeFileChanges(contribution.fileChanges),\n ...observed.flatMap((item) => normalizeFileChanges(item.fileChanges)),\n ].map((item) => ({ ...item, messageId: message.id ?? item.messageId })));\n const coverage = [contribution.fileChangeCoverage, ...observed.map((item) => item.fileChangeCoverage)];\n const fileChangeCoverage = coverage.includes('unavailable') ? 'unavailable' : coverage.includes('partial') ? 'partial' : coverage.includes('bounded') ? 'bounded' : undefined;\n return { ...contribution, fileActivityVersion: 1, fileChangeCoverage, outputs: [...byId.values()], fileChanges: changes };\n}\n\nexport function parseFileChangeReport(value: unknown): FileChangeReport | null {\n if (!value || typeof value !== 'object') return null;\n const report = value as Partial<FileChangeReport>;\n const revision = (item: FileChangeReport['before'] | undefined) => item === null || Boolean(item && validRevision(item) && (item.text === undefined || (typeof item.text === 'string' && item.text.length <= 32768)));\n return report.schema === 'xpert.file-change.v1' && typeof report.workspacePath === 'string'\n && revision(report.before) && revision(report.after) ? report as FileChangeReport : null;\n}\n","import type { FileChangeLineStats, FileChangeReport } from './file-activity.js';\n\nconst MAX_DIFF_CELLS = 4_000_000;\n\n/** Exact line LCS with bounded CPU/memory. Unknown text never becomes zero changes. */\nexport function countFileChangeLines(report: FileChangeReport): FileChangeLineStats {\n if ((report.before && report.before.text === undefined) || (report.after && report.after.text === undefined)) return { status: 'unavailable' }\n const lines = (text: string) => text ? text.replace(/\\r\\n/g, '\\n').replace(/\\n$/, '').split('\\n') : []\n const before = lines(report.before?.text ?? ''), after = lines(report.after?.text ?? '')\n let start = 0, endBefore = before.length, endAfter = after.length\n while (start < endBefore && start < endAfter && before[start] === after[start]) start++\n while (endBefore > start && endAfter > start && before[endBefore - 1] === after[endAfter - 1]) { endBefore--; endAfter-- }\n const n = endBefore - start, m = endAfter - start\n if (n * m > MAX_DIFF_CELLS) return { status: 'unavailable' }\n let previous = new Uint32Array(m + 1), current = new Uint32Array(m + 1)\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < m; j++) current[j + 1] = before[start + i] === after[start + j] ? previous[j] + 1 : Math.max(previous[j + 1], current[j])\n ;[previous, current] = [current, previous]\n }\n return { status: 'ready', added: m - previous[m], removed: n - previous[m] }\n}\n"],"names":["config","_a","_c","_b"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -19,6 +19,23 @@ export declare interface AgentPluginDiagnostic {
|
|
|
19
19
|
|
|
20
20
|
declare type Alignment = 'start' | 'center' | 'end' | 'baseline' | 'stretch';
|
|
21
21
|
|
|
22
|
+
export declare interface ApprovalActionRequest {
|
|
23
|
+
request: HITLRequest;
|
|
24
|
+
action: 'settings';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export declare interface ApprovalDecisionRequest {
|
|
28
|
+
request: HITLRequest;
|
|
29
|
+
decisions: HITLDecision[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Opaque host resource reference; ChatKit never interprets resource-specific policy. */
|
|
33
|
+
export declare interface ApprovalHostReference {
|
|
34
|
+
kind: string;
|
|
35
|
+
id: string;
|
|
36
|
+
expiresAt: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
22
39
|
/**
|
|
23
40
|
* strategies to host files before attaching them to messages.
|
|
24
41
|
*/
|
|
@@ -205,6 +222,15 @@ export declare type ChatFileChange = {
|
|
|
205
222
|
|
|
206
223
|
export declare const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT: "task_summary.open_resource";
|
|
207
224
|
|
|
225
|
+
export declare interface ChatKitApprovalsOptions {
|
|
226
|
+
/** Existing integrations keep the composer placement by default. */
|
|
227
|
+
placement?: 'composer' | 'inline';
|
|
228
|
+
onDecision?: (input: ApprovalDecisionRequest) => Promise<{
|
|
229
|
+
accepted: boolean;
|
|
230
|
+
}>;
|
|
231
|
+
onAction?: (input: ApprovalActionRequest) => Promise<void> | void;
|
|
232
|
+
}
|
|
233
|
+
|
|
208
234
|
export declare type ChatKitClientSecretObject = {
|
|
209
235
|
secret: string;
|
|
210
236
|
organizationId?: string;
|
|
@@ -248,6 +274,7 @@ export declare interface ChatKitElementEventMap {
|
|
|
248
274
|
}>;
|
|
249
275
|
'chatkit.project.change': CustomEvent<{
|
|
250
276
|
projectId: string | null;
|
|
277
|
+
selection?: ProjectSelection;
|
|
251
278
|
}>;
|
|
252
279
|
'chatkit.connectors.change': CustomEvent<{
|
|
253
280
|
connectorBindingIds: string[];
|
|
@@ -296,6 +323,7 @@ export declare type ChatKitEvents = {
|
|
|
296
323
|
/** Emitted when the user changes the active Xpert project in the composer. */
|
|
297
324
|
'chatkit.project.change': CustomEvent<{
|
|
298
325
|
projectId: string | null;
|
|
326
|
+
selection?: ProjectSelection;
|
|
299
327
|
}>;
|
|
300
328
|
/** Emitted when the user changes the Connector bindings selected for the conversation. */
|
|
301
329
|
'chatkit.connectors.change': CustomEvent<{
|
|
@@ -504,6 +532,8 @@ export declare type ChatKitOptions = {
|
|
|
504
532
|
* Optional animated pet companion rendered by the ChatKit web component over
|
|
505
533
|
* the host page viewport.
|
|
506
534
|
* Passing `true` enables the default built-in pet.
|
|
535
|
+
* Explicit `false` disables pets and local pet controls in chat mode,
|
|
536
|
+
* overriding saved user preferences. Pet display mode still requires a pet.
|
|
507
537
|
*
|
|
508
538
|
* @default false
|
|
509
539
|
*/
|
|
@@ -515,6 +545,8 @@ export declare type ChatKitOptions = {
|
|
|
515
545
|
* @default null
|
|
516
546
|
*/
|
|
517
547
|
initialThread?: null | string;
|
|
548
|
+
/** Generic approval placement and host decision callbacks. */
|
|
549
|
+
approvals?: ChatKitApprovalsOptions;
|
|
518
550
|
/**
|
|
519
551
|
* A map of handlers for the client tools configured on your server. The keys
|
|
520
552
|
* are the names of the client tools, and the values are functions that
|
|
@@ -544,6 +576,8 @@ export declare type ChatKitOptions = {
|
|
|
544
576
|
*/
|
|
545
577
|
header?: {
|
|
546
578
|
enabled?: boolean;
|
|
579
|
+
/** Enable native Electron dragging/OS double-click behavior on unused chat and Workbench header space. Defaults to false. */
|
|
580
|
+
windowDrag?: boolean;
|
|
547
581
|
/**
|
|
548
582
|
* Configuration for header title display, which defaults to showing thread titles.
|
|
549
583
|
*/
|
|
@@ -663,6 +697,12 @@ export declare type ChatKitOptions = {
|
|
|
663
697
|
*/
|
|
664
698
|
projects?: {
|
|
665
699
|
enabled?: boolean;
|
|
700
|
+
/** Initial conversation intent. Binding a running conversation does not change this option. */
|
|
701
|
+
selection?: ProjectSelection;
|
|
702
|
+
/** Offer automatic creation on first send when the Assistant supports it. */
|
|
703
|
+
autoNewEnabled?: boolean;
|
|
704
|
+
/** Hide the no-Project choice for Assistants requiring a Project workspace. */
|
|
705
|
+
allowNone?: boolean;
|
|
666
706
|
/**
|
|
667
707
|
* Allow the user to request Project creation from the selector.
|
|
668
708
|
* Defaults to true when Project selection is enabled. Set this to false
|
|
@@ -972,6 +1012,16 @@ export declare type ChatKitWorkbenchClientCommandRequest = {
|
|
|
972
1012
|
viewKey: string;
|
|
973
1013
|
};
|
|
974
1014
|
|
|
1015
|
+
/** Authenticated host response consumed only by ChatKit, never forwarded to a plugin. */
|
|
1016
|
+
export declare type ChatKitWorkbenchNavigationSession = {
|
|
1017
|
+
assistantId: string;
|
|
1018
|
+
projectId: string | null;
|
|
1019
|
+
threadId: string | null;
|
|
1020
|
+
conversationId?: string;
|
|
1021
|
+
secret: string;
|
|
1022
|
+
organizationId?: string;
|
|
1023
|
+
};
|
|
1024
|
+
|
|
975
1025
|
export declare type ChatKitWorkbenchOptions = {
|
|
976
1026
|
/** Show external Assistant executions in a native workbench tab. Enabled by default. */
|
|
977
1027
|
externalAssistants?: {
|
|
@@ -983,6 +1033,14 @@ export declare type ChatKitWorkbenchOptions = {
|
|
|
983
1033
|
* @default false
|
|
984
1034
|
*/
|
|
985
1035
|
enabled?: boolean;
|
|
1036
|
+
/**
|
|
1037
|
+
* Show a vertical strip of available remote-view icons at the right edge of
|
|
1038
|
+
* chat while the workbench is closed. Clicking an icon opens that view.
|
|
1039
|
+
* Requires `workbench.enabled`. Disabled by default.
|
|
1040
|
+
*/
|
|
1041
|
+
viewRail?: {
|
|
1042
|
+
enabled?: boolean;
|
|
1043
|
+
};
|
|
986
1044
|
/** Native side chat branched from the current thread. Disabled by default. */
|
|
987
1045
|
sideChat?: {
|
|
988
1046
|
enabled?: boolean;
|
|
@@ -990,6 +1048,13 @@ export declare type ChatKitWorkbenchOptions = {
|
|
|
990
1048
|
/**
|
|
991
1049
|
* Handles manifest-declared client commands that are not implemented by
|
|
992
1050
|
* ChatKit itself.
|
|
1051
|
+
* For assistant.conversation/project navigation, resolve and authorize the
|
|
1052
|
+
* requested resource on the server, then return
|
|
1053
|
+
* `{ success: true, session: ChatKitWorkbenchNavigationSession }`.
|
|
1054
|
+
* ChatKit switches its runtime scope and uses the same callback to refresh
|
|
1055
|
+
* this scoped session. Credentials are stripped from the remote-view reply.
|
|
1056
|
+
* Hosts that perform navigation themselves may return
|
|
1057
|
+
* `{ success: true, status: 'opened' }` without a session.
|
|
993
1058
|
*/
|
|
994
1059
|
onClientCommand?: (request: ChatKitWorkbenchClientCommandRequest) => unknown | Promise<unknown>;
|
|
995
1060
|
};
|
|
@@ -1596,6 +1661,8 @@ export declare interface HITLRejectDecision {
|
|
|
1596
1661
|
}
|
|
1597
1662
|
|
|
1598
1663
|
export declare interface HITLRequest {
|
|
1664
|
+
host?: ApprovalHostReference;
|
|
1665
|
+
toolCallId?: string;
|
|
1599
1666
|
actionRequests: HITLActionRequest[];
|
|
1600
1667
|
reviewConfigs: HITLReviewConfig[];
|
|
1601
1668
|
elicitation?: HITLMCPElicitation;
|
|
@@ -1772,6 +1839,8 @@ export declare interface InterruptPayload extends LangGraphInterruptPayload<Inte
|
|
|
1772
1839
|
|
|
1773
1840
|
export declare type InterruptRequest = ToolCallRequest | ClientToolRequest | HITLRequest;
|
|
1774
1841
|
|
|
1842
|
+
export declare function isApprovalHostReference(value: unknown): value is ApprovalHostReference;
|
|
1843
|
+
|
|
1775
1844
|
export declare function isClientToolInterrupt(value: unknown): value is ClientToolInterrupt;
|
|
1776
1845
|
|
|
1777
1846
|
export declare function isClientToolInterruptPayload(value: unknown): value is ClientToolInterruptPayload;
|
|
@@ -2042,6 +2111,16 @@ export declare type PetViewport = {
|
|
|
2042
2111
|
/** Shared live/history projection. Proven tool writes move out of outputs, never filename-based classification. */
|
|
2043
2112
|
export declare function projectMessageFileActivity(message: FileActivityMessage, contribution: TChatTaskSummaryContribution): TChatTaskSummaryContribution;
|
|
2044
2113
|
|
|
2114
|
+
/** Explicit user intent for the next conversation; absence retains legacy host behavior. */
|
|
2115
|
+
export declare type ProjectSelection = {
|
|
2116
|
+
mode: 'auto-new';
|
|
2117
|
+
} | {
|
|
2118
|
+
mode: 'none';
|
|
2119
|
+
} | {
|
|
2120
|
+
mode: 'existing';
|
|
2121
|
+
projectId: string;
|
|
2122
|
+
};
|
|
2123
|
+
|
|
2045
2124
|
export declare type RadioGroup = {
|
|
2046
2125
|
type: 'RadioGroup';
|
|
2047
2126
|
key?: string;
|
|
@@ -2291,6 +2370,7 @@ export declare type TChatRequest = {
|
|
|
2291
2370
|
state?: TXpertChatState;
|
|
2292
2371
|
agentKey?: string;
|
|
2293
2372
|
projectId?: string;
|
|
2373
|
+
projectSelection?: ProjectSelection;
|
|
2294
2374
|
conversationId?: string;
|
|
2295
2375
|
environmentId?: string;
|
|
2296
2376
|
id?: string;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { CHAT_EVENT_TYPE_FOLLOW_UP_CONSUMED, ChatMessageEventTypeEnum, ChatMessageStepCategory, ChatMessageTypeEnum, STATE_VARIABLE_HUMAN } from "./constants.js";
|
|
2
2
|
import "@langchain/core/messages/tool";
|
|
3
|
+
function isApprovalHostReference(value) {
|
|
4
|
+
return !!value && typeof value === "object" && "kind" in value && typeof value.kind === "string" && value.kind.length > 0 && "id" in value && typeof value.id === "string" && value.id.length > 0 && "expiresAt" in value && typeof value.expiresAt === "number" && Number.isFinite(value.expiresAt);
|
|
5
|
+
}
|
|
3
6
|
function isLocalizedText(value) {
|
|
4
7
|
return typeof value === "string" || !!value && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((item) => typeof item === "string" || item === void 0);
|
|
5
8
|
}
|
|
@@ -129,9 +132,7 @@ function normalizeHITLRequest(value) {
|
|
|
129
132
|
const normalizedActionRequests = actionRequests.map(
|
|
130
133
|
normalizeHITLActionRequest
|
|
131
134
|
);
|
|
132
|
-
const normalizedReviewConfigs = reviewConfigs.map(
|
|
133
|
-
normalizeHITLReviewConfig
|
|
134
|
-
);
|
|
135
|
+
const normalizedReviewConfigs = reviewConfigs.map(normalizeHITLReviewConfig);
|
|
135
136
|
if (normalizedActionRequests.some((request) => request === null) || normalizedReviewConfigs.some((config2) => config2 === null)) {
|
|
136
137
|
return null;
|
|
137
138
|
}
|
|
@@ -139,6 +140,12 @@ function normalizeHITLRequest(value) {
|
|
|
139
140
|
actionRequests: normalizedActionRequests,
|
|
140
141
|
reviewConfigs: normalizedReviewConfigs
|
|
141
142
|
};
|
|
143
|
+
if (value.host !== void 0) {
|
|
144
|
+
if (!isApprovalHostReference(value.host)) return null;
|
|
145
|
+
normalizedRequest.host = value.host;
|
|
146
|
+
}
|
|
147
|
+
if (typeof value.toolCallId === "string")
|
|
148
|
+
normalizedRequest.toolCallId = value.toolCallId;
|
|
142
149
|
const elicitation = normalizeHITLMCPElicitation(value.elicitation);
|
|
143
150
|
if (!elicitation || normalizedRequest.actionRequests.length !== 1) {
|
|
144
151
|
return normalizedRequest;
|
|
@@ -846,6 +853,7 @@ export {
|
|
|
846
853
|
getLegacyFileActivityContribution,
|
|
847
854
|
getMessageSkillUsages,
|
|
848
855
|
getPinnedPetPosition,
|
|
856
|
+
isApprovalHostReference,
|
|
849
857
|
isClientToolInterrupt,
|
|
850
858
|
isClientToolInterruptPayload,
|
|
851
859
|
isClientToolInterruptTask,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/thread-reference.ts","../src/pet.ts","../src/task-summary.ts","../src/skill-usage.ts","../src/tool-output.ts","../src/file-activity-receipt.ts","../src/file-activity.ts","../src/file-change-lines.ts"],"sourcesContent":["import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import { isHITLReviewDisplay, type HITLReviewDisplay } from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\n elicitation?: HITLMCPElicitation;\n}\n\nexport interface HITLApproveDecision {\n type: 'approve';\n}\n\nexport interface HITLEditDecision {\n type: 'edit';\n editedAction: HITLAction;\n}\n\nexport interface HITLRejectDecision {\n type: 'reject';\n message?: string;\n}\n\nexport interface HITLRespondDecision {\n type: 'respond';\n message: string;\n}\n\nexport type HITLDecision =\n | HITLApproveDecision\n | HITLEditDecision\n | HITLRejectDecision\n | HITLRespondDecision;\n\nexport interface HITLResponse {\n decisions: HITLDecision[];\n}\n\nexport type InterruptRequest =\n | ToolCallRequest\n | ClientToolRequest\n | HITLRequest;\n\nexport interface LangGraphInterrupt<TValue = unknown> {\n id: string;\n value: TValue;\n when?: string;\n resumable?: boolean;\n ns?: string[];\n}\n\nexport interface LangGraphInterruptTask<TValue = unknown> {\n id: string;\n name: string;\n path: Array<string | number>;\n interrupts: Array<LangGraphInterrupt<TValue>>;\n}\n\nexport interface LangGraphInterruptPayload<TValue = unknown> {\n tasks: Array<LangGraphInterruptTask<TValue>>;\n}\n\nexport type ClientToolInterrupt<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ClientToolInterruptTask<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ClientToolInterruptPayload<\n TRequest extends ClientToolRequest = ClientToolRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type ToolCallInterrupt<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterrupt<TRequest>;\n\nexport type ToolCallInterruptTask<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptTask<TRequest>;\n\nexport type ToolCallInterruptPayload<\n TRequest extends ToolCallRequest = ToolCallRequest,\n> = LangGraphInterruptPayload<TRequest>;\n\nexport type HITLInterrupt<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterrupt<TRequest>;\n\nexport type HITLInterruptTask<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptTask<TRequest>;\n\nexport type HITLInterruptPayload<TRequest extends HITLRequest = HITLRequest> =\n LangGraphInterruptPayload<TRequest>;\n\n/**\n * When an interrupt occurs during task execution, the system generates an InterruptPayload.\n *\n * Ordinary tool-call interrupts use `toolCalls`; ChatKit client-tool middleware\n * uses `clientToolCalls` so the UI can route those calls to the client.\n * Human-in-the-loop interrupts use `actionRequests` and `reviewConfigs` so\n * ChatKit can collect reviewer decisions and resume with `{ decisions }`.\n```json\n{\n \"type\": \"event\",\n \"event\": \"on_interrupt\",\n \"data\": {\n \"tasks\": [\n {\n \"id\": \"9c4d2ac5-8808-5b6f-855c-4d48aa3d77a7\",\n \"name\": \"Middleware_wPzR2bIXqE_after_model\",\n \"path\": [\"__pregel_pull\", \"Middleware_wPzR2bIXqE_after_model\"],\n \"interrupts\": [\n {\n \"id\": \"b42f7887d65e57ed11cf08b8927763db\",\n \"value\": {\n \"toolCalls\": [\n {\n \"name\": \"getUserStation\",\n \"args\": {\n \"input\": \"Query the site selected by the user\"\n },\n \"id\": \"call_00_swcaUjIaACXOHHaZyNmQB3Vm\",\n \"type\": \"tool_call\"\n }\n ]\n }\n }\n ]\n }\n ]\n }\n}\n```\n */\nexport interface InterruptPayload extends LangGraphInterruptPayload<InterruptRequest> {}\n\nexport interface ClientToolMessageInput {\n content: unknown;\n name?: string;\n tool_call_id?: string;\n status?: 'success' | 'error';\n artifact?: unknown;\n}\n\nexport interface ClientToolResponse {\n toolMessages: ClientToolMessageInput[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readRecordField(\n value: Record<string, unknown>,\n ...keys: string[]\n): Record<string, unknown> | null {\n for (const key of keys) {\n const field = value[key];\n if (isRecord(field)) return field;\n }\n\n return null;\n}\n\nfunction readArrayField(value: Record<string, unknown>, ...keys: string[]) {\n for (const key of keys) {\n const field = value[key];\n if (Array.isArray(field)) return field;\n }\n\n return null;\n}\n\nfunction readStringField(\n value: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const field = value[key];\n if (typeof field === 'string' && field.trim()) return field;\n }\n\n return null;\n}\n\nexport function isHITLDecisionType(\n value: unknown,\n): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(\n value: unknown,\n): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(\n value: unknown,\n): HITLReviewConfig | null {\n if (!isRecord(value)) return null;\n\n const actionName = readStringField(value, 'actionName', 'action_name');\n const allowedDecisions = readArrayField(\n value,\n 'allowedDecisions',\n 'allowed_decisions',\n );\n if (!actionName || !allowedDecisions) return null;\n\n const normalizedDecisions = allowedDecisions.filter(isHITLDecisionType);\n if (normalizedDecisions.length !== allowedDecisions.length) return null;\n\n const argsSchema = readRecordField(value, 'argsSchema', 'args_schema');\n\n return {\n actionName,\n allowedDecisions: normalizedDecisions,\n ...(argsSchema ? { argsSchema } : {}),\n };\n}\n\nfunction normalizeHITLMCPElicitation(\n value: unknown,\n): HITLMCPElicitation | null {\n if (!isRecord(value) || value.kind !== 'mcp_elicitation') return null;\n\n const actionName = readStringField(value, 'actionName');\n const field = readRecordField(value, 'field');\n if (!actionName || !field) return null;\n\n const name = readStringField(field, 'name');\n if (!name || field.type !== 'boolean' || field.required !== true) {\n return null;\n }\n if (field.title !== undefined && typeof field.title !== 'string') {\n return null;\n }\n\n const title = readStringField(field, 'title');\n return {\n kind: 'mcp_elicitation',\n actionName,\n field: {\n name,\n type: 'boolean',\n required: true,\n ...(title ? { title } : {}),\n },\n };\n}\n\nexport function normalizeHITLRequest(value: unknown): HITLRequest | null {\n if (!isRecord(value)) return null;\n\n const actionRequests = readArrayField(\n value,\n 'actionRequests',\n 'action_requests',\n );\n const reviewConfigs = readArrayField(\n value,\n 'reviewConfigs',\n 'review_configs',\n );\n if (\n !actionRequests ||\n !reviewConfigs ||\n actionRequests.length === 0 ||\n reviewConfigs.length === 0\n ) {\n return null;\n }\n\n const normalizedActionRequests = actionRequests.map(\n normalizeHITLActionRequest,\n );\n const normalizedReviewConfigs = reviewConfigs.map(\n normalizeHITLReviewConfig,\n );\n if (\n normalizedActionRequests.some((request) => request === null) ||\n normalizedReviewConfigs.some((config) => config === null)\n ) {\n return null;\n }\n\n const normalizedRequest: HITLRequest = {\n actionRequests: normalizedActionRequests as HITLActionRequest[],\n reviewConfigs: normalizedReviewConfigs as HITLReviewConfig[],\n };\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","/** A live reference to a conversation branch, never a client-supplied transcript. */\nexport type ChatKitThreadReference = {\n type: 'thread';\n id?: string;\n label?: string;\n conversationId: string;\n threadId: string;\n};\n\nexport function normalizeThreadReference(\n value: unknown,\n): ChatKitThreadReference | null {\n if (\n !value ||\n typeof value !== 'object' ||\n !('type' in value) ||\n value.type !== 'thread'\n )\n return null;\n if (\n !('conversationId' in value) ||\n !isLocator(value.conversationId) ||\n !('threadId' in value) ||\n !isLocator(value.threadId)\n )\n return null;\n if (\n 'label' in value &&\n value.label !== undefined &&\n (typeof value.label !== 'string' || value.label.length > 300)\n )\n return null;\n if ('id' in value && value.id !== undefined && !isLocator(value.id))\n return null;\n return {\n type: 'thread',\n conversationId: value.conversationId.trim(),\n threadId: value.threadId.trim(),\n ...('label' in value && typeof value.label === 'string'\n ? { label: value.label.trim() }\n : {}),\n ...('id' in value && typeof value.id === 'string'\n ? { id: value.id.trim() }\n : {}),\n };\n}\n\nfunction isLocator(value: unknown): value is string {\n return (\n typeof value === 'string' && value.trim().length > 0 && value.length <= 128\n );\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","import type { ChatSkillUsage } from './skill-usage.js';\nimport type { ChatFileChange } from './file-activity.js';\n\nexport const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type FileChangeResource = {\n type: 'file_change';\n first: { artifactId: string; artifactVersionId: string };\n last: { artifactId: string; artifactVersionId: string };\n};\n\nexport type FileChangeSetResource = {\n type: 'file_change_set';\n messageId: string;\n changes: { workspacePath: string; resource?: FileChangeResource }[];\n};\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 artifactVersionId?: string;\n }\n | FileChangeResource\n | FileChangeSetResource\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 /** Only host-verified, explicitly presented files get message-end cards. */\n origin?: 'tool' | 'integration' | 'legacy';\n workspacePath?: string;\n mimeType?: string;\n size?: number;\n sha256?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n skillUsages?: ChatSkillUsage[];\n /** Presence marks the new semantic projection; old writes are never deliveries. */\n fileActivityVersion?: 1;\n fileActivityToolCallId?: string;\n fileChangeCoverage?: 'bounded' | 'partial' | 'unavailable';\n fileChanges?: ChatFileChange[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","/** Snapshot produced by the runtime after successfully loading skill instructions. */\nexport type ChatSkillUsage = {\n skillId: string;\n name: string;\n version: string;\n source: {\n type: 'workspace' | 'project' | 'assistant' | 'plugin';\n id: string;\n };\n activation: 'read';\n toolCallId: string;\n executionId?: string;\n loadedAt: string;\n};\n\nexport function chatSkillUsageKey(usage: ChatSkillUsage): string {\n return JSON.stringify([\n usage.source.type,\n usage.source.id,\n usage.skillId,\n usage.version,\n ]);\n}\n\n/** Merge only observations belonging to the same message. Keep the first read. */\nexport function mergeChatSkillUsages(\n ...groups: ReadonlyArray<readonly ChatSkillUsage[] | undefined>\n): ChatSkillUsage[] {\n const usages = new Map<string, ChatSkillUsage>();\n for (const group of groups) {\n for (const usage of group ?? []) {\n const key = chatSkillUsageKey(usage);\n if (!usages.has(key)) usages.set(key, usage);\n }\n }\n return [...usages.values()];\n}\n\n/** JSON boundary: allowlist fields rather than forwarding paths or raw tool data. */\nexport function normalizeChatSkillUsages(value: unknown): ChatSkillUsage[] {\n if (!Array.isArray(value)) return [];\n const usages: ChatSkillUsage[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object' || item.activation !== 'read')\n continue;\n const { source } = item;\n if (\n !source ||\n typeof source !== 'object' ||\n !['workspace', 'project', 'assistant', 'plugin'].includes(source.type) ||\n typeof source.id !== 'string' ||\n !source.id.trim()\n )\n continue;\n if (\n typeof item.skillId !== 'string' ||\n !item.skillId.trim() ||\n typeof item.name !== 'string' ||\n !item.name.trim() ||\n typeof item.version !== 'string' ||\n typeof item.toolCallId !== 'string' ||\n !item.toolCallId.trim() ||\n typeof item.loadedAt !== 'string' ||\n !Number.isFinite(Date.parse(item.loadedAt))\n )\n continue;\n usages.push({\n skillId: item.skillId,\n name: item.name,\n version: item.version,\n source: { type: source.type, id: source.id },\n activation: 'read',\n toolCallId: item.toolCallId,\n ...(typeof item.executionId === 'string' && item.executionId\n ? { executionId: item.executionId }\n : {}),\n loadedAt: item.loadedAt,\n });\n }\n return mergeChatSkillUsages(usages);\n}\n\nfunction summarySkillUsages(summary: unknown): ChatSkillUsage[] {\n return summary &&\n typeof summary === 'object' &&\n 'version' in summary &&\n summary.version === 1 &&\n 'skillUsages' in summary\n ? normalizeChatSkillUsages(summary.skillUsages)\n : [];\n}\n\n/** Works for both streamed tool components and persisted message summaries. */\nexport function getMessageSkillUsages(message: {\n content?: unknown;\n taskSummary?: unknown;\n}): ChatSkillUsage[] {\n const groups = [summarySkillUsages(message.taskSummary)];\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part?.type === 'component' && part.data?.status === 'success') {\n groups.push(summarySkillUsages(part.data.taskSummary));\n }\n }\n }\n return mergeChatSkillUsages(...groups);\n}\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n","import type { ChatFileChange } from './file-activity.js';\nimport { normalizeFileChanges, normalizeFileOutputs } from './file-activity.js';\nimport type { ChatTaskSummaryOutput, TChatTaskSummaryContribution } from './task-summary.js';\n\n/** Host-owned facts from a tool execution, never an additional tool invocation. */\nexport type FileActivityReceipt = {\n version: 1;\n receiptId: string;\n toolCallId: string;\n updatedAt: string;\n} & (\n | { kind: 'changes'; coverage: 'bounded' | 'partial' | 'unavailable'; fileChanges: ChatFileChange[] }\n | { kind: 'delivery'; status: 'success'; outputs: ChatTaskSummaryOutput[] }\n | { kind: 'delivery'; status: 'error'; error: string }\n);\n\nexport type TMessageContentFileActivity = {\n id: string;\n type: 'file_activity';\n data: FileActivityReceipt;\n messageId?: string;\n executionId?: string;\n agentKey?: string;\n parentExecutionId?: string;\n runId?: string;\n};\n\nexport function parseFileActivityContent(value: unknown): TMessageContentFileActivity | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as Partial<TMessageContentFileActivity>;\n if (part.type !== 'file_activity' || typeof part.id !== 'string' || !part.id || !part.data || typeof part.data !== 'object') return null;\n const data = part.data;\n if (data.version !== 1 || data.receiptId !== part.id || typeof data.toolCallId !== 'string' || !data.toolCallId\n || typeof data.updatedAt !== 'string' || !Number.isFinite(Date.parse(data.updatedAt))) return null;\n const base = { version: 1 as const, receiptId: part.id, toolCallId: data.toolCallId, updatedAt: data.updatedAt };\n let receipt: FileActivityReceipt;\n if (data.kind === 'changes' && ['bounded', 'partial', 'unavailable'].includes(data.coverage) && Array.isArray(data.fileChanges)) {\n const fileChanges = normalizeFileChanges(data.fileChanges);\n if (fileChanges.length !== data.fileChanges.length) return null;\n receipt = { ...base, kind: 'changes', coverage: data.coverage, fileChanges };\n } else if (data.kind === 'delivery' && data.status === 'success' && Array.isArray(data.outputs)) {\n const outputs = normalizeFileOutputs(data.outputs);\n if (outputs.length !== data.outputs.length) return null;\n receipt = { ...base, kind: 'delivery', status: 'success', outputs };\n } else if (data.kind === 'delivery' && data.status === 'error' && typeof data.error === 'string') {\n receipt = { ...base, kind: 'delivery', status: 'error', error: data.error };\n } else return null;\n return { id: part.id, type: 'file_activity', data: receipt,\n ...(typeof part.messageId === 'string' ? { messageId: part.messageId } : {}),\n ...(typeof part.executionId === 'string' ? { executionId: part.executionId } : {}),\n ...(typeof part.agentKey === 'string' ? { agentKey: part.agentKey } : {}),\n ...(typeof part.parentExecutionId === 'string' ? { parentExecutionId: part.parentExecutionId } : {}),\n ...(typeof part.runId === 'string' ? { runId: part.runId } : {}) };\n}\n\ntype LegacyStep = { id?: unknown; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } };\n/** Compatibility uses explicit metadata and the original call identity, never labels or ID suffixes. */\nexport function getLegacyFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as { id?: unknown; type?: unknown; data?: LegacyStep };\n const step = part.type === 'component' ? part.data : value as LegacyStep;\n if (!step || typeof step !== 'object') return null;\n const summary = step.taskSummary ?? step._meta?.['xpertai/taskSummary'];\n const id = part.id ?? step.id;\n return summary?.version === 1 && summary.fileActivityVersion === 1\n && typeof summary.fileActivityToolCallId === 'string' && Boolean(summary.fileActivityToolCallId)\n && typeof id === 'string' && id !== summary.fileActivityToolCallId ? summary : null;\n}\n\nexport function isFileActivityContent(value: unknown): boolean {\n return Boolean(value && typeof value === 'object' && 'type' in value && value.type === 'file_activity')\n || getLegacyFileActivityContribution(value) !== null;\n}\n\nexport function getFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n const part = parseFileActivityContent(value);\n if (!part) return getLegacyFileActivityContribution(value);\n const receipt = part.data;\n return { version: 1, fileActivityVersion: 1, fileActivityToolCallId: receipt.toolCallId,\n ...(receipt.kind === 'changes' ? { fileChanges: receipt.fileChanges, fileChangeCoverage: receipt.coverage }\n : receipt.status === 'success' ? { outputs: receipt.outputs } : {}) };\n}\n\n/** Receipts are immutable terminal facts; replay replaces by identity, never appends a second operation. */\nexport function upsertFileActivityContent<T>(content: T[], receipt: TMessageContentFileActivity): (T | TMessageContentFileActivity)[] {\n const index = content.findIndex((item) => parseFileActivityContent(item)?.id === receipt.id);\n if (index < 0) return [...content, receipt];\n const previous = parseFileActivityContent(content[index]);\n if (previous && Date.parse(previous.data.updatedAt) >= Date.parse(receipt.data.updatedAt)) return content;\n return content.map((item, position) => position === index ? receipt : item);\n}\n","import { getFileActivityContribution } from './file-activity-receipt.js';\nimport type { ChatTaskSummaryOutput, ChatTaskSummaryResourceReference, TChatTaskSummaryContribution } from './task-summary.js';\n\nexport type FileRevision = { sha256: string; size: number };\nexport type ChatFileChange = {\n id: string;\n workspacePath: string;\n title: string;\n operation: 'added' | 'modified' | 'deleted' | 'unknown';\n before?: FileRevision | null;\n after?: FileRevision | null;\n resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>;\n coverage: 'observed' | 'legacy';\n messageId?: string;\n startedAt?: string;\n updatedAt?: string;\n};\nexport type FileChangeLineStats =\n | { status: 'ready'; added: number; removed: number }\n | { status: 'unavailable' };\nexport type MessageFileChangeStats = {\n messageId: string;\n items: { workspacePath: string; resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>; stats: FileChangeLineStats }[];\n};\n/** Stable cache identity for a fixed review range; never identifies mutable workspace bytes. */\nexport function fileChangeRangeKey(resource: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>) {\n return JSON.stringify([resource.first.artifactId, resource.first.artifactVersionId, resource.last.artifactId, resource.last.artifactVersionId]);\n}\n\n/** Private review payload. Never include text/diffs in compact task summaries. */\nexport type FileChangeReport = {\n schema: 'xpert.file-change.v1';\n workspacePath: string;\n before: (FileRevision & { text?: string }) | null;\n after: (FileRevision & { text?: string }) | null;\n};\n\nconst writeTools = new Set(['sandbox_write_file', 'sandbox_append_file', 'sandbox_edit_file', 'sandbox_multi_edit_file']);\ntype Part = { id?: string; type?: string; data?: { tool?: string; status?: string; input?: { file_path?: string }; output?: string; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } } };\nexport type FileActivityMessage = { id?: string; content?: unknown; taskSummary?: TChatTaskSummaryContribution; updatedAt?: string | Date; createdAt?: string | Date };\n\nexport function normalizeFileChanges(value: unknown): ChatFileChange[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is ChatFileChange => {\n if (!item || typeof item !== 'object') return false;\n const change = item as Partial<ChatFileChange>;\n return typeof change.id === 'string' && typeof change.workspacePath === 'string' && typeof change.title === 'string'\n && ['added', 'modified', 'deleted', 'unknown'].includes(change.operation ?? '')\n && ['observed', 'legacy'].includes(change.coverage ?? '')\n && (!change.resource || (change.resource.type === 'file_change' && validVersion(change.resource.first) && validVersion(change.resource.last)))\n && validRevision(change.before) && validRevision(change.after);\n }).map(({ id, title, workspacePath, operation, before, after, resource, coverage, messageId, startedAt, updatedAt }) => ({\n id, title, workspacePath, operation, before: compactRevision(before), after: compactRevision(after), resource, coverage, messageId, startedAt, updatedAt,\n }));\n}\nfunction compactRevision(value: FileRevision | null | undefined) {\n return value ? { sha256: value.sha256, size: value.size } : value;\n}\nexport function normalizeFileOutputs(value: unknown): ChatTaskSummaryOutput[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n if (!item || typeof item !== 'object') return [];\n const output = compactOutput(item as ChatTaskSummaryOutput);\n return output ? [output] : [];\n });\n}\nfunction compactOutput(value: ChatTaskSummaryOutput): ChatTaskSummaryOutput | null {\n if (!value || typeof value.id !== 'string' || typeof value.title !== 'string'\n || !['file', 'image', 'document', 'spreadsheet', 'presentation', 'site', 'url', 'mcp_app'].includes(value.kind)\n || (value.status !== undefined && value.status !== 'success')) return null;\n const ref = value.resource;\n const resource: ChatTaskSummaryOutput['resource'] = ref?.type === 'artifact' && typeof ref.artifactId === 'string'\n ? { type: 'artifact', artifactId: ref.artifactId, ...(typeof ref.artifactVersionId === 'string' ? { artifactVersionId: ref.artifactVersionId } : {}) }\n : ref?.type === 'workspace_file' && typeof ref.workspacePath === 'string'\n ? { type: 'workspace_file', workspacePath: ref.workspacePath, fileAssetId: ref.fileAssetId, storageFileId: ref.storageFileId }\n : ref?.type === 'url' && typeof ref.url === 'string' ? { type: 'url', url: ref.url } : undefined;\n if (!resource) return null;\n const { id, kind, title, description, status, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt } = value;\n return { id, kind, title, description, status, resource, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt };\n}\nfunction validVersion(value: { artifactId?: string; artifactVersionId?: string } | undefined) {\n return Boolean(value && typeof value.artifactId === 'string' && typeof value.artifactVersionId === 'string');\n}\nfunction validRevision(value: FileRevision | null | undefined) {\n return value == null || (typeof value.sha256 === 'string' && /^[a-f0-9]{64}$/.test(value.sha256) && Number.isSafeInteger(value.size) && value.size >= 0);\n}\n\n/** Collapse observed operations to the net change, retaining immutable first/last review references. */\nexport function mergeFileChanges(items: ChatFileChange[]): ChatFileChange[] {\n const byPath = new Map<string, ChatFileChange>();\n for (const item of [...items].sort((a, b) => (a.startedAt ?? a.updatedAt ?? '').localeCompare(b.startedAt ?? b.updatedAt ?? ''))) {\n const previous = byPath.get(item.workspacePath);\n if (!previous || previous.coverage === 'legacy') { byPath.set(item.workspacePath, item); continue; }\n if (item.coverage === 'legacy') continue;\n const latest = (item.updatedAt ?? '') >= (previous.updatedAt ?? '') ? item : previous;\n const earliest = (item.startedAt ?? item.updatedAt ?? '') < (previous.startedAt ?? previous.updatedAt ?? '') ? item : previous;\n const before = earliest.before;\n const after = latest.after;\n byPath.set(item.workspacePath, {\n ...latest, before, after, startedAt: earliest.startedAt ?? earliest.updatedAt,\n operation: before === null ? 'added' : after === null ? 'deleted' : 'modified',\n resource: earliest.resource && latest.resource ? { type: 'file_change', first: earliest.resource.first, last: latest.resource.last } : latest.resource,\n });\n }\n return [...byPath.values()].filter((item) => item.coverage === 'legacy' || item.before?.sha256 !== item.after?.sha256)\n .sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));\n}\n\n/** Shared live/history projection. Proven tool writes move out of outputs, never filename-based classification. */\nexport function projectMessageFileActivity(message: FileActivityMessage, contribution: TChatTaskSummaryContribution): TChatTaskSummaryContribution {\n const parts = Array.isArray(message.content) ? message.content as Part[] : [];\n const observed: TChatTaskSummaryContribution[] = [];\n const legacyChanges: ChatFileChange[] = [];\n const legacyOutputIds = new Set<string>();\n const date = message.updatedAt ?? message.createdAt;\n const updatedAt = date instanceof Date ? date.toISOString() : date;\n const observedToolCalls = new Set(parts.flatMap((part) => {\n const summary = getFileActivityContribution(part) ?? part.data?.taskSummary ?? part.data?._meta?.['xpertai/taskSummary'];\n return summary?.fileActivityToolCallId ? [summary.fileActivityToolCallId] : [];\n }));\n for (const part of parts) {\n const receipt = getFileActivityContribution(part);\n if (receipt) { observed.push(receipt); continue; }\n if (part?.type !== 'component' || !part.data) continue;\n const data = part.data;\n const explicit = data.taskSummary ?? data._meta?.['xpertai/taskSummary'];\n if (explicit?.version === 1) observed.push(explicit);\n if (!writeTools.has(data.tool ?? '') || data.status !== 'success') continue;\n const path = data.input?.file_path;\n if (typeof path !== 'string' || !path || path.startsWith('/') || path.split('/').includes('..')) continue;\n legacyOutputIds.add(`workspace-file:${path}`);\n if (explicit?.fileActivityVersion === 1 || (part.id && observedToolCalls.has(part.id))) continue;\n // Historical receipts cannot prove a diff or even an actual write; label them honestly.\n legacyChanges.push({ id: `file-change:${path}`, title: path, workspacePath: path, operation: 'unknown', coverage: 'legacy', messageId: message.id, updatedAt });\n }\n if (!observed.length && !legacyOutputIds.size && !contribution.outputs?.length && !contribution.fileChanges?.length) return contribution;\n const outputs = [...(contribution.outputs ?? []), ...observed.flatMap((item) => item.outputs ?? [])];\n const byId = new Map<string, ChatTaskSummaryOutput>();\n for (const raw of outputs) {\n const output = compactOutput(raw);\n if (!output) continue;\n if (legacyOutputIds.has(output.id) && output.origin !== 'tool' && output.origin !== 'integration') continue;\n if ((byId.get(output.id)?.updatedAt ?? '') > (output.updatedAt ?? updatedAt ?? '')) continue;\n byId.set(output.id, { ...output, origin: output.origin ?? 'legacy', messageId: message.id ?? output.messageId, updatedAt: output.updatedAt ?? updatedAt });\n }\n const changes = mergeFileChanges([\n ...legacyChanges,\n ...normalizeFileChanges(contribution.fileChanges),\n ...observed.flatMap((item) => normalizeFileChanges(item.fileChanges)),\n ].map((item) => ({ ...item, messageId: message.id ?? item.messageId })));\n const coverage = [contribution.fileChangeCoverage, ...observed.map((item) => item.fileChangeCoverage)];\n const fileChangeCoverage = coverage.includes('unavailable') ? 'unavailable' : coverage.includes('partial') ? 'partial' : coverage.includes('bounded') ? 'bounded' : undefined;\n return { ...contribution, fileActivityVersion: 1, fileChangeCoverage, outputs: [...byId.values()], fileChanges: changes };\n}\n\nexport function parseFileChangeReport(value: unknown): FileChangeReport | null {\n if (!value || typeof value !== 'object') return null;\n const report = value as Partial<FileChangeReport>;\n const revision = (item: FileChangeReport['before'] | undefined) => item === null || Boolean(item && validRevision(item) && (item.text === undefined || (typeof item.text === 'string' && item.text.length <= 32768)));\n return report.schema === 'xpert.file-change.v1' && typeof report.workspacePath === 'string'\n && revision(report.before) && revision(report.after) ? report as FileChangeReport : null;\n}\n","import type { FileChangeLineStats, FileChangeReport } from './file-activity.js';\n\nconst MAX_DIFF_CELLS = 4_000_000;\n\n/** Exact line LCS with bounded CPU/memory. Unknown text never becomes zero changes. */\nexport function countFileChangeLines(report: FileChangeReport): FileChangeLineStats {\n if ((report.before && report.before.text === undefined) || (report.after && report.after.text === undefined)) return { status: 'unavailable' }\n const lines = (text: string) => text ? text.replace(/\\r\\n/g, '\\n').replace(/\\n$/, '').split('\\n') : []\n const before = lines(report.before?.text ?? ''), after = lines(report.after?.text ?? '')\n let start = 0, endBefore = before.length, endAfter = after.length\n while (start < endBefore && start < endAfter && before[start] === after[start]) start++\n while (endBefore > start && endAfter > start && before[endBefore - 1] === after[endAfter - 1]) { endBefore--; endAfter-- }\n const n = endBefore - start, m = endAfter - start\n if (n * m > MAX_DIFF_CELLS) return { status: 'unavailable' }\n let previous = new Uint32Array(m + 1), current = new Uint32Array(m + 1)\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < m; j++) current[j + 1] = before[start + i] === after[start + j] ? previous[j] + 1 : Math.max(previous[j + 1], current[j])\n ;[previous, current] = [current, previous]\n }\n return { status: 'ready', added: m - previous[m], removed: n - previous[m] }\n}\n"],"names":["config","_a","_c","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/approvals.ts","../src/review-display.ts","../src/interrupt.ts","../src/localized-text.ts","../src/locale.ts","../src/thread-reference.ts","../src/pet.ts","../src/task-summary.ts","../src/skill-usage.ts","../src/tool-output.ts","../src/file-activity-receipt.ts","../src/file-activity.ts","../src/file-change-lines.ts"],"sourcesContent":["import type { HITLDecision, HITLRequest } from './interrupt.js';\n\n/** Opaque host resource reference; ChatKit never interprets resource-specific policy. */\nexport interface ApprovalHostReference {\n kind: string;\n id: string;\n expiresAt: number;\n}\nexport interface ApprovalDecisionRequest {\n request: HITLRequest;\n decisions: HITLDecision[];\n}\nexport interface ApprovalActionRequest {\n request: HITLRequest;\n action: 'settings';\n}\nexport interface ChatKitApprovalsOptions {\n /** Existing integrations keep the composer placement by default. */\n placement?: 'composer' | 'inline';\n onDecision?: (\n input: ApprovalDecisionRequest,\n ) => Promise<{ accepted: boolean }>;\n onAction?: (input: ApprovalActionRequest) => Promise<void> | void;\n}\nexport function isApprovalHostReference(\n value: unknown,\n): value is ApprovalHostReference {\n return (\n !!value &&\n typeof value === 'object' &&\n 'kind' in value &&\n typeof value.kind === 'string' &&\n value.kind.length > 0 &&\n 'id' in value &&\n typeof value.id === 'string' &&\n value.id.length > 0 &&\n 'expiresAt' in value &&\n typeof value.expiresAt === 'number' &&\n Number.isFinite(value.expiresAt)\n );\n}\n","import type { LocalizedText } from './localized-text.js';\n\nexport type HITLReviewSection =\n | { type: 'text'; label: LocalizedText; text: LocalizedText }\n | { type: 'code'; label: LocalizedText; code: string }\n | { type: 'table'; label: LocalizedText; columns: string[]; rows: Array<Array<string | number | boolean | null>> };\n\n/** Optional presentation metadata. Never changes action arguments or approval decisions. */\nexport type HITLReviewDisplay = {\n title: LocalizedText;\n summary: LocalizedText;\n sections: HITLReviewSection[];\n};\n\nfunction isLocalizedText(value: unknown): value is LocalizedText {\n return typeof value === 'string' || (!!value && typeof value === 'object' && !Array.isArray(value) &&\n Object.values(value).every((item) => typeof item === 'string' || item === undefined));\n}\n\nexport function isHITLReviewDisplay(value: unknown): value is HITLReviewDisplay {\n if (!value || typeof value !== 'object' || !('title' in value) || !isLocalizedText(value.title) ||\n !('summary' in value) || !isLocalizedText(value.summary) || !('sections' in value) || !Array.isArray(value.sections)) return false;\n return value.sections.every((section: unknown) => {\n if (!section || typeof section !== 'object' || !('label' in section) || !isLocalizedText(section.label) || !('type' in section)) return false;\n switch (section.type) {\n case 'text': return 'text' in section && isLocalizedText(section.text);\n case 'code': return 'code' in section && typeof section.code === 'string';\n case 'table': return 'columns' in section && Array.isArray(section.columns) && section.columns.every((column: unknown) => typeof column === 'string') &&\n 'rows' in section && Array.isArray(section.rows) && section.rows.every((row: unknown) => Array.isArray(row) && row.every((cell: unknown) => cell === null || typeof cell === 'string' || typeof cell === 'boolean' || (typeof cell === 'number' && Number.isFinite(cell))));\n default: return false;\n }\n });\n}\n","import {\n isApprovalHostReference,\n type ApprovalHostReference,\n} from './approvals.js';\nimport {\n isHITLReviewDisplay,\n type HITLReviewDisplay,\n} from './review-display.js';\nexport * from './review-display.js';\nimport { type ToolCall } from '@langchain/core/messages/tool';\n\nexport const REQUEST_USER_INPUT_TOOL_NAME = 'request_user_input';\nexport type RequestUserInputToolName = typeof REQUEST_USER_INPUT_TOOL_NAME;\nexport const REQUEST_USER_INPUT_RESULT_TYPE = 'request_user_input_result';\nexport type RequestUserInputResultType = typeof REQUEST_USER_INPUT_RESULT_TYPE;\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION =\n 'plan_clarification';\nexport const REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION =\n 'implementation_confirmation';\nexport type RequestUserInputResultPurpose =\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_PLAN_CLARIFICATION\n | typeof REQUEST_USER_INPUT_RESULT_PURPOSE_IMPLEMENTATION_CONFIRMATION;\n\nexport interface RequestUserInputOption {\n label: string;\n description: string;\n}\n\nexport interface RequestUserInputQuestion {\n id: string;\n header: string;\n question: string;\n options: RequestUserInputOption[];\n}\n\nexport interface RequestUserInputParams {\n questions: RequestUserInputQuestion[];\n}\n\nexport type RequestUserInputToolArgs = RequestUserInputParams;\n\nexport type RequestUserInputAnswerType = 'option' | 'other';\n\nexport interface RequestUserInputAnswer {\n id: string;\n question: string;\n value: string;\n type: RequestUserInputAnswerType;\n label?: string;\n description?: string;\n}\n\nexport interface RequestUserInputResult {\n type: RequestUserInputResultType;\n purpose: RequestUserInputResultPurpose;\n answers: RequestUserInputAnswer[];\n}\n\nexport type RequestUserInputToolCall = ToolCall & {\n name: RequestUserInputToolName;\n args: RequestUserInputToolArgs;\n id: string;\n type?: 'tool_call';\n};\n\nexport interface ClientToolRequest {\n clientToolCalls: ToolCall[];\n}\n\nexport interface ToolCallRequest {\n toolCalls: ToolCall[];\n}\n\nexport const HITL_DECISION_TYPES = [\n 'approve',\n 'edit',\n 'reject',\n 'respond',\n] as const;\n\nexport type HITLDecisionType = (typeof HITL_DECISION_TYPES)[number];\n\nexport interface HITLAction {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface HITLActionRequest extends HITLAction {\n description?: string;\n display?: HITLReviewDisplay;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n allowedDecisions: HITLDecisionType[];\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLBooleanElicitationField {\n name: string;\n type: 'boolean';\n title?: string;\n required: true;\n}\n\nexport interface HITLMCPElicitation {\n kind: 'mcp_elicitation';\n actionName: string;\n field: HITLBooleanElicitationField;\n}\n\nexport interface HITLRequest {\n host?: ApprovalHostReference;\n toolCallId?: string;\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(value: unknown): value is HITLDecisionType {\n return (\n typeof value === 'string' &&\n (HITL_DECISION_TYPES as readonly string[]).includes(value)\n );\n}\n\nfunction normalizeHITLActionRequest(value: unknown): HITLActionRequest | null {\n if (!isRecord(value)) return null;\n\n const name = readStringField(value, 'name');\n const args = readRecordField(value, 'args', 'arguments');\n if (!name || !args) return null;\n\n const description =\n typeof value.description === 'string' ? value.description : undefined;\n\n return {\n name,\n args,\n ...(description !== undefined ? { description } : {}),\n ...(isHITLReviewDisplay(value.display) ? { display: value.display } : {}),\n };\n}\n\nfunction normalizeHITLReviewConfig(value: unknown): 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(normalizeHITLReviewConfig);\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 if (value.host !== undefined) {\n if (!isApprovalHostReference(value.host)) return null;\n normalizedRequest.host = value.host;\n }\n if (typeof value.toolCallId === 'string')\n normalizedRequest.toolCallId = value.toolCallId;\n const elicitation = normalizeHITLMCPElicitation(value.elicitation);\n if (!elicitation || normalizedRequest.actionRequests.length !== 1) {\n return normalizedRequest;\n }\n\n const action = normalizedRequest.actionRequests[0];\n const config = normalizedRequest.reviewConfigs.find(\n (reviewConfig) => reviewConfig.actionName === elicitation.actionName,\n );\n if (\n !action ||\n action.name !== elicitation.actionName ||\n !config ||\n typeof action.args[elicitation.field.name] !== 'boolean' ||\n !config.allowedDecisions.includes('approve') ||\n !config.allowedDecisions.includes('reject')\n ) {\n return normalizedRequest;\n }\n\n return { ...normalizedRequest, elicitation };\n}\n\nexport function isClientToolRequest(\n value: unknown,\n): value is ClientToolRequest {\n return isRecord(value) && Array.isArray(value.clientToolCalls);\n}\n\nexport function isToolCallRequest(value: unknown): value is ToolCallRequest {\n return isRecord(value) && Array.isArray(value.toolCalls);\n}\n\nexport function isHITLRequest(value: unknown): value is HITLRequest {\n if (!isRecord(value)) return false;\n if (\n !Array.isArray(value.actionRequests) ||\n !Array.isArray(value.reviewConfigs)\n ) {\n return false;\n }\n\n return normalizeHITLRequest(value) !== null;\n}\n\nexport function isInterruptRequest(value: unknown): value is InterruptRequest {\n return (\n isToolCallRequest(value) ||\n isClientToolRequest(value) ||\n isHITLRequest(value)\n );\n}\n\nexport function isLangGraphInterrupt(\n value: unknown,\n): value is LangGraphInterrupt {\n return (\n isRecord(value) &&\n typeof value.id === 'string' &&\n Object.prototype.hasOwnProperty.call(value, 'value')\n );\n}\n\nexport function isLangGraphInterruptTask(\n value: unknown,\n): value is LangGraphInterruptTask {\n if (\n !isRecord(value) ||\n typeof value.id !== 'string' ||\n typeof value.name !== 'string' ||\n !Array.isArray(value.path) ||\n !Array.isArray(value.interrupts)\n ) {\n return false;\n }\n\n return (\n value.path.every(\n (item) => typeof item === 'string' || typeof item === 'number',\n ) && value.interrupts.every(isLangGraphInterrupt)\n );\n}\n\nexport function isLangGraphInterruptPayload(\n value: unknown,\n): value is LangGraphInterruptPayload {\n return (\n isRecord(value) &&\n Array.isArray(value.tasks) &&\n value.tasks.every(isLangGraphInterruptTask)\n );\n}\n\nexport function isClientToolInterrupt(\n value: unknown,\n): value is ClientToolInterrupt {\n return isLangGraphInterrupt(value) && isClientToolRequest(value.value);\n}\n\nexport function isClientToolInterruptTask(\n value: unknown,\n): value is ClientToolInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isClientToolInterrupt)\n );\n}\n\nexport function isClientToolInterruptPayload(\n value: unknown,\n): value is ClientToolInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isClientToolInterruptTask)\n );\n}\n\nexport function isToolCallInterrupt(\n value: unknown,\n): value is ToolCallInterrupt {\n return isLangGraphInterrupt(value) && isToolCallRequest(value.value);\n}\n\nexport function isToolCallInterruptTask(\n value: unknown,\n): value is ToolCallInterruptTask {\n return (\n isLangGraphInterruptTask(value) &&\n value.interrupts.every(isToolCallInterrupt)\n );\n}\n\nexport function isToolCallInterruptPayload(\n value: unknown,\n): value is ToolCallInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) &&\n value.tasks.every(isToolCallInterruptTask)\n );\n}\n\nexport function isHITLInterrupt(value: unknown): value is HITLInterrupt {\n return isLangGraphInterrupt(value) && isHITLRequest(value.value);\n}\n\nexport function isHITLInterruptTask(\n value: unknown,\n): value is HITLInterruptTask {\n return (\n isLangGraphInterruptTask(value) && value.interrupts.every(isHITLInterrupt)\n );\n}\n\nexport function isHITLInterruptPayload(\n value: unknown,\n): value is HITLInterruptPayload {\n return (\n isLangGraphInterruptPayload(value) && value.tasks.every(isHITLInterruptTask)\n );\n}\n","export type I18nObject = {\n en_US?: string;\n en?: string;\n 'en-US'?: string;\n zh_Hans?: string;\n zh_CN?: string;\n zh?: string;\n 'zh-Hans'?: string;\n 'zh-CN'?: string;\n [locale: string]: string | undefined;\n};\n\nexport type LocalizedText = string | I18nObject;\n\nexport function resolveLocalizedText(\n value: unknown,\n language = 'en-US',\n): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n\n if (!value || typeof value !== 'object') return null;\n\n const localized = value as I18nObject;\n const normalizedLanguage = language.trim();\n const underscoredLanguage = normalizedLanguage.replace(/-/g, '_');\n const languagePrefix = normalizedLanguage.split(/[-_]/)[0];\n const preferredKeys = normalizedLanguage.toLowerCase().startsWith('zh')\n ? [\n normalizedLanguage,\n underscoredLanguage,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n 'en_US',\n 'en-US',\n 'en',\n ]\n : [\n normalizedLanguage,\n underscoredLanguage,\n 'en_US',\n 'en-US',\n 'en',\n languagePrefix,\n 'zh_Hans',\n 'zh-Hans',\n 'zh_CN',\n 'zh-CN',\n 'zh',\n ];\n\n for (const key of preferredKeys) {\n const candidate = localized[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n for (const candidate of Object.values(localized)) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return null;\n}\n","export function normalizeRequestLanguage(\n locale?: string | null,\n): string | undefined {\n const normalized = locale?.trim();\n if (!normalized) {\n return undefined;\n }\n\n const lower = normalized.toLowerCase();\n if (lower === 'zh-hant' || lower === 'zh-tw' || lower === 'zh-hk') {\n return 'zh-Hant';\n }\n if (lower === 'zh' || lower === 'zh-cn' || lower === 'zh-hans') {\n return 'zh-Hans';\n }\n if (lower === 'en' || lower === 'en-us') {\n return 'en';\n }\n\n return normalized;\n}\n","/** A live reference to a conversation branch, never a client-supplied transcript. */\nexport type ChatKitThreadReference = {\n type: 'thread';\n id?: string;\n label?: string;\n conversationId: string;\n threadId: string;\n};\n\nexport function normalizeThreadReference(\n value: unknown,\n): ChatKitThreadReference | null {\n if (\n !value ||\n typeof value !== 'object' ||\n !('type' in value) ||\n value.type !== 'thread'\n )\n return null;\n if (\n !('conversationId' in value) ||\n !isLocator(value.conversationId) ||\n !('threadId' in value) ||\n !isLocator(value.threadId)\n )\n return null;\n if (\n 'label' in value &&\n value.label !== undefined &&\n (typeof value.label !== 'string' || value.label.length > 300)\n )\n return null;\n if ('id' in value && value.id !== undefined && !isLocator(value.id))\n return null;\n return {\n type: 'thread',\n conversationId: value.conversationId.trim(),\n threadId: value.threadId.trim(),\n ...('label' in value && typeof value.label === 'string'\n ? { label: value.label.trim() }\n : {}),\n ...('id' in value && typeof value.id === 'string'\n ? { id: value.id.trim() }\n : {}),\n };\n}\n\nfunction isLocator(value: unknown): value is string {\n return (\n typeof value === 'string' && value.trim().length > 0 && value.length <= 128\n );\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas,\n} from './options.js';\n\nexport type PetFrameAnimationDefinition = {\n row: number;\n frames: number;\n frameDurations: readonly number[];\n};\n\nexport type PetSpriteAtlasDefinition = {\n columns: number;\n rows: number;\n cellWidth: number;\n cellHeight: number;\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>;\n};\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter;\n position: Required<\n Pick<\n NonNullable<ChatKitPetOptions['position']>,\n 'draggable' | 'persist' | 'scale' | 'zIndex'\n >\n > &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>;\n behavior: NonNullable<ChatKitPetOptions['behavior']>;\n ariaLabel: string;\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>;\n};\n\nexport type ResolvedPetCharacter =\n {\n kind: 'atlas';\n src: string;\n atlas: PetSpriteAtlasDefinition;\n };\n\nexport type PetPosition = {\n x: number;\n y: number;\n};\n\nexport type PetSize = {\n width: number;\n height: number;\n};\n\nexport type PetViewport = {\n width: number;\n height: number;\n};\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review',\n] as const satisfies readonly ChatKitPetAnimationName[];\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320],\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220],\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280],\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280],\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240],\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260],\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220],\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280],\n },\n },\n} as const satisfies PetSpriteAtlasDefinition;\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight,\n};\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1';\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp';\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL,\n} as const satisfies ChatKitPetCharacter;\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40,\n} as const satisfies NormalizedPetOptions['position'];\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation,\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0\n ? override.frameDurations\n : base.frameDurations,\n };\n}\n\nexport function mergePetSpriteAtlas(\n override?: ChatKitPetSpriteAtlas,\n): PetSpriteAtlasDefinition {\n const animations = {} as Record<\n ChatKitPetAnimationName,\n PetFrameAnimationDefinition\n >;\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(\n petSpriteAtlas.animations[name],\n override?.animations?.[name],\n );\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations,\n };\n}\n\nfunction normalizeCharacter(\n character: ChatKitPetCharacter | undefined,\n): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER;\n }\n\n if (character.src) {\n return character;\n }\n\n return DEFAULT_PET_CHARACTER;\n}\n\nexport function normalizePetOptions(\n pet: ChatKitOptions['pet'] | null,\n): NormalizedPetOptions | null {\n if (!pet) {\n return null;\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto',\n };\n }\n\n if (pet.enabled === false) {\n return null;\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position,\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto',\n };\n}\n\nexport function resolvePetCharacter(\n character: ChatKitPetCharacter,\n): ResolvedPetCharacter | null {\n if (!character.src) {\n return null;\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas),\n };\n}\n\nexport function normalizeBoundsPadding(\n value?: number | Partial<ChatKitPetBoundsPadding>,\n): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value,\n };\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left,\n };\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const minX = padding.left;\n const minY = padding.top;\n const maxX = Math.max(minX, viewport.width - size.width - padding.right);\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom);\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y)),\n };\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding,\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2;\n const verticalCenter = (viewport.height - size.height) / 2;\n const right = viewport.width - size.width - padding.right;\n const bottom = viewport.height - size.height - padding.bottom;\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition(\n { x: padding.left, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top':\n return clampPetPosition(\n { x: horizontalCenter, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'top-right':\n return clampPetPosition(\n { x: right, y: padding.top },\n size,\n viewport,\n padding,\n );\n case 'left':\n return clampPetPosition(\n { x: padding.left, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'center':\n return clampPetPosition(\n { x: horizontalCenter, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'right':\n return clampPetPosition(\n { x: right, y: verticalCenter },\n size,\n viewport,\n padding,\n );\n case 'bottom-left':\n return clampPetPosition(\n { x: padding.left, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom':\n return clampPetPosition(\n { x: horizontalCenter, y: bottom },\n size,\n viewport,\n padding,\n );\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding);\n }\n}\n","import type { ChatSkillUsage } from './skill-usage.js';\nimport type { ChatFileChange } from './file-activity.js';\n\nexport const CHATKIT_TASK_SUMMARY_OPEN_RESOURCE_EFFECT =\n 'task_summary.open_resource' as const;\n\nexport type FileChangeResource = {\n type: 'file_change';\n first: { artifactId: string; artifactVersionId: string };\n last: { artifactId: string; artifactVersionId: string };\n};\n\nexport type FileChangeSetResource = {\n type: 'file_change_set';\n messageId: string;\n changes: { workspacePath: string; resource?: FileChangeResource }[];\n};\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 artifactVersionId?: string;\n }\n | FileChangeResource\n | FileChangeSetResource\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 /** Only host-verified, explicitly presented files get message-end cards. */\n origin?: 'tool' | 'integration' | 'legacy';\n workspacePath?: string;\n mimeType?: string;\n size?: number;\n sha256?: string;\n};\n\nexport type ChatTaskSummarySourceKind =\n | 'attachment'\n | 'code'\n | 'quote'\n | 'image'\n | 'web_page'\n | 'file_element'\n | 'knowledge'\n | 'skill'\n | 'plugin'\n | 'sub_agent';\n\nexport type ChatTaskSummarySource = {\n id: string;\n kind: ChatTaskSummarySourceKind;\n title: string;\n description?: string;\n resource?: ChatTaskSummaryResourceReference;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryPlan = {\n title: string;\n excerpt: string;\n messageId?: string;\n updatedAt?: string;\n};\n\nexport type ChatTaskSummaryTodoStatus = 'pending' | 'in_progress' | 'completed';\n\nexport type ChatTaskSummaryTodoItem = {\n id: string;\n content: string;\n status: ChatTaskSummaryTodoStatus;\n};\n\nexport type ChatTaskSummaryTodos = {\n componentId: string;\n title?: string;\n items: ChatTaskSummaryTodoItem[];\n messageId?: string;\n updatedAt?: string;\n};\n\n/**\n * Compact, persisted contribution from one chat message to a thread summary.\n * Raw tool output, logs, inputs, and environment values must never be copied here.\n */\nexport type TChatTaskSummaryContribution = {\n version: 1;\n plan?: ChatTaskSummaryPlan;\n todos?: ChatTaskSummaryTodos;\n outputs?: ChatTaskSummaryOutput[];\n sources?: ChatTaskSummarySource[];\n skillUsages?: ChatSkillUsage[];\n /** Presence marks the new semantic projection; old writes are never deliveries. */\n fileActivityVersion?: 1;\n fileActivityToolCallId?: string;\n fileChangeCoverage?: 'bounded' | 'partial' | 'unavailable';\n fileChanges?: ChatFileChange[];\n};\n\nexport type ChatTaskSummaryOpenResourceEffect = {\n resource: ChatTaskSummaryResourceReference;\n conversationId?: string;\n messageId?: string;\n title?: string;\n};\n","/** Snapshot produced by the runtime after successfully loading skill instructions. */\nexport type ChatSkillUsage = {\n skillId: string;\n name: string;\n version: string;\n source: {\n type: 'workspace' | 'project' | 'assistant' | 'plugin';\n id: string;\n };\n activation: 'read';\n toolCallId: string;\n executionId?: string;\n loadedAt: string;\n};\n\nexport function chatSkillUsageKey(usage: ChatSkillUsage): string {\n return JSON.stringify([\n usage.source.type,\n usage.source.id,\n usage.skillId,\n usage.version,\n ]);\n}\n\n/** Merge only observations belonging to the same message. Keep the first read. */\nexport function mergeChatSkillUsages(\n ...groups: ReadonlyArray<readonly ChatSkillUsage[] | undefined>\n): ChatSkillUsage[] {\n const usages = new Map<string, ChatSkillUsage>();\n for (const group of groups) {\n for (const usage of group ?? []) {\n const key = chatSkillUsageKey(usage);\n if (!usages.has(key)) usages.set(key, usage);\n }\n }\n return [...usages.values()];\n}\n\n/** JSON boundary: allowlist fields rather than forwarding paths or raw tool data. */\nexport function normalizeChatSkillUsages(value: unknown): ChatSkillUsage[] {\n if (!Array.isArray(value)) return [];\n const usages: ChatSkillUsage[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object' || item.activation !== 'read')\n continue;\n const { source } = item;\n if (\n !source ||\n typeof source !== 'object' ||\n !['workspace', 'project', 'assistant', 'plugin'].includes(source.type) ||\n typeof source.id !== 'string' ||\n !source.id.trim()\n )\n continue;\n if (\n typeof item.skillId !== 'string' ||\n !item.skillId.trim() ||\n typeof item.name !== 'string' ||\n !item.name.trim() ||\n typeof item.version !== 'string' ||\n typeof item.toolCallId !== 'string' ||\n !item.toolCallId.trim() ||\n typeof item.loadedAt !== 'string' ||\n !Number.isFinite(Date.parse(item.loadedAt))\n )\n continue;\n usages.push({\n skillId: item.skillId,\n name: item.name,\n version: item.version,\n source: { type: source.type, id: source.id },\n activation: 'read',\n toolCallId: item.toolCallId,\n ...(typeof item.executionId === 'string' && item.executionId\n ? { executionId: item.executionId }\n : {}),\n loadedAt: item.loadedAt,\n });\n }\n return mergeChatSkillUsages(usages);\n}\n\nfunction summarySkillUsages(summary: unknown): ChatSkillUsage[] {\n return summary &&\n typeof summary === 'object' &&\n 'version' in summary &&\n summary.version === 1 &&\n 'skillUsages' in summary\n ? normalizeChatSkillUsages(summary.skillUsages)\n : [];\n}\n\n/** Works for both streamed tool components and persisted message summaries. */\nexport function getMessageSkillUsages(message: {\n content?: unknown;\n taskSummary?: unknown;\n}): ChatSkillUsage[] {\n const groups = [summarySkillUsages(message.taskSummary)];\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part?.type === 'component' && part.data?.status === 'success') {\n groups.push(summarySkillUsages(part.data.taskSummary));\n }\n }\n }\n return mergeChatSkillUsages(...groups);\n}\n","export const TOOL_OUTPUT_PRESENTATION_TYPE = 'xpert.tool-output' as const;\nexport const TOOL_OUTPUT_PRESENTATION_VERSION = 1 as const;\n\nexport type ToolOutputImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp';\n\nexport type ToolOutputImageSource = 'knowledge-document' | 'sandbox';\n\n/**\n * Stable evidence anchors that are safe to persist in chat history.\n *\n * Execution-scoped file paths, storage paths, signed URLs, and internal batch\n * references must not be included here.\n */\nexport type ToolOutputImageAnchors = {\n knowledgeDocumentId?: string;\n page?: number;\n chunkId?: string;\n sourceBlockIds?: string[];\n visualAssetId?: string;\n};\n\n/**\n * An immutable image that was prepared for a model vision step.\n *\n * Chat history stores only the private Artifact identity and presentation\n * metadata. The browser asks the trusted host to resolve a short-lived preview\n * URL when the image is rendered.\n */\nexport type ToolOutputImageAttachment = {\n type: 'image';\n artifactId: string;\n artifactVersionId: string;\n sha256: string;\n mimeType: ToolOutputImageMimeType;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n source: ToolOutputImageSource;\n modelDetail: ImageDetail;\n anchors?: ToolOutputImageAnchors;\n};\n\nexport type ToolOutputAttachment = ToolOutputImageAttachment;\n\n/**\n * UI-only ToolMessage artifact. ToolMessage content remains the compact\n * model-facing result, while middleware metadata remains private to the model\n * execution path.\n */\nexport type ToolOutputPresentation = {\n type: typeof TOOL_OUTPUT_PRESENTATION_TYPE;\n version: typeof TOOL_OUTPUT_PRESENTATION_VERSION;\n attachments: ToolOutputAttachment[];\n};\n\nexport type ToolOutputArtifactJsonValue =\n | string\n | number\n | boolean\n | null\n | ToolOutputArtifactJsonValue[]\n | { [key: string]: ToolOutputArtifactJsonValue };\n\n/** JSON-safe artifact payloads supported by ToolMessage history. */\nexport type ToolMessageArtifact =\n | ToolOutputPresentation\n | ToolOutputArtifactJsonValue;\n\nexport type ToolOutputAttachmentPreviewRequest = {\n attachment: ToolOutputImageAttachment;\n toolCallId?: string;\n executionId?: string;\n};\n\nexport type ToolOutputAttachmentPreview = {\n /** Short-lived, host-authorized URL. Never persist this value in a message. */\n previewUrl: string;\n expiresAt?: string;\n};\n\n/** Detail level requested for the model vision input. */\nexport type ImageDetail = 'auto' | 'low' | 'high';\n","import type { ChatFileChange } from './file-activity.js';\nimport { normalizeFileChanges, normalizeFileOutputs } from './file-activity.js';\nimport type { ChatTaskSummaryOutput, TChatTaskSummaryContribution } from './task-summary.js';\n\n/** Host-owned facts from a tool execution, never an additional tool invocation. */\nexport type FileActivityReceipt = {\n version: 1;\n receiptId: string;\n toolCallId: string;\n updatedAt: string;\n} & (\n | { kind: 'changes'; coverage: 'bounded' | 'partial' | 'unavailable'; fileChanges: ChatFileChange[] }\n | { kind: 'delivery'; status: 'success'; outputs: ChatTaskSummaryOutput[] }\n | { kind: 'delivery'; status: 'error'; error: string }\n);\n\nexport type TMessageContentFileActivity = {\n id: string;\n type: 'file_activity';\n data: FileActivityReceipt;\n messageId?: string;\n executionId?: string;\n agentKey?: string;\n parentExecutionId?: string;\n runId?: string;\n};\n\nexport function parseFileActivityContent(value: unknown): TMessageContentFileActivity | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as Partial<TMessageContentFileActivity>;\n if (part.type !== 'file_activity' || typeof part.id !== 'string' || !part.id || !part.data || typeof part.data !== 'object') return null;\n const data = part.data;\n if (data.version !== 1 || data.receiptId !== part.id || typeof data.toolCallId !== 'string' || !data.toolCallId\n || typeof data.updatedAt !== 'string' || !Number.isFinite(Date.parse(data.updatedAt))) return null;\n const base = { version: 1 as const, receiptId: part.id, toolCallId: data.toolCallId, updatedAt: data.updatedAt };\n let receipt: FileActivityReceipt;\n if (data.kind === 'changes' && ['bounded', 'partial', 'unavailable'].includes(data.coverage) && Array.isArray(data.fileChanges)) {\n const fileChanges = normalizeFileChanges(data.fileChanges);\n if (fileChanges.length !== data.fileChanges.length) return null;\n receipt = { ...base, kind: 'changes', coverage: data.coverage, fileChanges };\n } else if (data.kind === 'delivery' && data.status === 'success' && Array.isArray(data.outputs)) {\n const outputs = normalizeFileOutputs(data.outputs);\n if (outputs.length !== data.outputs.length) return null;\n receipt = { ...base, kind: 'delivery', status: 'success', outputs };\n } else if (data.kind === 'delivery' && data.status === 'error' && typeof data.error === 'string') {\n receipt = { ...base, kind: 'delivery', status: 'error', error: data.error };\n } else return null;\n return { id: part.id, type: 'file_activity', data: receipt,\n ...(typeof part.messageId === 'string' ? { messageId: part.messageId } : {}),\n ...(typeof part.executionId === 'string' ? { executionId: part.executionId } : {}),\n ...(typeof part.agentKey === 'string' ? { agentKey: part.agentKey } : {}),\n ...(typeof part.parentExecutionId === 'string' ? { parentExecutionId: part.parentExecutionId } : {}),\n ...(typeof part.runId === 'string' ? { runId: part.runId } : {}) };\n}\n\ntype LegacyStep = { id?: unknown; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } };\n/** Compatibility uses explicit metadata and the original call identity, never labels or ID suffixes. */\nexport function getLegacyFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n if (!value || typeof value !== 'object') return null;\n const part = value as { id?: unknown; type?: unknown; data?: LegacyStep };\n const step = part.type === 'component' ? part.data : value as LegacyStep;\n if (!step || typeof step !== 'object') return null;\n const summary = step.taskSummary ?? step._meta?.['xpertai/taskSummary'];\n const id = part.id ?? step.id;\n return summary?.version === 1 && summary.fileActivityVersion === 1\n && typeof summary.fileActivityToolCallId === 'string' && Boolean(summary.fileActivityToolCallId)\n && typeof id === 'string' && id !== summary.fileActivityToolCallId ? summary : null;\n}\n\nexport function isFileActivityContent(value: unknown): boolean {\n return Boolean(value && typeof value === 'object' && 'type' in value && value.type === 'file_activity')\n || getLegacyFileActivityContribution(value) !== null;\n}\n\nexport function getFileActivityContribution(value: unknown): TChatTaskSummaryContribution | null {\n const part = parseFileActivityContent(value);\n if (!part) return getLegacyFileActivityContribution(value);\n const receipt = part.data;\n return { version: 1, fileActivityVersion: 1, fileActivityToolCallId: receipt.toolCallId,\n ...(receipt.kind === 'changes' ? { fileChanges: receipt.fileChanges, fileChangeCoverage: receipt.coverage }\n : receipt.status === 'success' ? { outputs: receipt.outputs } : {}) };\n}\n\n/** Receipts are immutable terminal facts; replay replaces by identity, never appends a second operation. */\nexport function upsertFileActivityContent<T>(content: T[], receipt: TMessageContentFileActivity): (T | TMessageContentFileActivity)[] {\n const index = content.findIndex((item) => parseFileActivityContent(item)?.id === receipt.id);\n if (index < 0) return [...content, receipt];\n const previous = parseFileActivityContent(content[index]);\n if (previous && Date.parse(previous.data.updatedAt) >= Date.parse(receipt.data.updatedAt)) return content;\n return content.map((item, position) => position === index ? receipt : item);\n}\n","import { getFileActivityContribution } from './file-activity-receipt.js';\nimport type { ChatTaskSummaryOutput, ChatTaskSummaryResourceReference, TChatTaskSummaryContribution } from './task-summary.js';\n\nexport type FileRevision = { sha256: string; size: number };\nexport type ChatFileChange = {\n id: string;\n workspacePath: string;\n title: string;\n operation: 'added' | 'modified' | 'deleted' | 'unknown';\n before?: FileRevision | null;\n after?: FileRevision | null;\n resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>;\n coverage: 'observed' | 'legacy';\n messageId?: string;\n startedAt?: string;\n updatedAt?: string;\n};\nexport type FileChangeLineStats =\n | { status: 'ready'; added: number; removed: number }\n | { status: 'unavailable' };\nexport type MessageFileChangeStats = {\n messageId: string;\n items: { workspacePath: string; resource?: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>; stats: FileChangeLineStats }[];\n};\n/** Stable cache identity for a fixed review range; never identifies mutable workspace bytes. */\nexport function fileChangeRangeKey(resource: Extract<ChatTaskSummaryResourceReference, { type: 'file_change' }>) {\n return JSON.stringify([resource.first.artifactId, resource.first.artifactVersionId, resource.last.artifactId, resource.last.artifactVersionId]);\n}\n\n/** Private review payload. Never include text/diffs in compact task summaries. */\nexport type FileChangeReport = {\n schema: 'xpert.file-change.v1';\n workspacePath: string;\n before: (FileRevision & { text?: string }) | null;\n after: (FileRevision & { text?: string }) | null;\n};\n\nconst writeTools = new Set(['sandbox_write_file', 'sandbox_append_file', 'sandbox_edit_file', 'sandbox_multi_edit_file']);\ntype Part = { id?: string; type?: string; data?: { tool?: string; status?: string; input?: { file_path?: string }; output?: string; taskSummary?: TChatTaskSummaryContribution; _meta?: { 'xpertai/taskSummary'?: TChatTaskSummaryContribution } } };\nexport type FileActivityMessage = { id?: string; content?: unknown; taskSummary?: TChatTaskSummaryContribution; updatedAt?: string | Date; createdAt?: string | Date };\n\nexport function normalizeFileChanges(value: unknown): ChatFileChange[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is ChatFileChange => {\n if (!item || typeof item !== 'object') return false;\n const change = item as Partial<ChatFileChange>;\n return typeof change.id === 'string' && typeof change.workspacePath === 'string' && typeof change.title === 'string'\n && ['added', 'modified', 'deleted', 'unknown'].includes(change.operation ?? '')\n && ['observed', 'legacy'].includes(change.coverage ?? '')\n && (!change.resource || (change.resource.type === 'file_change' && validVersion(change.resource.first) && validVersion(change.resource.last)))\n && validRevision(change.before) && validRevision(change.after);\n }).map(({ id, title, workspacePath, operation, before, after, resource, coverage, messageId, startedAt, updatedAt }) => ({\n id, title, workspacePath, operation, before: compactRevision(before), after: compactRevision(after), resource, coverage, messageId, startedAt, updatedAt,\n }));\n}\nfunction compactRevision(value: FileRevision | null | undefined) {\n return value ? { sha256: value.sha256, size: value.size } : value;\n}\nexport function normalizeFileOutputs(value: unknown): ChatTaskSummaryOutput[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n if (!item || typeof item !== 'object') return [];\n const output = compactOutput(item as ChatTaskSummaryOutput);\n return output ? [output] : [];\n });\n}\nfunction compactOutput(value: ChatTaskSummaryOutput): ChatTaskSummaryOutput | null {\n if (!value || typeof value.id !== 'string' || typeof value.title !== 'string'\n || !['file', 'image', 'document', 'spreadsheet', 'presentation', 'site', 'url', 'mcp_app'].includes(value.kind)\n || (value.status !== undefined && value.status !== 'success')) return null;\n const ref = value.resource;\n const resource: ChatTaskSummaryOutput['resource'] = ref?.type === 'artifact' && typeof ref.artifactId === 'string'\n ? { type: 'artifact', artifactId: ref.artifactId, ...(typeof ref.artifactVersionId === 'string' ? { artifactVersionId: ref.artifactVersionId } : {}) }\n : ref?.type === 'workspace_file' && typeof ref.workspacePath === 'string'\n ? { type: 'workspace_file', workspacePath: ref.workspacePath, fileAssetId: ref.fileAssetId, storageFileId: ref.storageFileId }\n : ref?.type === 'url' && typeof ref.url === 'string' ? { type: 'url', url: ref.url } : undefined;\n if (!resource) return null;\n const { id, kind, title, description, status, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt } = value;\n return { id, kind, title, description, status, resource, origin, workspacePath, mimeType, size, sha256, messageId, updatedAt };\n}\nfunction validVersion(value: { artifactId?: string; artifactVersionId?: string } | undefined) {\n return Boolean(value && typeof value.artifactId === 'string' && typeof value.artifactVersionId === 'string');\n}\nfunction validRevision(value: FileRevision | null | undefined) {\n return value == null || (typeof value.sha256 === 'string' && /^[a-f0-9]{64}$/.test(value.sha256) && Number.isSafeInteger(value.size) && value.size >= 0);\n}\n\n/** Collapse observed operations to the net change, retaining immutable first/last review references. */\nexport function mergeFileChanges(items: ChatFileChange[]): ChatFileChange[] {\n const byPath = new Map<string, ChatFileChange>();\n for (const item of [...items].sort((a, b) => (a.startedAt ?? a.updatedAt ?? '').localeCompare(b.startedAt ?? b.updatedAt ?? ''))) {\n const previous = byPath.get(item.workspacePath);\n if (!previous || previous.coverage === 'legacy') { byPath.set(item.workspacePath, item); continue; }\n if (item.coverage === 'legacy') continue;\n const latest = (item.updatedAt ?? '') >= (previous.updatedAt ?? '') ? item : previous;\n const earliest = (item.startedAt ?? item.updatedAt ?? '') < (previous.startedAt ?? previous.updatedAt ?? '') ? item : previous;\n const before = earliest.before;\n const after = latest.after;\n byPath.set(item.workspacePath, {\n ...latest, before, after, startedAt: earliest.startedAt ?? earliest.updatedAt,\n operation: before === null ? 'added' : after === null ? 'deleted' : 'modified',\n resource: earliest.resource && latest.resource ? { type: 'file_change', first: earliest.resource.first, last: latest.resource.last } : latest.resource,\n });\n }\n return [...byPath.values()].filter((item) => item.coverage === 'legacy' || item.before?.sha256 !== item.after?.sha256)\n .sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));\n}\n\n/** Shared live/history projection. Proven tool writes move out of outputs, never filename-based classification. */\nexport function projectMessageFileActivity(message: FileActivityMessage, contribution: TChatTaskSummaryContribution): TChatTaskSummaryContribution {\n const parts = Array.isArray(message.content) ? message.content as Part[] : [];\n const observed: TChatTaskSummaryContribution[] = [];\n const legacyChanges: ChatFileChange[] = [];\n const legacyOutputIds = new Set<string>();\n const date = message.updatedAt ?? message.createdAt;\n const updatedAt = date instanceof Date ? date.toISOString() : date;\n const observedToolCalls = new Set(parts.flatMap((part) => {\n const summary = getFileActivityContribution(part) ?? part.data?.taskSummary ?? part.data?._meta?.['xpertai/taskSummary'];\n return summary?.fileActivityToolCallId ? [summary.fileActivityToolCallId] : [];\n }));\n for (const part of parts) {\n const receipt = getFileActivityContribution(part);\n if (receipt) { observed.push(receipt); continue; }\n if (part?.type !== 'component' || !part.data) continue;\n const data = part.data;\n const explicit = data.taskSummary ?? data._meta?.['xpertai/taskSummary'];\n if (explicit?.version === 1) observed.push(explicit);\n if (!writeTools.has(data.tool ?? '') || data.status !== 'success') continue;\n const path = data.input?.file_path;\n if (typeof path !== 'string' || !path || path.startsWith('/') || path.split('/').includes('..')) continue;\n legacyOutputIds.add(`workspace-file:${path}`);\n if (explicit?.fileActivityVersion === 1 || (part.id && observedToolCalls.has(part.id))) continue;\n // Historical receipts cannot prove a diff or even an actual write; label them honestly.\n legacyChanges.push({ id: `file-change:${path}`, title: path, workspacePath: path, operation: 'unknown', coverage: 'legacy', messageId: message.id, updatedAt });\n }\n if (!observed.length && !legacyOutputIds.size && !contribution.outputs?.length && !contribution.fileChanges?.length) return contribution;\n const outputs = [...(contribution.outputs ?? []), ...observed.flatMap((item) => item.outputs ?? [])];\n const byId = new Map<string, ChatTaskSummaryOutput>();\n for (const raw of outputs) {\n const output = compactOutput(raw);\n if (!output) continue;\n if (legacyOutputIds.has(output.id) && output.origin !== 'tool' && output.origin !== 'integration') continue;\n if ((byId.get(output.id)?.updatedAt ?? '') > (output.updatedAt ?? updatedAt ?? '')) continue;\n byId.set(output.id, { ...output, origin: output.origin ?? 'legacy', messageId: message.id ?? output.messageId, updatedAt: output.updatedAt ?? updatedAt });\n }\n const changes = mergeFileChanges([\n ...legacyChanges,\n ...normalizeFileChanges(contribution.fileChanges),\n ...observed.flatMap((item) => normalizeFileChanges(item.fileChanges)),\n ].map((item) => ({ ...item, messageId: message.id ?? item.messageId })));\n const coverage = [contribution.fileChangeCoverage, ...observed.map((item) => item.fileChangeCoverage)];\n const fileChangeCoverage = coverage.includes('unavailable') ? 'unavailable' : coverage.includes('partial') ? 'partial' : coverage.includes('bounded') ? 'bounded' : undefined;\n return { ...contribution, fileActivityVersion: 1, fileChangeCoverage, outputs: [...byId.values()], fileChanges: changes };\n}\n\nexport function parseFileChangeReport(value: unknown): FileChangeReport | null {\n if (!value || typeof value !== 'object') return null;\n const report = value as Partial<FileChangeReport>;\n const revision = (item: FileChangeReport['before'] | undefined) => item === null || Boolean(item && validRevision(item) && (item.text === undefined || (typeof item.text === 'string' && item.text.length <= 32768)));\n return report.schema === 'xpert.file-change.v1' && typeof report.workspacePath === 'string'\n && revision(report.before) && revision(report.after) ? report as FileChangeReport : null;\n}\n","import type { FileChangeLineStats, FileChangeReport } from './file-activity.js';\n\nconst MAX_DIFF_CELLS = 4_000_000;\n\n/** Exact line LCS with bounded CPU/memory. Unknown text never becomes zero changes. */\nexport function countFileChangeLines(report: FileChangeReport): FileChangeLineStats {\n if ((report.before && report.before.text === undefined) || (report.after && report.after.text === undefined)) return { status: 'unavailable' }\n const lines = (text: string) => text ? text.replace(/\\r\\n/g, '\\n').replace(/\\n$/, '').split('\\n') : []\n const before = lines(report.before?.text ?? ''), after = lines(report.after?.text ?? '')\n let start = 0, endBefore = before.length, endAfter = after.length\n while (start < endBefore && start < endAfter && before[start] === after[start]) start++\n while (endBefore > start && endAfter > start && before[endBefore - 1] === after[endAfter - 1]) { endBefore--; endAfter-- }\n const n = endBefore - start, m = endAfter - start\n if (n * m > MAX_DIFF_CELLS) return { status: 'unavailable' }\n let previous = new Uint32Array(m + 1), current = new Uint32Array(m + 1)\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < m; j++) current[j + 1] = before[start + i] === after[start + j] ? previous[j] + 1 : Math.max(previous[j + 1], current[j])\n ;[previous, current] = [current, previous]\n }\n return { status: 'ready', added: m - previous[m], removed: n - previous[m] }\n}\n"],"names":["config","_a","_c","_b"],"mappings":"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"}
|