ummaya 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/README.md +15 -2
  2. package/bin/ummaya +10 -1
  3. package/npm-shrinkwrap.json +253 -2
  4. package/package.json +5 -1
  5. package/prompts/manifest.yaml +1 -1
  6. package/prompts/system_v1.md +1 -0
  7. package/pyproject.toml +26 -2
  8. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  9. package/src/ummaya/_canonical/__init__.py +2 -0
  10. package/src/ummaya/engine/engine.py +29 -132
  11. package/src/ummaya/evidence/__init__.py +21 -2
  12. package/src/ummaya/evidence/dataset_contract.py +193 -0
  13. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  14. package/src/ummaya/evidence/document_harness.py +313 -0
  15. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  16. package/src/ummaya/evidence/gates.py +70 -0
  17. package/src/ummaya/evidence/json_types.py +20 -0
  18. package/src/ummaya/evidence/models.py +88 -1
  19. package/src/ummaya/evidence/output_payload.py +89 -0
  20. package/src/ummaya/evidence/payload_documents.py +233 -0
  21. package/src/ummaya/evidence/route_contracts.py +224 -0
  22. package/src/ummaya/evidence/route_helpers.py +150 -0
  23. package/src/ummaya/evidence/runner.py +81 -212
  24. package/src/ummaya/evidence/source_provenance.py +246 -0
  25. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  26. package/src/ummaya/evidence/tool_layer.py +39 -0
  27. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  28. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  29. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  30. package/src/ummaya/ipc/frame_schema.py +5 -5
  31. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  32. package/src/ummaya/ipc/stdio.py +1109 -477
  33. package/src/ummaya/llm/client.py +102 -3
  34. package/src/ummaya/llm/config.py +8 -3
  35. package/src/ummaya/primitives/__init__.py +6 -2
  36. package/src/ummaya/primitives/delegation.py +1 -1
  37. package/src/ummaya/primitives/document.py +28 -0
  38. package/src/ummaya/settings.py +0 -3
  39. package/src/ummaya/tools/discovery_bridge.py +17 -1
  40. package/src/ummaya/tools/documents/__init__.py +297 -0
  41. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  42. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  43. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  44. package/src/ummaya/tools/documents/authoring.py +283 -0
  45. package/src/ummaya/tools/documents/baselines.py +114 -0
  46. package/src/ummaya/tools/documents/capability.py +331 -0
  47. package/src/ummaya/tools/documents/contracts.py +112 -0
  48. package/src/ummaya/tools/documents/conversion.py +521 -0
  49. package/src/ummaya/tools/documents/diff.py +275 -0
  50. package/src/ummaya/tools/documents/engines.py +163 -0
  51. package/src/ummaya/tools/documents/evaluation.py +291 -0
  52. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  53. package/src/ummaya/tools/documents/fixtures.py +174 -0
  54. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  55. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  56. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  57. package/src/ummaya/tools/documents/formats/base.py +41 -0
  58. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  59. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  60. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  61. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  62. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  63. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  64. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  65. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  66. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  67. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  68. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  69. package/src/ummaya/tools/documents/inspection.py +289 -0
  70. package/src/ummaya/tools/documents/intake.py +1079 -0
  71. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  72. package/src/ummaya/tools/documents/models.py +1598 -0
  73. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  74. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  75. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  76. package/src/ummaya/tools/documents/patch.py +170 -0
  77. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  78. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  79. package/src/ummaya/tools/documents/permissions.py +110 -0
  80. package/src/ummaya/tools/documents/planner.py +616 -0
  81. package/src/ummaya/tools/documents/registry.py +2733 -0
  82. package/src/ummaya/tools/documents/render.py +978 -0
  83. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  84. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  85. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  86. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  87. package/src/ummaya/tools/documents/reread.py +157 -0
  88. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  89. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  90. package/src/ummaya/tools/documents/scorecard.py +184 -0
  91. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  92. package/src/ummaya/tools/documents/style.py +48 -0
  93. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  94. package/src/ummaya/tools/documents/validate.py +347 -0
  95. package/src/ummaya/tools/executor.py +29 -0
  96. package/src/ummaya/tools/live_proxy.py +0 -3
  97. package/src/ummaya/tools/models.py +5 -1
  98. package/src/ummaya/tools/register_all.py +8 -0
  99. package/src/ummaya/tools/registry.py +10 -1
  100. package/src/ummaya/tools/routing/__init__.py +59 -0
  101. package/src/ummaya/tools/routing/builder.py +105 -0
  102. package/src/ummaya/tools/routing/cards.py +29 -0
  103. package/src/ummaya/tools/routing/decision_service.py +534 -0
  104. package/src/ummaya/tools/routing/decision_types.py +74 -0
  105. package/src/ummaya/tools/routing/feasibility.py +122 -0
  106. package/src/ummaya/tools/routing/intent.py +17 -0
  107. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  108. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  109. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  110. package/src/ummaya/tools/routing/intent_types.py +48 -0
  111. package/src/ummaya/tools/routing/lint.py +78 -0
  112. package/src/ummaya/tools/routing/metadata.py +174 -0
  113. package/src/ummaya/tools/routing/projection.py +340 -0
  114. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  115. package/src/ummaya/tools/routing/schema.py +81 -0
  116. package/src/ummaya/tools/routing/types.py +96 -0
  117. package/src/ummaya/tools/routing_index.py +2 -2
  118. package/src/ummaya/tools/search.py +34 -746
  119. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  120. package/tui/package.json +1 -1
  121. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  122. package/tui/src/QueryEngine.ts +12 -8
  123. package/tui/src/bridge/inboundAttachments.ts +3 -3
  124. package/tui/src/cli/handlers/auth.ts +3 -12
  125. package/tui/src/cli/print.ts +7 -7
  126. package/tui/src/commands/insights.ts +1 -1
  127. package/tui/src/commands/install-github-app/types.ts +8 -30
  128. package/tui/src/commands/plugin/types.ts +6 -28
  129. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  130. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  131. package/tui/src/components/Feedback.tsx +1 -1
  132. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  133. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  134. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  135. package/tui/src/components/Spinner/types.ts +6 -28
  136. package/tui/src/components/agents/generateAgent.ts +1 -1
  137. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  138. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  139. package/tui/src/components/mcp/types.ts +16 -38
  140. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  141. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  142. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  143. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  144. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  145. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  146. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  147. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  148. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  149. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  150. package/tui/src/components/primitive/index.tsx +43 -1
  151. package/tui/src/components/primitive/types.ts +137 -0
  152. package/tui/src/components/ui/option.ts +4 -26
  153. package/tui/src/constants/common.ts +0 -2
  154. package/tui/src/constants/prompts.ts +4 -3
  155. package/tui/src/constants/querySource.ts +4 -26
  156. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  157. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  158. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  159. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  160. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  161. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  162. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  163. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  164. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  165. package/tui/src/ink/ink.tsx +33 -14
  166. package/tui/src/ink/reconciler.ts +2 -3
  167. package/tui/src/ink/render-to-screen.ts +30 -10
  168. package/tui/src/ipc/bridge.ts +62 -15
  169. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  170. package/tui/src/ipc/codec.ts +3 -3
  171. package/tui/src/ipc/frames.generated.ts +12 -12
  172. package/tui/src/ipc/llmClient.ts +151 -27
  173. package/tui/src/ipc/schema/frame.schema.json +1 -1
  174. package/tui/src/keybindings/defaultBindings.ts +4 -0
  175. package/tui/src/main.tsx +29 -11
  176. package/tui/src/native-ts/file-index/index.ts +33 -3
  177. package/tui/src/observability/surface.ts +2 -2
  178. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  179. package/tui/src/projectOnboardingState.ts +7 -6
  180. package/tui/src/query/chatMessageTypes.ts +18 -0
  181. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  182. package/tui/src/query/deps.ts +1 -1
  183. package/tui/src/query/messageGuards.ts +106 -0
  184. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  185. package/tui/src/query/run.ts +1075 -0
  186. package/tui/src/query/supportBoundary.ts +168 -0
  187. package/tui/src/query/toolResultErrors.ts +103 -0
  188. package/tui/src/query/toolRunner.ts +687 -0
  189. package/tui/src/query/unavailableToolRepair.ts +118 -0
  190. package/tui/src/query.ts +9 -2186
  191. package/tui/src/screens/REPL.tsx +40 -29
  192. package/tui/src/services/api/adapterManifest.ts +4 -0
  193. package/tui/src/services/api/backendChat/events.ts +117 -0
  194. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  195. package/tui/src/services/api/backendChat/frame.ts +9 -0
  196. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  197. package/tui/src/services/api/backendChat/types.ts +62 -0
  198. package/tui/src/services/api/backendChat.ts +1 -0
  199. package/tui/src/services/api/client.ts +65 -2
  200. package/tui/src/services/api/errorUtils.ts +5 -5
  201. package/tui/src/services/api/errors.ts +1 -1
  202. package/tui/src/services/api/logging.ts +1 -1
  203. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  204. package/tui/src/services/api/ummaya/messages.ts +255 -0
  205. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  206. package/tui/src/services/api/ummaya/provider.ts +200 -0
  207. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  208. package/tui/src/services/api/ummaya/request.ts +200 -0
  209. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  210. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  211. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  212. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  213. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  214. package/tui/src/services/api/ummaya/types.ts +110 -0
  215. package/tui/src/services/api/ummaya/usage.ts +30 -0
  216. package/tui/src/services/api/ummaya.ts +26 -418
  217. package/tui/src/services/api/withRetry.ts +1 -1
  218. package/tui/src/services/awaySummary.ts +2 -2
  219. package/tui/src/services/claudeAiLimits.ts +1 -1
  220. package/tui/src/services/compact/autoCompact.ts +1 -1
  221. package/tui/src/services/compact/compact.ts +1 -1
  222. package/tui/src/services/lsp/types.ts +8 -30
  223. package/tui/src/services/tips/types.ts +6 -28
  224. package/tui/src/services/tokenEstimation.ts +1 -1
  225. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  226. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  227. package/tui/src/services/tools/toolExecution.ts +94 -1
  228. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  229. package/tui/src/store/session-store.ts +10 -36
  230. package/tui/src/stubs/any-stub.ts +15 -10
  231. package/tui/src/stubs/color-diff-napi.ts +37 -23
  232. package/tui/src/stubs/globals.d.ts +3 -3
  233. package/tui/src/stubs/macro-preload.ts +23 -12
  234. package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
  235. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  236. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  237. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  238. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  239. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  240. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  241. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  242. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  243. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  244. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  245. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  246. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  247. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  248. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  249. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  250. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  251. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  252. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  253. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  254. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  255. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  256. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  257. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  258. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  259. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  260. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  261. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  262. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  263. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  264. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  265. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  266. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  267. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  268. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  269. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  270. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  271. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  272. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  273. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  274. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  275. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  276. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  277. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  278. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  279. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  280. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  281. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  282. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  283. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  284. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  285. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  286. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  287. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  288. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  289. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  290. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  291. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  292. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  293. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  294. package/tui/src/tools/BashTool/call.ts +202 -0
  295. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  296. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  297. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  298. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  299. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  300. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  301. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  302. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  303. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  304. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  305. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  306. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  307. package/tui/src/tools/BashTool/schemas.ts +65 -0
  308. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  309. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  310. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  311. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  312. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  313. package/tui/src/tools/BriefTool/upload.ts +1 -1
  314. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  315. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  316. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  317. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  318. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  319. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  320. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  321. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  322. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  323. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  324. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  325. package/tui/src/tools/FileEditTool/call.ts +228 -0
  326. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  327. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  328. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  329. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  330. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  331. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  332. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
  333. package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
  334. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  335. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  336. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  337. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  338. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  339. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  340. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  341. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  342. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  343. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  344. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  345. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  346. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  347. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  348. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  349. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  350. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  351. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  352. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  353. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  354. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  355. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  356. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
  357. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  358. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  359. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
  360. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  361. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  362. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  363. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  364. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  365. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  366. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  367. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  368. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  369. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  370. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  371. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  372. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  373. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  374. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  375. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  376. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  377. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  378. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  379. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  380. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  381. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  382. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  383. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  384. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  385. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
  386. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  387. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  388. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  389. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  390. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  391. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  392. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  393. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  394. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  395. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  396. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  397. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  398. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  399. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  400. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  401. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  402. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  403. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  404. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  405. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  406. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  407. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  408. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  409. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  410. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  411. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  412. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  413. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  414. package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
  415. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  416. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  417. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  418. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  419. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  420. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  421. package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
  422. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  423. package/tui/src/tools.ts +39 -190
  424. package/tui/src/types/fileSuggestion.ts +4 -26
  425. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  426. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  427. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  428. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  429. package/tui/src/types/message.ts +80 -102
  430. package/tui/src/types/messageQueueTypes.ts +6 -28
  431. package/tui/src/types/notebook.ts +16 -38
  432. package/tui/src/types/statusLine.ts +4 -26
  433. package/tui/src/types/tools.ts +24 -46
  434. package/tui/src/types/utils.ts +6 -28
  435. package/tui/src/upstreamproxy/relay.ts +7 -3
  436. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  437. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  438. package/tui/src/utils/auth.ts +129 -139
  439. package/tui/src/utils/bash/ast.ts +23 -23
  440. package/tui/src/utils/bash/bashParser.ts +5 -5
  441. package/tui/src/utils/billing.ts +1 -1
  442. package/tui/src/utils/collapseReadSearch.ts +3 -3
  443. package/tui/src/utils/cronTasks.ts +1 -1
  444. package/tui/src/utils/execFileNoThrow.ts +1 -1
  445. package/tui/src/utils/filePersistence/types.ts +16 -38
  446. package/tui/src/utils/forkedAgent.ts +1 -1
  447. package/tui/src/utils/gracefulShutdown.ts +4 -4
  448. package/tui/src/utils/heapDumpService.ts +12 -8
  449. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  450. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  451. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  452. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  453. package/tui/src/utils/messages.ts +18 -0
  454. package/tui/src/utils/migrateSessions.ts +3 -3
  455. package/tui/src/utils/model/model.ts +6 -6
  456. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  457. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  458. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  459. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  460. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  461. package/tui/src/utils/protectedNamespace.ts +5 -3
  462. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  463. package/tui/src/utils/ripgrep.ts +16 -7
  464. package/tui/src/utils/sessionTitle.ts +1 -1
  465. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  466. package/tui/src/utils/shell/prefix.ts +1 -1
  467. package/tui/src/utils/sideQuery.ts +1 -1
  468. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  469. package/tui/src/utils/teleport.tsx +1 -1
  470. package/uv.lock +400 -14
  471. package/tui/src/services/api/claude.ts +0 -3540
  472. package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
  473. package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
  474. package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
  475. package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
  476. package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
  477. package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
