ummaya 0.2.3 → 0.2.5

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