ummaya 0.2.4 → 0.2.5

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 (477) hide show
  1. package/README.md +15 -2
  2. package/bin/ummaya +10 -1
  3. package/npm-shrinkwrap.json +253 -2
  4. package/package.json +5 -1
  5. package/prompts/manifest.yaml +1 -1
  6. package/prompts/system_v1.md +1 -0
  7. package/pyproject.toml +26 -2
  8. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  9. package/src/ummaya/_canonical/__init__.py +2 -0
  10. package/src/ummaya/engine/engine.py +29 -132
  11. package/src/ummaya/evidence/__init__.py +21 -2
  12. package/src/ummaya/evidence/dataset_contract.py +193 -0
  13. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  14. package/src/ummaya/evidence/document_harness.py +313 -0
  15. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  16. package/src/ummaya/evidence/gates.py +70 -0
  17. package/src/ummaya/evidence/json_types.py +20 -0
  18. package/src/ummaya/evidence/models.py +88 -1
  19. package/src/ummaya/evidence/output_payload.py +89 -0
  20. package/src/ummaya/evidence/payload_documents.py +233 -0
  21. package/src/ummaya/evidence/route_contracts.py +224 -0
  22. package/src/ummaya/evidence/route_helpers.py +150 -0
  23. package/src/ummaya/evidence/runner.py +81 -212
  24. package/src/ummaya/evidence/source_provenance.py +246 -0
  25. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  26. package/src/ummaya/evidence/tool_layer.py +39 -0
  27. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  28. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  29. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  30. package/src/ummaya/ipc/frame_schema.py +5 -5
  31. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  32. package/src/ummaya/ipc/stdio.py +1109 -477
  33. package/src/ummaya/llm/client.py +102 -3
  34. package/src/ummaya/llm/config.py +8 -3
  35. package/src/ummaya/primitives/__init__.py +6 -2
  36. package/src/ummaya/primitives/delegation.py +1 -1
  37. package/src/ummaya/primitives/document.py +28 -0
  38. package/src/ummaya/settings.py +0 -3
  39. package/src/ummaya/tools/discovery_bridge.py +17 -1
  40. package/src/ummaya/tools/documents/__init__.py +297 -0
  41. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  42. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  43. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  44. package/src/ummaya/tools/documents/authoring.py +283 -0
  45. package/src/ummaya/tools/documents/baselines.py +114 -0
  46. package/src/ummaya/tools/documents/capability.py +331 -0
  47. package/src/ummaya/tools/documents/contracts.py +112 -0
  48. package/src/ummaya/tools/documents/conversion.py +521 -0
  49. package/src/ummaya/tools/documents/diff.py +275 -0
  50. package/src/ummaya/tools/documents/engines.py +163 -0
  51. package/src/ummaya/tools/documents/evaluation.py +291 -0
  52. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  53. package/src/ummaya/tools/documents/fixtures.py +174 -0
  54. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  55. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  56. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  57. package/src/ummaya/tools/documents/formats/base.py +41 -0
  58. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  59. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  60. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  61. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  62. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  63. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  64. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  65. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  66. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  67. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  68. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  69. package/src/ummaya/tools/documents/inspection.py +289 -0
  70. package/src/ummaya/tools/documents/intake.py +1079 -0
  71. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  72. package/src/ummaya/tools/documents/models.py +1598 -0
  73. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  74. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  75. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  76. package/src/ummaya/tools/documents/patch.py +170 -0
  77. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  78. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  79. package/src/ummaya/tools/documents/permissions.py +110 -0
  80. package/src/ummaya/tools/documents/planner.py +616 -0
  81. package/src/ummaya/tools/documents/registry.py +2733 -0
  82. package/src/ummaya/tools/documents/render.py +978 -0
  83. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  84. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  85. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  86. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  87. package/src/ummaya/tools/documents/reread.py +157 -0
  88. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  89. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  90. package/src/ummaya/tools/documents/scorecard.py +184 -0
  91. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  92. package/src/ummaya/tools/documents/style.py +48 -0
  93. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  94. package/src/ummaya/tools/documents/validate.py +347 -0
  95. package/src/ummaya/tools/executor.py +29 -0
  96. package/src/ummaya/tools/live_proxy.py +0 -3
  97. package/src/ummaya/tools/models.py +5 -1
  98. package/src/ummaya/tools/register_all.py +8 -0
  99. package/src/ummaya/tools/registry.py +10 -1
  100. package/src/ummaya/tools/routing/__init__.py +59 -0
  101. package/src/ummaya/tools/routing/builder.py +105 -0
  102. package/src/ummaya/tools/routing/cards.py +29 -0
  103. package/src/ummaya/tools/routing/decision_service.py +534 -0
  104. package/src/ummaya/tools/routing/decision_types.py +74 -0
  105. package/src/ummaya/tools/routing/feasibility.py +122 -0
  106. package/src/ummaya/tools/routing/intent.py +17 -0
  107. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  108. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  109. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  110. package/src/ummaya/tools/routing/intent_types.py +48 -0
  111. package/src/ummaya/tools/routing/lint.py +78 -0
  112. package/src/ummaya/tools/routing/metadata.py +174 -0
  113. package/src/ummaya/tools/routing/projection.py +340 -0
  114. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  115. package/src/ummaya/tools/routing/schema.py +81 -0
  116. package/src/ummaya/tools/routing/types.py +96 -0
  117. package/src/ummaya/tools/routing_index.py +2 -2
  118. package/src/ummaya/tools/search.py +34 -746
  119. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  120. package/tui/package.json +1 -1
  121. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  122. package/tui/src/QueryEngine.ts +12 -8
  123. package/tui/src/bridge/inboundAttachments.ts +3 -3
  124. package/tui/src/cli/handlers/auth.ts +3 -12
  125. package/tui/src/cli/print.ts +7 -7
  126. package/tui/src/commands/insights.ts +1 -1
  127. package/tui/src/commands/install-github-app/types.ts +8 -30
  128. package/tui/src/commands/plugin/types.ts +6 -28
  129. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  130. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  131. package/tui/src/components/Feedback.tsx +1 -1
  132. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  133. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  134. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  135. package/tui/src/components/Spinner/types.ts +6 -28
  136. package/tui/src/components/agents/generateAgent.ts +1 -1
  137. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  138. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  139. package/tui/src/components/mcp/types.ts +16 -38
  140. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  141. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  142. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  143. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  144. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  145. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  146. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  147. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  148. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  149. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  150. package/tui/src/components/primitive/index.tsx +43 -1
  151. package/tui/src/components/primitive/types.ts +137 -0
  152. package/tui/src/components/ui/option.ts +4 -26
  153. package/tui/src/constants/common.ts +0 -2
  154. package/tui/src/constants/prompts.ts +4 -3
  155. package/tui/src/constants/querySource.ts +4 -26
  156. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  157. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  158. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  159. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  160. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  161. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  162. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  163. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  164. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  165. package/tui/src/ink/ink.tsx +33 -14
  166. package/tui/src/ink/reconciler.ts +2 -3
  167. package/tui/src/ink/render-to-screen.ts +30 -10
  168. package/tui/src/ipc/bridge.ts +62 -15
  169. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  170. package/tui/src/ipc/codec.ts +3 -3
  171. package/tui/src/ipc/frames.generated.ts +12 -12
  172. package/tui/src/ipc/llmClient.ts +151 -27
  173. package/tui/src/ipc/schema/frame.schema.json +1 -1
  174. package/tui/src/keybindings/defaultBindings.ts +4 -0
  175. package/tui/src/main.tsx +29 -11
  176. package/tui/src/native-ts/file-index/index.ts +33 -3
  177. package/tui/src/observability/surface.ts +2 -2
  178. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  179. package/tui/src/projectOnboardingState.ts +7 -6
  180. package/tui/src/query/chatMessageTypes.ts +18 -0
  181. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  182. package/tui/src/query/deps.ts +1 -1
  183. package/tui/src/query/messageGuards.ts +106 -0
  184. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  185. package/tui/src/query/run.ts +1075 -0
  186. package/tui/src/query/supportBoundary.ts +168 -0
  187. package/tui/src/query/toolResultErrors.ts +103 -0
  188. package/tui/src/query/toolRunner.ts +687 -0
  189. package/tui/src/query/unavailableToolRepair.ts +118 -0
  190. package/tui/src/query.ts +9 -2186
  191. package/tui/src/screens/REPL.tsx +40 -29
  192. package/tui/src/services/api/adapterManifest.ts +4 -0
  193. package/tui/src/services/api/backendChat/events.ts +117 -0
  194. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  195. package/tui/src/services/api/backendChat/frame.ts +9 -0
  196. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  197. package/tui/src/services/api/backendChat/types.ts +62 -0
  198. package/tui/src/services/api/backendChat.ts +1 -0
  199. package/tui/src/services/api/client.ts +65 -2
  200. package/tui/src/services/api/errorUtils.ts +5 -5
  201. package/tui/src/services/api/errors.ts +1 -1
  202. package/tui/src/services/api/logging.ts +1 -1
  203. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  204. package/tui/src/services/api/ummaya/messages.ts +255 -0
  205. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  206. package/tui/src/services/api/ummaya/provider.ts +200 -0
  207. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  208. package/tui/src/services/api/ummaya/request.ts +200 -0
  209. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  210. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  211. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  212. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  213. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  214. package/tui/src/services/api/ummaya/types.ts +110 -0
  215. package/tui/src/services/api/ummaya/usage.ts +30 -0
  216. package/tui/src/services/api/ummaya.ts +26 -418
  217. package/tui/src/services/api/withRetry.ts +1 -1
  218. package/tui/src/services/awaySummary.ts +2 -2
  219. package/tui/src/services/claudeAiLimits.ts +1 -1
  220. package/tui/src/services/compact/autoCompact.ts +1 -1
  221. package/tui/src/services/compact/compact.ts +1 -1
  222. package/tui/src/services/lsp/types.ts +8 -30
  223. package/tui/src/services/tips/types.ts +6 -28
  224. package/tui/src/services/tokenEstimation.ts +1 -1
  225. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  226. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  227. package/tui/src/services/tools/toolExecution.ts +94 -1
  228. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  229. package/tui/src/store/session-store.ts +10 -36
  230. package/tui/src/stubs/any-stub.ts +15 -10
  231. package/tui/src/stubs/color-diff-napi.ts +37 -23
  232. package/tui/src/stubs/globals.d.ts +3 -3
  233. package/tui/src/stubs/macro-preload.ts +23 -12
  234. package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
  235. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  236. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  237. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  238. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  239. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  240. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  241. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  242. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  243. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  244. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  245. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  246. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  247. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  248. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  249. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  250. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  251. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  252. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  253. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  254. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  255. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  256. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  257. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  258. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  259. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  260. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  261. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  262. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  263. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  264. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  265. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  266. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  267. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  268. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  269. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  270. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  271. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  272. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  273. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  274. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  275. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  276. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  277. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  278. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  279. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  280. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  281. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  282. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  283. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  284. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  285. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  286. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  287. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  288. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  289. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  290. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  291. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  292. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  293. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  294. package/tui/src/tools/BashTool/call.ts +202 -0
  295. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  296. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  297. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  298. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  299. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  300. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  301. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  302. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  303. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  304. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  305. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  306. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  307. package/tui/src/tools/BashTool/schemas.ts +65 -0
  308. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  309. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  310. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  311. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  312. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  313. package/tui/src/tools/BriefTool/upload.ts +1 -1
  314. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  315. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  316. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  317. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  318. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  319. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  320. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  321. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  322. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  323. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  324. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  325. package/tui/src/tools/FileEditTool/call.ts +228 -0
  326. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  327. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  328. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  329. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  330. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  331. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  332. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
  333. package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
  334. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  335. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  336. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  337. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  338. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  339. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  340. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  341. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  342. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  343. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  344. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  345. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  346. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  347. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  348. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  349. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  350. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  351. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  352. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  353. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  354. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  355. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  356. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
  357. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  358. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  359. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
  360. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  361. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  362. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  363. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  364. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  365. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  366. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  367. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  368. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  369. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  370. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  371. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  372. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  373. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  374. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  375. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  376. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  377. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  378. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  379. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  380. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  381. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  382. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  383. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  384. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  385. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
  386. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  387. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  388. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  389. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  390. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  391. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  392. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  393. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  394. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  395. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  396. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  397. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  398. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  399. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  400. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  401. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  402. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  403. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  404. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  405. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  406. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  407. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  408. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  409. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  410. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  411. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  412. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  413. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  414. package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
  415. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  416. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  417. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  418. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  419. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  420. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  421. package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
  422. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  423. package/tui/src/tools.ts +39 -190
  424. package/tui/src/types/fileSuggestion.ts +4 -26
  425. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  426. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  427. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  428. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  429. package/tui/src/types/message.ts +80 -102
  430. package/tui/src/types/messageQueueTypes.ts +6 -28
  431. package/tui/src/types/notebook.ts +16 -38
  432. package/tui/src/types/statusLine.ts +4 -26
  433. package/tui/src/types/tools.ts +24 -46
  434. package/tui/src/types/utils.ts +6 -28
  435. package/tui/src/upstreamproxy/relay.ts +7 -3
  436. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  437. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  438. package/tui/src/utils/auth.ts +129 -139
  439. package/tui/src/utils/bash/ast.ts +23 -23
  440. package/tui/src/utils/bash/bashParser.ts +5 -5
  441. package/tui/src/utils/billing.ts +1 -1
  442. package/tui/src/utils/collapseReadSearch.ts +3 -3
  443. package/tui/src/utils/cronTasks.ts +1 -1
  444. package/tui/src/utils/execFileNoThrow.ts +1 -1
  445. package/tui/src/utils/filePersistence/types.ts +16 -38
  446. package/tui/src/utils/forkedAgent.ts +1 -1
  447. package/tui/src/utils/gracefulShutdown.ts +4 -4
  448. package/tui/src/utils/heapDumpService.ts +12 -8
  449. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  450. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  451. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  452. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  453. package/tui/src/utils/messages.ts +18 -0
  454. package/tui/src/utils/migrateSessions.ts +3 -3
  455. package/tui/src/utils/model/model.ts +6 -6
  456. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  457. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  458. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  459. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  460. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  461. package/tui/src/utils/protectedNamespace.ts +5 -3
  462. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  463. package/tui/src/utils/ripgrep.ts +16 -7
  464. package/tui/src/utils/sessionTitle.ts +1 -1
  465. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  466. package/tui/src/utils/shell/prefix.ts +1 -1
  467. package/tui/src/utils/sideQuery.ts +1 -1
  468. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  469. package/tui/src/utils/teleport.tsx +1 -1
  470. package/uv.lock +400 -14
  471. package/tui/src/services/api/claude.ts +0 -3540
  472. package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
  473. package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
  474. package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
  475. package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
  476. package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
  477. package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
