@letta-ai/letta-code 0.33.8 → 0.34.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.
Files changed (67) hide show
  1. package/dist/agent-presets.js +2 -2
  2. package/dist/agent-presets.js.map +1 -1
  3. package/dist/ask-user-question.cjs +128 -0
  4. package/dist/ask-user-question.cjs.map +10 -0
  5. package/dist/ask-user-question.js +88 -0
  6. package/dist/ask-user-question.js.map +10 -0
  7. package/dist/gateway-core.js +6 -20
  8. package/dist/gateway-core.js.map +5 -6
  9. package/dist/mcp-client.js +2 -2
  10. package/dist/mcp-client.js.map +1 -1
  11. package/dist/mcp-oauth.js +2 -2
  12. package/dist/mcp-oauth.js.map +1 -1
  13. package/dist/types/agent/client-skills.d.ts.map +1 -1
  14. package/dist/types/agent/skills.d.ts +0 -5
  15. package/dist/types/agent/skills.d.ts.map +1 -1
  16. package/dist/types/agent-settings.d.ts +23 -0
  17. package/dist/types/agent-settings.d.ts.map +1 -0
  18. package/dist/types/ask-user-question.d.ts +31 -0
  19. package/dist/types/ask-user-question.d.ts.map +1 -0
  20. package/dist/types/channels/gateway-core.d.ts.map +1 -1
  21. package/dist/types/channels/message-channel-formatting.d.ts.map +1 -1
  22. package/dist/types/cli/helpers/tool-name-mapping.d.ts +0 -8
  23. package/dist/types/cli/helpers/tool-name-mapping.d.ts.map +1 -1
  24. package/dist/types/permissions/checker.d.ts.map +1 -1
  25. package/dist/types/settings-manager.d.ts +5 -14
  26. package/dist/types/settings-manager.d.ts.map +1 -1
  27. package/dist/types/telemetry/error-reporting.d.ts +8 -0
  28. package/dist/types/telemetry/error-reporting.d.ts.map +1 -1
  29. package/dist/types/telemetry/index.d.ts +2 -7
  30. package/dist/types/telemetry/index.d.ts.map +1 -1
  31. package/dist/types/tools/client-preferences.d.ts +8 -0
  32. package/dist/types/tools/client-preferences.d.ts.map +1 -0
  33. package/dist/types/tools/impl/ask-user-question.d.ts +6 -18
  34. package/dist/types/tools/impl/ask-user-question.d.ts.map +1 -1
  35. package/dist/types/tools/impl/monitor.d.ts +0 -1
  36. package/dist/types/tools/impl/monitor.d.ts.map +1 -1
  37. package/dist/types/tools/impl/watch-pr.d.ts.map +1 -1
  38. package/dist/types/tools/manager.d.ts.map +1 -1
  39. package/dist/types/tools/tool-definitions.d.ts +1 -1
  40. package/dist/types/tools/toolset-catalog.d.ts +1 -1
  41. package/dist/types/tools/toolset-catalog.d.ts.map +1 -1
  42. package/dist/types/tools/toolset.d.ts.map +1 -1
  43. package/dist/types/types/client-preferences.d.ts +7 -0
  44. package/dist/types/types/client-preferences.d.ts.map +1 -0
  45. package/dist/types/types/protocol_v2.d.ts +4 -7
  46. package/dist/types/types/protocol_v2.d.ts.map +1 -1
  47. package/dist/types/types/teleport-protocol.d.ts +3 -0
  48. package/dist/types/types/teleport-protocol.d.ts.map +1 -1
  49. package/dist/types/utils/task-notifications.d.ts +0 -1
  50. package/dist/types/utils/task-notifications.d.ts.map +1 -1
  51. package/dist/types/websocket/listener/protocol-outbound.d.ts.map +1 -1
  52. package/dist/types/websocket/listener/queue.d.ts.map +1 -1
  53. package/dist/types/websocket/listener/runtime.d.ts.map +1 -1
  54. package/dist/types/websocket/listener/types.d.ts +1 -9
  55. package/dist/types/websocket/listener/types.d.ts.map +1 -1
  56. package/image-resize-worker.js +2 -6449
  57. package/letta.js +41025 -41253
  58. package/package.json +16 -2
  59. package/scripts/isolated-unit-tests.json +10 -0
  60. package/scripts/smoke-image-worker.mjs +68 -0
  61. package/scripts/source-file-size-baseline.json +13 -13
  62. package/scripts/stage-pypi-deps.mjs +1 -11
  63. package/scripts/unit-test-impact.test.cjs +2 -1
  64. package/skills/curating-memory-palace/SKILL.md +102 -60
  65. package/skills/initializing-memory/SKILL.md +1 -1
  66. package/dist/types/tools/interactive-policy.d.ts +0 -12
  67. package/dist/types/tools/interactive-policy.d.ts.map +0 -1
@@ -1713,7 +1713,7 @@ user: What is the codebase structure?
1713
1713
  assistant: [Uses the Agent tool with subagent_type=general-purpose]
1714
1714
  </example>
1715
1715
 
1716
- Tools are executed in a user-selected permission mode. When you attempt to call a tool that is not automatically allowed by the user's permission mode or permission settings, the user will be prompted so that they can approve or deny the execution. If the user denies a tool you call, do not re-attempt the exact same tool call. Instead, think about why the user has denied the tool call and adjust your approach. If you do not understand why the user has denied a tool call, use the AskUserQuestion to ask them.
1716
+ Tools are executed in a user-selected permission mode. When you attempt to call a tool that is not automatically allowed by the user's permission mode or permission settings, the user will be prompted so that they can approve or deny the execution. If the user denies a tool you call, do not re-attempt the exact same tool call. Instead, think about why the user has denied the tool call and adjust your approach. If you do not understand why the user has denied a tool call, ask them using AskUserQuestion when available, or an ordinary message otherwise.
1717
1717
 
1718
1718
  - Tool results and user messages may include <system-reminder> tags. <system-reminder> tags contain useful information and reminders. They are automatically added by the system, and bear no direct relation to the specific tool results or user messages in which they appear.
1719
1719
  - The conversation has unlimited context through automatic summarization.
@@ -2586,4 +2586,4 @@ export {
2586
2586
  DEFAULT_CREATED_AGENT_BASE_TOOLS
2587
2587
  };
2588
2588
 
