ummaya 0.2.4 → 0.2.6

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 (482) hide show
  1. package/README.md +15 -2
  2. package/bin/ummaya +10 -1
  3. package/bun.lock +180 -244
  4. package/npm-shrinkwrap.json +760 -1760
  5. package/package.json +39 -22
  6. package/prompts/manifest.yaml +1 -1
  7. package/prompts/system_v1.md +1 -0
  8. package/pyproject.toml +27 -2
  9. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  10. package/src/ummaya/_canonical/__init__.py +2 -0
  11. package/src/ummaya/_canonical/baselines.yaml +113 -0
  12. package/src/ummaya/engine/engine.py +29 -132
  13. package/src/ummaya/evidence/__init__.py +21 -2
  14. package/src/ummaya/evidence/dataset_contract.py +193 -0
  15. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  16. package/src/ummaya/evidence/document_harness.py +313 -0
  17. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  18. package/src/ummaya/evidence/gates.py +70 -0
  19. package/src/ummaya/evidence/json_types.py +20 -0
  20. package/src/ummaya/evidence/models.py +88 -1
  21. package/src/ummaya/evidence/output_payload.py +89 -0
  22. package/src/ummaya/evidence/payload_documents.py +233 -0
  23. package/src/ummaya/evidence/route_contracts.py +224 -0
  24. package/src/ummaya/evidence/route_helpers.py +150 -0
  25. package/src/ummaya/evidence/runner.py +81 -212
  26. package/src/ummaya/evidence/source_provenance.py +246 -0
  27. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  28. package/src/ummaya/evidence/tool_layer.py +39 -0
  29. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  30. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  31. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  32. package/src/ummaya/ipc/frame_schema.py +5 -5
  33. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  34. package/src/ummaya/ipc/stdio.py +1109 -477
  35. package/src/ummaya/llm/client.py +102 -3
  36. package/src/ummaya/llm/config.py +8 -3
  37. package/src/ummaya/primitives/__init__.py +6 -2
  38. package/src/ummaya/primitives/delegation.py +1 -1
  39. package/src/ummaya/primitives/document.py +28 -0
  40. package/src/ummaya/settings.py +0 -3
  41. package/src/ummaya/tools/discovery_bridge.py +17 -1
  42. package/src/ummaya/tools/documents/__init__.py +297 -0
  43. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  44. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  45. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  46. package/src/ummaya/tools/documents/authoring.py +283 -0
  47. package/src/ummaya/tools/documents/baselines.py +132 -0
  48. package/src/ummaya/tools/documents/capability.py +331 -0
  49. package/src/ummaya/tools/documents/contracts.py +112 -0
  50. package/src/ummaya/tools/documents/conversion.py +521 -0
  51. package/src/ummaya/tools/documents/diff.py +275 -0
  52. package/src/ummaya/tools/documents/engines.py +163 -0
  53. package/src/ummaya/tools/documents/evaluation.py +291 -0
  54. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  55. package/src/ummaya/tools/documents/fixtures.py +174 -0
  56. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  57. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  58. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  59. package/src/ummaya/tools/documents/formats/base.py +41 -0
  60. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  61. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  62. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  63. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  64. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  65. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  66. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  67. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  68. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  69. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  70. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  71. package/src/ummaya/tools/documents/inspection.py +289 -0
  72. package/src/ummaya/tools/documents/intake.py +1079 -0
  73. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  74. package/src/ummaya/tools/documents/models.py +1598 -0
  75. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  76. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  77. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  78. package/src/ummaya/tools/documents/patch.py +170 -0
  79. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  80. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  81. package/src/ummaya/tools/documents/permissions.py +110 -0
  82. package/src/ummaya/tools/documents/planner.py +616 -0
  83. package/src/ummaya/tools/documents/registry.py +2733 -0
  84. package/src/ummaya/tools/documents/render.py +978 -0
  85. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  86. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  87. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  88. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  89. package/src/ummaya/tools/documents/reread.py +157 -0
  90. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  91. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  92. package/src/ummaya/tools/documents/scorecard.py +184 -0
  93. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  94. package/src/ummaya/tools/documents/style.py +48 -0
  95. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  96. package/src/ummaya/tools/documents/validate.py +347 -0
  97. package/src/ummaya/tools/executor.py +29 -0
  98. package/src/ummaya/tools/live_proxy.py +0 -3
  99. package/src/ummaya/tools/models.py +5 -1
  100. package/src/ummaya/tools/register_all.py +8 -0
  101. package/src/ummaya/tools/registry.py +10 -1
  102. package/src/ummaya/tools/routing/__init__.py +59 -0
  103. package/src/ummaya/tools/routing/builder.py +105 -0
  104. package/src/ummaya/tools/routing/cards.py +29 -0
  105. package/src/ummaya/tools/routing/decision_service.py +534 -0
  106. package/src/ummaya/tools/routing/decision_types.py +74 -0
  107. package/src/ummaya/tools/routing/feasibility.py +122 -0
  108. package/src/ummaya/tools/routing/intent.py +17 -0
  109. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  110. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  111. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  112. package/src/ummaya/tools/routing/intent_types.py +48 -0
  113. package/src/ummaya/tools/routing/lint.py +78 -0
  114. package/src/ummaya/tools/routing/metadata.py +174 -0
  115. package/src/ummaya/tools/routing/projection.py +340 -0
  116. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  117. package/src/ummaya/tools/routing/schema.py +81 -0
  118. package/src/ummaya/tools/routing/types.py +96 -0
  119. package/src/ummaya/tools/routing_index.py +2 -2
  120. package/src/ummaya/tools/search.py +34 -746
  121. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  122. package/tui/bun.lock +126 -305
  123. package/tui/package.json +35 -22
  124. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  125. package/tui/src/QueryEngine.ts +12 -8
  126. package/tui/src/bridge/inboundAttachments.ts +3 -3
  127. package/tui/src/cli/handlers/auth.ts +3 -12
  128. package/tui/src/cli/handlers/mcp.tsx +0 -1
  129. package/tui/src/cli/print.ts +8 -9
  130. package/tui/src/commands/insights.ts +1 -1
  131. package/tui/src/commands/install-github-app/types.ts +8 -30
  132. package/tui/src/commands/plugin/types.ts +6 -28
  133. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  134. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  135. package/tui/src/components/Feedback.tsx +1 -1
  136. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  137. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  138. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  139. package/tui/src/components/Spinner/types.ts +6 -28
  140. package/tui/src/components/agents/generateAgent.ts +1 -1
  141. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  142. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  143. package/tui/src/components/mcp/types.ts +16 -38
  144. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  145. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  146. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  147. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  148. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  149. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  150. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  151. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  152. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  153. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  154. package/tui/src/components/primitive/index.tsx +43 -1
  155. package/tui/src/components/primitive/types.ts +137 -0
  156. package/tui/src/components/ui/option.ts +4 -26
  157. package/tui/src/constants/common.ts +0 -2
  158. package/tui/src/constants/prompts.ts +4 -3
  159. package/tui/src/constants/querySource.ts +4 -26
  160. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  161. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  162. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  163. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  164. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  165. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  166. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  167. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  168. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  169. package/tui/src/ink/ink.tsx +33 -14
  170. package/tui/src/ink/reconciler.ts +2 -3
  171. package/tui/src/ink/render-to-screen.ts +30 -10
  172. package/tui/src/ipc/bridge.ts +62 -15
  173. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  174. package/tui/src/ipc/codec.ts +3 -3
  175. package/tui/src/ipc/frames.generated.ts +12 -12
  176. package/tui/src/ipc/llmClient.ts +151 -27
  177. package/tui/src/ipc/schema/frame.schema.json +1 -1
  178. package/tui/src/keybindings/defaultBindings.ts +4 -0
  179. package/tui/src/main.tsx +32 -15
  180. package/tui/src/native-ts/file-index/index.ts +33 -3
  181. package/tui/src/observability/surface.ts +2 -2
  182. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  183. package/tui/src/projectOnboardingState.ts +7 -6
  184. package/tui/src/query/chatMessageTypes.ts +18 -0
  185. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  186. package/tui/src/query/deps.ts +1 -1
  187. package/tui/src/query/messageGuards.ts +106 -0
  188. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  189. package/tui/src/query/run.ts +1075 -0
  190. package/tui/src/query/supportBoundary.ts +168 -0
  191. package/tui/src/query/toolResultErrors.ts +103 -0
  192. package/tui/src/query/toolRunner.ts +687 -0
  193. package/tui/src/query/unavailableToolRepair.ts +118 -0
  194. package/tui/src/query.ts +9 -2186
  195. package/tui/src/screens/REPL.tsx +40 -29
  196. package/tui/src/services/api/adapterManifest.ts +4 -0
  197. package/tui/src/services/api/backendChat/events.ts +117 -0
  198. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  199. package/tui/src/services/api/backendChat/frame.ts +9 -0
  200. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  201. package/tui/src/services/api/backendChat/types.ts +62 -0
  202. package/tui/src/services/api/backendChat.ts +1 -0
  203. package/tui/src/services/api/client.ts +65 -2
  204. package/tui/src/services/api/errorUtils.ts +5 -5
  205. package/tui/src/services/api/errors.ts +1 -1
  206. package/tui/src/services/api/logging.ts +1 -1
  207. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  208. package/tui/src/services/api/ummaya/messages.ts +255 -0
  209. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  210. package/tui/src/services/api/ummaya/provider.ts +200 -0
  211. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  212. package/tui/src/services/api/ummaya/request.ts +200 -0
  213. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  214. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  215. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  216. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  217. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  218. package/tui/src/services/api/ummaya/types.ts +110 -0
  219. package/tui/src/services/api/ummaya/usage.ts +30 -0
  220. package/tui/src/services/api/ummaya.ts +26 -418
  221. package/tui/src/services/api/withRetry.ts +1 -1
  222. package/tui/src/services/awaySummary.ts +2 -2
  223. package/tui/src/services/claudeAiLimits.ts +1 -1
  224. package/tui/src/services/compact/autoCompact.ts +1 -1
  225. package/tui/src/services/compact/compact.ts +1 -1
  226. package/tui/src/services/lsp/types.ts +8 -30
  227. package/tui/src/services/tips/types.ts +6 -28
  228. package/tui/src/services/tokenEstimation.ts +1 -1
  229. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  230. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  231. package/tui/src/services/tools/toolExecution.ts +94 -1
  232. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  233. package/tui/src/store/session-store.ts +10 -36
  234. package/tui/src/stubs/any-stub.ts +15 -10
  235. package/tui/src/stubs/color-diff-napi.ts +37 -23
  236. package/tui/src/stubs/globals.d.ts +3 -3
  237. package/tui/src/stubs/macro-preload.ts +23 -12
  238. package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
  239. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  240. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  241. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  242. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  243. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  244. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  245. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  246. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  247. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  248. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  249. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  250. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  251. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  252. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  253. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  254. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  255. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  256. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  257. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  258. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  259. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  260. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  261. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  262. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  263. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  264. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  265. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  266. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  267. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  268. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  269. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  270. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  271. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  272. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  273. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  274. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  275. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  276. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  277. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  278. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  279. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  280. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  281. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  282. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  283. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  284. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  285. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  286. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  287. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  288. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  289. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  290. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  291. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  292. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  293. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  294. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  295. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  296. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  297. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  298. package/tui/src/tools/BashTool/call.ts +202 -0
  299. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  300. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  301. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  302. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  303. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  304. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  305. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  306. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  307. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  308. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  309. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  310. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  311. package/tui/src/tools/BashTool/schemas.ts +65 -0
  312. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  313. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  314. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  315. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  316. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  317. package/tui/src/tools/BriefTool/upload.ts +1 -1
  318. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  319. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  320. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  321. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  322. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  323. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  324. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  325. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  326. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  327. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  328. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  329. package/tui/src/tools/FileEditTool/call.ts +228 -0
  330. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  331. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  332. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  333. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  334. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  335. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  336. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
  337. package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
  338. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  339. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  340. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  341. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  342. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  343. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  344. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  345. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  346. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  347. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  348. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  349. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  350. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  351. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  352. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  353. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  354. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  355. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  356. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  357. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  358. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  359. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  360. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
  361. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  362. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  363. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
  364. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  365. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  366. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  367. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  368. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  369. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  370. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  371. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  372. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  373. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  374. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  375. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  376. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  377. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  378. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  379. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  380. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  381. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  382. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  383. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  384. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  385. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  386. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  387. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  388. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  389. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
  390. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  391. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  392. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  393. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  394. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  395. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  396. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  397. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  398. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  399. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  400. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  401. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  402. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  403. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  404. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  405. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  406. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  407. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  408. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  409. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  410. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  411. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  412. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  413. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  414. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  415. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  416. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  417. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  418. package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
  419. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  420. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  421. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  422. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  423. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  424. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  425. package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
  426. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  427. package/tui/src/tools.ts +39 -190
  428. package/tui/src/types/fileSuggestion.ts +4 -26
  429. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  430. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  431. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  432. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  433. package/tui/src/types/message.ts +80 -102
  434. package/tui/src/types/messageQueueTypes.ts +6 -28
  435. package/tui/src/types/notebook.ts +16 -38
  436. package/tui/src/types/statusLine.ts +4 -26
  437. package/tui/src/types/tools.ts +24 -46
  438. package/tui/src/types/utils.ts +6 -28
  439. package/tui/src/upstreamproxy/relay.ts +7 -3
  440. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  441. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  442. package/tui/src/utils/auth.ts +129 -139
  443. package/tui/src/utils/bash/ast.ts +23 -23
  444. package/tui/src/utils/bash/bashParser.ts +5 -5
  445. package/tui/src/utils/billing.ts +1 -1
  446. package/tui/src/utils/claudeDesktop.ts +4 -4
  447. package/tui/src/utils/collapseReadSearch.ts +3 -3
  448. package/tui/src/utils/cronTasks.ts +1 -1
  449. package/tui/src/utils/execFileNoThrow.ts +1 -1
  450. package/tui/src/utils/filePersistence/types.ts +16 -38
  451. package/tui/src/utils/forkedAgent.ts +1 -1
  452. package/tui/src/utils/gracefulShutdown.ts +4 -4
  453. package/tui/src/utils/heapDumpService.ts +12 -8
  454. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  455. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  456. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  457. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  458. package/tui/src/utils/messages.ts +18 -0
  459. package/tui/src/utils/migrateSessions.ts +3 -3
  460. package/tui/src/utils/model/model.ts +6 -6
  461. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  462. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  463. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  464. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  465. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  466. package/tui/src/utils/protectedNamespace.ts +5 -3
  467. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  468. package/tui/src/utils/ripgrep.ts +16 -7
  469. package/tui/src/utils/sessionTitle.ts +1 -1
  470. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  471. package/tui/src/utils/shell/prefix.ts +1 -1
  472. package/tui/src/utils/sideQuery.ts +1 -1
  473. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  474. package/tui/src/utils/teleport.tsx +1 -1
  475. package/uv.lock +426 -45
  476. package/tui/src/services/api/claude.ts +0 -3540
  477. package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
  478. package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
  479. package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
  480. package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
  481. package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
  482. 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+LCA8Ym9keT4sIG9yIDwhRE9DVFlQRT4pJ1xuICB9XG4gIC8vIFNESyBjb25zdW1lcnMgdHlwaWNhbGx5IHNldCB0aGlzIHZpYSBpbm5lckhUTUwg4oCUIGRpc2FsbG93IGV4ZWN1dGFibGUvc3R5bGVcbiAgLy8gdGFncyBzbyBhIHByZXZpZXcgY2FuJ3QgcnVuIGNvZGUgb3IgcmVzdHlsZSB0aGUgaG9zdCBwYWdlLiBJbmxpbmUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgKG9uY2xpY2sgZXRjLikgYXJlIHN0aWxsIHBvc3NpYmxlOyBjb25zdW1lcnMgc2hvdWxkIHNhbml0aXplLlxuICBpZiAoLzxcXHMqKHNjcmlwdHxzdHlsZSlcXGIvaS50ZXN0KHByZXZpZXcpKSB7XG4gICAgcmV0dXJuICdwcmV2aWV3IG11c3Qgbm90IGNvbnRhaW4gPHNjcmlwdD4gb3IgPHN0eWxlPiB0YWdzLiBVc2UgaW5saW5lIHN0eWxlcyB2aWEgdGhlIHN0eWxlIGF0dHJpYnV0ZSBpZiBuZWVkZWQuJ1xuICB9XG4gIGlmICghLzxbYS16XVtePl0qPi9pLnRlc3QocHJldmlldykpIHtcbiAgICByZXR1cm4gJ3ByZXZpZXcgbXVzdCBjb250YWluIEhUTUwgKHByZXZpZXdGb3JtYXQgaXMgc2V0IHRvIFwiaHRtbFwiKS4gV3JhcCBjb250ZW50IGluIGEgdGFnIGxpa2UgPGRpdj4gb3IgPHByZT4uJ1xuICB9XG4gIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFTQSxPQUFPLFFBQVEsWUFBWTtBQUNwQyxPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQ0VDLGtCQUFrQixFQUNsQkMsd0JBQXdCLFFBQ25CLHdCQUF3QjtBQUMvQixTQUFTQyxlQUFlLFFBQVEsbUNBQW1DO0FBQ25FLFNBQVNDLFlBQVksUUFBUSwwQkFBMEI7QUFDdkQsU0FBU0MsWUFBWSxRQUFRLHlDQUF5QztBQUN0RSxTQUFTQyxDQUFDLFFBQVEsUUFBUTtBQUMxQixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FB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QUd2QyxNQUFNLENBQUNDLE9BQU8sQ0FBQzFCLE9BQU8sQ0FBQyxDQUN4Q1YsR0FBRyxDQUFDLENBQUMsQ0FBQ3NDLFlBQVksRUFBRUMsTUFBTSxDQUFDLEtBQUs7TUFDL0IsTUFBTW9DLFVBQVUsR0FBR2hFLFdBQVcsR0FBRzJCLFlBQVksQ0FBQztNQUM5QyxNQUFNc0MsS0FBSyxHQUFHLENBQUMsSUFBSXRDLFlBQVksTUFBTUMsTUFBTSxHQUFHLENBQUM7TUFDL0MsSUFBSW9DLFVBQVUsRUFBRS9GLE9BQU8sRUFBRTtRQUN2QmdHLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLHNCQUFzQkYsVUFBVSxDQUFDL0YsT0FBTyxFQUFFLENBQUM7TUFDeEQ7TUFDQSxJQUFJK0YsVUFBVSxFQUFFakYsS0FBSyxFQUFFO1FBQ3JCa0YsS0FBSyxDQUFDQyxJQUFJLENBQUMsZUFBZUYsVUFBVSxDQUFDakYsS0FBSyxFQUFFLENBQUM7TUFDL0M7TUFDQSxPQUFPa0YsS0FBSyxDQUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FDREEsSUFBSSxDQUFDLElBQUksQ0FBQztJQUViLE9BQU87TUFDTHdCLElBQUksRUFBRSxhQUFhO01BQ25CQyxPQUFPLEVBQUUscUNBQXFDTCxXQUFXLHlEQUF5RDtNQUNsSE0sV0FBVyxFQUFFUDtJQUNmLENBQUM7RUFDSDtBQUNGLENBQUMsV0FBVzFHLE9BQU8sQ0FBQ2tELFdBQVcsRUFBRVMsTUFBTSxDQUFDLENBQUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLFNBQVNpQyxtQkFBbUJBLENBQUMvRSxPQUFPLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7RUFDdkUsSUFBSUEsT0FBTyxLQUFLbUUsU0FBUyxFQUFFLE9BQU8sSUFBSTtFQUN0QyxJQUFJLDZCQUE2QixDQUFDa0MsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDL0MsT0FBTywwRkFBMEY7RUFDbkc7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJLHVCQUF1QixDQUFDcUcsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDekMsT0FBTyx5R0FBeUc7RUFDbEg7RUFDQSxJQUFJLENBQUMsZUFBZSxDQUFDcUcsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDbEMsT0FBTyx3R0FBd0c7RUFDakg7RUFDQSxPQUFPLElBQUk7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
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>)