@@ -1,266 +1,238 @@
1
- import { c as _c } from "react/compiler-runtime";
2
- import { feature } from 'bun:bundle';
3
- import * as React from 'react';
4
- import { getAllowedChannels, getQuestionPreviewFormat } from 'src/bootstrap/state.js';
5
- import { MessageResponse } from 'src/components/MessageResponse.js';
6
- import { BLACK_CIRCLE } from 'src/constants/figures.js';
7
- import { getModeColor } from 'src/utils/permissions/PermissionMode.js';
8
- import { z } from 'zod/v4';
9
- import { Box, Text } from '../../ink.js';
10
- import type { Tool } from '../../Tool.js';
11
- import { buildTool, type ToolDef } from '../../Tool.js';
12
- import { lazySchema } from '../../utils/lazySchema.js';
13
- import { ASK_USER_QUESTION_TOOL_CHIP_WIDTH, ASK_USER_QUESTION_TOOL_NAME, ASK_USER_QUESTION_TOOL_PROMPT, DESCRIPTION, PREVIEW_FEATURE_PROMPT } from './prompt.js';
14
- const questionOptionSchema = lazySchema(() => z.object({
15
- label: z.string().describe('The display text for this option that the user will see and select. Should be concise (1-5 words) and clearly describe the choice.'),
16
- description: z.string().describe('Explanation of what this option means or what will happen if chosen. Useful for providing context about trade-offs or implications.'),
17
- preview: z.string().optional().describe('Optional preview content rendered when this option is focused. Use for mockups, code snippets, or visual comparisons that help users compare options. See the tool description for the expected content format.')
18
- }));
19
- const questionSchema = lazySchema(() => z.object({
20
- question: z.string().describe('The complete question to ask the user. Should be clear, specific, and end with a question mark. Example: "Which library should we use for date formatting?" If multiSelect is true, phrase it accordingly, e.g. "Which features do you want to enable?"'),
21
- header: z.string().describe(`Very short label displayed as a chip/tag (max ${ASK_USER_QUESTION_TOOL_CHIP_WIDTH} chars). Examples: "Auth method", "Library", "Approach".`),
22
- options: z.array(questionOptionSchema()).min(2).max(4).describe(`The available choices for this question. Must have 2-4 options. Each option should be a distinct, mutually exclusive choice (unless multiSelect is enabled). There should be no 'Other' option, that will be provided automatically.`),
23
- multiSelect: z.boolean().default(false).describe('Set to true to allow the user to select multiple options instead of just one. Use when choices are not mutually exclusive.')
24
- }));
1
+ import { feature } from 'bun:bundle'
2
+ import * as React from 'react'
3
+ import {
4
+ getAllowedChannels,
5
+ getQuestionPreviewFormat,
6
+ } from 'src/bootstrap/state.js'
7
+ import { MessageResponse } from 'src/components/MessageResponse.js'
8
+ import { BLACK_CIRCLE } from 'src/constants/figures.js'
9
+ import { getModeColor } from 'src/utils/permissions/PermissionMode.js'
10
+ import { z } from 'zod/v4'
11
+ import { Box, Text } from '../../ink.js'
12
+ import { buildTool, type Tool, type ToolDef } from '../../Tool.js'
13
+ import { lazySchema } from '../../utils/lazySchema.js'
14
+ import { buildAgentSupportMetadata } from '../AgentTool/orchestrationSupport.js'
15
+ import {
16
+ ASK_USER_QUESTION_TOOL_CHIP_WIDTH,
17
+ ASK_USER_QUESTION_TOOL_NAME,
18
+ ASK_USER_QUESTION_TOOL_PROMPT,
19
+ DESCRIPTION,
20
+ PREVIEW_FEATURE_PROMPT,
21
+ } from './prompt.js'
22
+
23
+ const questionOptionSchema = lazySchema(() =>
24
+ z.object({
25
+ label: z.string().describe('The display text for this option that the user will see and select. Should be concise (1-5 words) and clearly describe the choice.'),
26
+ description: z.string().describe('Explanation of what this option means or what will happen if chosen. Useful for providing context about trade-offs or implications.'),
27
+ preview: z.string().optional().describe('Optional preview content rendered when this option is focused. Use for mockups, code snippets, or visual comparisons that help users compare options. See the tool description for the expected content format.'),
28
+ }),
29
+ )
30
+
31
+ const questionSchema = lazySchema(() =>
32
+ z.object({
33
+ question: z.string().describe('The complete question to ask the user. Should be clear, specific, and end with a question mark.'),
34
+ header: z.string().describe(`Very short label displayed as a chip/tag (max ${ASK_USER_QUESTION_TOOL_CHIP_WIDTH} chars).`),
35
+ options: z.array(questionOptionSchema()).min(2).max(4).describe('The available choices for this question. Must have 2-4 options.'),
36
+ multiSelect: z.boolean().default(false).describe('Set to true to allow the user to select multiple options instead of just one.'),
37
+ }),
38
+ )
39
+
25
40
  const annotationsSchema = lazySchema(() => {
26
41
  const annotationSchema = z.object({
27
42
  preview: z.string().optional().describe('The preview content of the selected option, if the question used previews.'),
28
- notes: z.string().optional().describe('Free-text notes the user added to their selection.')
29
- });
30
- return z.record(z.string(), annotationSchema).optional().describe('Optional per-question annotations from the user (e.g., notes on preview selections). Keyed by question text.');
31
- });
32
- const UNIQUENESS_REFINE = {
33
- check: (data: {
34
- questions: {
35
- question: string;
36
- options: {
37
- label: string;
38
- }[];
39
- }[];
40
- }) => {
41
- const questions = data.questions.map(q => q.question);
42
- if (questions.length !== new Set(questions).size) {
43
- return false;
44
- }
43
+ notes: z.string().optional().describe('Free-text notes the user added to their selection.'),
44
+ })
45
+ return z.record(z.string(), annotationSchema).optional()
46
+ })
47
+
48
+ const uniquenessRefine = {
49
+ check: (data: { questions: { question: string; options: { label: string }[] }[] }) => {
50
+ const questions = data.questions.map(q => q.question)
51
+ if (questions.length !== new Set(questions).size) return false
45
52
  for (const question of data.questions) {
46
- const labels = question.options.map(opt => opt.label);
47
- if (labels.length !== new Set(labels).size) {
48
- return false;
49
- }
53
+ const labels = question.options.map(option => option.label)
54
+ if (labels.length !== new Set(labels).size) return false
50
55
  }
51
- return true;
56
+ return true
52
57
  },
53
- message: 'Question texts must be unique, option labels must be unique within each question'
54
- } as const;
58
+ message:
59
+ 'Question texts must be unique, option labels must be unique within each question',
60
+ } as const
61
+
55
62
  const commonFields = lazySchema(() => ({
56
- answers: z.record(z.string(), z.string()).optional().describe('User answers collected by the permission component'),
63
+ answers: z.record(z.string(), z.string()).optional(),
57
64
  annotations: annotationsSchema(),
58
- metadata: z.object({
59
- source: z.string().optional().describe('Optional identifier for the source of this question (e.g., "remember" for /remember command). Used for analytics tracking.')
60
- }).optional().describe('Optional metadata for tracking and analytics purposes. Not displayed to user.')
61
- }));
62
- const inputSchema = lazySchema(() => z.strictObject({
63
- questions: z.array(questionSchema()).min(1).max(4).describe('Questions to ask the user (1-4 questions)'),
64
- ...commonFields()
65
- }).refine(UNIQUENESS_REFINE.check, {
66
- message: UNIQUENESS_REFINE.message
67
- }));
68
- type InputSchema = ReturnType<typeof inputSchema>;
69
- const outputSchema = lazySchema(() => z.object({
70
- questions: z.array(questionSchema()).describe('The questions that were asked'),
71
- answers: z.record(z.string(), z.string()).describe('The answers provided by the user (question text -> answer string; multi-select answers are comma-separated)'),
72
- annotations: annotationsSchema()
73
- }));
74
- type OutputSchema = ReturnType<typeof outputSchema>;
65
+ metadata: z.object({ source: z.string().optional() }).optional(),
66
+ }))
67
+
68
+ const inputSchema = lazySchema(() =>
69
+ z
70
+ .strictObject({
71
+ questions: z.array(questionSchema()).min(1).max(4),
72
+ ...commonFields(),
73
+ })
74
+ .refine(uniquenessRefine.check, { message: uniquenessRefine.message }),
75
+ )
76
+ type InputSchema = ReturnType<typeof inputSchema>
77
+
78
+ const outputSchema = lazySchema(() =>
79
+ z.object({
80
+ questions: z.array(questionSchema()),
81
+ answers: z.record(z.string(), z.string()),
82
+ annotations: annotationsSchema(),
83
+ evidenceJoinKey: z.string(),
84
+ parentToolUseId: z.string(),
85
+ resumeToken: z.string(),
86
+ permissionFlow: z.literal('coordinator_parent_round_trip'),
87
+ }),
88
+ )
89
+ type OutputSchema = ReturnType<typeof outputSchema>
75
90
 