2589
- //# debugId=89470D292266CA6164756E2164756E21
2589
+ //# debugId=006C28A4424C7CD564756E2164756E21
@@ -12,6 +12,6 @@
12
12
  "/**\n * Pure builder for the `POST /v1/agents` wire payload of a Letta Code agent.\n *\n * This is the shared creation-policy choke point for the CLI and external\n * harness surfaces. It owns the defaults that must not drift between callers:\n * agent type, prompt mode, tags, server tools, initial messages, parallel tool\n * calls, and compaction. Callers may supply either a Letta Code personality or\n * their own identity blocks without rebuilding that policy.\n *\n * Everything reachable from this module must stay free of Node/backend imports\n * so it can be bundled in the browser-safe `agent-presets` package export.\n */\n\nimport type { CreateBlock } from \"@letta-ai/letta-client/resources/blocks/blocks\";\nimport { DEFAULT_SUMMARIZATION_MODEL } from \"@/constants\";\nimport { buildCreatedAgentTags } from \"./agent-tags\";\nimport { getDefaultMemoryBlocks } from \"./memory\";\nimport { getDefaultModel, resolveModel } from \"./model-catalog\";\nimport {\n buildPersonalityMemoryBlocks,\n getPersonalityCreationTags,\n getPersonalityDefaultMemoryFiles,\n getPersonalityOption,\n type PersonalityId,\n} from \"./personality-presets\";\nimport { buildSystemPrompt, type MemoryPromptMode } from \"./prompt-assets\";\n\n/** Agent type used for all Letta Code agents. */\nexport const LETTA_CODE_AGENT_TYPE = \"letta_v1_agent\";\n\n/**\n * Server-side tools attached to created agents. Client-side tools (Read,\n * Write, Bash, etc.) are passed via client_tools at runtime instead.\n */\nexport const DEFAULT_CREATED_AGENT_BASE_TOOLS = [\"web_search\", \"fetch_webpage\"];\n\nexport type CreateAgentMemoryBlock = CreateBlock;\n\n/**\n * Root marker that makes the hosted memory repository use MemFS v2.\n * The server seeds the root `MEMORY.md` layout only when the create request\n * includes a block with this label.\n */\nexport const DEFAULT_ROOT_MEMORY_BLOCK: CreateAgentMemoryBlock = {\n label: \"MEMORY\",\n value: \"# Memory\\n\",\n description: \"Root memory index.\",\n};\n\nexport interface BuildCreateAgentRequestOptions {\n personalityId?: PersonalityId;\n name?: string;\n description?: string;\n /** Model ID or handle. Personality default, then catalog default, applies. */\n model?: string;\n /** Complete prompt override. Null delegates default selection to the server. */\n system?: string | null;\n /** Whether the target is Letta Cloud; callers determine this with their backend's cloud detection. */\n isLettaCloud?: boolean;\n memoryPromptMode?: MemoryPromptMode;\n /**\n * Caller-defined identity. With a personality, matching labels replace its\n * blocks and new labels append after the personality blocks.\n */\n memoryBlocks?: CreateAgentMemoryBlock[];\n blockIds?: string[];\n /** Extra tags appended after canonical Letta Code and personality tags. */\n extraTags?: string[];\n enableMemfs?: boolean;\n isSubagent?: boolean;\n /** Exact server-side tools. Omission uses the Letta Code web-tool defaults. */\n baseTools?: string[];\n embedding?: string;\n hidden?: boolean;\n parallelToolCalls?: boolean;\n compactionModel?: string;\n}\n\nexport interface CreateAgentRequest {\n agent_type: typeof LETTA_CODE_AGENT_TYPE;\n name?: string;\n description?: string;\n model: string;\n system: string | null;\n memory_blocks?: CreateAgentMemoryBlock[];\n block_ids?: string[];\n tags: string[];\n tools: string[];\n include_base_tools: false;\n include_base_tool_rules: false;\n initial_message_sequence: never[];\n parallel_tool_calls: boolean;\n compaction_settings: { model: string };\n embedding?: string;\n hidden?: boolean;\n}\n\nexport type CreateAgentRequestForPersonality = CreateAgentRequest & {\n name: string;\n description: string;\n memory_blocks: CreateAgentMemoryBlock[];\n profile_picture?: {\n content: string;\n };\n};\n\nfunction mergeMemoryBlocks(\n base: CreateAgentMemoryBlock[],\n overrides: CreateAgentMemoryBlock[] | undefined,\n): CreateAgentMemoryBlock[] {\n const blocks = base.map((block) => ({ ...block }));\n for (const override of overrides ?? []) {\n const index = blocks.findIndex((block) => block.label === override.label);\n if (index >= 0) {\n blocks[index] = { ...override };\n } else {\n blocks.push({ ...override });\n }\n }\n return blocks;\n}\n\nfunction ensureRootMemoryBlock(\n blocks: CreateAgentMemoryBlock[],\n): CreateAgentMemoryBlock[] {\n return blocks.some((block) => block.label === DEFAULT_ROOT_MEMORY_BLOCK.label)\n ? blocks\n : [{ ...DEFAULT_ROOT_MEMORY_BLOCK }, ...blocks];\n}\n\n/** Build the canonical Core create-agent request for a Letta Code agent. */\nexport async function buildCreateAgentRequest(\n options: BuildCreateAgentRequestOptions = {},\n): Promise<CreateAgentRequest> {\n const personality = options.personalityId\n ? getPersonalityOption(options.personalityId)\n : undefined;\n const modelIdentifier = options.model ?? personality?.defaultModel;\n const modelHandle = modelIdentifier\n ? resolveModel(modelIdentifier)\n : getDefaultModel();\n if (!modelHandle) {\n throw new Error(`Unknown model: ${modelIdentifier}`);\n }\n\n if (\n !options.isSubagent &&\n options.enableMemfs !== undefined &&\n options.memoryPromptMode !== undefined &&\n options.enableMemfs !== (options.memoryPromptMode !== \"standard\")\n ) {\n throw new Error(\n \"enableMemfs and memoryPromptMode must describe the same memory mode\",\n );\n }\n const enableMemfs = options.isSubagent\n ? false\n : (options.enableMemfs ?? options.memoryPromptMode !== \"standard\");\n const memoryPromptMode = options.isSubagent\n ? \"standard\"\n : (options.memoryPromptMode ?? (enableMemfs ? \"root-memfs\" : \"standard\"));\n const personalityTags = options.personalityId\n ? getPersonalityCreationTags(options.personalityId)\n : [];\n const personalityBlocks = options.personalityId\n ? buildPersonalityMemoryBlocks(\n options.personalityId,\n await getDefaultMemoryBlocks(),\n )\n : [];\n const hasSuppliedMemoryBlocks =\n options.personalityId !== undefined || options.memoryBlocks !== undefined;\n const suppliedMemoryBlocks = hasSuppliedMemoryBlocks\n ? mergeMemoryBlocks(personalityBlocks, options.memoryBlocks)\n : [];\n // Root-layout agents must send the MEMORY block so the server seeds a\n // MemFS v2 repository; without it the initial repo uses the legacy\n // system/ layout even when the prompt mode says otherwise.\n const memoryBlocks = options.isSubagent\n ? undefined\n : memoryPromptMode === \"root-memfs\"\n ? ensureRootMemoryBlock(suppliedMemoryBlocks)\n : hasSuppliedMemoryBlocks\n ? suppliedMemoryBlocks\n : undefined;\n const blockIds = options.isSubagent ? undefined : options.blockIds;\n\n return {\n agent_type: LETTA_CODE_AGENT_TYPE,\n ...(options.name !== undefined || personality\n ? { name: options.name ?? personality?.label }\n : {}),\n ...(options.description !== undefined || personality\n ? { description: options.description ?? personality?.description }\n : {}),\n model: modelHandle,\n system:\n options.system !== undefined\n ? options.system\n : options.isLettaCloud\n ? null\n : buildSystemPrompt(\"default\", memoryPromptMode),\n ...(memoryBlocks !== undefined ? { memory_blocks: memoryBlocks } : {}),\n ...(blockIds && blockIds.length > 0 ? { block_ids: blockIds } : {}),\n tags: buildCreatedAgentTags({\n enableMemfs,\n isSubagent: options.isSubagent,\n tags: [...personalityTags, ...(options.extraTags ?? [])],\n }),\n tools: [...(options.baseTools ?? DEFAULT_CREATED_AGENT_BASE_TOOLS)],\n include_base_tools: false,\n include_base_tool_rules: false,\n initial_message_sequence: [],\n parallel_tool_calls: options.parallelToolCalls ?? true,\n compaction_settings: {\n model: options.compactionModel ?? DEFAULT_SUMMARIZATION_MODEL,\n },\n ...(options.embedding !== undefined\n ? { embedding: options.embedding }\n : {}),\n ...(options.isSubagent\n ? { hidden: true }\n : options.hidden !== undefined\n ? { hidden: options.hidden }\n : {}),\n };\n}\n\n/** Compatibility wrapper for callers that create a personality agent. */\nexport async function buildCreateAgentRequestForPersonality(params: {\n personalityId: PersonalityId;\n name?: string;\n description?: string;\n model?: string;\n extraTags?: string[];\n /** This browser-safe wrapper defaults to Cloud; pass false for a local server. */\n isLettaCloud?: boolean;\n}): Promise<CreateAgentRequestForPersonality> {\n const request = (await buildCreateAgentRequest({\n ...params,\n isLettaCloud: params.isLettaCloud ?? true,\n })) as CreateAgentRequestForPersonality;\n const profilePicture = getPersonalityDefaultMemoryFiles(\n params.personalityId,\n ).find((file) => file.path === \"profile.png\");\n if (!profilePicture) {\n return request;\n }\n const { getPersonalityAssetBase64 } = await import(\n \"./personality-asset-content\"\n );\n return {\n ...request,\n profile_picture: {\n content: await getPersonalityAssetBase64(profilePicture.assetId),\n },\n };\n}\n"
13
13
  ],
