ummaya 0.2.4 → 0.2.5

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