76
- // SDK schemas are identical to internal schemas now that `preview` and
77
- // `annotations` are public (configurable via `toolConfig.askUserQuestion`).
78
- export const _sdkInputSchema = inputSchema;
79
- export const _sdkOutputSchema = outputSchema;
80
- export type Question = z.infer<ReturnType<typeof questionSchema>>;
81
- export type QuestionOption = z.infer<ReturnType<typeof questionOptionSchema>>;
82
- export type Output = z.infer<OutputSchema>;
83
- function AskUserQuestionResultMessage(t0) {
84
- const $ = _c(3);
85
- const {
86
- answers
87
- } = t0;
88
- let t1;
89
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
90
- t1 = <Box flexDirection="row"><Text color={getModeColor("default")}>{BLACK_CIRCLE} </Text><Text>User answered UMMAYA's questions:</Text></Box>;
91
- $[0] = t1;
92
- } else {
93
- t1 = $[0];
91
+ export const _sdkInputSchema = inputSchema
92
+ export const _sdkOutputSchema = outputSchema
93
+ export type Question = z.infer<ReturnType<typeof questionSchema>>
94
+ export type QuestionOption = z.infer<ReturnType<typeof questionOptionSchema>>
95
+ export type Output = z.infer<OutputSchema>
96
+
97
+ function AskUserQuestionResultMessage({
98
+ answers,
99
+ }: {
100
+ readonly answers: Output['answers']
101
+ }): React.ReactNode {
102
+ return (
103
+ <Box flexDirection="column" marginTop={1}>
104
+ <Box flexDirection="row">
105
+ <Text color={getModeColor('default')}>{BLACK_CIRCLE}&nbsp;</Text>
106
+ <Text>User answered UMMAYA&apos;s questions:</Text>
107
+ </Box>
108
+ <MessageResponse>
109
+ <Box flexDirection="column">
110
+ {Object.entries(answers).map(([questionText, answer]) => (
111
+ <Text key={questionText} color="inactive">
112
+ · {questionText} → {answer}
113
+ </Text>
114
+ ))}
115
+ </Box>
116
+ </MessageResponse>
117
+ </Box>
118
+ )
119
+ }
120
+
121
+ function validateHtmlPreview(preview: string | undefined): string | null {
122
+ if (preview === undefined) return null
123
+ if (/<\s*(html|body|!doctype)\b/iu.test(preview)) {
124
+ return 'preview must be an HTML fragment, not a full document (no <html>, <body>, or <!DOCTYPE>)'
94
125
  }
95
- let t2;
96
- if ($[1] !== answers) {
97
- t2 = <Box flexDirection="column" marginTop={1}>{t1}<MessageResponse><Box flexDirection="column">{Object.entries(answers).map(_temp)}</Box></MessageResponse></Box>;
98
- $[1] = answers;
99
- $[2] = t2;
100
- } else {
101
- t2 = $[2];
126
+ if (/<\s*(script|style)\b/iu.test(preview)) {
127
+ return 'preview must not contain <script> or <style> tags. Use inline styles via the style attribute if needed.'
102
128
  }
103
- return t2;
104
- }
105
- function _temp(t0) {
106
- const [questionText, answer] = t0;
107
- return <Text key={questionText} color="inactive">· {questionText} → {answer}</Text>;
129
+ if (!/<[a-z][^>]*>/iu.test(preview)) {
130
+ return 'preview must contain HTML (previewFormat is set to "html"). Wrap content in a tag like <div> or <pre>.'
131
+ }
132
+ return null
108
133
  }
134
+
109
135
  export const AskUserQuestionTool: Tool<InputSchema, Output> = buildTool({
110
136
  name: ASK_USER_QUESTION_TOOL_NAME,
111
137
  searchHint: 'prompt the user with a multiple-choice question',
112
138
  maxResultSizeChars: 100_000,
113
139
  shouldDefer: true,
114
140
  async description() {
115
- return DESCRIPTION;
141
+ return DESCRIPTION
116
142
  },
117
143
  async prompt() {
118
- const format = getQuestionPreviewFormat();
119
- if (format === undefined) {
120
- // SDK consumer that hasn't opted into a preview format — omit preview
121
- // guidance (they may not render the field at all).
122
- return ASK_USER_QUESTION_TOOL_PROMPT;
123
- }
124
- return ASK_USER_QUESTION_TOOL_PROMPT + PREVIEW_FEATURE_PROMPT[format];
144
+ const format = getQuestionPreviewFormat()
145
+ return format === undefined
146
+ ? ASK_USER_QUESTION_TOOL_PROMPT
147
+ : ASK_USER_QUESTION_TOOL_PROMPT + PREVIEW_FEATURE_PROMPT[format]
125
148
  },
126
149
  get inputSchema(): InputSchema {
127
- return inputSchema();
150
+ return inputSchema()
128
151
  },
129
152
  get outputSchema(): OutputSchema {
130
- return outputSchema();
153
+ return outputSchema()
131
154
  },
132
155
  userFacingName() {
133
- return '';
156
+ return ''
134
157
  },
135
158
  isEnabled() {
136
- // When --channels is active the user is likely on Telegram/Discord, not
137
- // watching the TUI. The multiple-choice dialog would hang with nobody at
138
- // the keyboard. Channel permission relay already skips
139
- // requiresUserInteraction() tools (interactiveHandler.ts) so there's
140
- // no alternate approval path.
141
159
  if ((feature('KAIROS') || feature('KAIROS_CHANNELS')) && getAllowedChannels().length > 0) {
142
- return false;
160
+ return false
143
161
  }
144
- return true;
162
+ return true
145
163
  },
146
164
  isConcurrencySafe() {
147
- return true;
165
+ return true
148
166
  },
149
167
  isReadOnly() {
150
- return true;
168
+ return true
151
169
  },
152
170
  toAutoClassifierInput(input) {
153
- return input.questions.map(q => q.question).join(' | ');
171
+ return input.questions.map(question => question.question).join(' | ')
154
172
  },
155
173
  requiresUserInteraction() {
156
- return true;
157
- },
158
- async validateInput({
159
- questions
160
- }) {
161
- if (getQuestionPreviewFormat() !== 'html') {
162
- return {
163
- result: true
164
- };
165
- }
166
- for (const q of questions) {
167
- for (const opt of q.options) {
168
- const err = validateHtmlPreview(opt.preview);
169
- if (err) {
174
+ return true
175
+ },
176
+ async validateInput({ questions }) {
177
+ if (getQuestionPreviewFormat() !== 'html') return { result: true }
178
+ for (const question of questions) {
179
+ for (const option of question.options) {
180
+ const error = validateHtmlPreview(option.preview)
181
+ if (error) {
170
182
  return {
171
183
  result: false,
172
- message: `Option "${opt.label}" in question "${q.question}": ${err}`,
173
- errorCode: 1
174
- };
184
+ message: `Option "${option.label}" in question "${question.question}": ${error}`,
185
+ errorCode: 1,
186
+ }
175
187
  }
176
188
  }
177
189
  }
178
- return {
179
- result: true
180
- };
190
+ return { result: true }
181
191
  },
182
192
  async checkPermissions(input) {
183
- return {
184
- behavior: 'ask' as const,
185
- message: 'Answer questions?',
186
- updatedInput: input
187
- };
193
+ return { behavior: 'ask', message: 'Answer questions?', updatedInput: input }
188
194
  },
189
195
  renderToolUseMessage() {
190
- return null;
196
+ return null
191
197
  },
192
198
  renderToolUseProgressMessage() {
193
- return null;
199
+ return null
194
200
  },
195
- renderToolResultMessage({
196
- answers
197
- }, _toolUseID) {
198
- return <AskUserQuestionResultMessage answers={answers} />;
201
+ renderToolResultMessage({ answers }) {
202
+ return <AskUserQuestionResultMessage answers={answers} />
199
203
  },
200
204
  renderToolUseRejectedMessage() {
201
- return <Box flexDirection="row" marginTop={1}>
205
+ return (
206
+ <Box flexDirection="row" marginTop={1}>
202
207
  <Text color={getModeColor('default')}>{BLACK_CIRCLE}&nbsp;</Text>
203
208
  <Text>User declined to answer questions</Text>
204
- </Box>;
209
+ </Box>
210
+ )
205
211
  },
206
212
  renderToolUseErrorMessage() {
207
- return null;
213
+ return null
208
214
  },
209
- async call({
210
- questions,
211
- answers = {},
212
- annotations
213
- }, _context) {
215
+ async call({ questions, answers = {}, annotations }, context) {
214
216
  return {
215
217
  data: {
216
218
  questions,
217
219
  answers,
218
- ...(annotations && {
219
- annotations
220
- })
221
- }
222
- };
220
+ ...(annotations && { annotations }),
221
+ ...buildAgentSupportMetadata({
222
+ taskId: ASK_USER_QUESTION_TOOL_NAME,
223
+ parentToolUseId: context.toolUseId,
224
+ }),
225
+ },
226
+ }
223
227
  },
224
- mapToolResultToToolResultBlockParam({
225
- answers,
226
- annotations
227
- }, toolUseID) {
228
- const answersText = Object.entries(answers).map(([questionText, answer]) => {
229
- const annotation = annotations?.[questionText];
230
- const parts = [`"${questionText}"="${answer}"`];
231
- if (annotation?.preview) {
232
- parts.push(`selected preview:\n${annotation.preview}`);
233
- }
234
- if (annotation?.notes) {
235
- parts.push(`user notes: ${annotation.notes}`);
236
- }
237
- return parts.join(' ');
238
- }).join(', ');
228
+ mapToolResultToToolResultBlockParam(result, toolUseID) {
229
+ const answersText = Object.entries(result.answers)
230
+ .map(([questionText, answer]) => `"${questionText}"="${answer}"`)
231
+ .join(', ')
239
232
  return {
240
233
  type: 'tool_result',
241
- content: `User has answered your questions: ${answersText}. You can now continue with the user's answers in mind.`,
242
- tool_use_id: toolUseID
243
- };
244
- }
245
- } satisfies ToolDef<InputSchema, Output>);
246
-
247
- // Lightweight HTML fragment check. Not a parser — HTML5 parsers are
248
- // error-recovering by spec and accept anything. We're checking model intent
249
- // (did it emit HTML?) and catching the specific things we told it not to do.
250
- function validateHtmlPreview(preview: string | undefined): string | null {
251
- if (preview === undefined) return null;
252
- if (/<\s*(html|body|!doctype)\b/i.test(preview)) {
253
- return 'preview must be an HTML fragment, not a full document (no <html>, <body>, or <!DOCTYPE>)';
254
- }
255
- // SDK consumers typically set this via innerHTML — disallow executable/style
256
- // tags so a preview can't run code or restyle the host page. Inline event
257
- // handlers (onclick etc.) are still possible; consumers should sanitize.
258
- if (/<\s*(script|style)\b/i.test(preview)) {
259
- return 'preview must not contain <script> or <style> tags. Use inline styles via the style attribute if needed.';
260
- }
261
- if (!/<[a-z][^>]*>/i.test(preview)) {
262
- return 'preview must contain HTML (previewFormat is set to "html"). Wrap content in a tag like <div> or <pre>.';
263
- }
264
- return null;
265
- }
266
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJnZXRBbGxvd2VkQ2hhbm5lbHMiLCJnZXRRdWVzdGlvblByZXZpZXdGb3JtYXQiLCJNZXNzYWdlUmVzcG9uc2UiLCJCTEFDS19DSVJDTEUiLCJnZXRNb2RlQ29sb3IiLCJ6IiwiQm94IiwiVGV4dCIsIlRvb2wiLCJidWlsZFRvb2wiLCJUb29sRGVmIiwibGF6eVNjaGVtYSIsIkFTS19VU0VSX1FVRVNUSU9OX1RPT0xfQ0hJUF9XSURUSCIsIkFTS19VU0VSX1FVRVNUSU9OX1RPT0xfTkFNRSIsIkFTS19VU0VSX1FVRVNUSU9OX1RPT0xfUFJPTVBUIiwiREVTQ1JJUFRJT04iLCJQUkVWSUVXX0ZFQVRVUkVfUFJPTVBUIiwicXVlc3Rpb25PcHRpb25TY2hlbWEiLCJvYmplY3QiLCJsYWJlbCIsInN0cmluZyIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJwcmV2aWV3Iiwib3B0aW9uYWwiLCJxdWVzdGlvblNjaGVtYSIsInF1ZXN0aW9uIiwiaGVhZGVyIiwib3B0aW9ucyIsImFycmF5IiwibWluIiwibWF4IiwibXVsdGlTZWxlY3QiLCJib29sZWFuIiwiZGVmYXVsdCIsImFubm90YXRpb25zU2NoZW1hIiwiYW5ub3RhdGlvblNjaGVtYSIsIm5vdGVzIiwicmVjb3JkIiwiVU5JUVVFTkVTU19SRUZJTkUiLCJjaGVjayIsImRhdGEiLCJxdWVzdGlvbnMiLCJtYXAiLCJxIiwibGVuZ3RoIiwiU2V0Iiwic2l6ZSIsImxhYmVscyIsIm9wdCIsIm1lc3NhZ2UiLCJjb25zdCIsImNvbW1vbkZpZWxkcyIsImFuc3dlcnMiLCJhbm5vdGF0aW9ucyIsIm1ldGFkYXRhIiwic291cmNlIiwiaW5wdXRTY2hlbWEiLCJzdHJpY3RPYmplY3QiLCJyZWZpbmUiLCJJbnB1dFNjaGVtYSIsIlJldHVyblR5cGUiLCJvdXRwdXRTY2hlbWEiLCJPdXRwdXRTY2hlbWEiLCJfc2RrSW5wdXRTY2hlbWEiLCJfc2RrT3V0cHV0U2NoZW1hIiwiUXVlc3Rpb24iLCJpbmZlciIsIlF1ZXN0aW9uT3B0aW9uIiwiT3V0cHV0IiwiQXNrVXNlclF1ZXN0aW9uUmVzdWx0TWVzc2FnZSIsInQwIiwiJCIsIl9jIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJ0MiIsIk9iamVjdCIsImVudHJpZXMiLCJfdGVtcCIsInF1ZXN0aW9uVGV4dCIsImFuc3dlciIsIkFza1VzZXJRdWVzdGlvblRvb2wiLCJuYW1lIiwic2VhcmNoSGludCIsIm1heFJlc3VsdFNpemVDaGFycyIsInNob3VsZERlZmVyIiwicHJvbXB0IiwiZm9ybWF0IiwidW5kZWZpbmVkIiwidXNlckZhY2luZ05hbWUiLCJpc0VuYWJsZWQiLCJpc0NvbmN1cnJlbmN5U2FmZSIsImlzUmVhZE9ubHkiLCJ0b0F1dG9DbGFzc2lmaWVySW5wdXQiLCJpbnB1dCIsImpvaW4iLCJyZXF1aXJlc1VzZXJJbnRlcmFjdGlvbiIsInZhbGlkYXRlSW5wdXQiLCJyZXN1bHQiLCJlcnIiLCJ2YWxpZGF0ZUh0bWxQcmV2aWV3IiwiZXJyb3JDb2RlIiwiY2hlY2tQZXJtaXNzaW9ucyIsImJlaGF2aW9yIiwidXBkYXRlZElucHV0IiwicmVuZGVyVG9vbFVzZU1lc3NhZ2UiLCJyZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlIiwicmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UiLCJfdG9vbFVzZUlEIiwicmVuZGVyVG9vbFVzZVJlamVjdGVkTWVzc2FnZSIsInJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UiLCJjYWxsIiwiX2NvbnRleHQiLCJtYXBUb29sUmVzdWx0VG9Ub29sUmVzdWx0QmxvY2tQYXJhbSIsInRvb2xVc2VJRCIsImFuc3dlcnNUZXh0IiwiYW5ub3RhdGlvbiIsInBhcnRzIiwicHVzaCIsInR5cGUiLCJjb250ZW50IiwidG9vbF91c2VfaWQiLCJ0ZXN0Il0sInNvdXJjZXMiOlsiQXNrVXNlclF1ZXN0aW9uVG9vbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmVhdHVyZSB9IGZyb20gJ2J1bjpidW5kbGUnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIGdldEFsbG93ZWRDaGFubmVscyxcbiAgZ2V0UXVlc3Rpb25QcmV2aWV3Rm9ybWF0LFxufSBmcm9tICdzcmMvYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHsgTWVzc2FnZVJlc3BvbnNlIH0gZnJvbSAnc3JjL2NvbXBvbmVudHMvTWVzc2FnZVJlc3BvbnNlLmpzJ1xuaW1wb3J0IHsgQkxBQ0tfQ0lSQ0xFIH0gZnJvbSAnc3JjL2NvbnN0YW50cy9maWd1cmVzLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kZUNvbG9yIH0gZnJvbSAnc3JjL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25Nb2RlLmpzJ1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZC92NCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQgeyBidWlsZFRvb2wsIHR5cGUgVG9vbERlZiB9IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQgeyBsYXp5U2NoZW1hIH0gZnJvbSAnLi4vLi4vdXRpbHMvbGF6eVNjaGVtYS5qcydcbmltcG9ydCB7XG4gIEFTS19VU0VSX1FVRVNUSU9OX1RPT0xfQ0hJUF9XSURUSCxcbiAgQVNLX1VTRVJfUVVFU1RJT05fVE9PTF9OQU1FLFxuICBBU0tfVVNFUl9RVUVTVElPTl9UT09MX1BST01QVCxcbiAgREVTQ1JJUFRJT04sXG4gIFBSRVZJRVdfRkVBVFVSRV9QUk9NUFQsXG59IGZyb20gJy4vcHJvbXB0LmpzJ1xuXG5jb25zdCBxdWVzdGlvbk9wdGlvblNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGxhYmVsOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RoZSBkaXNwbGF5IHRleHQgZm9yIHRoaXMgb3B0aW9uIHRoYXQgdGhlIHVzZXIgd2lsbCBzZWUgYW5kIHNlbGVjdC4gU2hvdWxkIGJlIGNvbmNpc2UgKDEtNSB3b3JkcykgYW5kIGNsZWFybHkgZGVzY3JpYmUgdGhlIGNob2ljZS4nLFxuICAgICAgKSxcbiAgICBkZXNjcmlwdGlvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdFeHBsYW5hdGlvbiBvZiB3aGF0IHRoaXMgb3B0aW9uIG1lYW5zIG9yIHdoYXQgd2lsbCBoYXBwZW4gaWYgY2hvc2VuLiBVc2VmdWwgZm9yIHByb3ZpZGluZyBjb250ZXh0IGFib3V0IHRyYWRlLW9mZnMgb3IgaW1wbGljYXRpb25zLicsXG4gICAgICApLFxuICAgIHByZXZpZXc6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ09wdGlvbmFsIHByZXZpZXcgY29udGVudCByZW5kZXJlZCB3aGVuIHRoaXMgb3B0aW9uIGlzIGZvY3VzZWQuIFVzZSBmb3IgbW9ja3VwcywgY29kZSBzbmlwcGV0cywgb3IgdmlzdWFsIGNvbXBhcmlzb25zIHRoYXQgaGVscCB1c2VycyBjb21wYXJlIG9wdGlvbnMuIFNlZSB0aGUgdG9vbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGV4cGVjdGVkIGNvbnRlbnQgZm9ybWF0LicsXG4gICAgICApLFxuICB9KSxcbilcblxuY29uc3QgcXVlc3Rpb25TY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+XG4gIHoub2JqZWN0KHtcbiAgICBxdWVzdGlvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdUaGUgY29tcGxldGUgcXVlc3Rpb24gdG8gYXNrIHRoZSB1c2VyLiBTaG91bGQgYmUgY2xlYXIsIHNwZWNpZmljLCBhbmQgZW5kIHdpdGggYSBxdWVzdGlvbiBtYXJrLiBFeGFtcGxlOiBcIldoaWNoIGxpYnJhcnkgc2hvdWxkIHdlIHVzZSBmb3IgZGF0ZSBmb3JtYXR0aW5nP1wiIElmIG11bHRpU2VsZWN0IGlzIHRydWUsIHBocmFzZSBpdCBhY2NvcmRpbmdseSwgZS5nLiBcIldoaWNoIGZlYXR1cmVzIGRvIHlvdSB3YW50IHRvIGVuYWJsZT9cIicsXG4gICAgICApLFxuICAgIGhlYWRlcjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIGBWZXJ5IHNob3J0IGxhYmVsIGRpc3BsYXllZCBhcyBhIGNoaXAvdGFnIChtYXggJHtBU0tfVVNFUl9RVUVTVElPTl9UT09MX0NISVBfV0lEVEh9IGNoYXJzKS4gRXhhbXBsZXM6IFwiQXV0aCBtZXRob2RcIiwgXCJMaWJyYXJ5XCIsIFwiQXBwcm9hY2hcIi5gLFxuICAgICAgKSxcbiAgICBvcHRpb25zOiB6XG4gICAgICAuYXJyYXkocXVlc3Rpb25PcHRpb25TY2hlbWEoKSlcbiAgICAgIC5taW4oMilcbiAgICAgIC5tYXgoNClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgYFRoZSBhdmFpbGFibGUgY2hvaWNlcyBmb3IgdGhpcyBxdWVzdGlvbi4gTXVzdCBoYXZlIDItNCBvcHRpb25zLiBFYWNoIG9wdGlvbiBzaG91bGQgYmUgYSBkaXN0aW5jdCwgbXV0dWFsbHkgZXhjbHVzaXZlIGNob2ljZSAodW5sZXNzIG11bHRpU2VsZWN0IGlzIGVuYWJsZWQpLiBUaGVyZSBzaG91bGQgYmUgbm8gJ090aGVyJyBvcHRpb24sIHRoYXQgd2lsbCBiZSBwcm92aWRlZCBhdXRvbWF0aWNhbGx5LmAsXG4gICAgICApLFxuICAgIG11bHRpU2VsZWN0OiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1NldCB0byB0cnVlIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBvcHRpb25zIGluc3RlYWQgb2YganVzdCBvbmUuIFVzZSB3aGVuIGNob2ljZXMgYXJlIG5vdCBtdXR1YWxseSBleGNsdXNpdmUuJyxcbiAgICAgICksXG4gIH0pLFxuKVxuXG5jb25zdCBhbm5vdGF0aW9uc1NjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT4ge1xuICBjb25zdCBhbm5vdGF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHByZXZpZXc6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RoZSBwcmV2aWV3IGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiwgaWYgdGhlIHF1ZXN0aW9uIHVzZWQgcHJldmlld3MuJyxcbiAgICAgICksXG4gICAgbm90ZXM6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZSgnRnJlZS10ZXh0IG5vdGVzIHRoZSB1c2VyIGFkZGVkIHRvIHRoZWlyIHNlbGVjdGlvbi4nKSxcbiAgfSlcblxuICByZXR1cm4gelxuICAgIC5yZWNvcmQoei5zdHJpbmcoKSwgYW5ub3RhdGlvblNjaGVtYSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgICdPcHRpb25hbCBwZXItcXVlc3Rpb24gYW5ub3RhdGlvbnMgZnJvbSB0aGUgdXNlciAoZS5nLiwgbm90ZXMgb24gcHJldmlldyBzZWxlY3Rpb25zKS4gS2V5ZWQgYnkgcXVlc3Rpb24gdGV4dC4nLFxuICAgIClcbn0pXG5cbmNvbnN0IFVOSVFVRU5FU1NfUkVGSU5FID0ge1xuICBjaGVjazogKGRhdGE6IHtcbiAgICBxdWVzdGlvbnM6IHsgcXVlc3Rpb246IHN0cmluZzsgb3B0aW9uczogeyBsYWJlbDogc3RyaW5nIH1bXSB9W11cbiAgfSkgPT4ge1xuICAgIGNvbnN0IHF1ZXN0aW9ucyA9IGRhdGEucXVlc3Rpb25zLm1hcChxID0+IHEucXVlc3Rpb24pXG4gICAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggIT09IG5ldyBTZXQocXVlc3Rpb25zKS5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBkYXRhLnF1ZXN0aW9ucykge1xuICAgICAgY29uc3QgbGFiZWxzID0gcXVlc3Rpb24ub3B0aW9ucy5tYXAob3B0ID0+IG9wdC5sYWJlbClcbiAgICAgIGlmIChsYWJlbHMubGVuZ3RoICE9PSBuZXcgU2V0KGxhYmVscykuc2l6ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfSxcbiAgbWVzc2FnZTpcbiAgICAnUXVlc3Rpb24gdGV4dHMgbXVzdCBiZSB1bmlxdWUsIG9wdGlvbiBsYWJlbHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGVhY2ggcXVlc3Rpb24nLFxufSBhcyBjb25zdFxuXG5jb25zdCBjb21tb25GaWVsZHMgPSBsYXp5U2NoZW1hKCgpID0+ICh7XG4gIGFuc3dlcnM6IHpcbiAgICAucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoJ1VzZXIgYW5zd2VycyBjb2xsZWN0ZWQgYnkgdGhlIHBlcm1pc3Npb24gY29tcG9uZW50JyksXG4gIGFubm90YXRpb25zOiBhbm5vdGF0aW9uc1NjaGVtYSgpLFxuICBtZXRhZGF0YTogelxuICAgIC5vYmplY3Qoe1xuICAgICAgc291cmNlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ09wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVzdGlvbiAoZS5nLiwgXCJyZW1lbWJlclwiIGZvciAvcmVtZW1iZXIgY29tbWFuZCkuIFVzZWQgZm9yIGFuYWx5dGljcyB0cmFja2luZy4nLFxuICAgICAgICApLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICAnT3B0aW9uYWwgbWV0YWRhdGEgZm9yIHRyYWNraW5nIGFuZCBhbmFseXRpY3MgcHVycG9zZXMuIE5vdCBkaXNwbGF5ZWQgdG8gdXNlci4nLFxuICAgICksXG59KSlcblxuY29uc3QgaW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+XG4gIHpcbiAgICAuc3RyaWN0T2JqZWN0KHtcbiAgICAgIHF1ZXN0aW9uczogelxuICAgICAgICAuYXJyYXkocXVlc3Rpb25TY2hlbWEoKSlcbiAgICAgICAgLm1pbigxKVxuICAgICAgICAubWF4KDQpXG4gICAgICAgIC5kZXNjcmliZSgnUXVlc3Rpb25zIHRvIGFzayB0aGUgdXNlciAoMS00IHF1ZXN0aW9ucyknKSxcbiAgICAgIC4uLmNvbW1vbkZpZWxkcygpLFxuICAgIH0pXG4gICAgLnJlZmluZShVTklRVUVORVNTX1JFRklORS5jaGVjaywge1xuICAgICAgbWVzc2FnZTogVU5JUVVFTkVTU19SRUZJTkUubWVzc2FnZSxcbiAgICB9KSxcbilcbnR5cGUgSW5wdXRTY2hlbWEgPSBSZXR1cm5UeXBlPHR5cGVvZiBpbnB1dFNjaGVtYT5cblxuY29uc3Qgb3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYSgoKSA9PlxuICB6Lm9iamVjdCh7XG4gICAgcXVlc3Rpb25zOiB6XG4gICAgICAuYXJyYXkocXVlc3Rpb25TY2hlbWEoKSlcbiAgICAgIC5kZXNjcmliZSgnVGhlIHF1ZXN0aW9ucyB0aGF0IHdlcmUgYXNrZWQnKSxcbiAgICBhbnN3ZXJzOiB6XG4gICAgICAucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdUaGUgYW5zd2VycyBwcm92aWRlZCBieSB0aGUgdXNlciAocXVlc3Rpb24gdGV4dCAtPiBhbnN3ZXIgc3RyaW5nOyBtdWx0aS1zZWxlY3QgYW5zd2VycyBhcmUgY29tbWEtc2VwYXJhdGVkKScsXG4gICAgICApLFxuICAgIGFubm90YXRpb25zOiBhbm5vdGF0aW9uc1NjaGVtYSgpLFxuICB9KSxcbilcbnR5cGUgT3V0cHV0U2NoZW1hID0gUmV0dXJuVHlwZTx0eXBlb2Ygb3V0cHV0U2NoZW1hPlxuXG4vLyBTREsgc2NoZW1hcyBhcmUgaWRlbnRpY2FsIHRvIGludGVybmFsIHNjaGVtYXMgbm93IHRoYXQgYHByZXZpZXdgIGFuZFxuLy8gYGFubm90YXRpb25zYCBhcmUgcHVibGljIChjb25maWd1cmFibGUgdmlhIGB0b29sQ29uZmlnLmFza1VzZXJRdWVzdGlvbmApLlxuZXhwb3J0IGNvbnN0IF9zZGtJbnB1dFNjaGVtYSA9IGlucHV0U2NoZW1hXG5leHBvcnQgY29uc3QgX3Nka091dHB1dFNjaGVtYSA9IG91dHB1dFNjaGVtYVxuXG5leHBvcnQgdHlwZSBRdWVzdGlvbiA9IHouaW5mZXI8UmV0dXJuVHlwZTx0eXBlb2YgcXVlc3Rpb25TY2hlbWE+PlxuZXhwb3J0IHR5cGUgUXVlc3Rpb25PcHRpb24gPSB6LmluZmVyPFJldHVyblR5cGU8dHlwZW9mIHF1ZXN0aW9uT3B0aW9uU2NoZW1hPj5cbmV4cG9ydCB0eXBlIE91dHB1dCA9IHouaW5mZXI8T3V0cHV0U2NoZW1hPlxuXG5mdW5jdGlvbiBBc2tVc2VyUXVlc3Rpb25SZXN1bHRNZXNzYWdlKHtcbiAgYW5zd2Vycyxcbn06IHtcbiAgYW5zd2VyczogT3V0cHV0WydhbnN3ZXJzJ11cbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpblRvcD17MX0+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJyb3dcIj5cbiAgICAgICAgPFRleHQgY29sb3I9e2dldE1vZGVDb2xvcignZGVmYXVsdCcpfT57QkxBQ0tfQ0lSQ0xFfSZuYnNwOzwvVGV4dD5cbiAgICAgICAgPFRleHQ+VXNlciBhbnN3ZXJlZCBDbGF1ZGUmYXBvcztzIHF1ZXN0aW9uczo8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICAgIDxNZXNzYWdlUmVzcG9uc2U+XG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgIHtPYmplY3QuZW50cmllcyhhbnN3ZXJzKS5tYXAoKFtxdWVzdGlvblRleHQsIGFuc3dlcl0pID0+IChcbiAgICAgICAgICAgIDxUZXh0IGtleT17cXVlc3Rpb25UZXh0fSBjb2xvcj1cImluYWN0aXZlXCI+XG4gICAgICAgICAgICAgIMK3IHtxdWVzdGlvblRleHR9IOKGkiB7YW5zd2VyfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0JveD5cbiAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgIDwvQm94PlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBBc2tVc2VyUXVlc3Rpb25Ub29sOiBUb29sPElucHV0U2NoZW1hLCBPdXRwdXQ+ID0gYnVpbGRUb29sKHtcbiAgbmFtZTogQVNLX1VTRVJfUVVFU1RJT05fVE9PTF9OQU1FLFxuICBzZWFyY2hIaW50OiAncHJvbXB0IHRoZSB1c2VyIHdpdGggYSBtdWx0aXBsZS1jaG9pY2UgcXVlc3Rpb24nLFxuICBtYXhSZXN1bHRTaXplQ2hhcnM6IDEwMF8wMDAsXG4gIHNob3VsZERlZmVyOiB0cnVlLFxuICBhc3luYyBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gREVTQ1JJUFRJT05cbiAgfSxcbiAgYXN5bmMgcHJvbXB0KCkge1xuICAgIGNvbnN0IGZvcm1hdCA9IGdldFF1ZXN0aW9uUHJldmlld0Zvcm1hdCgpXG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTREsgY29uc3VtZXIgdGhhdCBoYXNuJ3Qgb3B0ZWQgaW50byBhIHByZXZpZXcgZm9ybWF0IOKAlCBvbWl0IHByZXZpZXdcbiAgICAgIC8vIGd1aWRhbmNlICh0aGV5IG1heSBub3QgcmVuZGVyIHRoZSBmaWVsZCBhdCBhbGwpLlxuICAgICAgcmV0dXJuIEFTS19VU0VSX1FVRVNUSU9OX1RPT0xfUFJPTVBUXG4gICAgfVxuICAgIHJldHVybiBBU0tfVVNFUl9RVUVTVElPTl9UT09MX1BST01QVCArIFBSRVZJRVdfRkVBVFVSRV9QUk9NUFRbZm9ybWF0XVxuICB9LFxuICBnZXQgaW5wdXRTY2hlbWEoKTogSW5wdXRTY2hlbWEge1xuICAgIHJldHVybiBpbnB1dFNjaGVtYSgpXG4gIH0sXG4gIGdldCBvdXRwdXRTY2hlbWEoKTogT3V0cHV0U2NoZW1hIHtcbiAgICByZXR1cm4gb3V0cHV0U2NoZW1hKClcbiAgfSxcbiAgdXNlckZhY2luZ05hbWUoKSB7XG4gICAgcmV0dXJuICcnXG4gIH0sXG4gIGlzRW5hYmxlZCgpIHtcbiAgICAvLyBXaGVuIC0tY2hhbm5lbHMgaXMgYWN0aXZlIHRoZSB1c2VyIGlzIGxpa2VseSBvbiBUZWxlZ3JhbS9EaXNjb3JkLCBub3RcbiAgICAvLyB3YXRjaGluZyB0aGUgVFVJLiBUaGUgbXVsdGlwbGUtY2hvaWNlIGRpYWxvZyB3b3VsZCBoYW5nIHdpdGggbm9ib2R5IGF0XG4gICAgLy8gdGhlIGtleWJvYXJkLiBDaGFubmVsIHBlcm1pc3Npb24gcmVsYXkgYWxyZWFkeSBza2lwc1xuICAgIC8vIHJlcXVpcmVzVXNlckludGVyYWN0aW9uKCkgdG9vbHMgKGludGVyYWN0aXZlSGFuZGxlci50cykgc28gdGhlcmUnc1xuICAgIC8vIG5vIGFsdGVybmF0ZSBhcHByb3ZhbCBwYXRoLlxuICAgIGlmIChcbiAgICAgIChmZWF0dXJlKCdLQUlST1MnKSB8fCBmZWF0dXJlKCdLQUlST1NfQ0hBTk5FTFMnKSkgJiZcbiAgICAgIGdldEFsbG93ZWRDaGFubmVscygpLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9LFxuICBpc0NvbmN1cnJlbmN5U2FmZSgpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9LFxuICBpc1JlYWRPbmx5KCkge1xuICAgIHJldHVybiB0cnVlXG4gIH0sXG4gIHRvQXV0b0NsYXNzaWZpZXJJbnB1dChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC5xdWVzdGlvbnMubWFwKHEgPT4gcS5xdWVzdGlvbikuam9pbignIHwgJylcbiAgfSxcbiAgcmVxdWlyZXNVc2VySW50ZXJhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfSxcbiAgYXN5bmMgdmFsaWRhdGVJbnB1dCh7IHF1ZXN0aW9ucyB9KSB7XG4gICAgaWYgKGdldFF1ZXN0aW9uUHJldmlld0Zvcm1hdCgpICE9PSAnaHRtbCcpIHtcbiAgICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcSBvZiBxdWVzdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIHEub3B0aW9ucykge1xuICAgICAgICBjb25zdCBlcnIgPSB2YWxpZGF0ZUh0bWxQcmV2aWV3KG9wdC5wcmV2aWV3KVxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgT3B0aW9uIFwiJHtvcHQubGFiZWx9XCIgaW4gcXVlc3Rpb24gXCIke3EucXVlc3Rpb259XCI6ICR7ZXJyfWAsXG4gICAgICAgICAgICBlcnJvckNvZGU6IDEsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9XG4gIH0sXG4gIGFzeW5jIGNoZWNrUGVybWlzc2lvbnMoaW5wdXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmVoYXZpb3I6ICdhc2snIGFzIGNvbnN0LFxuICAgICAgbWVzc2FnZTogJ0Fuc3dlciBxdWVzdGlvbnM/JyxcbiAgICAgIHVwZGF0ZWRJbnB1dDogaW5wdXQsXG4gICAgfVxuICB9LFxuICByZW5kZXJUb29sVXNlTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9LFxuICByZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlKCkge1xuICAgIHJldHVybiBudWxsXG4gIH0sXG4gIHJlbmRlclRvb2xSZXN1bHRNZXNzYWdlKHsgYW5zd2VycyB9LCBfdG9vbFVzZUlEKSB7XG4gICAgcmV0dXJuIDxBc2tVc2VyUXVlc3Rpb25SZXN1bHRNZXNzYWdlIGFuc3dlcnM9e2Fuc3dlcnN9IC8+XG4gIH0sXG4gIHJlbmRlclRvb2xVc2VSZWplY3RlZE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiIG1hcmdpblRvcD17MX0+XG4gICAgICAgIDxUZXh0IGNvbG9yPXtnZXRNb2RlQ29sb3IoJ2RlZmF1bHQnKX0+e0JMQUNLX0NJUkNMRX0mbmJzcDs8L1RleHQ+XG4gICAgICAgIDxUZXh0PlVzZXIgZGVjbGluZWQgdG8gYW5zd2VyIHF1ZXN0aW9uczwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfSxcbiAgcmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9LFxuICBhc3luYyBjYWxsKHsgcXVlc3Rpb25zLCBhbnN3ZXJzID0ge30sIGFubm90YXRpb25zIH0sIF9jb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHsgcXVlc3Rpb25zLCBhbnN3ZXJzLCAuLi4oYW5ub3RhdGlvbnMgJiYgeyBhbm5vdGF0aW9ucyB9KSB9LFxuICAgIH1cbiAgfSxcbiAgbWFwVG9vbFJlc3VsdFRvVG9vbFJlc3VsdEJsb2NrUGFyYW0oeyBhbnN3ZXJzLCBhbm5vdGF0aW9ucyB9LCB0b29sVXNlSUQpIHtcbiAgICBjb25zdCBhbnN3ZXJzVGV4dCA9IE9iamVjdC5lbnRyaWVzKGFuc3dlcnMpXG4gICAgICAubWFwKChbcXVlc3Rpb25UZXh0LCBhbnN3ZXJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb24gPSBhbm5vdGF0aW9ucz8uW3F1ZXN0aW9uVGV4dF1cbiAgICAgICAgY29uc3QgcGFydHMgPSBbYFwiJHtxdWVzdGlvblRleHR9XCI9XCIke2Fuc3dlcn1cImBdXG4gICAgICAgIGlmIChhbm5vdGF0aW9uPy5wcmV2aWV3KSB7XG4gICAgICAgICAgcGFydHMucHVzaChgc2VsZWN0ZWQgcHJldmlldzpcXG4ke2Fubm90YXRpb24ucHJldmlld31gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uPy5ub3Rlcykge1xuICAgICAgICAgIHBhcnRzLnB1c2goYHVzZXIgbm90ZXM6ICR7YW5ub3RhdGlvbi5ub3Rlc31gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJylcbiAgICAgIH0pXG4gICAgICAuam9pbignLCAnKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICd0b29sX3Jlc3VsdCcsXG4gICAgICBjb250ZW50OiBgVXNlciBoYXMgYW5zd2VyZWQgeW91ciBxdWVzdGlvbnM6ICR7YW5zd2Vyc1RleHR9LiBZb3UgY2FuIG5vdyBjb250aW51ZSB3aXRoIHRoZSB1c2VyJ3MgYW5zd2VycyBpbiBtaW5kLmAsXG4gICAgICB0b29sX3VzZV9pZDogdG9vbFVzZUlELFxuICAgIH1cbiAgfSxcbn0gc2F0aXNmaWVzIFRvb2xEZWY8SW5wdXRTY2hlbWEsIE91dHB1dD4pXG5cbi8vIExpZ2h0d2VpZ2h0IEhUTUwgZnJhZ21lbnQgY2hlY2suIE5vdCBhIHBhcnNlciDigJQgSFRNTDUgcGFyc2VycyBhcmVcbi8vIGVycm9yLXJlY292ZXJpbmcgYnkgc3BlYyBhbmQgYWNjZXB0IGFueXRoaW5nLiBXZSdyZSBjaGVja2luZyBtb2RlbCBpbnRlbnRcbi8vIChkaWQgaXQgZW1pdCBIVE1MPykgYW5kIGNhdGNoaW5nIHRoZSBzcGVjaWZpYyB0aGluZ3Mgd2UgdG9sZCBpdCBub3QgdG8gZG8uXG5mdW5jdGlvbiB2YWxpZGF0ZUh0bWxQcmV2aWV3KHByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAocHJldmlldyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuICBpZiAoLzxcXHMqKGh0bWx8Ym9keXwhZG9jdHlwZSlcXGIvaS50ZXN0KHByZXZpZXcpKSB7XG4gICAgcmV0dXJuICdwcmV2aWV3IG11c3QgYmUgYW4gSFRNTCBmcmFnbWVudCwgbm90IGEgZnVsbCBkb2N1bWVudCAobm8gPGh0bWw+LCA8Ym9keT4sIG9yIDwhRE9DVFlQRT4pJ1xuICB9XG4gIC8vIFNESyBjb25zdW1lcnMgdHlwaWNhbGx5IHNldCB0aGlzIHZpYSBpbm5lckhUTUwg4oCUIGRpc2FsbG93IGV4ZWN1dGFibGUvc3R5bGVcbiAgLy8gdGFncyBzbyBhIHByZXZpZXcgY2FuJ3QgcnVuIGNvZGUgb3IgcmVzdHlsZSB0aGUgaG9zdCBwYWdlLiBJbmxpbmUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgKG9uY2xpY2sgZXRjLikgYXJlIHN0aWxsIHBvc3NpYmxlOyBjb25zdW1lcnMgc2hvdWxkIHNhbml0aXplLlxuICBpZiAoLzxcXHMqKHNjcmlwdHxzdHlsZSlcXGIvaS50ZXN0KHByZXZpZXcpKSB7XG4gICAgcmV0dXJuICdwcmV2aWV3IG11c3Qgbm90IGNvbnRhaW4gPHNjcmlwdD4gb3IgPHN0eWxlPiB0YWdzLiBVc2UgaW5saW5lIHN0eWxlcyB2aWEgdGhlIHN0eWxlIGF0dHJpYnV0ZSBpZiBuZWVkZWQuJ1xuICB9XG4gIGlmICghLzxbYS16XVtePl0qPi9pLnRlc3QocHJldmlldykpIHtcbiAgICByZXR1cm4gJ3ByZXZpZXcgbXVzdCBjb250YWluIEhUTUwgKHByZXZpZXdGb3JtYXQgaXMgc2V0IHRvIFwiaHRtbFwiKS4gV3JhcCBjb250ZW50IGluIGEgdGFnIGxpa2UgPGRpdj4gb3IgPHByZT4uJ1xuICB9XG4gIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFTQSxPQUFPLFFBQVEsWUFBWTtBQUNwQyxPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQ0VDLGtCQUFrQixFQUNsQkMsd0JBQXdCLFFBQ25CLHdCQUF3QjtBQUMvQixTQUFTQyxlQUFlLFFBQVEsbUNBQW1DO0FBQ25FLFNBQVNDLFlBQVksUUFBUSwwQkFBMEI7QUFDdkQsU0FBU0MsWUFBWSxRQUFRLHlDQUF5QztBQUN0RSxTQUFTQyxDQUFDLFFBQVEsUUFBUTtBQUMxQixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FBQ3hDLGNBQWNDLElBQUksUUFBUSxlQUFlO0FBQ3pDLFNBQVNDLFNBQVMsRUFBRSxLQUFLQyxPQUFPLFFBQVEsZUFBZTtBQUN2RCxTQUFTQyxVQUFVLFFBQVEsMkJBQTJCO0FBQ3RELFNBQ0VDLGlDQUFpQyxFQUNqQ0MsMkJBQTJCLEVBQzNCQyw2QkFBNkIsRUFDN0JDLFdBQVcsRUFDWEMsc0JBQXNCLFFBQ2pCLGFBQWE7QUFFcEIsTUFBTUMsb0JBQW9CLEdBQUdOLFVBQVUsQ0FBQyxNQUN0Q04sQ0FBQyxDQUFDYSxNQUFNLENBQUM7RUFDUEMsS0FBSyxFQUFFZCxDQUFDLENBQ0xlLE1BQU0sQ0FBQyxDQUFDLENBQ1JDLFFBQVEsQ0FDUCxvSUFDRixDQUFDO0VBQ0hDLFdBQVcsRUFBRWpCLENBQUMsQ0FDWGUsTUFBTSxDQUFDLENBQUMsQ0FDUkMsUUFBUSxDQUNQLHFJQUNGLENBQUM7RUFDSEUsT0FBTyxFQUFFbEIsQ0FBQyxDQUNQZSxNQUFNLENBQUMsQ0FBQyxDQUNSSSxRQUFRLENBQUMsQ0FBQyxDQUNWSCxRQUFRLENBQ1AsaU5BQ0Y7QUFDSixDQUFDLENBQ0gsQ0FBQztBQUVELE1BQU1JLGNBQWMsR0FBR2QsVUFBVSxDQUFDLE1BQ2hDTixDQUFDLENBQUNhLE1BQU0sQ0FBQztFQUNQUSxRQUFRLEVBQUVyQixDQUFDLENBQ1JlLE1BQU0sQ0FBQyxDQUFDLENBQ1JDLFFBQVEsQ0FDUCx5UEFDRixDQUFDO0VBQ0hNLE1BQU0sRUFBRXRCLENBQUMsQ0FDTmUsTUFBTSxDQUFDLENBQUMsQ0FDUkMsUUFBUSxDQUNQLGlEQUFpRFQsaUNBQWlDLDBEQUNwRixDQUFDO0VBQ0hnQixPQUFPLEVBQUV2QixDQUFDLENBQ1B3QixLQUFLLENBQUNaLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUM3QmEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNOQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ05WLFFBQVEsQ0FDUCxzT0FDRixDQUFDO0VBQ0hXLFdBQVcsRUFBRTNCLENBQUMsQ0FDWDRCLE9BQU8sQ0FBQyxDQUFDLENBQ1RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FDZGIsUUFBUSxDQUNQLDRIQUNGO0FBQ0osQ0FBQyxDQUNILENBQUM7QUFFRCxNQUFNYyxpQkFBaUIsR0FBR3hCLFVBQVUsQ0FBQyxNQUFNO0VBQ3pDLE1BQU15QixnQkFBZ0IsR0FBRy9CLENBQUMsQ0FBQ2EsTUFBTSxDQUFDO0lBQ2hDSyxPQUFPLEVBQUVsQixDQUFDLENBQ1BlLE1BQU0sQ0FBQyxDQUFDLENBQ1JJLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FDUCw0RUFDRixDQUFDO0lBQ0hnQixLQUFLLEVBQUVoQyxDQUFDLENBQ0xlLE1BQU0sQ0FBQyxDQUFDLENBQ1JJLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FBQyxvREFBb0Q7RUFDbEUsQ0FBQyxDQUFDO0VBRUYsT0FBT2hCLENBQUMsQ0FDTGlDLE1BQU0sQ0FBQ2pDLENBQUMsQ0FBQ2UsTUFBTSxDQUFDLENBQUMsRUFBRWdCLGdCQUFnQixDQUFDLENBQ3BDWixRQUFRLENBQUMsQ0FBQyxDQUNWSCxRQUFRLENBQ1AsOEdBQ0YsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU1rQixpQkFBaUIsR0FBRztFQUN4QkMsS0FBSyxFQUFFQSxDQUFDQyxJQUFJLEVBQUU7SUFDWkMsU0FBUyxFQUFFO01BQUVoQixRQUFRLEVBQUUsTUFBTTtNQUFFRSxPQUFPLEVBQUU7UUFBRVQsS0FBSyxFQUFFLE1BQU07TUFBQyxDQUFDLEVBQUU7SUFBQyxDQUFDLEVBQUU7RUFDakUsQ0FBQyxLQUFLO0lBQ0osTUFBTXVCLFNBQVMsR0FBR0QsSUFBSSxDQUFDQyxTQUFTLENBQUNDLEdBQUcsQ0FBQ0MsQ0FBQyxJQUFJQSxDQUFDLENBQUNsQixRQUFRLENBQUM7SUFDckQsSUFBSWdCLFNBQVMsQ0FBQ0csTUFBTSxLQUFLLElBQUlDLEdBQUcsQ0FBQ0osU0FBUyxDQUFDLENBQUNLLElBQUksRUFBRTtNQUNoRCxPQUFPLEtBQUs7SUFDZDtJQUNBLEtBQUssTUFBTXJCLFFBQVEsSUFBSWUsSUFBSSxDQUFDQyxTQUFTLEVBQUU7TUFDckMsTUFBTU0sTUFBTSxHQUFHdEIsUUFBUSxDQUFDRSxPQUFPLENBQUNlLEdBQUcsQ0FBQ00sR0FBRyxJQUFJQSxHQUFHLENBQUM5QixLQUFLLENBQUM7TUFDckQsSUFBSTZCLE1BQU0sQ0FBQ0gsTUFBTSxLQUFLLElBQUlDLEdBQUcsQ0FBQ0UsTUFBTSxDQUFDLENBQUNELElBQUksRUFBRTtRQUMxQyxPQUFPLEtBQUs7TUFDZDtJQUNGO0lBQ0EsT0FBTyxJQUFJO0VBQ2IsQ0FBQztFQUNERyxPQUFPLEVBQ0w7QUFDSixDQUFDLElBQUlDLEtBQUs7QUFFVixNQUFNQyxZQUFZLEdBQUd6QyxVQUFVLENBQUMsT0FBTztFQUNyQzBDLE9BQU8sRUFBRWhELENBQUMsQ0FDUGlDLE1BQU0sQ0FBQ2pDLENBQUMsQ0FBQ2UsTUFBTSxDQUFDLENBQUMsRUFBRWYsQ0FBQyxDQUFDZSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQzlCSSxRQUFRLENBQUMsQ0FBQyxDQUNWSCxRQUFRLENBQUMsb0RBQW9ELENBQUM7RUFDakVpQyxXQUFXLEVBQUVuQixpQkFBaUIsQ0FBQyxDQUFDO0VBQ2hDb0IsUUFBUSxFQUFFbEQsQ0FBQyxDQUNSYSxNQUFNLENBQUM7SUFDTnNDLE1BQU0sRUFBRW5ELENBQUMsQ0FDTmUsTUFBTSxDQUFDLENBQUMsQ0FDUkksUUFBUSxDQUFDLENBQUMsQ0FDVkgsUUFBUSxDQUNQLDRIQUNGO0VBQ0osQ0FBQyxDQUFDLENBQ0RHLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FDUCwrRUFDRjtBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTW9DLFdBQVcsR0FBRzlDLFVBQVUsQ0FBQyxNQUM3Qk4sQ0FBQyxDQUNFcUQsWUFBWSxDQUFDO0VBQ1poQixTQUFTLEVBQUVyQyxDQUFDLENBQ1R3QixLQUFLLENBQUNKLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FDdkJLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDTkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNOVixRQUFRLENBQUMsMkNBQTJDLENBQUM7RUFDeEQsR0FBRytCLFlBQVksQ0FBQztBQUNsQixDQUFDLENBQUMsQ0FDRE8sTUFBTSxDQUFDcEIsaUJBQWlCLENBQUNDLEtBQUssRUFBRTtFQUMvQlUsT0FBTyxFQUFFWCxpQkFBaUIsQ0FBQ1c7QUFDN0IsQ0FBQyxDQUNMLENBQUM7QUFDRCxLQUFLVSxXQUFXLEdBQUdDLFVBQVUsQ0FBQyxPQUFPSixXQUFXLENBQUM7QUFFakQsTUFBTUssWUFBWSxHQUFHbkQsVUFBVSxDQUFDLE1BQzlCTixDQUFDLENBQUNhLE1BQU0sQ0FBQztFQUNQd0IsU0FBUyxFQUFFckMsQ0FBQyxDQUNUd0IsS0FBSyxDQUFDSixjQUFjLENBQUMsQ0FBQyxDQUFDLENBQ3ZCSixRQUFRLENBQUMsK0JBQStCLENBQUM7RUFDNUNnQyxPQUFPLEVBQUVoRCxDQUFDLENBQ1BpQyxNQUFNLENBQUNqQyxDQUFDLENBQUNlLE1BQU0sQ0FBQyxDQUFDLEVBQUVmLENBQUMsQ0FBQ2UsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUM5QkMsUUFBUSxDQUNQLDZHQUNGLENBQUM7RUFDSGlDLFdBQVcsRUFBRW5CLGlCQUFpQixDQUFDO0FBQ2pDLENBQUMsQ0FDSCxDQUFDO0FBQ0QsS0FBSzRCLFlBQVksR0FBR0YsVUFBVSxDQUFDLE9BQU9DLFlBQVksQ0FBQzs7QUFFbkQ7QUFDQTtBQUNBLE9BQU8sTUFBTUUsZUFBZSxHQUFHUCxXQUFXO0FBQzFDLE9BQU8sTUFBTVEsZ0JBQWdCLEdBQUdILFlBQVk7QUFFNUMsT0FBTyxLQUFLSSxRQUFRLEdBQUc3RCxDQUFDLENBQUM4RCxLQUFLLENBQUNOLFVBQVUsQ0FBQyxPQUFPcEMsY0FBYyxDQUFDLENBQUM7QUFDakUsT0FBTyxLQUFLMkMsY0FBYyxHQUFHL0QsQ0FBQyxDQUFDOEQsS0FBSyxDQUFDTixVQUFVLENBQUMsT0FBTzVDLG9CQUFvQixDQUFDLENBQUM7QUFDN0UsT0FBTyxLQUFLb0QsTUFBTSxHQUFHaEUsQ0FBQyxDQUFDOEQsS0FBSyxDQUFDSixZQUFZLENBQUM7QUFFMUMsU0FBQU8sNkJBQUFDLEVBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBc0M7SUFBQXBCO0VBQUEsSUFBQWtCLEVBSXJDO0VBQUEsSUFBQUcsRUFBQTtFQUFBLElBQUFGLENBQUEsUUFBQUcsTUFBQSxDQUFBQyxHQUFBO0lBR0tGLEVBQUEsSUFBQyxHQUFHLENBQWUsYUFBSyxDQUFMLEtBQUssQ0FDdEIsQ0FBQyxJQUFJLENBQVEsS0FBdUIsQ0FBdkIsQ0FBQXRFLFlBQVksQ0FBQyxTQUFTLEVBQUMsQ0FBR0QsYUFBVyxDQUFFLENBQU0sRUFBekQsSUFBSSxDQUNMLENBQUMsSUFBSSxDQUFDLGlDQUFzQyxFQUEzQyxJQUFJLENBQ1AsRUFIQyxHQUFHLENBR0U7SUFBQXFFLENBQUEsTUFBQUUsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQUYsQ0FBQTtFQUFBO0VBQUEsSUFBQUssRUFBQTtFQUFBLElBQUFMLENBQUEsUUFBQW5CLE9BQUE7SUFKUndCLEVBQUEsSUFBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FBWSxTQUFDLENBQUQsR0FBQyxDQUN0QyxDQUFBSCxFQUdLLENBQ0wsQ0FBQyxlQUFlLENBQ2QsQ0FBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FDeEIsQ0FBQUksTUFBTSxDQUFBQyxPQUFRLENBQUMxQixPQUFPLENBQUMsQ0FBQVYsR0FBSSxDQUFDcUMsS0FJNUIsRUFDSCxFQU5DLEdBQUcsQ0FPTixFQVJDLGVBQWUsQ0FTbEIsRUFkQyxHQUFHLENBY0U7SUFBQVIsQ0FBQSxNQUFBbkIsT0FBQTtJQUFBbUIsQ0FBQSxNQUFBSyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBTCxDQUFBO0VBQUE7RUFBQSxPQWROSyxFQWNNO0FBQUE7QUFwQlYsU0FBQUcsTUFBQVQsRUFBQTtFQWF3QyxPQUFBVSxZQUFBLEVBQUFDLE1BQUEsSUFBQVgsRUFBc0I7RUFBQSxPQUNsRCxDQUFDLElBQUksQ0FBTVUsR0FBWSxDQUFaQSxhQUFXLENBQUMsQ0FBUSxLQUFVLENBQVYsVUFBVSxDQUFDLEVBQ3JDQSxhQUFXLENBQUUsR0FBSUMsT0FBSyxDQUMzQixFQUZDLElBQUksQ0FFRTtBQUFBO0FBUW5CLE9BQU8sTUFBTUMsbUJBQW1CLEVBQUUzRSxJQUFJLENBQUNvRCxXQUFXLEVBQUVTLE1BQU0sQ0FBQyxHQUFHNUQsU0FBUyxDQUFDO0VBQ3RFMkUsSUFBSSxFQUFFdkUsMkJBQTJCO0VBQ2pDd0UsVUFBVSxFQUFFLGlEQUFpRDtFQUM3REMsa0JBQWtCLEVBQUUsT0FBTztFQUMzQkMsV0FBVyxFQUFFLElBQUk7RUFDakIsTUFBTWpFLFdBQVdBLENBQUEsRUFBRztJQUNsQixPQUFPUCxXQUFXO0VBQ3BCLENBQUM7RUFDRCxNQUFNeUUsTUFBTUEsQ0FBQSxFQUFHO0lBQ2IsTUFBTUMsTUFBTSxHQUFHeEYsd0JBQXdCLENBQUMsQ0FBQztJQUN6QyxJQUFJd0YsTUFBTSxLQUFLQyxTQUFTLEVBQUU7TUFDeEI7TUFDQTtNQUNBLE9BQU81RSw2QkFBNkI7SUFDdEM7SUFDQSxPQUFPQSw2QkFBNkIsR0FBR0Usc0JBQXNCLENBQUN5RSxNQUFNLENBQUM7RUFDdkUsQ0FBQztFQUNELElBQUloQyxXQUFXQSxDQUFBLENBQUUsRUFBRUcsV0FBVyxDQUFDO0lBQzdCLE9BQU9ILFdBQVcsQ0FBQyxDQUFDO0VBQ3RCLENBQUM7RUFDRCxJQUFJSyxZQUFZQSxDQUFBLENBQUUsRUFBRUMsWUFBWSxDQUFDO0lBQy9CLE9BQU9ELFlBQVksQ0FBQyxDQUFDO0VBQ3ZCLENBQUM7RUFDRDZCLGNBQWNBLENBQUEsRUFBRztJQUNmLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDREMsU0FBU0EsQ0FBQSxFQUFHO0lBQ1Y7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQ0UsQ0FBQzlGLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSUEsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEtBQ2hERSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM2QyxNQUFNLEdBQUcsQ0FBQyxFQUMvQjtNQUNBLE9BQU8sS0FBSztJQUNkO0lBQ0EsT0FBTyxJQUFJO0VBQ2IsQ0FBQztFQUNEZ0QsaUJBQWlCQSxDQUFBLEVBQUc7SUFDbEIsT0FBTyxJQUFJO0VBQ2IsQ0FBQztFQUNEQyxVQUFVQSxDQUFBLEVBQUc7SUFDWCxPQUFPLElBQUk7RUFDYixDQUFDO0VBQ0RDLHFCQUFxQkEsQ0FBQ0MsS0FBSyxFQUFFO0lBQzNCLE9BQU9BLEtBQUssQ0FBQ3RELFNBQVMsQ0FBQ0MsR0FBRyxDQUFDQyxDQUFDLElBQUlBLENBQUMsQ0FBQ2xCLFFBQVEsQ0FBQyxDQUFDdUUsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUN6RCxDQUFDO0VBQ0RDLHVCQUF1QkEsQ0FBQSxFQUFHO0lBQ3hCLE9BQU8sSUFBSTtFQUNiLENBQUM7RUFDRCxNQUFNQyxhQUFhQSxDQUFDO0lBQUV6RDtFQUFVLENBQUMsRUFBRTtJQUNqQyxJQUFJekMsd0JBQXdCLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtNQUN6QyxPQUFPO1FBQUVtRyxNQUFNLEVBQUU7TUFBSyxDQUFDO0lBQ3pCO0lBQ0EsS0FBSyxNQUFNeEQsQ0FBQyxJQUFJRixTQUFTLEVBQUU7TUFDekIsS0FBSyxNQUFNTyxHQUFHLElBQUlMLENBQUMsQ0FBQ2hCLE9BQU8sRUFBRTtRQUMzQixNQUFNeUUsR0FBRyxHQUFHQyxtQkFBbUIsQ0FBQ3JELEdBQUcsQ0FBQzFCLE9BQU8sQ0FBQztRQUM1QyxJQUFJOEUsR0FBRyxFQUFFO1VBQ1AsT0FBTztZQUNMRCxNQUFNLEVBQUUsS0FBSztZQUNibEQsT0FBTyxFQUFFLFdBQVdELEdBQUcsQ0FBQzlCLEtBQUssa0JBQWtCeUIsQ0FBQyxDQUFDbEIsUUFBUSxNQUFNMkUsR0FBRyxFQUFFO1lBQ3BFRSxTQUFTLEVBQUU7VUFDYixDQUFDO1FBQ0g7TUFDRjtJQUNGO0lBQ0EsT0FBTztNQUFFSCxNQUFNLEVBQUU7SUFBSyxDQUFDO0VBQ3pCLENBQUM7RUFDRCxNQUFNSSxnQkFBZ0JBLENBQUNSLEtBQUssRUFBRTtJQUM1QixPQUFPO01BQ0xTLFFBQVEsRUFBRSxLQUFLLElBQUl0RCxLQUFLO01BQ3hCRCxPQUFPLEVBQUUsbUJBQW1CO01BQzVCd0QsWUFBWSxFQUFFVjtJQUNoQixDQUFDO0VBQ0gsQ0FBQztFQUNEVyxvQkFBb0JBLENBQUEsRUFBRztJQUNyQixPQUFPLElBQUk7RUFDYixDQUFDO0VBQ0RDLDRCQUE0QkEsQ0FBQSxFQUFHO0lBQzdCLE9BQU8sSUFBSTtFQUNiLENBQUM7RUFDREMsdUJBQXVCQSxDQUFDO0lBQUV4RDtFQUFRLENBQUMsRUFBRXlELFVBQVUsRUFBRTtJQUMvQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUN6RCxPQUFPLENBQUMsR0FBRztFQUMzRCxDQUFDO0VBQ0QwRCw0QkFBNEJBLENBQUEsRUFBRztJQUM3QixPQUNFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMzRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDRCxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUk7QUFDeEUsUUFBUSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJO0FBQ3JELE1BQU0sRUFBRSxHQUFHLENBQUM7RUFFVixDQUFDO0VBQ0Q2Ryx5QkFBeUJBLENBQUEsRUFBRztJQUMxQixPQUFPLElBQUk7RUFDYixDQUFDO0VBQ0QsTUFBTUMsSUFBSUEsQ0FBQztJQUFFdkUsU0FBUztJQUFFVyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQUVDO0VBQVksQ0FBQyxFQUFFNEQsUUFBUSxFQUFFO0lBQzdELE9BQU87TUFDTHpFLElBQUksRUFBRTtRQUFFQyxTQUFTO1FBQUVXLE9BQU87UUFBRSxJQUFJQyxXQUFXLElBQUk7VUFBRUE7UUFBWSxDQUFDO01BQUU7SUFDbEUsQ0FBQztFQUNILENBQUM7RUFDRDZELG1DQUFtQ0EsQ0FBQztJQUFFOUQsT0FBTztJQUFFQztFQUFZLENBQUMsRUFBRThELFNBQVMsRUFBRTtJQUN2RSxNQUFNQyxXQUFXLEdBQUd2QyxNQUFNLENBQUNDLE9BQU8sQ0FBQzFCLE9BQU8sQ0FBQyxDQUN4Q1YsR0FBRyxDQUFDLENBQUMsQ0FBQ3NDLFlBQVksRUFBRUMsTUFBTSxDQUFDLEtBQUs7TUFDL0IsTUFBTW9DLFVBQVUsR0FBR2hFLFdBQVcsR0FBRzJCLFlBQVksQ0FBQztNQUM5QyxNQUFNc0MsS0FBSyxHQUFHLENBQUMsSUFBSXRDLFlBQVksTUFBTUMsTUFBTSxHQUFHLENBQUM7TUFDL0MsSUFBSW9DLFVBQVUsRUFBRS9GLE9BQU8sRUFBRTtRQUN2QmdHLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLHNCQUFzQkYsVUFBVSxDQUFDL0YsT0FBTyxFQUFFLENBQUM7TUFDeEQ7TUFDQSxJQUFJK0YsVUFBVSxFQUFFakYsS0FBSyxFQUFFO1FBQ3JCa0YsS0FBSyxDQUFDQyxJQUFJLENBQUMsZUFBZUYsVUFBVSxDQUFDakYsS0FBSyxFQUFFLENBQUM7TUFDL0M7TUFDQSxPQUFPa0YsS0FBSyxDQUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FDREEsSUFBSSxDQUFDLElBQUksQ0FBQztJQUViLE9BQU87TUFDTHdCLElBQUksRUFBRSxhQUFhO01BQ25CQyxPQUFPLEVBQUUscUNBQXFDTCxXQUFXLHlEQUF5RDtNQUNsSE0sV0FBVyxFQUFFUDtJQUNmLENBQUM7RUFDSDtBQUNGLENBQUMsV0FBVzFHLE9BQU8sQ0FBQ2tELFdBQVcsRUFBRVMsTUFBTSxDQUFDLENBQUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLFNBQVNpQyxtQkFBbUJBLENBQUMvRSxPQUFPLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7RUFDdkUsSUFBSUEsT0FBTyxLQUFLbUUsU0FBUyxFQUFFLE9BQU8sSUFBSTtFQUN0QyxJQUFJLDZCQUE2QixDQUFDa0MsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDL0MsT0FBTywwRkFBMEY7RUFDbkc7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJLHVCQUF1QixDQUFDcUcsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDekMsT0FBTyx5R0FBeUc7RUFDbEg7RUFDQSxJQUFJLENBQUMsZUFBZSxDQUFDcUcsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDbEMsT0FBTyx3R0FBd0c7RUFDakg7RUFDQSxPQUFPLElBQUk7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
234
+ content: `User has answered your questions: ${answersText}. You can now continue with the user's answers in mind.\n\nevidence_join_key: ${result.evidenceJoinKey}\nparent_tool_use_id: ${result.parentToolUseId}\nresume_token: ${result.resumeToken}\npermission_flow: ${result.permissionFlow}`,
235
+ tool_use_id: toolUseID,
236
+ }
237
+ },
238
+ } satisfies ToolDef<InputSchema, Output>)