14
14
  "mappings": ";;;;;AAQO,IAAM,wBAAwB;AAG9B,IAAM,wBAAwB;AAG9B,IAAM,0BAA0B;AAGhC,IAAM,yBAAyB;AAQ/B,SAAS,qBAAqB,CACnC,UAAwC,CAAC,GAC/B;AAAA,EACV,MAAM,OAAO,CAAC,qBAAqB;AAAA,EACnC,IAAI,QAAQ,YAAY;AAAA,IACtB,KAAK,KAAK,uBAAuB;AAAA,EACnC;AAAA,EACA,IAAI,QAAQ,aAAa;AAAA,IACvB,KAAK,KAAK,sBAAsB;AAAA,EAClC;AAAA,EACA,IAAI,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAAA,IAC/C,KAAK,KAAK,GAAG,QAAQ,IAAI;AAAA,EAC3B;AAAA,EACA,OAAO,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA;;AC1B1B,IAAM,8BAA8B;AA2BpC,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB,IAAI;AACjC,IAAM,wBAAwB,KAAK;AAEnC,IAAM,mBAAmB;AACzB,IAAM,oBAAoB,IAAI;AAC9B,IAAM,qBAAqB,KAAK;AAoBhC,IAAM,+BAA+B,KAAK;;;ACjE1C,IAAM,yBAAyB,CAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACoCnD,IAAM,iBAAyC;AAAA,EACpD,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EAEf,yBAAyB;AAAA,EACzB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,aAAa;AACf;AAeO,IAAM,iBAAuC;AAAA,EAClD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AA8BO,SAAS,iBAAiB,CAC/B,UACA,YACQ;AAAA,EACR,MAAM,SAAS,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAAA,EAC3D,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MACR,mBAAmB,0CACrB;AAAA,EACF;AAAA,EACA,IAAI,eAAe,eAAe;AAAA,IAChC,QACE,OAAO,qBACP,OAAO,gBACP,OAAO,SACP,KAAK;AAAA,EACT;AAAA,EACA,IAAI,eAAe,cAAc;AAAA,IAC/B,QACE,OAAO,oBACP,OAAO,gBACP,OAAO,SACP,KAAK;AAAA,EACT;AAAA,EACA,IAAI,eAAe,SAAS;AAAA,IAC1B,QAAQ,OAAO,gBAAgB,OAAO,SAAS,KAAK;AAAA,EACtD;AAAA,EAEA,OAAO,OAAO,QAAQ,KAAK;AAAA;;;ACxJtB,IAAM,sBAAsB,CAAC,WAAW,OAAO;AAU/C,SAAS,mBAAmB,CAAC,SAGlC;AAAA,EACA,MAAM,mBAAmB;AAAA,EACzB,MAAM,QAAQ,QAAQ,MAAM,gBAAgB;AAAA,EAE5C,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,MAAM,IAAI;AAAA,IACpC,OAAO,EAAE,aAAa,CAAC,GAAG,MAAM,QAAQ;AAAA,EAC1C;AAAA,EAEA,MAAM,kBAAkB,MAAM;AAAA,EAC9B,MAAM,OAAO,MAAM;AAAA,EACnB,MAAM,cAAsC,CAAC;AAAA,EAG7C,WAAW,QAAQ,gBAAgB,MAAM;AAAA,CAAI,GAAG;AAAA,IAC9C,MAAM,aAAa,KAAK,QAAQ,GAAG;AAAA,IACnC,IAAI,aAAa,GAAG;AAAA,MAClB,MAAM,MAAM,KAAK,MAAM,GAAG,UAAU,EAAE,KAAK;AAAA,MAC3C,MAAM,QAAQ,KAAK,MAAM,aAAa,CAAC,EAAE,KAAK;AAAA,MAC9C,YAAY,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,aAAa,MAAM,KAAK,KAAK,EAAE;AAAA;AAM1C,eAAe,uBAAuB,GAA2B;AAAA,EAC/D,MAAM,eAA8B,CAAC;AAAA,EAErC,MAAM,WAAW,oBAAoB,IAAI,CAAC,UAAU,GAAG,WAAW;AAAA,EAElE,WAAW,YAAY,UAAU;AAAA,IAC/B,IAAI;AAAA,MACF,MAAM,UAAU,eAAe;AAAA,MAC/B,IAAI,CAAC,SAAS;AAAA,QACZ,QAAQ,KAAK,iCAAiC,UAAU;AAAA,QACxD;AAAA,MACF;AAAA,MACA,QAAQ,aAAa,SAAS,oBAAoB,OAAO;AAAA,MAEzD,MAAM,QAAQ,YAAY,SAAS,SAAS,QAAQ,QAAQ,EAAE;AAAA,MAC9D,MAAM,QAAqB;AAAA,QACzB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,IAAI,YAAY,aAAa;AAAA,QAC3B,MAAM,cAAc,YAAY;AAAA,MAClC;AAAA,MAGA,IAAK,uBAA6C,SAAS,KAAK,GAAG;AAAA,QACjE,MAAM,YAAY;AAAA,MACpB;AAAA,MAEA,aAAa,KAAK,KAAK;AAAA,MACvB,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,iBAAiB,aAAa,KAAK;AAAA;AAAA,EAErD;AAAA,EAEA,OAAO;AAAA;AAIT,IAAI,qBAA2C;AAK/C,eAAsB,sBAAsB,GAA2B;AAAA,EACrE,IAAI,CAAC,oBAAoB;AAAA,IACvB,qBAAqB,MAAM,wBAAwB;AAAA,EACrD;AAAA,EACA,OAAO;AAAA;;;AC3EF,IAAM,SAAyB,CAAC;AAEvC,IAAM,wBAAwB,IAAI,IAAI;AAAA,EACpC,CAAC,QAAQ,YAAY;AAAA,EACrB,CAAC,aAAa,iBAAiB;AAAA,EAC/B,CAAC,aAAa,iBAAiB;AACjC,CAAC;AAED,SAAS,0BAA0B,CACjC,iBACqB;AAAA,EACrB,IAAI,oBAAoB,SAAS;AAAA,IAC/B,OACE,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,SAAS,kBAAkB,CAAC,KAAK;AAAA,EAEzE;AAAA,EACA,IAAI,oBAAoB,kBAAkB;AAAA,IACxC,MAAM,iBAAiB,OAAO,OAAO,CAAC,UACpC,MAAM,OAAO,SAAS,mBAAmB,CAC3C;AAAA,IACA,MAAM,iBAAiB,eAAe,KACpC,CAAC,UAAU,MAAM,YAAY,qBAAqB,KACpD;AAAA,IACA,IAAI;AAAA,MAAgB,OAAO;AAAA,IAC3B,MAAM,YAAY,eAAe;AAAA,IACjC,OAAO,YACH;AAAA,SACK;AAAA,MACH,IAAI;AAAA,MACJ,YAAY;AAAA,WACP,UAAU;AAAA,QACb,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,MACnB;AAAA,IACF,IACA;AAAA,EACN;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,mBAAmB,CACjC,iBACqB;AAAA,EACrB,MAAM,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,eAAe;AAAA,EAChE,IAAI;AAAA,IAAM,OAAO;AAAA,EAEjB,MAAM,WAAW,OAAO,KAAK,CAAC,UAAU,MAAM,WAAW,eAAe;AAAA,EACxE,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,MAAM,WAAW,2BAA2B,eAAe;AAAA,EAC3D,IAAI;AAAA,IAAU,OAAO;AAAA,EAIrB,MAAM,UAAU,OAAO,OACrB,CAAC,UAAU,MAAM,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,eAC5D;AAAA,EACA,MAAM,kBAAkB,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC;AAAA,EACpE,OAAO,gBAAgB,SAAS,IAAK,QAAQ,MAAM,OAAQ;AAAA;AAItD,SAAS,YAAY,CAAC,iBAAwC;AAAA,EACnE,MAAM,QAAQ,oBAAoB,eAAe;AAAA,EACjD,IAAI;AAAA,IAAO,OAAO,MAAM;AAAA,EAExB,MAAM,gBAAgB,sBAAsB,IAAI,eAAe;AAAA,EAC/D,IAAI;AAAA,IAAe,OAAO;AAAA,EAG1B,OAAO,gBAAgB,SAAS,GAAG,IAAI,kBAAkB;AAAA;AAIpD,SAAS,eAAe,GAAW;AAAA,EACxC,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAEhC,MAAM,YAAY,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM;AAAA,EAC5D,IAAI;AAAA,IAAW,OAAO,UAAU;AAAA,EAEhC,MAAM,eAAe,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS;AAAA,EAC3D,IAAI;AAAA,IAAc,OAAO,aAAa;AAAA,EAEtC,MAAM,aAAa,OAAO;AAAA,EAC1B,IAAI,CAAC,YAAY;AAAA,IACf,MAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAAA,EACA,OAAO,WAAW;AAAA;;;ACtFb,IAAM,sBAA2C;AAAA,EACtD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aACE;AAAA,IACF,oBAAoB;AAAA,MAClB;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAKO,IAAM,yBAAyB;AAE/B,SAAS,mBAAmB,CAAC,eAAsC;AAAA,EACxE,OAAO,GAAG,yBAAyB;AAAA;AAG9B,SAAS,0BAA0B,CACxC,eACU;AAAA,EACV,OAAO,iCAAiC,aAAa,EAAE,SAAS,IAC5D,CAAC,oBAAoB,aAAa,CAAC,IACnC,CAAC;AAAA;AAGA,SAAS,4BAA4B,CAC1C,MACsB;AAAA,EACtB,WAAW,OAAO,QAAQ,CAAC,GAAG;AAAA,IAC5B,IAAI,CAAC,IAAI,WAAW,sBAAsB,GAAG;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,MAAM,gBAAgB,qBACpB,IAAI,MAAM,uBAAuB,MAAM,CACzC;AAAA,IACA,IAAI,eAAe;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGF,IAAM,qCAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,IAAM,sBAAqD;AAAA,EACzD,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AACR;AAQO,IAAM,2BAA2B;AAAA,EACtC;AACF;AAEO,SAAS,uBAAuB,CACrC,eAC4D;AAAA,EAC5D,OAAQ,yBAAsD,SAC5D,aACF;AAAA;AAIF,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF;AAMA,SAAS,qBAAqB,CAAC,SAAyB;AAAA,EACtD,OAAO,GAAG,QAAQ,QAAQ;AAAA;AAAA;AAG5B,SAAS,iBAAiB,CAAC,iBAGzB;AAAA,EACA,MAAM,YAAY,eAAe;AAAA,EACjC,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,uCAAuC,iBAAiB;AAAA,EAC1E;AAAA,EAEA,OAAO,oBAAoB,SAAS;AAAA;AAGtC,SAAS,aAAa,CAAC,iBAAiC;AAAA,EACtD,QAAQ,SAAS,kBAAkB,eAAe;AAAA,EAClD,IAAI,CAAC,KAAK,KAAK,GAAG;AAAA,IAChB,MAAM,IAAI,MAAM,GAAG,wCAAwC;AAAA,EAC7D;AAAA,EAEA,OAAO,sBAAsB,IAAI;AAAA;AAGnC,SAAS,4BAA4B,CACnC,iBACwB;AAAA,EACxB,QAAQ,gBAAgB,kBAAkB,eAAe;AAAA,EACzD,OAAO,OAAO,YACZ,OAAO,QAAQ,WAAW,EAAE,OAAO,EAAE,SAClC,0BAAgD,SAAS,GAAG,CAC/D,CACF;AAAA;AA+CF,SAAS,mBAAmB,CAAC,gBAAgC;AAAA,EAC3D,MAAM,SAAS,eAAe,KAC5B,CAAC,cAAc,UAAU,OAAO,cAClC;AAAA,EACA,IAAI,CAAC,UAAU,CAAC,OAAO,QAAQ,KAAK,GAAG;AAAA,IACrC,MAAM,IAAI,MAAM,uCAAuC,gBAAgB;AAAA,EACzE;AAAA,EACA,OAAO,OAAO;AAAA;AAGT,SAAS,oBAAoB,CAClC,eACmB;AAAA,EACnB,MAAM,SAAS,oBAAoB,KACjC,CAAC,cAAc,UAAU,OAAO,aAClC;AAAA,EACA,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,wBAAwB,eAAe;AAAA,EACzD;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,gCAAgC,CAC9C,eACyC;AAAA,EACzC,OAAO,qBAAqB,aAAa,EAAE,sBAAsB,CAAC;AAAA;AAG7D,SAAS,oBAAoB,CAAC,OAAqC;AAAA,EACxE,MAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAAA,EAC5C,IAAI,CAAC,YAAY;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,oBAAoB,KACjC,CAAC,cAAc,UAAU,OAAO,UAClC;AAAA,EACA,IAAI,QAAQ;AAAA,IACV,OAAO,OAAO;AAAA,EAChB;AAAA,EAEA,OAAO,oBAAoB,eAAe;AAAA;AAGrC,SAAS,qBAAqB,CAAC,eAAsC;AAAA,EAC1E,IAAI,kBAAkB,QAAQ;AAAA,IAC5B,OAAO,cAAc,kBAAkB;AAAA,EACzC;AAAA,EAEA,IAAI,kBAAkB,YAAY;AAAA,IAChC,OAAO,cAAc,sBAAsB;AAAA,EAC7C;AAAA,EAEA,IAAI,kBAAkB,SAAS;AAAA,IAC7B,OAAO,cAAc,mBAAmB;AAAA,EAC1C;AAAA,EAEA,IAAI,kBAAkB,UAAU;AAAA,IAC9B,OAAO,cAAc,oBAAoB;AAAA,EAC3C;AAAA,EAEA,IAAI,kBAAkB,SAAS;AAAA,IAC7B,OAAO,sBAAsB,oBAAoB,cAAc,CAAC;AAAA,EAClE;AAAA,EAEA,IAAI,kBAAkB,SAAS;AAAA,IAC7B,OAAO,cAAc,mBAAmB;AAAA,EAC1C;AAAA,EAEA,OAAO,sBAAsB,oBAAoB,eAAe,CAAC;AAAA;AAG5D,SAAS,sBAAsB,GAAW;AAAA,EAC/C,OAAO,cAAc,WAAW;AAAA;AAG3B,SAAS,0BAA0B,CACxC,eACQ;AAAA,EACR,IAAI,kBAAkB,QAAQ;AAAA,IAC5B,OAAO,cAAc,gBAAgB;AAAA,EACvC;AAAA,EAEA,IAAI,kBAAkB,YAAY;AAAA,IAChC,OAAO,cAAc,oBAAoB;AAAA,EAC3C;AAAA,EAEA,IAAI,kBAAkB,SAAS;AAAA,IAC7B,OAAO,cAAc,iBAAiB;AAAA,EACxC;AAAA,EAEA,IAAI,kBAAkB,UAAU;AAAA,IAC9B,OAAO,cAAc,kBAAkB;AAAA,EACzC;AAAA,EAEA,IAAI,kBAAkB,SAAS;AAAA,IAC7B,OAAO,uBAAuB;AAAA,EAChC;AAAA,EAEA,OAAO,uBAAuB;AAAA;AAczB,SAAS,8BAA8B,CAC5C,eACA,cAAsC,SAKtC;AAAA,EACA,MAAM,iCACJ,kBAAkB,SACd,qBACA,kBAAkB,aAChB,yBACA,kBAAkB,UAChB,sBACA,kBAAkB,WAChB,uBACA,kBAAkB,UAChB,sBACA;AAAA,EACd,MAAM,+BACJ,kBAAkB,SACd,mBACA,kBAAkB,aAChB,uBACA,kBAAkB,WAChB,qBACA,kBAAkB,UAChB,oBACA;AAAA,EACZ,MAAM,oCACJ,gBAAgB,UAAU,yBAAyB;AAAA,EAErD,OAAO;AAAA,IACL,SAAS;AAAA,MACP,OAAO,sBAAsB,aAAa;AAAA,MAC1C,aAAa,6BAA6B,8BAA8B,EACrE;AAAA,MACH,yBAAyB;AAAA,IAC3B;AAAA,IACA,OAAO;AAAA,MACL,OAAO,2BAA2B,aAAa;AAAA,MAC/C,aAAa,6BAA6B,4BAA4B,EACnE;AAAA,MACH,yBAAyB;AAAA,IAC3B;AAAA,OACI,wBAAwB,aAAa,IACrC;AAAA,MACE,YAAY;AAAA,QACV,OAAO,cAAc,iCAAiC;AAAA,QACtD,aAAa,6BACX,iCACF,EAAE;AAAA,QACF,yBAAyB;AAAA,MAC3B;AAAA,IACF,IACA,CAAC;AAAA,EACP;AAAA;AAiBK,SAAS,4BAA4B,CAC1C,eACA,qBAKA,cAAsC,SACZ;AAAA,EAC1B,MAAM,mBAAmB,+BACvB,eACA,WACF;AAAA,EAEA,MAAM,eAAe,oBAAoB,IAAI,CAAC,UAAU;AAAA,IACtD,IAAI,MAAM,UAAU,WAAW;AAAA,MAC7B,OAAO;AAAA,QACL,OAAO,MAAM;AAAA,QACb,OAAO,iBAAiB,QAAQ;AAAA,QAChC,aACE,iBAAiB,QAAQ,eACzB,MAAM,eACN;AAAA,MACJ;AAAA,IACF;AAAA,IAEA,IAAI,MAAM,UAAU,SAAS;AAAA,MAC3B,OAAO;AAAA,QACL,OAAO,MAAM;AAAA,QACb,OAAO,iBAAiB,MAAM;AAAA,QAC9B,aACE,iBAAiB,MAAM,eAAe,MAAM,eAAe;AAAA,MAC/D;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,aAAa,MAAM,eAAe;AAAA,IACpC;AAAA,GACD;AAAA,EAED,IAAI,iBAAiB,YAAY;AAAA,IAC/B,aAAa,KAAK;AAAA,MAChB,OAAO;AAAA,MACP,OAAO,iBAAiB,WAAW;AAAA,MACnC,aAAa,iBAAiB,WAAW;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;;;AC/bF,IAAM,wBAAwB;AAM9B,IAAM,mCAAmC,CAAC,cAAc,eAAe;AASvE,IAAM,4BAAoD;AAAA,EAC/D,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EACP,aAAa;AACf;AA2DA,SAAS,iBAAiB,CACxB,MACA,WAC0B;AAAA,EAC1B,MAAM,SAAS,KAAK,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE;AAAA,EACjD,WAAW,YAAY,aAAa,CAAC,GAAG;AAAA,IACtC,MAAM,QAAQ,OAAO,UAAU,CAAC,UAAU,MAAM,UAAU,SAAS,KAAK;AAAA,IACxE,IAAI,SAAS,GAAG;AAAA,MACd,OAAO,SAAS,KAAK,SAAS;AAAA,IAChC,EAAO;AAAA,MACL,OAAO,KAAK,KAAK,SAAS,CAAC;AAAA;AAAA,EAE/B;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,qBAAqB,CAC5B,QAC0B;AAAA,EAC1B,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,0BAA0B,KAAK,IACzE,SACA,CAAC,KAAK,0BAA0B,GAAG,GAAG,MAAM;AAAA;AAIlD,eAAsB,uBAAuB,CAC3C,UAA0C,CAAC,GACd;AAAA,EAC7B,MAAM,cAAc,QAAQ,gBACxB,qBAAqB,QAAQ,aAAa,IAC1C;AAAA,EACJ,MAAM,kBAAkB,QAAQ,SAAS,aAAa;AAAA,EACtD,MAAM,cAAc,kBAChB,aAAa,eAAe,IAC5B,gBAAgB;AAAA,EACpB,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,IAAI,MAAM,kBAAkB,iBAAiB;AAAA,EACrD;AAAA,EAEA,IACE,CAAC,QAAQ,cACT,QAAQ,gBAAgB,aACxB,QAAQ,qBAAqB,aAC7B,QAAQ,iBAAiB,QAAQ,qBAAqB,aACtD;AAAA,IACA,MAAM,IAAI,MACR,qEACF;AAAA,EACF;AAAA,EACA,MAAM,cAAc,QAAQ,aACxB,QACC,QAAQ,eAAe,QAAQ,qBAAqB;AAAA,EACzD,MAAM,mBAAmB,QAAQ,aAC7B,aACC,QAAQ,qBAAqB,cAAc,eAAe;AAAA,EAC/D,MAAM,kBAAkB,QAAQ,gBAC5B,2BAA2B,QAAQ,aAAa,IAChD,CAAC;AAAA,EACL,MAAM,oBAAoB,QAAQ,gBAC9B,6BACE,QAAQ,eACR,MAAM,uBAAuB,CAC/B,IACA,CAAC;AAAA,EACL,MAAM,0BACJ,QAAQ,kBAAkB,aAAa,QAAQ,iBAAiB;AAAA,EAClE,MAAM,uBAAuB,0BACzB,kBAAkB,mBAAmB,QAAQ,YAAY,IACzD,CAAC;AAAA,EAIL,MAAM,eAAe,QAAQ,aACzB,YACA,qBAAqB,eACnB,sBAAsB,oBAAoB,IAC1C,0BACE,uBACA;AAAA,EACR,MAAM,WAAW,QAAQ,aAAa,YAAY,QAAQ;AAAA,EAE1D,OAAO;AAAA,IACL,YAAY;AAAA,OACR,QAAQ,SAAS,aAAa,cAC9B,EAAE,MAAM,QAAQ,QAAQ,aAAa,MAAM,IAC3C,CAAC;AAAA,OACD,QAAQ,gBAAgB,aAAa,cACrC,EAAE,aAAa,QAAQ,eAAe,aAAa,YAAY,IAC/D,CAAC;AAAA,IACL,OAAO;AAAA,IACP,QACE,QAAQ,WAAW,YACf,QAAQ,SACR,QAAQ,eACN,OACA,kBAAkB,WAAW,gBAAgB;AAAA,OACjD,iBAAiB,YAAY,EAAE,eAAe,aAAa,IAAI,CAAC;AAAA,OAChE,YAAY,SAAS,SAAS,IAAI,EAAE,WAAW,SAAS,IAAI,CAAC;AAAA,IACjE,MAAM,sBAAsB;AAAA,MAC1B;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB,MAAM,CAAC,GAAG,iBAAiB,GAAI,QAAQ,aAAa,CAAC,CAAE;AAAA,IACzD,CAAC;AAAA,IACD,OAAO,CAAC,GAAI,QAAQ,aAAa,gCAAiC;AAAA,IAClE,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,0BAA0B,CAAC;AAAA,IAC3B,qBAAqB,QAAQ,qBAAqB;AAAA,IAClD,qBAAqB;AAAA,MACnB,OAAO,QAAQ,mBAAmB;AAAA,IACpC;AAAA,OACI,QAAQ,cAAc,YACtB,EAAE,WAAW,QAAQ,UAAU,IAC/B,CAAC;AAAA,OACD,QAAQ,aACR,EAAE,QAAQ,KAAK,IACf,QAAQ,WAAW,YACjB,EAAE,QAAQ,QAAQ,OAAO,IACzB,CAAC;AAAA,EACT;AAAA;AAIF,eAAsB,qCAAqC,CAAC,QAQd;AAAA,EAC5C,MAAM,UAAW,MAAM,wBAAwB;AAAA,OAC1C;AAAA,IACH,cAAc,OAAO,gBAAgB;AAAA,EACvC,CAAC;AAAA,EACD,MAAM,iBAAiB,iCACrB,OAAO,aACT,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,aAAa;AAAA,EAC5C,IAAI,CAAC,gBAAgB;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,QAAQ,8BAA8B,MACpC;AAAA,EAEF,OAAO;AAAA,OACF;AAAA,IACH,iBAAiB;AAAA,MACf,SAAS,MAAM,0BAA0B,eAAe,OAAO;AAAA,IACjE;AAAA,EACF;AAAA;",
