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
@@ -0,0 +1,244 @@
1
+ import { feature } from 'bun:bundle'
2
+ import { isCoordinatorMode } from '../../coordinator/coordinatorMode.js'
3
+ import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from '../../services/analytics/index.js'
4
+ import type { AppState } from '../../state/AppState.js'
5
+ import type { ToolUseContext, Tools } from '../../Tool.js'
6
+ import { getAgentModel } from '../../utils/model/agent.js'
7
+ import { createAgentId } from '../../utils/uuid.js'
8
+ import { buildCoordinatorWorkerPermissionContext } from './orchestrationSupport.js'
9
+ import { isBuiltInAgent } from './loadAgentsDir.js'
10
+ import { isForkSubagentEnabled } from './forkSubagent.js'
11
+ import { runAgent } from './runAgent.js'
12
+ import {
13
+ assertAgentLaunchAllowed,
14
+ launchTeammateIfRequested,
15
+ resolveSelectedAgentRoute,
16
+ resolveTeamName,
17
+ } from './launchRouting.js'
18
+ import { launchRemoteAgentIfRequested } from './remoteRouting.js'
19
+ import {
20
+ buildAgentPromptSetup,
21
+ buildRunAgentParams,
22
+ } from './promptSetup.js'
23
+ import {
24
+ appendForkWorktreeNotice,
25
+ buildWorktreeCleanup,
26
+ createWorktreeState,
27
+ } from './worktreeLifecycle.js'
28
+ import {
29
+ isBackgroundTasksDisabled,
30
+ isCoordinatorEnvMode,
31
+ isProactiveAgentActive,
32
+ } from './runtimeConfig.js'
33
+ import {
34
+ launchAsyncAgent,
35
+ registerAgentName,
36
+ } from './asyncLifecycle.js'
37
+ import { launchSyncAgent } from './foregroundLifecycle.js'
38
+ import type {
39
+ AgentLifecycleMetadata,
40
+ AgentToolCallResult,
41
+ AgentToolInput,
42
+ AgentToolProgressCallback,
43
+ } from './schemas.js'
44
+
45
+ type SetAppState = (f: (prev: AppState) => AppState) => void
46
+ type RunAgentParams = Parameters<typeof runAgent>[0]
47
+ type AssistantProgressSource = {
48
+ readonly requestId?: string
49
+ readonly message?: { readonly id?: string }
50
+ }
51
+
52
+ export async function callAgentTool(
53
+ input: AgentToolInput,
54
+ toolUseContext: ToolUseContext,
55
+ canUseTool: RunAgentParams['canUseTool'],
56
+ assistantMessage: AssistantProgressSource | undefined,
57
+ onProgress?: AgentToolProgressCallback,
58
+ ): Promise<AgentToolCallResult> {
59
+ const startTime = Date.now()
60
+ const model = isCoordinatorMode() ? undefined : input.model
61
+ const appState = toolUseContext.getAppState()
62
+ const rootSetAppState =
63
+ toolUseContext.setAppStateForTasks ?? toolUseContext.setAppState
64
+ const teamName = resolveTeamName(input, appState)
65
+ assertAgentLaunchAllowed({ input, teamName })
66
+
67
+ const teammateResult = await launchTeammateIfRequested({
68
+ input,
69
+ teamName,
70
+ model,
71
+ toolUseContext,
72
+ assistantMessage,
73
+ })
74
+ if (teammateResult) return teammateResult
75
+
76
+ const { selectedAgent, isForkPath } = await resolveSelectedAgentRoute({
77
+ input,
78
+ toolUseContext,
79
+ appState,
80
+ })
81
+ assertAgentLaunchAllowed({ input, selectedAgent, teamName })
82
+ const permissionMode = appState.toolPermissionContext.mode
83
+ const resolvedAgentModel = getAgentModel(
84
+ selectedAgent.model,
85
+ toolUseContext.options.mainLoopModel,
86
+ isForkPath ? undefined : model,
87
+ permissionMode,
88
+ )
89
+ const shouldRunAsync = shouldRunAgentAsync({
90
+ input,
91
+ selectedAgent,
92
+ appState,
93
+ })
94
+ const metadata: AgentLifecycleMetadata = {
95
+ prompt: input.prompt,
96
+ resolvedAgentModel,
97
+ isBuiltInAgent: isBuiltInAgent(selectedAgent),
98
+ startTime,
99
+ agentType: selectedAgent.agentType,
100
+ isAsync: shouldRunAsync,
101
+ }
102
+ logSelectedAgent(selectedAgent, resolvedAgentModel, metadata, isForkPath)
103
+
104
+ const effectiveIsolation = input.isolation ?? selectedAgent.isolation
105
+ const remoteResult = await launchRemoteAgentIfRequested({
106
+ effectiveIsolation,
107
+ description: input.description,
108
+ prompt: input.prompt,
109
+ selectedAgent,
110
+ toolUseContext,
111
+ })
112
+ if (remoteResult) return remoteResult
113
+
114
+ const earlyAgentId = createAgentId()
115
+ const promptSetup = await buildAgentPromptSetup({
116
+ prompt: input.prompt,
117
+ selectedAgent,
118
+ toolUseContext,
119
+ assistantMessage,
120
+ resolvedAgentModel,
121
+ isForkPath,
122
+ hasWorktree: effectiveIsolation === 'worktree',
123
+ cwd: input.cwd,
124
+ })
125
+ const worktreeState = await createWorktreeState({
126
+ isolation: effectiveIsolation,
127
+ earlyAgentId,
128
+ })
129
+ appendForkWorktreeNotice({
130
+ isForkPath,
131
+ worktreePath: worktreeState.current?.worktreePath,
132
+ promptMessages: promptSetup.promptMessages,
133
+ })
134
+
135
+ const workerPermissionContext = buildCoordinatorWorkerPermissionContext(
136
+ appState.toolPermissionContext,
137
+ selectedAgent.permissionMode ?? 'acceptEdits',
138
+ )
139
+ const workerTools = await assembleWorkerTools(
140
+ workerPermissionContext,
141
+ appState.mcp.tools,
142
+ )
143
+ const runAgentParams = buildRunAgentParams({
144
+ selectedAgent,
145
+ promptSetup,
146
+ toolUseContext,
147
+ canUseTool,
148
+ shouldRunAsync,
149
+ isForkPath,
150
+ model,
151
+ workerTools,
152
+ worktreePath: worktreeState.current?.worktreePath,
153
+ description: input.description,
154
+ })
155
+ const cwdOverridePath = input.cwd ?? worktreeState.current?.worktreePath
156
+ const getWorktreeResult = buildWorktreeCleanup({
157
+ state: worktreeState,
158
+ earlyAgentId,
159
+ selectedAgent,
160
+ description: input.description,
161
+ })
162
+
163
+ if (shouldRunAsync) {
164
+ const data = launchAsyncAgent({
165
+ asyncAgentId: earlyAgentId,
166
+ description: input.description,
167
+ prompt: input.prompt,
168
+ selectedAgent,
169
+ rootSetAppState,
170
+ toolUseContext,
171
+ runAgentParams,
172
+ metadata,
173
+ assistantMessage,
174
+ cwdOverridePath,
175
+ isCoordinator: isCoordinatorEnvMode(),
176
+ getWorktreeResult,
177
+ })
178
+ registerAgentName({ name: input.name, agentId: earlyAgentId, rootSetAppState })
179
+ return { data }
180
+ }
181
+
182
+ return launchSyncAgent({
183
+ syncAgentId: earlyAgentId,
184
+ selectedAgent,
185
+ prompt: input.prompt,
186
+ promptMessages: promptSetup.promptMessages,
187
+ description: input.description,
188
+ runAgentParams,
189
+ toolUseContext,
190
+ rootSetAppState,
191
+ metadata,
192
+ assistantMessage,
193
+ cwdOverridePath,
194
+ onProgress,
195
+ getWorktreeResult,
196
+ })
197
+ }
198
+
199
+ async function assembleWorkerTools(
200
+ workerPermissionContext: AppState['toolPermissionContext'],
201
+ mcpTools: AppState['mcp']['tools'],
202
+ ): Promise<Tools> {
203
+ const { assembleToolPool } = await import('../../tools.js')
204
+ return assembleToolPool(workerPermissionContext, mcpTools)
205
+ }
206
+
207
+ function shouldRunAgentAsync({
208
+ input,
209
+ selectedAgent,
210
+ appState,
211
+ }: {
212
+ readonly input: AgentToolInput
213
+ readonly selectedAgent: { readonly background?: boolean }
214
+ readonly appState: Pick<AppState, 'kairosEnabled'>
215
+ }): boolean {
216
+ const assistantForceAsync = feature('KAIROS') ? appState.kairosEnabled : false
217
+ return (
218
+ (input.run_in_background === true ||
219
+ selectedAgent.background === true ||
220
+ isCoordinatorEnvMode() ||
221
+ isForkSubagentEnabled() ||
222
+ assistantForceAsync ||
223
+ isProactiveAgentActive()) &&
224
+ !isBackgroundTasksDisabled
225
+ )
226
+ }
227
+
228
+ function logSelectedAgent(
229
+ selectedAgent: { readonly agentType: string; readonly source?: string; readonly color?: string },
230
+ resolvedAgentModel: string,
231
+ metadata: Pick<AgentLifecycleMetadata, 'isAsync' | 'isBuiltInAgent'>,
232
+ isForkPath: boolean,
233
+ ): void {
234
+ logEvent('tengu_agent_tool_selected', {
235
+ agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
236
+ model: resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
237
+ source: selectedAgent.source as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
238
+ color: selectedAgent.color as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
239
+ is_built_in_agent: metadata.isBuiltInAgent,
240
+ is_resume: false,
241
+ is_async: metadata.isAsync,
242
+ is_fork: isForkPath,
243
+ })
244
+ }
@@ -0,0 +1,73 @@
1
+ import type { AppState } from '../../state/AppState.js'
2
+ import type { Tools, ToolUseContext } from '../../Tool.js'
3
+ import { sleep } from '../../utils/sleep.js'
4
+ import type { AgentDefinition } from './loadAgentsDir.js'
5
+ import { hasRequiredMcpServers } from './loadAgentsDir.js'
6
+
7
+ export async function waitForRequiredMcpServers(
8
+ selectedAgent: AgentDefinition,
9
+ toolUseContext: ToolUseContext,
10
+ appState: AppState,
11
+ ): Promise<void> {
12
+ const requiredMcpServers = selectedAgent.requiredMcpServers
13
+ if (!requiredMcpServers?.length) return
14
+ let currentAppState = appState
15
+ if (hasPendingRequiredServers(currentAppState, requiredMcpServers)) {
16
+ const deadline = Date.now() + 30_000
17
+ while (Date.now() < deadline) {
18
+ await sleep(500)
19
+ currentAppState = toolUseContext.getAppState()
20
+ if (hasFailedRequiredServer(currentAppState, requiredMcpServers)) break
21
+ if (!hasPendingRequiredServers(currentAppState, requiredMcpServers)) break
22
+ }
23
+ }
24
+ const serversWithTools = mcpServersWithTools(currentAppState.mcp.tools)
25
+ if (hasRequiredMcpServers(selectedAgent, serversWithTools)) return
26
+ const missing = requiredMcpServers.filter(
27
+ pattern =>
28
+ !serversWithTools.some(server =>
29
+ server.toLowerCase().includes(pattern.toLowerCase()),
30
+ ),
31
+ )
32
+ throw new Error(
33
+ `Agent '${selectedAgent.agentType}' requires MCP servers matching: ${missing.join(', ')}. MCP servers with tools: ${serversWithTools.length > 0 ? serversWithTools.join(', ') : 'none'}. Use /mcp to configure and authenticate the required MCP servers.`,
34
+ )
35
+ }
36
+
37
+ export function mcpServersWithTools(tools: Tools): string[] {
38
+ const serverNames: string[] = []
39
+ for (const tool of tools) {
40
+ if (!tool.name?.startsWith('mcp__')) continue
41
+ const serverName = tool.name.split('__')[1]
42
+ if (serverName && !serverNames.includes(serverName)) {
43
+ serverNames.push(serverName)
44
+ }
45
+ }
46
+ return serverNames
47
+ }
48
+
49
+ function hasPendingRequiredServers(
50
+ appState: AppState,
51
+ requiredMcpServers: readonly string[],
52
+ ): boolean {
53
+ return appState.mcp.clients.some(
54
+ client =>
55
+ client.type === 'pending' &&
56
+ requiredMcpServers.some(pattern =>
57
+ client.name.toLowerCase().includes(pattern.toLowerCase()),
58
+ ),
59
+ )
60
+ }
61
+
62
+ function hasFailedRequiredServer(
63
+ appState: AppState,
64
+ requiredMcpServers: readonly string[],
65
+ ): boolean {
66
+ return appState.mcp.clients.some(
67
+ client =>
68
+ client.type === 'failed' &&
69
+ requiredMcpServers.some(pattern =>
70
+ client.name.toLowerCase().includes(pattern.toLowerCase()),
71
+ ),
72
+ )
73
+ }
@@ -0,0 +1,70 @@
1
+ import type { ToolPermissionContext } from '../../Tool.js'
2
+ import type { PermissionMode } from '../../types/permissions.js'
3
+
4
+ export const COORDINATOR_PERMISSION_FLOW =
5
+ 'coordinator_parent_round_trip' as const
6
+
7
+ export type CoordinatorPermissionFlow = typeof COORDINATOR_PERMISSION_FLOW
8
+
9
+ export type AgentSupportMetadata = {
10
+ evidenceJoinKey: string
11
+ parentToolUseId: string
12
+ resumeToken: string
13
+ permissionFlow: CoordinatorPermissionFlow
14
+ }
15
+
16
+ const UNKNOWN_PARENT_TOOL_USE_ID = 'parent-tool-use:unknown'
17
+
18
+ const PROTECTED_WORKER_TOOLS = new Set([
19
+ 'document',
20
+ 'send',
21
+ 'check',
22
+ 'workspace_write',
23
+ 'workspace_edit',
24
+ ])
25
+
26
+ function stableJoinPart(part: string): string {
27
+ const sanitized = part.replace(/[^A-Za-z0-9_.:-]/g, '_')
28
+ return sanitized.length > 0 ? sanitized : 'unknown'
29
+ }
30
+
31
+ export function buildAgentSupportMetadata({
32
+ agentId,
33
+ taskId,
34
+ parentToolUseId,
35
+ }: {
36
+ agentId?: string
37
+ taskId?: string
38
+ parentToolUseId?: string
39
+ }): AgentSupportMetadata {
40
+ const childId = stableJoinPart(agentId ?? taskId ?? 'unknown')
41
+ const parentId = stableJoinPart(parentToolUseId ?? UNKNOWN_PARENT_TOOL_USE_ID)
42
+ return {
43
+ evidenceJoinKey: `${parentId}:${childId}`,
44
+ parentToolUseId: parentId,
45
+ resumeToken: `resume:${childId}`,
46
+ permissionFlow: COORDINATOR_PERMISSION_FLOW,
47
+ }
48
+ }
49
+
50
+ export function isProtectedWorkerTool(toolName: string): boolean {
51
+ return PROTECTED_WORKER_TOOLS.has(toolName)
52
+ }
53
+
54
+ function workerMode(requestedMode: PermissionMode | undefined): PermissionMode {
55
+ return requestedMode === 'plan' ? 'plan' : 'default'
56
+ }
57
+
58
+ export function buildCoordinatorWorkerPermissionContext(
59
+ parent: ToolPermissionContext,
60
+ requestedMode: PermissionMode | undefined,
61
+ ): ToolPermissionContext {
62
+ return {
63
+ ...parent,
64
+ mode: workerMode(requestedMode),
65
+ alwaysAllowRules: {},
66
+ isBypassPermissionsModeAvailable: false,
67
+ shouldAvoidPermissionPrompts: false,
68
+ awaitAutomatedChecksBeforeDialog: true,
69
+ }
70
+ }
@@ -0,0 +1,39 @@
1
+ import type { ToolUseContext } from '../../Tool.js'
2
+ import type { PermissionResult } from '../../utils/permissions/PermissionResult.js'
3
+ import type { AgentToolInput } from './schemas.js'
4
+ import { isAntBuild } from './runtimeConfig.js'
5
+
6
+ const NON_INHERITABLE_PERMISSION_MODES = new Set(['bypassPermissions', 'dontAsk'])
7
+
8
+ export async function checkAgentToolPermissions(
9
+ input: AgentToolInput,
10
+ context: ToolUseContext,
11
+ ): Promise<PermissionResult> {
12
+ const appState = context.getAppState()
13
+ const requestedMode = input.mode
14
+ if (
15
+ (requestedMode && NON_INHERITABLE_PERMISSION_MODES.has(requestedMode)) ||
16
+ NON_INHERITABLE_PERMISSION_MODES.has(appState.toolPermissionContext.mode)
17
+ ) {
18
+ return {
19
+ behavior: 'deny',
20
+ message:
21
+ 'Agent workers must use the coordinator parent permission round-trip; bypass and dontAsk modes are not inherited by subagents.',
22
+ decisionReason: {
23
+ type: 'asyncAgent',
24
+ reason: 'Subagents cannot inherit bypass or dontAsk permission mode.',
25
+ },
26
+ }
27
+ }
28
+
29
+ if (isAntBuild() && appState.toolPermissionContext.mode === 'auto') {
30
+ return {
31
+ behavior: 'passthrough',
32
+ message: 'Agent tool requires permission to spawn sub-agents.',
33
+ }
34
+ }
35
+ return {
36
+ behavior: 'allow',
37
+ updatedInput: input,
38
+ }
39
+ }
@@ -0,0 +1,181 @@
1
+ import type { AssistantMessage, Message as MessageType } from 'src/types/message.js'
2
+ import { getQuerySourceForAgent } from 'src/utils/promptCategory.js'
3
+ import { enhanceSystemPromptWithEnvDetails, getSystemPrompt } from '../../constants/prompts.js'
4
+ import type { ToolUseContext, Tools } from '../../Tool.js'
5
+ import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from '../../services/analytics/index.js'
6
+ import { createUserMessage } from '../../utils/messages.js'
7
+ import { logForDebugging } from '../../utils/debug.js'
8
+ import { errorMessage } from '../../utils/errors.js'
9
+ import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js'
10
+ import { asSystemPrompt } from '../../utils/systemPromptType.js'
11
+ import { buildForkedMessages } from './forkSubagent.js'
12
+ import type { AgentDefinition } from './loadAgentsDir.js'
13
+ import { isBuiltInAgent } from './loadAgentsDir.js'
14
+ import { runAgent } from './runAgent.js'
15
+ import {
16
+ additionalWorkingDirectoryPaths,
17
+ isAntBuild,
18
+ } from './runtimeConfig.js'
19
+
20
+ type RunAgentParams = Parameters<typeof runAgent>[0]
21
+
22
+ export type PromptSetup = {
23
+ readonly promptMessages: MessageType[]
24
+ readonly override?: RunAgentParams['override']
25
+ readonly forkContextMessages?: MessageType[]
26
+ readonly useExactTools?: true
27
+ readonly querySource: RunAgentParams['querySource']
28
+ }
29
+
30
+ export async function buildAgentPromptSetup({
31
+ prompt,
32
+ selectedAgent,
33
+ toolUseContext,
34
+ assistantMessage,
35
+ resolvedAgentModel,
36
+ isForkPath,
37
+ hasWorktree,
38
+ cwd,
39
+ }: {
40
+ readonly prompt: string
41
+ readonly selectedAgent: AgentDefinition
42
+ readonly toolUseContext: ToolUseContext
43
+ readonly assistantMessage?: AssistantMessage
44
+ readonly resolvedAgentModel: string
45
+ readonly isForkPath: boolean
46
+ readonly hasWorktree: boolean
47
+ readonly cwd?: string
48
+ }): Promise<PromptSetup> {
49
+ if (isForkPath) {
50
+ const systemPrompt =
51
+ toolUseContext.renderedSystemPrompt ??
52
+ (await buildFallbackParentSystemPrompt(toolUseContext))
53
+ return {
54
+ promptMessages: buildForkedMessages(prompt, assistantMessage),
55
+ override: { systemPrompt },
56
+ forkContextMessages: toolUseContext.messages,
57
+ useExactTools: true,
58
+ querySource:
59
+ toolUseContext.options.querySource ??
60
+ getQuerySourceForAgent(selectedAgent.agentType, isBuiltInAgent(selectedAgent)),
61
+ }
62
+ }
63
+
64
+ const enhancedSystemPrompt = await buildSelectedAgentSystemPrompt({
65
+ selectedAgent,
66
+ toolUseContext,
67
+ resolvedAgentModel,
68
+ })
69
+ return {
70
+ promptMessages: [createUserMessage({ content: prompt })],
71
+ override:
72
+ enhancedSystemPrompt && !hasWorktree && !cwd
73
+ ? { systemPrompt: asSystemPrompt(enhancedSystemPrompt) }
74
+ : undefined,
75
+ querySource:
76
+ toolUseContext.options.querySource ??
77
+ getQuerySourceForAgent(selectedAgent.agentType, isBuiltInAgent(selectedAgent)),
78
+ }
79
+ }
80
+
81
+ export function buildRunAgentParams({
82
+ selectedAgent,
83
+ promptSetup,
84
+ toolUseContext,
85
+ canUseTool,
86
+ shouldRunAsync,
87
+ isForkPath,
88
+ model,
89
+ workerTools,
90
+ worktreePath,
91
+ description,
92
+ }: {
93
+ readonly selectedAgent: AgentDefinition
94
+ readonly promptSetup: PromptSetup
95
+ readonly toolUseContext: ToolUseContext
96
+ readonly canUseTool: RunAgentParams['canUseTool']
97
+ readonly shouldRunAsync: boolean
98
+ readonly isForkPath: boolean
99
+ readonly model?: string
100
+ readonly workerTools: Tools
101
+ readonly worktreePath?: string
102
+ readonly description: string
103
+ }): RunAgentParams {
104
+ return {
105
+ agentDefinition: selectedAgent,
106
+ promptMessages: promptSetup.promptMessages,
107
+ toolUseContext,
108
+ canUseTool,
109
+ isAsync: shouldRunAsync,
110
+ querySource: promptSetup.querySource,
111
+ model: isForkPath ? undefined : model,
112
+ override: promptSetup.override,
113
+ availableTools: isForkPath ? toolUseContext.options.tools : workerTools,
114
+ forkContextMessages: promptSetup.forkContextMessages,
115
+ ...(promptSetup.useExactTools ? { useExactTools: true as const } : {}),
116
+ worktreePath,
117
+ description,
118
+ }
119
+ }
120
+
121
+ async function buildFallbackParentSystemPrompt(
122
+ toolUseContext: ToolUseContext,
123
+ ): Promise<ReturnType<typeof buildEffectiveSystemPrompt>> {
124
+ const appState = toolUseContext.getAppState()
125
+ const mainThreadAgentDefinition = appState.agent
126
+ ? appState.agentDefinitions.activeAgents.find(
127
+ agent => agent.agentType === appState.agent,
128
+ )
129
+ : undefined
130
+ const defaultSystemPrompt = await getSystemPrompt(
131
+ toolUseContext.options.tools,
132
+ toolUseContext.options.mainLoopModel,
133
+ additionalWorkingDirectoryPaths(toolUseContext),
134
+ toolUseContext.options.mcpClients,
135
+ )
136
+ return buildEffectiveSystemPrompt({
137
+ mainThreadAgentDefinition,
138
+ toolUseContext,
139
+ customSystemPrompt: toolUseContext.options.customSystemPrompt,
140
+ defaultSystemPrompt,
141
+ appendSystemPrompt: toolUseContext.options.appendSystemPrompt,
142
+ })
143
+ }
144
+
145
+ async function buildSelectedAgentSystemPrompt({
146
+ selectedAgent,
147
+ toolUseContext,
148
+ resolvedAgentModel,
149
+ }: {
150
+ readonly selectedAgent: AgentDefinition
151
+ readonly toolUseContext: ToolUseContext
152
+ readonly resolvedAgentModel: string
153
+ }): Promise<string[] | undefined> {
154
+ try {
155
+ const agentPrompt = selectedAgent.getSystemPrompt({ toolUseContext })
156
+ if (selectedAgent.memory) {
157
+ logEvent('tengu_agent_memory_loaded', {
158
+ ...(isAntBuild()
159
+ ? {
160
+ agent_type:
161
+ selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
162
+ }
163
+ : {}),
164
+ scope: selectedAgent.memory as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
165
+ source: 'subagent' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
166
+ })
167
+ }
168
+ return enhanceSystemPromptWithEnvDetails(
169
+ [agentPrompt],
170
+ resolvedAgentModel,
171
+ additionalWorkingDirectoryPaths(toolUseContext),
172
+ )
173
+ } catch (error) {
174
+ const promptError =
175
+ error instanceof Error ? error : new Error(errorMessage(error))
176
+ logForDebugging(
177
+ `Failed to get system prompt for agent ${selectedAgent.agentType}: ${errorMessage(promptError)}`,
178
+ )
179
+ return undefined
180
+ }
181
+ }
@@ -0,0 +1,62 @@
1
+ import type { ToolUseContext } from '../../Tool.js'
2
+ import {
3
+ checkRemoteAgentEligibility,
4
+ formatPreconditionError,
5
+ getRemoteTaskSessionUrl,
6
+ registerRemoteAgentTask,
7
+ } from '../../tasks/RemoteAgentTask/RemoteAgentTask.js'
8
+ import { getTaskOutputPath } from '../../utils/task/diskOutput.js'
9
+ import { teleportToRemote } from '../../utils/teleport.js'
10
+ import type { AgentDefinition } from './loadAgentsDir.js'
11
+ import type {
12
+ AgentToolCallResult,
13
+ RemoteLaunchedOutput,
14
+ } from './schemas.js'
15
+ import { isAntBuild } from './runtimeConfig.js'
16
+
17
+ export async function launchRemoteAgentIfRequested({
18
+ effectiveIsolation,
19
+ description,
20
+ prompt,
21
+ selectedAgent: _selectedAgent,
22
+ toolUseContext,
23
+ }: {
24
+ readonly effectiveIsolation?: 'worktree' | 'remote'
25
+ readonly description: string
26
+ readonly prompt: string
27
+ readonly selectedAgent: AgentDefinition
28
+ readonly toolUseContext: ToolUseContext
29
+ }): Promise<AgentToolCallResult | undefined> {
30
+ if (!isAntBuild() || effectiveIsolation !== 'remote') return undefined
31
+ const eligibility = await checkRemoteAgentEligibility()
32
+ if ('errors' in eligibility) {
33
+ const reasons = eligibility.errors.map(formatPreconditionError).join('\n')
34
+ throw new Error(`Cannot launch remote agent:\n${reasons}`)
35
+ }
36
+ let bundleFailHint: string | undefined
37
+ const session = await teleportToRemote({
38
+ initialMessage: prompt,
39
+ description,
40
+ signal: toolUseContext.abortController.signal,
41
+ onBundleFail: message => {
42
+ bundleFailHint = message
43
+ },
44
+ })
45
+ if (!session) throw new Error(bundleFailHint ?? 'Failed to create remote session')
46
+ const { taskId, sessionId } = registerRemoteAgentTask({
47
+ remoteTaskType: 'remote-agent',
48
+ session: { id: session.id, title: session.title || description },
49
+ command: prompt,
50
+ context: toolUseContext,
51
+ toolUseId: toolUseContext.toolUseId,
52
+ })
53
+ const remoteResult: RemoteLaunchedOutput = {
54
+ status: 'remote_launched',
55
+ taskId,
56
+ sessionUrl: getRemoteTaskSessionUrl(sessionId),
57
+ description,
58
+ prompt,
59
+ outputFile: getTaskOutputPath(taskId),
60
+ }
61
+ return { data: remoteResult }
62
+ }