@@ -0,0 +1,169 @@
1
+ import * as React from 'react'
2
+ import { getSdkAgentProgressSummariesEnabled } from '../../bootstrap/state.js'
3
+ import {
4
+ createActivityDescriptionResolver,
5
+ createProgressTracker,
6
+ getProgressUpdate,
7
+ updateAgentProgress as updateAsyncAgentProgress,
8
+ updateProgressFromMessage,
9
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
10
+ import type { ToolUseContext } from '../../Tool.js'
11
+ import type { Message as MessageType } from '../../types/message.js'
12
+ import { normalizeMessages } from '../../utils/messages.js'
13
+ import { getAssistantMessageContentLength } from '../../utils/tokens.js'
14
+ import { BackgroundHint } from '../BashTool/UI.js'
15
+ import { emitTaskProgress, getLastToolUseName } from './agentToolProgress.js'
16
+ import {
17
+ isBackgroundTasksDisabled,
18
+ PROGRESS_THRESHOLD_MS,
19
+ } from './runtimeConfig.js'
20
+ import type { AgentToolProgressCallback } from './schemas.js'
21
+
22
+ type SetAppState = Parameters<typeof updateAsyncAgentProgress>[2]
23
+ export type AssistantProgressSource = {
24
+ readonly requestId?: string
25
+ readonly message?: { readonly id?: string }
26
+ }
27
+
28
+ export function emitInitialProgress(
29
+ promptMessages: MessageType[],
30
+ prompt: string,
31
+ syncAgentId: string,
32
+ assistantMessage: AssistantProgressSource | undefined,
33
+ onProgress: AgentToolProgressCallback | undefined,
34
+ ): void {
35
+ if (promptMessages.length === 0 || !onProgress) return
36
+ const normalizedFirstMessage = normalizeMessages(promptMessages).find(
37
+ message => message.type === 'user',
38
+ )
39
+ if (!normalizedFirstMessage) return
40
+ onProgress({
41
+ toolUseID: `agent_${assistantMessage?.message?.id}`,
42
+ data: {
43
+ message: normalizedFirstMessage,
44
+ type: 'agent_progress',
45
+ prompt,
46
+ agentId: syncAgentId,
47
+ },
48
+ })
49
+ }
50
+
51
+ export function showBackgroundHintIfNeeded(
52
+ backgroundHintShown: boolean,
53
+ agentStartTime: number,
54
+ toolUseContext: ToolUseContext,
55
+ ): boolean {
56
+ if (
57
+ isBackgroundTasksDisabled ||
58
+ backgroundHintShown ||
59
+ Date.now() - agentStartTime < PROGRESS_THRESHOLD_MS ||
60
+ !toolUseContext.setToolJSX
61
+ ) {
62
+ return backgroundHintShown
63
+ }
64
+ toolUseContext.setToolJSX({
65
+ jsx: React.createElement(BackgroundHint),
66
+ shouldHidePromptInput: false,
67
+ shouldContinueAnimation: true,
68
+ showSpinner: true,
69
+ })
70
+ return true
71
+ }
72
+
73
+ export function emitMessageProgress({
74
+ message,
75
+ syncTracker,
76
+ syncResolveActivity,
77
+ foregroundTaskId,
78
+ toolUseContext,
79
+ rootSetAppState,
80
+ description,
81
+ agentStartTime,
82
+ syncAgentId,
83
+ assistantMessage,
84
+ onProgress,
85
+ }: {
86
+ readonly message: MessageType
87
+ readonly syncTracker: ReturnType<typeof createProgressTracker>
88
+ readonly syncResolveActivity: ReturnType<typeof createActivityDescriptionResolver>
89
+ readonly foregroundTaskId?: string
90
+ readonly toolUseContext: ToolUseContext
91
+ readonly rootSetAppState: SetAppState
92
+ readonly description: string
93
+ readonly agentStartTime: number
94
+ readonly syncAgentId: string
95
+ readonly assistantMessage: AssistantProgressSource | undefined
96
+ readonly onProgress: AgentToolProgressCallback | undefined
97
+ }): void {
98
+ updateProgressFromMessage(
99
+ syncTracker,
100
+ message,
101
+ syncResolveActivity,
102
+ toolUseContext.options.tools,
103
+ )
104
+ if (foregroundTaskId) {
105
+ const lastToolName = getLastToolUseName(message)
106
+ if (lastToolName) {
107
+ emitTaskProgress(
108
+ syncTracker,
109
+ foregroundTaskId,
110
+ toolUseContext.toolUseId,
111
+ description,
112
+ agentStartTime,
113
+ lastToolName,
114
+ )
115
+ if (getSdkAgentProgressSummariesEnabled()) {
116
+ updateAsyncAgentProgress(
117
+ foregroundTaskId,
118
+ getProgressUpdate(syncTracker),
119
+ rootSetAppState,
120
+ )
121
+ }
122
+ }
123
+ }
124
+ if (
125
+ message.type === 'progress' &&
126
+ (message.data.type === 'bash_progress' ||
127
+ message.data.type === 'powershell_progress') &&
128
+ onProgress
129
+ ) {
130
+ onProgress({ toolUseID: message.toolUseID, data: message.data })
131
+ }
132
+ if (message.type !== 'assistant' && message.type !== 'user') return
133
+ if (message.type === 'assistant') {
134
+ const contentLength = getAssistantMessageContentLength(message)
135
+ if (contentLength > 0) {
136
+ toolUseContext.setResponseLength(length => length + contentLength)
137
+ }
138
+ }
139
+ emitNormalizedToolProgress(
140
+ message,
141
+ {
142
+ syncAgentId,
143
+ toolUseID: `agent_${assistantMessage?.message?.id}`,
144
+ },
145
+ onProgress,
146
+ )
147
+ }
148
+
149
+ function emitNormalizedToolProgress(
150
+ message: MessageType,
151
+ progressTarget: { readonly syncAgentId: string; readonly toolUseID: string },
152
+ onProgress: AgentToolProgressCallback | undefined,
153
+ ): void {
154
+ if (!onProgress) return
155
+ for (const normalizedMessage of normalizeMessages([message])) {
156
+ for (const content of normalizedMessage.message.content) {
157
+ if (content.type !== 'tool_use' && content.type !== 'tool_result') continue
158
+ onProgress({
159
+ toolUseID: progressTarget.toolUseID,
160
+ data: {
161
+ message: normalizedMessage,
162
+ type: 'agent_progress',
163
+ prompt: '',
164
+ agentId: progressTarget.syncAgentId,
165
+ },
166
+ })
167
+ }
168
+ }
169
+ }
@@ -0,0 +1,89 @@
1
+ import type { AppState } from '../../state/AppState.js'
2
+ import type { ToolUseContext } from '../../Tool.js'
3
+ import {
4
+ createProgressTracker,
5
+ getProgressUpdate,
6
+ registerAgentForeground,
7
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
8
+ import { enqueueSdkEvent } from '../../utils/sdkEventQueue.js'
9
+ import type { AgentDefinition } from './loadAgentsDir.js'
10
+ import {
11
+ getAutoBackgroundMs,
12
+ isBackgroundTasksDisabled,
13
+ } from './runtimeConfig.js'
14
+
15
+ type SetAppState = (f: (prev: AppState) => AppState) => void
16
+
17
+ export type ForegroundTaskRuntime = {
18
+ readonly taskId?: string
19
+ readonly backgroundPromise?: Promise<{ readonly type: 'background' }>
20
+ readonly cancelAutoBackground?: () => void
21
+ }
22
+
23
+ export function setupForegroundTask({
24
+ syncAgentId,
25
+ selectedAgent,
26
+ description,
27
+ prompt,
28
+ rootSetAppState,
29
+ toolUseContext,
30
+ }: {
31
+ readonly syncAgentId: string
32
+ readonly selectedAgent: AgentDefinition
33
+ readonly description: string
34
+ readonly prompt: string
35
+ readonly rootSetAppState: SetAppState
36
+ readonly toolUseContext: ToolUseContext
37
+ }): ForegroundTaskRuntime {
38
+ if (isBackgroundTasksDisabled) return {}
39
+ const registration = registerAgentForeground({
40
+ agentId: syncAgentId,
41
+ description,
42
+ prompt,
43
+ selectedAgent,
44
+ setAppState: rootSetAppState,
45
+ toolUseId: toolUseContext.toolUseId,
46
+ autoBackgroundMs: getAutoBackgroundMs() || undefined,
47
+ })
48
+ return {
49
+ taskId: registration.taskId,
50
+ backgroundPromise: registration.backgroundSignal.then(() => ({
51
+ type: 'background',
52
+ })),
53
+ cancelAutoBackground: registration.cancelAutoBackground,
54
+ }
55
+ }
56
+
57
+ export function enqueueCompletionSdkEvent({
58
+ foregroundTaskId,
59
+ toolUseContext,
60
+ syncTracker,
61
+ syncAgentError,
62
+ wasAborted,
63
+ description,
64
+ agentStartTime,
65
+ }: {
66
+ readonly foregroundTaskId: string
67
+ readonly toolUseContext: ToolUseContext
68
+ readonly syncTracker: ReturnType<typeof createProgressTracker>
69
+ readonly syncAgentError?: Error
70
+ readonly wasAborted: boolean
71
+ readonly description: string
72
+ readonly agentStartTime: number
73
+ }): void {
74
+ const progress = getProgressUpdate(syncTracker)
75
+ enqueueSdkEvent({
76
+ type: 'system',
77
+ subtype: 'task_notification',
78
+ task_id: foregroundTaskId,
79
+ tool_use_id: toolUseContext.toolUseId,
80
+ status: syncAgentError ? 'failed' : wasAborted ? 'stopped' : 'completed',
81
+ output_file: '',
82
+ summary: description,
83
+ usage: {
84
+ total_tokens: progress.tokenCount,
85
+ tool_uses: progress.toolUseCount,
86
+ duration_ms: Date.now() - agentStartTime,
87
+ },
88
+ })
89
+ }
@@ -1,12 +1,9 @@
1
- import { feature } from 'bun:bundle'
2
1
  import type { BetaToolUseBlock } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'
3
2
  import { randomUUID } from 'crypto'
4
- import { getIsNonInteractiveSession } from '../../bootstrap/state.js'
5
3
  import {
6
4
  FORK_BOILERPLATE_TAG,
7
5
  FORK_DIRECTIVE_PREFIX,
8
6
  } from '../../constants/xml.js'
9
- import { isCoordinatorMode } from '../../coordinator/coordinatorMode.js'
10
7
  import type {
11
8
  AssistantMessage,
12
9
  Message as MessageType,
@@ -14,6 +11,7 @@ import type {
14
11
  import { logForDebugging } from '../../utils/debug.js'
15
12
  import { createUserMessage } from '../../utils/messages.js'
16
13
  import type { BuiltInAgentDefinition } from './loadAgentsDir.js'
14
+ export { isForkSubagentEnabled } from './forkSubagentGate.js'
17
15
 
18
16
  /**
19
17
  * Fork subagent feature gate.
@@ -29,15 +27,6 @@ import type { BuiltInAgentDefinition } from './loadAgentsDir.js'
29
27
  * Mutually exclusive with coordinator mode — coordinator already owns the
30
28
  * orchestration role and has its own delegation model.
31
29
  */
32
- export function isForkSubagentEnabled(): boolean {
33
- if (feature('FORK_SUBAGENT')) {
34
- if (isCoordinatorMode()) return false
35
- if (getIsNonInteractiveSession()) return false
36
- return true
37
- }
38
- return false
39
- }
40
-
41
30
  /** Synthetic agent type name used for analytics when the fork path fires. */
42
31
  export const FORK_SUBAGENT_TYPE = 'fork'
43
32
 
@@ -0,0 +1,34 @@
1
+ import { feature } from 'bun:bundle'
2
+ import { getIsNonInteractiveSession } from '../../bootstrap/state.js'
3
+ import { isCoordinatorMode } from '../../coordinator/coordinatorMode.js'
4
+ import {
5
+ isEnvDefinedFalsy,
6
+ isEnvTruthy,
7
+ } from '../../utils/envUtils.js'
8
+
9
+ function readFeatureBoolean(value: string | undefined): boolean | undefined {
10
+ if (isEnvTruthy(value)) return true
11
+ if (isEnvDefinedFalsy(value)) return false
12
+ return undefined
13
+ }
14
+
15
+ function isForkSubagentFeatureEnabled(): boolean {
16
+ const ummayaOverride = readFeatureBoolean(
17
+ process.env.UMMAYA_FEATURE_FORK_SUBAGENT,
18
+ )
19
+ if (ummayaOverride !== undefined) return ummayaOverride
20
+
21
+ const claudeOverride = readFeatureBoolean(
22
+ process.env.CLAUDE_CODE_FEATURE_FORK_SUBAGENT,
23
+ )
24
+ return claudeOverride ?? (feature('FORK_SUBAGENT') ? true : false)
25
+ }
26
+
27
+ export function isForkSubagentEnabled(): boolean {
28
+ if (isForkSubagentFeatureEnabled()) {
29
+ if (isCoordinatorMode()) return false
30
+ if (getIsNonInteractiveSession()) return false
31
+ return true
32
+ }
33
+ return false
34
+ }
@@ -0,0 +1,203 @@
1
+ import type { AssistantMessage } from 'src/types/message.js'
2
+ import type { AppState } from '../../state/AppState.js'
3
+ import type { ToolPermissionContext, Tools, ToolUseContext } from '../../Tool.js'
4
+ import { filterDeniedAgents, getDenyRuleForAgent } from '../../utils/permissions/permissions.js'
5
+ import { isAgentSwarmsEnabled } from '../../utils/agentSwarmsEnabled.js'
6
+ import { isInProcessTeammate } from '../../utils/teammateContext.js'
7
+ import { isTeammate } from '../../utils/teammate.js'
8
+ import { setAgentColor } from './agentColorManager.js'
9
+ import { buildAgentSupportMetadata } from './orchestrationSupport.js'
10
+ import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
11
+ import { AGENT_TOOL_NAME } from './constants.js'
12
+ import {
13
+ FORK_AGENT,
14
+ isForkSubagentEnabled,
15
+ isInForkChild,
16
+ } from './forkSubagent.js'
17
+ import type { AgentDefinition } from './loadAgentsDir.js'
18
+ import { filterAgentsByMcpRequirements } from './loadAgentsDir.js'
19
+ import { mcpServersWithTools, waitForRequiredMcpServers } from './mcpRouting.js'
20
+ import { getPrompt } from './prompt.js'
21
+ import type {
22
+ AgentToolCallResult,
23
+ AgentToolInput,
24
+ TeammateSpawnedOutput,
25
+ } from './schemas.js'
26
+ import { isCoordinatorEnvMode } from './runtimeConfig.js'
27
+
28
+ export type SelectedAgentRoute = {
29
+ readonly selectedAgent: AgentDefinition
30
+ readonly isForkPath: boolean
31
+ }
32
+
33
+ export async function buildAgentToolPrompt({
34
+ agents,
35
+ tools,
36
+ getToolPermissionContext,
37
+ allowedAgentTypes,
38
+ }: {
39
+ readonly agents: readonly AgentDefinition[]
40
+ readonly tools: Tools
41
+ readonly getToolPermissionContext: () => Promise<ToolPermissionContext>
42
+ readonly allowedAgentTypes?: readonly string[]
43
+ }): Promise<string> {
44
+ const toolPermissionContext = await getToolPermissionContext()
45
+ const filteredAgents = filterDeniedAgents(
46
+ filterAgentsByMcpRequirements(agents, mcpServersWithTools(tools)),
47
+ toolPermissionContext,
48
+ AGENT_TOOL_NAME,
49
+ )
50
+ return getPrompt(filteredAgents, isCoordinatorEnvMode(), allowedAgentTypes)
51
+ }
52
+
53
+ export function resolveTeamName(
54
+ input: Pick<AgentToolInput, 'team_name'>,
55
+ appState: Pick<AppState, 'teamContext'>,
56
+ ): string | undefined {
57
+ if (!isAgentSwarmsEnabled()) return undefined
58
+ return input.team_name ?? appState.teamContext?.teamName
59
+ }
60
+
61
+ export function assertAgentLaunchAllowed({
62
+ input,
63
+ selectedAgent,
64
+ teamName,
65
+ }: {
66
+ readonly input: AgentToolInput
67
+ readonly selectedAgent?: AgentDefinition
68
+ readonly teamName?: string
69
+ }): void {
70
+ if (input.team_name && !isAgentSwarmsEnabled()) {
71
+ throw new Error('Agent Teams is not yet available on your plan.')
72
+ }
73
+ if (isTeammate() && teamName && input.name) {
74
+ throw new Error(
75
+ 'Teammates cannot spawn other teammates — the team roster is flat. To spawn a subagent instead, omit the `name` parameter.',
76
+ )
77
+ }
78
+ if (isInProcessTeammate() && teamName && input.run_in_background === true) {
79
+ throw new Error(
80
+ 'In-process teammates cannot spawn background agents. Use run_in_background=false for synchronous subagents.',
81
+ )
82
+ }
83
+ if (isInProcessTeammate() && teamName && selectedAgent?.background === true) {
84
+ throw new Error(
85
+ `In-process teammates cannot spawn background agents. Agent '${selectedAgent.agentType}' has background: true in its definition.`,
86
+ )
87
+ }
88
+ }
89
+
90
+ export async function launchTeammateIfRequested({
91
+ input,
92
+ teamName,
93
+ model,
94
+ toolUseContext,
95
+ assistantMessage,
96
+ }: {
97
+ readonly input: AgentToolInput
98
+ readonly teamName?: string
99
+ readonly model?: string
100
+ readonly toolUseContext: ToolUseContext
101
+ readonly assistantMessage?: AssistantMessage
102
+ }): Promise<AgentToolCallResult | undefined> {
103
+ if (!teamName || !input.name) return undefined
104
+ const agentDef = input.subagent_type
105
+ ? toolUseContext.options.agentDefinitions.activeAgents.find(
106
+ agent => agent.agentType === input.subagent_type,
107
+ )
108
+ : undefined
109
+ if (agentDef?.color) {
110
+ setAgentColor(input.subagent_type, agentDef.color)
111
+ }
112
+ const { spawnTeammate } = await import('../shared/spawnMultiAgent.js')
113
+ const result = await spawnTeammate(
114
+ {
115
+ name: input.name,
116
+ prompt: input.prompt,
117
+ description: input.description,
118
+ team_name: teamName,
119
+ use_splitpane: true,
120
+ plan_mode_required: input.mode === 'plan',
121
+ model: model ?? agentDef?.model,
122
+ agent_type: input.subagent_type,
123
+ invokingRequestId: assistantMessage?.requestId,
124
+ },
125
+ toolUseContext,
126
+ )
127
+ const spawnResult: TeammateSpawnedOutput = {
128
+ status: 'teammate_spawned',
129
+ prompt: input.prompt,
130
+ ...result.data,
131
+ ...buildAgentSupportMetadata({
132
+ agentId: result.data.agent_id,
133
+ parentToolUseId: toolUseContext.toolUseId,
134
+ }),
135
+ }
136
+ return { data: spawnResult }
137
+ }
138
+
139
+ export async function resolveSelectedAgentRoute({
140
+ input,
141
+ toolUseContext,
142
+ appState,
143
+ }: {
144
+ readonly input: AgentToolInput
145
+ readonly toolUseContext: ToolUseContext
146
+ readonly appState: AppState
147
+ }): Promise<SelectedAgentRoute> {
148
+ const effectiveType =
149
+ input.subagent_type ??
150
+ (isForkSubagentEnabled() ? undefined : GENERAL_PURPOSE_AGENT.agentType)
151
+ const isForkPath = effectiveType === undefined
152
+ const selectedAgent = isForkPath
153
+ ? resolveForkAgent(toolUseContext)
154
+ : resolveNamedAgent(effectiveType, toolUseContext, appState)
155
+
156
+ await waitForRequiredMcpServers(selectedAgent, toolUseContext, appState)
157
+ if (selectedAgent.color) setAgentColor(selectedAgent.agentType, selectedAgent.color)
158
+ return { selectedAgent, isForkPath }
159
+ }
160
+
161
+ function resolveForkAgent(toolUseContext: ToolUseContext): AgentDefinition {
162
+ if (
163
+ toolUseContext.options.querySource === `agent:builtin:${FORK_AGENT.agentType}` ||
164
+ isInForkChild(toolUseContext.messages)
165
+ ) {
166
+ throw new Error(
167
+ 'Fork is not available inside a forked worker. Complete your task directly using your tools.',
168
+ )
169
+ }
170
+ return FORK_AGENT
171
+ }
172
+
173
+ function resolveNamedAgent(
174
+ effectiveType: string,
175
+ toolUseContext: ToolUseContext,
176
+ appState: AppState,
177
+ ): AgentDefinition {
178
+ const allAgents = toolUseContext.options.agentDefinitions.activeAgents
179
+ const allowedAgentTypes = toolUseContext.options.agentDefinitions.allowedAgentTypes
180
+ const visibleAgents = filterDeniedAgents(
181
+ allowedAgentTypes
182
+ ? allAgents.filter(agent => allowedAgentTypes.includes(agent.agentType))
183
+ : allAgents,
184
+ appState.toolPermissionContext,
185
+ AGENT_TOOL_NAME,
186
+ )
187
+ const found = visibleAgents.find(agent => agent.agentType === effectiveType)
188
+ if (found) return found
189
+ const denied = allAgents.find(agent => agent.agentType === effectiveType)
190
+ if (denied) {
191
+ const denyRule = getDenyRuleForAgent(
192
+ appState.toolPermissionContext,
193
+ AGENT_TOOL_NAME,
194
+ effectiveType,
195
+ )
196
+ throw new Error(
197
+ `Agent type '${effectiveType}' has been denied by permission rule '${AGENT_TOOL_NAME}(${effectiveType})' from ${denyRule?.source ?? 'settings'}.`,
198
+ )
199
+ }
200
+ throw new Error(
201
+ `Agent type '${effectiveType}' not found. Available agents: ${visibleAgents.map(agent => agent.agentType).join(', ')}`,
202
+ )
203
+ }