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,83 @@
1
+ import {
2
+ isLocalAgentTask,
3
+ updateAgentProgress as updateAsyncAgentProgress,
4
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
5
+ import type { ToolUseContext } from '../../Tool.js'
6
+ import type { Message as MessageType } from '../../types/message.js'
7
+ import { getTaskOutputPath } from '../../utils/task/diskOutput.js'
8
+ import { buildAgentSupportMetadata } from './orchestrationSupport.js'
9
+ import { continueForegroundAgentInBackground } from './backgroundedLifecycle.js'
10
+ import { canReadAgentOutputFile } from './asyncLifecycle.js'
11
+ import type { AgentDefinition } from './loadAgentsDir.js'
12
+ import { runAgent } from './runAgent.js'
13
+ import type {
14
+ AgentLifecycleMetadata,
15
+ AsyncLaunchedOutput,
16
+ WorktreeResult,
17
+ } from './schemas.js'
18
+
19
+ type SetAppState = Parameters<typeof updateAsyncAgentProgress>[2]
20
+ type RunAgentParams = Parameters<typeof runAgent>[0]
21
+ type SyncAgentContext = Parameters<typeof continueForegroundAgentInBackground>[0]['syncAgentContext']
22
+
23
+ export function maybeBackgroundAgent({
24
+ foregroundTaskId,
25
+ agentIterator,
26
+ agentMessages,
27
+ toolUseContext,
28
+ rootSetAppState,
29
+ description,
30
+ prompt,
31
+ syncAgentId,
32
+ runAgentParams,
33
+ metadata,
34
+ getWorktreeResult,
35
+ syncAgentContext,
36
+ stopForegroundSummarization,
37
+ }: {
38
+ readonly foregroundTaskId: string
39
+ readonly agentIterator: AsyncIterator<MessageType>
40
+ readonly agentMessages: MessageType[]
41
+ readonly toolUseContext: ToolUseContext
42
+ readonly rootSetAppState: SetAppState
43
+ readonly description: string
44
+ readonly prompt: string
45
+ readonly syncAgentId: string
46
+ readonly selectedAgent: AgentDefinition
47
+ readonly runAgentParams: RunAgentParams
48
+ readonly metadata: AgentLifecycleMetadata
49
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
50
+ readonly syncAgentContext: SyncAgentContext
51
+ readonly stopForegroundSummarization: () => void
52
+ }): AsyncLaunchedOutput | undefined {
53
+ const task = toolUseContext.getAppState().tasks[foregroundTaskId]
54
+ if (!isLocalAgentTask(task) || !task.isBackgrounded) return undefined
55
+ stopForegroundSummarization()
56
+ continueForegroundAgentInBackground({
57
+ backgroundedTaskId: foregroundTaskId,
58
+ task,
59
+ syncAgentContext,
60
+ agentIterator,
61
+ agentMessages,
62
+ runAgentParams,
63
+ rootSetAppState,
64
+ toolUseContext,
65
+ metadata,
66
+ description,
67
+ syncAgentId,
68
+ getWorktreeResult,
69
+ })
70
+ return {
71
+ isAsync: true,
72
+ status: 'async_launched',
73
+ agentId: foregroundTaskId,
74
+ description,
75
+ prompt,
76
+ outputFile: getTaskOutputPath(foregroundTaskId),
77
+ canReadOutputFile: canReadAgentOutputFile(toolUseContext.options.tools),
78
+ ...buildAgentSupportMetadata({
79
+ agentId: foregroundTaskId,
80
+ parentToolUseId: toolUseContext.toolUseId,
81
+ }),
82
+ }
83
+ }
@@ -0,0 +1,133 @@
1
+ import {
2
+ createActivityDescriptionResolver,
3
+ createProgressTracker,
4
+ updateAgentProgress as updateAsyncAgentProgress,
5
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
6
+ import type { ToolUseContext } from '../../Tool.js'
7
+ import type { Message as MessageType } from '../../types/message.js'
8
+ import type { ForegroundTaskRuntime } from './foregroundTask.js'
9
+ import type { AgentDefinition } from './loadAgentsDir.js'
10
+ import { runAgent } from './runAgent.js'
11
+ import { maybeBackgroundAgent } from './foregroundBackground.js'
12
+ import {
13
+ emitMessageProgress,
14
+ showBackgroundHintIfNeeded,
15
+ type AssistantProgressSource,
16
+ } from './foregroundProgress.js'
17
+ import type {
18
+ AgentLifecycleMetadata,
19
+ AgentToolProgressCallback,
20
+ AsyncLaunchedOutput,
21
+ WorktreeResult,
22
+ } from './schemas.js'
23
+
24
+ type SetAppState = Parameters<typeof updateAsyncAgentProgress>[2]
25
+ type RunAgentParams = Parameters<typeof runAgent>[0]
26
+ type SyncAgentContext = Parameters<typeof maybeBackgroundAgent>[0]['syncAgentContext']
27
+
28
+ export async function drainForegroundMessages({
29
+ agentIterator,
30
+ agentMessages,
31
+ agentStartTime,
32
+ syncTracker,
33
+ syncResolveActivity,
34
+ foreground,
35
+ toolUseContext,
36
+ rootSetAppState,
37
+ description,
38
+ prompt,
39
+ syncAgentId,
40
+ selectedAgent,
41
+ runAgentParams,
42
+ metadata,
43
+ assistantMessage,
44
+ onProgress,
45
+ getWorktreeResult,
46
+ syncAgentContext,
47
+ stopForegroundSummarization,
48
+ }: {
49
+ readonly agentIterator: AsyncIterator<MessageType>
50
+ readonly agentMessages: MessageType[]
51
+ readonly agentStartTime: number
52
+ readonly syncTracker: ReturnType<typeof createProgressTracker>
53
+ readonly syncResolveActivity: ReturnType<typeof createActivityDescriptionResolver>
54
+ readonly foreground: ForegroundTaskRuntime
55
+ readonly toolUseContext: ToolUseContext
56
+ readonly rootSetAppState: SetAppState
57
+ readonly description: string
58
+ readonly prompt: string
59
+ readonly syncAgentId: string
60
+ readonly selectedAgent: AgentDefinition
61
+ readonly runAgentParams: RunAgentParams
62
+ readonly metadata: AgentLifecycleMetadata
63
+ readonly assistantMessage: AssistantProgressSource | undefined
64
+ readonly onProgress: AgentToolProgressCallback | undefined
65
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
66
+ readonly syncAgentContext: SyncAgentContext
67
+ readonly stopForegroundSummarization: () => void
68
+ }): Promise<AsyncLaunchedOutput | undefined> {
69
+ let backgroundHintShown = false
70
+ while (true) {
71
+ backgroundHintShown = showBackgroundHintIfNeeded(
72
+ backgroundHintShown,
73
+ agentStartTime,
74
+ toolUseContext,
75
+ )
76
+ const raceResult = await nextForegroundRace(agentIterator, foreground)
77
+ if (raceResult.type === 'background' && foreground.taskId) {
78
+ const backgrounded = maybeBackgroundAgent({
79
+ foregroundTaskId: foreground.taskId,
80
+ agentIterator,
81
+ agentMessages,
82
+ toolUseContext,
83
+ rootSetAppState,
84
+ description,
85
+ prompt,
86
+ syncAgentId,
87
+ selectedAgent,
88
+ runAgentParams,
89
+ metadata,
90
+ getWorktreeResult,
91
+ syncAgentContext,
92
+ stopForegroundSummarization,
93
+ })
94
+ if (backgrounded) return backgrounded
95
+ continue
96
+ }
97
+ if (raceResult.type !== 'message') continue
98
+ if (raceResult.result.done) break
99
+ const message = raceResult.result.value
100
+ agentMessages.push(message)
101
+ emitMessageProgress({
102
+ message,
103
+ syncTracker,
104
+ syncResolveActivity,
105
+ foregroundTaskId: foreground.taskId,
106
+ toolUseContext,
107
+ rootSetAppState,
108
+ description,
109
+ agentStartTime,
110
+ syncAgentId,
111
+ assistantMessage,
112
+ onProgress,
113
+ })
114
+ }
115
+ return undefined
116
+ }
117
+
118
+ async function nextForegroundRace(
119
+ agentIterator: AsyncIterator<MessageType>,
120
+ foreground: ForegroundTaskRuntime,
121
+ ): Promise<
122
+ | { readonly type: 'background' }
123
+ | { readonly type: 'message'; readonly result: IteratorResult<MessageType, void> }
124
+ > {
125
+ const nextMessagePromise = agentIterator.next()
126
+ if (!foreground.backgroundPromise) {
127
+ return { type: 'message', result: await nextMessagePromise }
128
+ }
129
+ return Promise.race([
130
+ nextMessagePromise.then(result => ({ type: 'message' as const, result })),
131
+ foreground.backgroundPromise,
132
+ ])
133
+ }
@@ -0,0 +1,98 @@
1
+ import { feature } from 'bun:bundle'
2
+ import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from '../../services/analytics/index.js'
3
+ import type { ToolUseContext } from '../../Tool.js'
4
+ import type { Message as MessageType } from '../../types/message.js'
5
+ import { AbortError } from '../../utils/errors.js'
6
+ import { logForDebugging } from '../../utils/debug.js'
7
+ import { isSyntheticMessage } from '../../utils/messages.js'
8
+ import { classifyHandoffIfNeeded } from './agentToolHandoff.js'
9
+ import { finalizeAgentTool } from './agentToolResult.js'
10
+ import { buildAgentSupportMetadata } from './orchestrationSupport.js'
11
+ import type { AgentDefinition } from './loadAgentsDir.js'
12
+ import type {
13
+ AgentLifecycleMetadata,
14
+ AgentToolCallResult,
15
+ WorktreeResult,
16
+ } from './schemas.js'
17
+
18
+ export function logTermination(
19
+ metadata: AgentLifecycleMetadata,
20
+ isAsync: boolean,
21
+ reason: 'user_cancel_sync' | 'user_cancel_background',
22
+ ): void {
23
+ logEvent('tengu_agent_tool_terminated', {
24
+ agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
25
+ model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
26
+ duration_ms: Date.now() - metadata.startTime,
27
+ is_async: isAsync,
28
+ is_built_in_agent: metadata.isBuiltInAgent,
29
+ reason: reason as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
30
+ })
31
+ }
32
+
33
+ export async function finalizeSyncAgent({
34
+ agentMessages,
35
+ syncAgentError,
36
+ metadata,
37
+ selectedAgent,
38
+ toolUseContext,
39
+ prompt,
40
+ syncAgentId,
41
+ worktreeResult,
42
+ }: {
43
+ readonly agentMessages: MessageType[]
44
+ readonly syncAgentError?: Error
45
+ readonly metadata: AgentLifecycleMetadata
46
+ readonly selectedAgent: AgentDefinition
47
+ readonly toolUseContext: ToolUseContext
48
+ readonly prompt: string
49
+ readonly syncAgentId: string
50
+ readonly worktreeResult: WorktreeResult
51
+ }): Promise<AgentToolCallResult> {
52
+ const lastMessage = agentMessages.findLast(
53
+ message => message.type !== 'system' && message.type !== 'progress',
54
+ )
55
+ if (lastMessage && isSyntheticMessage(lastMessage)) {
56
+ logTermination(metadata, false, 'user_cancel_sync')
57
+ throw new AbortError()
58
+ }
59
+
60
+ if (syncAgentError) {
61
+ const hasAssistantMessages = agentMessages.some(
62
+ message => message.type === 'assistant',
63
+ )
64
+ if (!hasAssistantMessages) throw syncAgentError
65
+ logForDebugging(
66
+ `Sync agent recovering from error with ${agentMessages.length} messages`,
67
+ )
68
+ }
69
+ const agentResult = finalizeAgentTool(agentMessages, syncAgentId, metadata)
70
+ if (feature('TRANSCRIPT_CLASSIFIER')) {
71
+ const handoffWarning = await classifyHandoffIfNeeded({
72
+ agentMessages,
73
+ tools: toolUseContext.options.tools,
74
+ toolPermissionContext: toolUseContext.getAppState().toolPermissionContext,
75
+ abortSignal: toolUseContext.abortController.signal,
76
+ subagentType: selectedAgent.agentType,
77
+ totalToolUseCount: agentResult.totalToolUseCount,
78
+ })
79
+ if (handoffWarning) {
80
+ agentResult.content = [
81
+ { type: 'text', text: handoffWarning },
82
+ ...agentResult.content,
83
+ ]
84
+ }
85
+ }
86
+ return {
87
+ data: {
88
+ status: 'completed',
89
+ prompt,
90
+ ...agentResult,
91
+ ...worktreeResult,
92
+ ...buildAgentSupportMetadata({
93
+ agentId: syncAgentId,
94
+ parentToolUseId: toolUseContext.toolUseId,
95
+ }),
96
+ },
97
+ }
98
+ }
@@ -0,0 +1,237 @@
1
+ import { clearInvokedSkillsForAgent, getSdkAgentProgressSummariesEnabled } from '../../bootstrap/state.js'
2
+ import { startAgentSummarization } from '../../services/AgentSummary/agentSummary.js'
3
+ import { clearDumpState } from '../../services/api/dumpPrompts.js'
4
+ import type { AppState } from '../../state/AppState.js'
5
+ import {
6
+ createActivityDescriptionResolver,
7
+ createProgressTracker,
8
+ unregisterAgentForeground,
9
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
10
+ import type { ToolUseContext } from '../../Tool.js'
11
+ import { runWithAgentContext } from '../../utils/agentContext.js'
12
+ import { runWithCwdOverride } from '../../utils/cwd.js'
13
+ import { logForDebugging } from '../../utils/debug.js'
14
+ import { AbortError, errorMessage, toError } from '../../utils/errors.js'
15
+ import type { CacheSafeParams } from '../../utils/forkedAgent.js'
16
+ import { getParentSessionId } from '../../utils/teammate.js'
17
+ import type { AgentDefinition } from './loadAgentsDir.js'
18
+ import { isBuiltInAgent } from './loadAgentsDir.js'
19
+ import { runAgent } from './runAgent.js'
20
+ import { drainForegroundMessages } from './foregroundDrain.js'
21
+ import { finalizeSyncAgent, logTermination } from './foregroundFinalize.js'
22
+ import { emitInitialProgress } from './foregroundProgress.js'
23
+ import {
24
+ enqueueCompletionSdkEvent,
25
+ setupForegroundTask,
26
+ } from './foregroundTask.js'
27
+ import type {
28
+ AgentLifecycleMetadata,
29
+ AgentToolCallResult,
30
+ AgentToolProgressCallback,
31
+ WorktreeResult,
32
+ } from './schemas.js'
33
+
34
+ type SetAppState = (f: (prev: AppState) => AppState) => void
35
+ type RunAgentParams = Parameters<typeof runAgent>[0]
36
+ type AssistantProgressSource = {
37
+ readonly requestId?: string
38
+ readonly message?: { readonly id?: string }
39
+ }
40
+
41
+ export async function launchSyncAgent({
42
+ syncAgentId,
43
+ selectedAgent,
44
+ prompt,
45
+ promptMessages,
46
+ description,
47
+ runAgentParams,
48
+ toolUseContext,
49
+ rootSetAppState,
50
+ metadata,
51
+ assistantMessage,
52
+ cwdOverridePath,
53
+ onProgress,
54
+ getWorktreeResult,
55
+ }: {
56
+ readonly syncAgentId: string
57
+ readonly selectedAgent: AgentDefinition
58
+ readonly prompt: string
59
+ readonly promptMessages: RunAgentParams['promptMessages']
60
+ readonly description: string
61
+ readonly runAgentParams: RunAgentParams
62
+ readonly toolUseContext: ToolUseContext
63
+ readonly rootSetAppState: SetAppState
64
+ readonly metadata: AgentLifecycleMetadata
65
+ readonly assistantMessage?: AssistantProgressSource
66
+ readonly cwdOverridePath?: string
67
+ readonly onProgress?: AgentToolProgressCallback
68
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
69
+ }): Promise<AgentToolCallResult> {
70
+ const syncAgentContext = {
71
+ agentId: syncAgentId,
72
+ parentSessionId: getParentSessionId(),
73
+ agentType: 'subagent' as const,
74
+ subagentName: selectedAgent.agentType,
75
+ isBuiltIn: isBuiltInAgent(selectedAgent),
76
+ invokingRequestId: assistantMessage?.requestId,
77
+ invocationKind: 'spawn' as const,
78
+ invocationEmitted: false,
79
+ }
80
+ return runWithAgentContext(syncAgentContext, () =>
81
+ withCwd(cwdOverridePath, () =>
82
+ runForegroundLoop({
83
+ syncAgentId,
84
+ selectedAgent,
85
+ prompt,
86
+ promptMessages,
87
+ description,
88
+ runAgentParams,
89
+ toolUseContext,
90
+ rootSetAppState,
91
+ metadata,
92
+ assistantMessage,
93
+ onProgress,
94
+ getWorktreeResult,
95
+ syncAgentContext,
96
+ }),
97
+ ),
98
+ )
99
+ }
100
+
101
+ async function runForegroundLoop({
102
+ syncAgentId,
103
+ selectedAgent,
104
+ prompt,
105
+ promptMessages,
106
+ description,
107
+ runAgentParams,
108
+ toolUseContext,
109
+ rootSetAppState,
110
+ metadata,
111
+ assistantMessage,
112
+ onProgress,
113
+ getWorktreeResult,
114
+ syncAgentContext,
115
+ }: {
116
+ readonly syncAgentId: string
117
+ readonly selectedAgent: AgentDefinition
118
+ readonly prompt: string
119
+ readonly promptMessages: RunAgentParams['promptMessages']
120
+ readonly description: string
121
+ readonly runAgentParams: RunAgentParams
122
+ readonly toolUseContext: ToolUseContext
123
+ readonly rootSetAppState: SetAppState
124
+ readonly metadata: AgentLifecycleMetadata
125
+ readonly assistantMessage?: { readonly message?: { readonly id?: string } }
126
+ readonly onProgress?: AgentToolProgressCallback
127
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
128
+ readonly syncAgentContext: Parameters<typeof runWithAgentContext>[0]
129
+ }): Promise<AgentToolCallResult> {
130
+ const agentMessages: RunAgentParams['promptMessages'] = []
131
+ const agentStartTime = Date.now()
132
+ const syncTracker = createProgressTracker()
133
+ const syncResolveActivity = createActivityDescriptionResolver(toolUseContext.options.tools)
134
+ const foreground = setupForegroundTask({
135
+ syncAgentId,
136
+ selectedAgent,
137
+ description,
138
+ prompt,
139
+ rootSetAppState,
140
+ toolUseContext,
141
+ })
142
+ let wasBackgrounded = false
143
+ let wasAborted = false
144
+ let syncAgentError: Error | undefined
145
+ let worktreeResult: WorktreeResult = {}
146
+ let stopForegroundSummarization: (() => void) | undefined
147
+ emitInitialProgress(promptMessages, prompt, syncAgentId, assistantMessage, onProgress)
148
+ const agentIterator = runAgent({
149
+ ...runAgentParams,
150
+ override: { ...runAgentParams.override, agentId: syncAgentId },
151
+ onCacheSafeParams:
152
+ foreground.taskId && getSdkAgentProgressSummariesEnabled()
153
+ ? (params: CacheSafeParams) => {
154
+ const { stop } = startAgentSummarization(
155
+ foreground.taskId,
156
+ syncAgentId,
157
+ params,
158
+ rootSetAppState,
159
+ )
160
+ stopForegroundSummarization = stop
161
+ }
162
+ : undefined,
163
+ })[Symbol.asyncIterator]()
164
+
165
+ try {
166
+ const backgrounded = await drainForegroundMessages({
167
+ agentIterator,
168
+ agentMessages,
169
+ agentStartTime,
170
+ syncTracker,
171
+ syncResolveActivity,
172
+ foreground,
173
+ toolUseContext,
174
+ rootSetAppState,
175
+ description,
176
+ prompt,
177
+ syncAgentId,
178
+ selectedAgent,
179
+ runAgentParams,
180
+ metadata,
181
+ assistantMessage,
182
+ onProgress,
183
+ getWorktreeResult,
184
+ syncAgentContext,
185
+ stopForegroundSummarization: () => stopForegroundSummarization?.(),
186
+ })
187
+ if (backgrounded) {
188
+ wasBackgrounded = true
189
+ return { data: backgrounded }
190
+ }
191
+ } catch (error) {
192
+ const syncError = error instanceof Error ? error : toError(error)
193
+ if (syncError instanceof AbortError) {
194
+ wasAborted = true
195
+ logTermination(metadata, false, 'user_cancel_sync')
196
+ throw syncError
197
+ }
198
+ logForDebugging(`Sync agent error: ${errorMessage(syncError)}`, { level: 'error' })
199
+ syncAgentError = syncError
200
+ } finally {
201
+ toolUseContext.setToolJSX?.(null)
202
+ stopForegroundSummarization?.()
203
+ if (foreground.taskId) {
204
+ unregisterAgentForeground(foreground.taskId, rootSetAppState)
205
+ if (!wasBackgrounded) {
206
+ enqueueCompletionSdkEvent({
207
+ foregroundTaskId: foreground.taskId,
208
+ toolUseContext,
209
+ syncTracker,
210
+ syncAgentError,
211
+ wasAborted,
212
+ description,
213
+ agentStartTime,
214
+ })
215
+ }
216
+ }
217
+ clearInvokedSkillsForAgent(syncAgentId)
218
+ if (!wasBackgrounded) clearDumpState(syncAgentId)
219
+ foreground.cancelAutoBackground?.()
220
+ if (!wasBackgrounded) worktreeResult = await getWorktreeResult()
221
+ }
222
+
223
+ return finalizeSyncAgent({
224
+ agentMessages,
225
+ syncAgentError,
226
+ metadata,
227
+ selectedAgent,
228
+ toolUseContext,
229
+ prompt,
230
+ syncAgentId,
231
+ worktreeResult,
232
+ })
233
+ }
234
+
235
+ function withCwd<T>(cwdOverridePath: string | undefined, fn: () => T): T {
236
+ return cwdOverridePath ? runWithCwdOverride(cwdOverridePath, fn) : fn()
237
+ }