15
- "debugId": "89470D292266CA6164756E2164756E21",
15
+ "debugId": "006C28A4424C7CD564756E2164756E21",
16
16
  "names": []
17
17
  }
@@ -0,0 +1,128 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
8
+ var __toCommonJS = (from) => {
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
10
+ if (entry)
11
+ return entry;
12
+ entry = __defProp({}, "__esModule", { value: true });
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ __moduleCache.set(from, entry);
22
+ return entry;
23
+ };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
29
+ var __export = (target, all) => {
30
+ for (var name in all)
31
+ __defProp(target, name, {
32
+ get: all[name],
33
+ enumerable: true,
34
+ configurable: true,
35
+ set: __exportSetter.bind(all, name)
36
+ });
37
+ };
38
+
39
+ // src/ask-user-question.ts
40
+ var exports_ask_user_question = {};
41
+ __export(exports_ask_user_question, {
42
+ prepareAskUserQuestionNotif: () => prepareAskUserQuestionNotif,
43
+ parseAskUserQuestionReceipt: () => parseAskUserQuestionReceipt,
44
+ parseAskUserQuestionNotif: () => parseAskUserQuestionNotif,
45
+ isAskUserQuestions: () => isAskUserQuestions
46
+ });
47
+ module.exports = __toCommonJS(exports_ask_user_question);
48
+ function isRecord(value) {
49
+ return value !== null && typeof value === "object" && !Array.isArray(value);
50
+ }
51
+ function isNonemptyString(value) {
52
+ return typeof value === "string" && value.trim().length > 0;
53
+ }
54
+ function isAskUserQuestions(value) {
55
+ return Array.isArray(value) && value.length > 0 && value.length <= 4 && value.every((question) => isRecord(question) && isNonemptyString(question.question) && isNonemptyString(question.header) && (question.multiSelect === undefined || typeof question.multiSelect === "boolean") && Array.isArray(question.options) && question.options.length >= 2 && question.options.length <= 4 && question.options.every((option) => isRecord(option) && isNonemptyString(option.label) && isNonemptyString(option.description))) && new Set(value.map((question) => question.question)).size === value.length;
56
+ }
57
+ function parseJson(value) {
58
+ try {
59
+ return JSON.parse(value);
60
+ } catch {
61
+ return null;
62
+ }
63
+ }
64
+ function hasQuestionIdentity(value) {
65
+ return isRecord(value) && value.version === 2 && isNonemptyString(value.toolCallId) && isAskUserQuestions(value.questions);
66
+ }
67
+ function parseAskUserQuestionReceipt(value) {
68
+ const receipt = typeof value === "string" ? parseJson(value) : value;
69
+ if (!hasQuestionIdentity(receipt) || receipt.type !== "ask_user_question")
70
+ return null;
71
+ return {
72
+ type: receipt.type,
73
+ version: 2,
74
+ toolCallId: receipt.toolCallId,
75
+ questions: receipt.questions
76
+ };
77
+ }
78
+ function parseResponse(value) {
79
+ if (!hasQuestionIdentity(value) || value.type !== "ask_user_question_response")
80
+ return null;
81
+ const base = {
82
+ type: value.type,
83
+ version: 2,
84
+ toolCallId: value.toolCallId,
85
+ questions: value.questions
86
+ };
87
+ if (value.status === "dismissed" && value.answers === undefined)
88
+ return { ...base, status: "dismissed" };
89
+ if (value.status !== "answered" || !isRecord(value.answers))
90
+ return null;
91
+ const answers = value.answers;
92
+ if (Object.keys(answers).length !== value.questions.length || !value.questions.every((question) => Object.hasOwn(answers, question.question) && isNonemptyString(answers[question.question])))
93
+ return null;
94
+ return {
95
+ ...base,
96
+ status: "answered",
97
+ answers
98
+ };
99
+ }
100
+ function escapeXml(value) {
101
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
102
+ }
103
+ function prepareAskUserQuestionNotif(response) {
104
+ const parsed = parseResponse(response);
105
+ if (!parsed)
106
+ throw new Error("Invalid AskUserQuestion response");
107
+ return `<task-notification>
108
+ <task-id>${escapeXml(parsed.toolCallId)}</task-id>
109
+ <summary>User ${parsed.status} your questions.</summary>
110
+ <ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>
111
+ </task-notification>`;
112
+ }
113
+ function parseAskUserQuestionNotif(text) {
114
+ const responses = [];
115
+ const notifications = text.matchAll(/<task-notification>(?:(?!<task-notification>)[\s\S])*?<\/task-notification>/g);
116
+ for (const [notification] of notifications) {
117
+ const content = notification.match(/<ask-user-question-response>([\s\S]*?)<\/ask-user-question-response>/)?.[1];
118
+ if (!content)
119
+ continue;
120
+ const decoded = content.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
121
+ const response = parseResponse(parseJson(decoded));
122
+ if (response)
123
+ responses.push(response);
124
+ }
125
+ return responses;
126
+ }
127
+
128
+ //# debugId=9D909147504B11BC64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ask-user-question.ts"],
4
+ "sourcesContent": [
5
+ "/** Browser-safe question receipts and user-message notifications. */\nexport interface AskUserQuestion {\n question: string;\n header: string;\n options: Array<{ label: string; description: string }>;\n multiSelect?: boolean;\n}\n\nexport interface AskUserQuestionReceipt {\n type: \"ask_user_question\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n}\n\nexport interface AskUserQuestionResponse {\n type: \"ask_user_question_response\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n status: \"answered\" | \"dismissed\";\n answers?: Record<string, string>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isNonemptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isAskUserQuestions(value: unknown): value is AskUserQuestion[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.length <= 4 &&\n value.every(\n (question) =>\n isRecord(question) &&\n isNonemptyString(question.question) &&\n isNonemptyString(question.header) &&\n (question.multiSelect === undefined ||\n typeof question.multiSelect === \"boolean\") &&\n Array.isArray(question.options) &&\n question.options.length >= 2 &&\n question.options.length <= 4 &&\n question.options.every(\n (option: unknown) =>\n isRecord(option) &&\n isNonemptyString(option.label) &&\n isNonemptyString(option.description),\n ),\n ) &&\n new Set(value.map((question) => question.question)).size === value.length\n );\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction hasQuestionIdentity(value: unknown): value is Record<\n string,\n unknown\n> & {\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n} {\n return (\n isRecord(value) &&\n value.version === 2 &&\n isNonemptyString(value.toolCallId) &&\n isAskUserQuestions(value.questions)\n );\n}\n\nexport function parseAskUserQuestionReceipt(\n value: unknown,\n): AskUserQuestionReceipt | null {\n const receipt = typeof value === \"string\" ? parseJson(value) : value;\n if (!hasQuestionIdentity(receipt) || receipt.type !== \"ask_user_question\")\n return null;\n return {\n type: receipt.type,\n version: 2,\n toolCallId: receipt.toolCallId,\n questions: receipt.questions,\n };\n}\n\nfunction parseResponse(value: unknown): AskUserQuestionResponse | null {\n if (\n !hasQuestionIdentity(value) ||\n value.type !== \"ask_user_question_response\"\n )\n return null;\n const base = {\n type: value.type,\n version: 2,\n toolCallId: value.toolCallId,\n questions: value.questions,\n } as const;\n if (value.status === \"dismissed\" && value.answers === undefined)\n return { ...base, status: \"dismissed\" };\n if (value.status !== \"answered\" || !isRecord(value.answers)) return null;\n const answers = value.answers;\n if (\n Object.keys(answers).length !== value.questions.length ||\n !value.questions.every(\n (question) =>\n Object.hasOwn(answers, question.question) &&\n isNonemptyString(answers[question.question]),\n )\n )\n return null;\n return {\n ...base,\n status: \"answered\",\n answers: answers as Record<string, string>,\n };\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\n/** Return content for a user-role message submitted through normal message delivery. */\nexport function prepareAskUserQuestionNotif(\n response: AskUserQuestionResponse,\n): string {\n const parsed = parseResponse(response);\n if (!parsed) throw new Error(\"Invalid AskUserQuestion response\");\n return `<task-notification>\\n<task-id>${escapeXml(parsed.toolCallId)}</task-id>\\n<summary>User ${parsed.status} your questions.</summary>\\n<ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>\\n</task-notification>`;\n}\n\n/** Match only complete notifications; queued messages may coalesce several together. */\nexport function parseAskUserQuestionNotif(\n text: string,\n): AskUserQuestionResponse[] {\n const responses: AskUserQuestionResponse[] = [];\n const notifications = text.matchAll(\n /<task-notification>(?:(?!<task-notification>)[\\s\\S])*?<\\/task-notification>/g,\n );\n for (const [notification] of notifications) {\n const content = notification.match(\n /<ask-user-question-response>([\\s\\S]*?)<\\/ask-user-question-response>/,\n )?.[1];\n if (!content) continue;\n const decoded = content\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n const response = parseResponse(parseJson(decoded));\n if (response) responses.push(response);\n }\n return responses;\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAAA;AAG5E,SAAS,gBAAgB,CAAC,OAAiC;AAAA,EACzD,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA;AAGrD,SAAS,kBAAkB,CAAC,OAA4C;AAAA,EAC7E,OACE,MAAM,QAAQ,KAAK,KACnB,MAAM,SAAS,KACf,MAAM,UAAU,KAChB,MAAM,MACJ,CAAC,aACC,SAAS,QAAQ,KACjB,iBAAiB,SAAS,QAAQ,KAClC,iBAAiB,SAAS,MAAM,MAC/B,SAAS,gBAAgB,aACxB,OAAO,SAAS,gBAAgB,cAClC,MAAM,QAAQ,SAAS,OAAO,KAC9B,SAAS,QAAQ,UAAU,KAC3B,SAAS,QAAQ,UAAU,KAC3B,SAAS,QAAQ,MACf,CAAC,WACC,SAAS,MAAM,KACf,iBAAiB,OAAO,KAAK,KAC7B,iBAAiB,OAAO,WAAW,CACvC,CACJ,KACA,IAAI,IAAI,MAAM,IAAI,CAAC,aAAa,SAAS,QAAQ,CAAC,EAAE,SAAS,MAAM;AAAA;AAIvE,SAAS,SAAS,CAAC,OAAwB;AAAA,EACzC,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,KAAK;AAAA,IACvB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,mBAAmB,CAAC,OAO3B;AAAA,EACA,OACE,SAAS,KAAK,KACd,MAAM,YAAY,KAClB,iBAAiB,MAAM,UAAU,KACjC,mBAAmB,MAAM,SAAS;AAAA;AAI/B,SAAS,2BAA2B,CACzC,OAC+B;AAAA,EAC/B,MAAM,UAAU,OAAO,UAAU,WAAW,UAAU,KAAK,IAAI;AAAA,EAC/D,IAAI,CAAC,oBAAoB,OAAO,KAAK,QAAQ,SAAS;AAAA,IACpD,OAAO;AAAA,EACT,OAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,SAAS;AAAA,IACT,YAAY,QAAQ;AAAA,IACpB,WAAW,QAAQ;AAAA,EACrB;AAAA;AAGF,SAAS,aAAa,CAAC,OAAgD;AAAA,EACrE,IACE,CAAC,oBAAoB,KAAK,KAC1B,MAAM,SAAS;AAAA,IAEf,OAAO;AAAA,EACT,MAAM,OAAO;AAAA,IACX,MAAM,MAAM;AAAA,IACZ,SAAS;AAAA,IACT,YAAY,MAAM;AAAA,IAClB,WAAW,MAAM;AAAA,EACnB;AAAA,EACA,IAAI,MAAM,WAAW,eAAe,MAAM,YAAY;AAAA,IACpD,OAAO,KAAK,MAAM,QAAQ,YAAY;AAAA,EACxC,IAAI,MAAM,WAAW,cAAc,CAAC,SAAS,MAAM,OAAO;AAAA,IAAG,OAAO;AAAA,EACpE,MAAM,UAAU,MAAM;AAAA,EACtB,IACE,OAAO,KAAK,OAAO,EAAE,WAAW,MAAM,UAAU,UAChD,CAAC,MAAM,UAAU,MACf,CAAC,aACC,OAAO,OAAO,SAAS,SAAS,QAAQ,KACxC,iBAAiB,QAAQ,SAAS,SAAS,CAC/C;AAAA,IAEA,OAAO;AAAA,EACT,OAAO;AAAA,OACF;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,EACF;AAAA;AAGF,SAAS,SAAS,CAAC,OAAuB;AAAA,EACxC,OAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AAAA;AAIlB,SAAS,2BAA2B,CACzC,UACQ;AAAA,EACR,MAAM,SAAS,cAAc,QAAQ;AAAA,EACrC,IAAI,CAAC;AAAA,IAAQ,MAAM,IAAI,MAAM,kCAAkC;AAAA,EAC/D,OAAO;AAAA,WAAiC,UAAU,OAAO,UAAU;AAAA,gBAA8B,OAAO;AAAA,8BAAiE,UAAU,KAAK,UAAU,MAAM,CAAC;AAAA;AAAA;AAIpM,SAAS,yBAAyB,CACvC,MAC2B;AAAA,EAC3B,MAAM,YAAuC,CAAC;AAAA,EAC9C,MAAM,gBAAgB,KAAK,SACzB,8EACF;AAAA,EACA,YAAY,iBAAiB,eAAe;AAAA,IAC1C,MAAM,UAAU,aAAa,MAC3B,sEACF,IAAI;AAAA,IACJ,IAAI,CAAC;AAAA,MAAS;AAAA,IACd,MAAM,UAAU,QACb,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG;AAAA,IACxB,MAAM,WAAW,cAAc,UAAU,OAAO,CAAC;AAAA,IACjD,IAAI;AAAA,MAAU,UAAU,KAAK,QAAQ;AAAA,EACvC;AAAA,EACA,OAAO;AAAA;",
8
+ "debugId": "9D909147504B11BC64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,88 @@
1
+ // src/ask-user-question.ts
2
+ function isRecord(value) {
3
+ return value !== null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ function isNonemptyString(value) {
6
+ return typeof value === "string" && value.trim().length > 0;
7
+ }
8
+ function isAskUserQuestions(value) {
9
+ return Array.isArray(value) && value.length > 0 && value.length <= 4 && value.every((question) => isRecord(question) && isNonemptyString(question.question) && isNonemptyString(question.header) && (question.multiSelect === undefined || typeof question.multiSelect === "boolean") && Array.isArray(question.options) && question.options.length >= 2 && question.options.length <= 4 && question.options.every((option) => isRecord(option) && isNonemptyString(option.label) && isNonemptyString(option.description))) && new Set(value.map((question) => question.question)).size === value.length;
10
+ }
11
+ function parseJson(value) {
12
+ try {
13
+ return JSON.parse(value);
14
+ } catch {
15
+ return null;
16
+ }
17
+ }
18
+ function hasQuestionIdentity(value) {
19
+ return isRecord(value) && value.version === 2 && isNonemptyString(value.toolCallId) && isAskUserQuestions(value.questions);
20
+ }
21
+ function parseAskUserQuestionReceipt(value) {
22
+ const receipt = typeof value === "string" ? parseJson(value) : value;
23
+ if (!hasQuestionIdentity(receipt) || receipt.type !== "ask_user_question")
24
+ return null;
25
+ return {
26
+ type: receipt.type,
27
+ version: 2,
28
+ toolCallId: receipt.toolCallId,
29
+ questions: receipt.questions
30
+ };
31
+ }
32
+ function parseResponse(value) {
33
+ if (!hasQuestionIdentity(value) || value.type !== "ask_user_question_response")
34
+ return null;
35
+ const base = {
36
+ type: value.type,
37
+ version: 2,
38
+ toolCallId: value.toolCallId,
39
+ questions: value.questions
40
+ };
41
+ if (value.status === "dismissed" && value.answers === undefined)
42
+ return { ...base, status: "dismissed" };
43
+ if (value.status !== "answered" || !isRecord(value.answers))
44
+ return null;
45
+ const answers = value.answers;
46
+ if (Object.keys(answers).length !== value.questions.length || !value.questions.every((question) => Object.hasOwn(answers, question.question) && isNonemptyString(answers[question.question])))
47
+ return null;
48
+ return {
49
+ ...base,
50
+ status: "answered",
51
+ answers
52
+ };
53
+ }
54
+ function escapeXml(value) {
55
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
56
+ }
57
+ function prepareAskUserQuestionNotif(response) {
58
+ const parsed = parseResponse(response);
59
+ if (!parsed)
60
+ throw new Error("Invalid AskUserQuestion response");
61
+ return `<task-notification>
62
+ <task-id>${escapeXml(parsed.toolCallId)}</task-id>
63
+ <summary>User ${parsed.status} your questions.</summary>
64
+ <ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>
65
+ </task-notification>`;
66
+ }
67
+ function parseAskUserQuestionNotif(text) {
68
+ const responses = [];
69
+ const notifications = text.matchAll(/<task-notification>(?:(?!<task-notification>)[\s\S])*?<\/task-notification>/g);
70
+ for (const [notification] of notifications) {
71
+ const content = notification.match(/<ask-user-question-response>([\s\S]*?)<\/ask-user-question-response>/)?.[1];
72
+ if (!content)
73
+ continue;
74
+ const decoded = content.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
75
+ const response = parseResponse(parseJson(decoded));
76
+ if (response)
77
+ responses.push(response);
78
+ }
79
+ return responses;
80
+ }
81
+ export {
82
+ prepareAskUserQuestionNotif,
83
+ parseAskUserQuestionReceipt,
84
+ parseAskUserQuestionNotif,
85
+ isAskUserQuestions
86
+ };
87
+
88
+ //# debugId=F9A038729960456364756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ask-user-question.ts"],
4
+ "sourcesContent": [
5
+ "/** Browser-safe question receipts and user-message notifications. */\nexport interface AskUserQuestion {\n question: string;\n header: string;\n options: Array<{ label: string; description: string }>;\n multiSelect?: boolean;\n}\n\nexport interface AskUserQuestionReceipt {\n type: \"ask_user_question\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n}\n\nexport interface AskUserQuestionResponse {\n type: \"ask_user_question_response\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n status: \"answered\" | \"dismissed\";\n answers?: Record<string, string>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isNonemptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isAskUserQuestions(value: unknown): value is AskUserQuestion[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.length <= 4 &&\n value.every(\n (question) =>\n isRecord(question) &&\n isNonemptyString(question.question) &&\n isNonemptyString(question.header) &&\n (question.multiSelect === undefined ||\n typeof question.multiSelect === \"boolean\") &&\n Array.isArray(question.options) &&\n question.options.length >= 2 &&\n question.options.length <= 4 &&\n question.options.every(\n (option: unknown) =>\n isRecord(option) &&\n isNonemptyString(option.label) &&\n isNonemptyString(option.description),\n ),\n ) &&\n new Set(value.map((question) => question.question)).size === value.length\n );\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction hasQuestionIdentity(value: unknown): value is Record<\n string,\n unknown\n> & {\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n} {\n return (\n isRecord(value) &&\n value.version === 2 &&\n isNonemptyString(value.toolCallId) &&\n isAskUserQuestions(value.questions)\n );\n}\n\nexport function parseAskUserQuestionReceipt(\n value: unknown,\n): AskUserQuestionReceipt | null {\n const receipt = typeof value === \"string\" ? parseJson(value) : value;\n if (!hasQuestionIdentity(receipt) || receipt.type !== \"ask_user_question\")\n return null;\n return {\n type: receipt.type,\n version: 2,\n toolCallId: receipt.toolCallId,\n questions: receipt.questions,\n };\n}\n\nfunction parseResponse(value: unknown): AskUserQuestionResponse | null {\n if (\n !hasQuestionIdentity(value) ||\n value.type !== \"ask_user_question_response\"\n )\n return null;\n const base = {\n type: value.type,\n version: 2,\n toolCallId: value.toolCallId,\n questions: value.questions,\n } as const;\n if (value.status === \"dismissed\" && value.answers === undefined)\n return { ...base, status: \"dismissed\" };\n if (value.status !== \"answered\" || !isRecord(value.answers)) return null;\n const answers = value.answers;\n if (\n Object.keys(answers).length !== value.questions.length ||\n !value.questions.every(\n (question) =>\n Object.hasOwn(answers, question.question) &&\n isNonemptyString(answers[question.question]),\n )\n )\n return null;\n return {\n ...base,\n status: \"answered\",\n answers: answers as Record<string, string>,\n };\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\n/** Return content for a user-role message submitted through normal message delivery. */\nexport function prepareAskUserQuestionNotif(\n response: AskUserQuestionResponse,\n): string {\n const parsed = parseResponse(response);\n if (!parsed) throw new Error(\"Invalid AskUserQuestion response\");\n return `<task-notification>\\n<task-id>${escapeXml(parsed.toolCallId)}</task-id>\\n<summary>User ${parsed.status} your questions.</summary>\\n<ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>\\n</task-notification>`;\n}\n\n/** Match only complete notifications; queued messages may coalesce several together. */\nexport function parseAskUserQuestionNotif(\n text: string,\n): AskUserQuestionResponse[] {\n const responses: AskUserQuestionResponse[] = [];\n const notifications = text.matchAll(\n /<task-notification>(?:(?!<task-notification>)[\\s\\S])*?<\\/task-notification>/g,\n );\n for (const [notification] of notifications) {\n const content = notification.match(\n /<ask-user-question-response>([\\s\\S]*?)<\\/ask-user-question-response>/,\n )?.[1];\n if (!content) continue;\n const decoded = content\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n const response = parseResponse(parseJson(decoded));\n if (response) responses.push(response);\n }\n return responses;\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "F9A038729960456364756E2164756E21",
9
+ "names": []
10
+ }
@@ -485,22 +485,6 @@ class ChannelControlRequestCoordinator {
485
485
  return true;
486
486
  }
487
487
  }
488
- // src/tools/interactive-policy.ts
489
- var INTERACTIVE_APPROVAL_TOOLS = new Set(["AskUserQuestion"]);
490
- var INTERACTIVE_USER_INPUT_TOOL_NAMES = [
491
- "AskUserQuestion"
492
- ];
493
- var RUNTIME_USER_INPUT_TOOLS = new Set(INTERACTIVE_USER_INPUT_TOOL_NAMES);
494
- var HEADLESS_AUTO_ALLOW_TOOLS = new Set;
495
- function getInteractiveApprovalKind(toolName) {
496
- switch (toolName) {
497
- case "AskUserQuestion":
498
- return "ask_user_question";
499
- default:
500
- return null;
501
- }
502
- }
503
-
504
488
  // src/channels/gateway-sources.ts
505
489
  function sourceRouteKey(source) {
506
490
  return [
@@ -1449,7 +1433,8 @@ class ChannelGateway {
1449
1433
  client_message_id: delivery.clientMessageId
1450
1434
  }
1451
1435
  ],
1452
- image_failure_mode: "drop"
1436
+ image_failure_mode: "drop",
1437
+ client_preferences: {}
1453
1438
  }
1454
1439
  });
