ummaya 0.2.4 → 0.2.6

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