1455
1440
  if (!response.accepted) {
@@ -1994,7 +1979,7 @@ class ChannelGateway {
1994
1979
  return;
1995
1980
  this.enqueueHook(state, () => this.hooks.onControlRequest({
1996
1981
  requestId: message.request_id,
1997
- kind: getInteractiveApprovalKind(message.request.tool_name) ?? "generic_tool_approval",
1982
+ kind: "generic_tool_approval",
1998
1983
  source,
1999
1984
  toolName: message.request.tool_name,
2000
1985
  input: message.request.input
@@ -2257,7 +2242,8 @@ function replaceSlackMarkdownLinks(text, placeholders) {
2257
2242
  index++;
2258
2243
  continue;
2259
2244
  }
2260
- result += createSlackPlaceholder(placeholders, `<${escapeSlackMrkdwnSegment(link.url)}|${formatSlackLinkLabel(link.label)}>`);
2245
+ const label = restoreSlackPlaceholders(formatSlackLinkLabel(link.label), placeholders);
2246
+ result += createSlackPlaceholder(placeholders, `<${escapeSlackMrkdwnSegment(link.url)}|${label}>`);
2261
2247
  index = link.endIndex;
2262
2248
  }
2263
2249
  return result;
@@ -3075,4 +3061,4 @@ export {
3075
3061
  ChannelControlRequestCoordinator
3076
3062
  };
3077
3063
 
3078
- //# debugId=39779204B75018A464756E2164756E21
3064
+ //# debugId=B90B3E001C72BB3264756E2164756E21