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,208 @@
1
+ import { feature } from 'bun:bundle'
2
+ import { clearInvokedSkillsForAgent } from '../../bootstrap/state.js'
3
+ import { startAgentSummarization } from '../../services/AgentSummary/agentSummary.js'
4
+ import {
5
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
6
+ logEvent,
7
+ } from '../../services/analytics/index.js'
8
+ import { clearDumpState } from '../../services/api/dumpPrompts.js'
9
+ import type { AppState } from '../../state/AppState.js'
10
+ import type { ToolUseContext } from '../../Tool.js'
11
+ import {
12
+ completeAgentTask as completeAsyncAgent,
13
+ createActivityDescriptionResolver,
14
+ createProgressTracker,
15
+ enqueueAgentNotification,
16
+ failAgentTask as failAsyncAgent,
17
+ getProgressUpdate,
18
+ getTokenCountFromTracker,
19
+ isLocalAgentTask,
20
+ killAsyncAgent,
21
+ updateAgentProgress as updateAsyncAgentProgress,
22
+ updateProgressFromMessage,
23
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
24
+ import { asAgentId } from '../../types/ids.js'
25
+ import type { Message as MessageType } from '../../types/message.js'
26
+ import { AbortError, errorMessage } from '../../utils/errors.js'
27
+ import type { CacheSafeParams } from '../../utils/forkedAgent.js'
28
+ import { extractTextContent } from '../../utils/messages.js'
29
+ import { classifyHandoffIfNeeded } from './agentToolHandoff.js'
30
+ import { extractPartialResult } from './agentToolPartialResult.js'
31
+ import { emitTaskProgress, getLastToolUseName } from './agentToolProgress.js'
32
+ import {
33
+ finalizeAgentTool,
34
+ type FinalizeAgentToolMetadata,
35
+ } from './agentToolResult.js'
36
+
37
+ type SetAppState = (f: (prev: AppState) => AppState) => void
38
+
39
+ export async function runAsyncAgentLifecycle({
40
+ taskId,
41
+ abortController,
42
+ makeStream,
43
+ metadata,
44
+ description,
45
+ toolUseContext,
46
+ rootSetAppState,
47
+ agentIdForCleanup,
48
+ enableSummarization,
49
+ getWorktreeResult,
50
+ }: {
51
+ taskId: string
52
+ abortController: AbortController
53
+ makeStream: (
54
+ onCacheSafeParams: ((p: CacheSafeParams) => void) | undefined,
55
+ ) => AsyncGenerator<MessageType, void>
56
+ metadata: FinalizeAgentToolMetadata
57
+ description: string
58
+ toolUseContext: ToolUseContext
59
+ rootSetAppState: SetAppState
60
+ agentIdForCleanup: string
61
+ enableSummarization: boolean
62
+ getWorktreeResult: () => Promise<{
63
+ worktreePath?: string
64
+ worktreeBranch?: string
65
+ }>
66
+ }): Promise<void> {
67
+ let stopSummarization: (() => void) | undefined
68
+ const agentMessages: MessageType[] = []
69
+ try {
70
+ const tracker = createProgressTracker()
71
+ const resolveActivity = createActivityDescriptionResolver(
72
+ toolUseContext.options.tools,
73
+ )
74
+ const onCacheSafeParams = enableSummarization
75
+ ? (params: CacheSafeParams) => {
76
+ const { stop } = startAgentSummarization(
77
+ taskId,
78
+ asAgentId(taskId),
79
+ params,
80
+ rootSetAppState,
81
+ )
82
+ stopSummarization = stop
83
+ }
84
+ : undefined
85
+ for await (const message of makeStream(onCacheSafeParams)) {
86
+ agentMessages.push(message)
87
+ rootSetAppState(prev => {
88
+ const task = prev.tasks[taskId]
89
+ if (!isLocalAgentTask(task) || !task.retain) return prev
90
+ const base = task.messages ?? []
91
+ return {
92
+ ...prev,
93
+ tasks: {
94
+ ...prev.tasks,
95
+ [taskId]: { ...task, messages: [...base, message] },
96
+ },
97
+ }
98
+ })
99
+ updateProgressFromMessage(
100
+ tracker,
101
+ message,
102
+ resolveActivity,
103
+ toolUseContext.options.tools,
104
+ )
105
+ updateAsyncAgentProgress(
106
+ taskId,
107
+ getProgressUpdate(tracker),
108
+ rootSetAppState,
109
+ )
110
+ const lastToolName = getLastToolUseName(message)
111
+ if (lastToolName) {
112
+ emitTaskProgress(
113
+ tracker,
114
+ taskId,
115
+ toolUseContext.toolUseId,
116
+ description,
117
+ metadata.startTime,
118
+ lastToolName,
119
+ )
120
+ }
121
+ }
122
+
123
+ stopSummarization?.()
124
+
125
+ const agentResult = finalizeAgentTool(agentMessages, taskId, metadata)
126
+
127
+ completeAsyncAgent(agentResult, rootSetAppState)
128
+
129
+ let finalMessage = extractTextContent(agentResult.content, '\n')
130
+
131
+ if (feature('TRANSCRIPT_CLASSIFIER')) {
132
+ const handoffWarning = await classifyHandoffIfNeeded({
133
+ agentMessages,
134
+ tools: toolUseContext.options.tools,
135
+ toolPermissionContext:
136
+ toolUseContext.getAppState().toolPermissionContext,
137
+ abortSignal: abortController.signal,
138
+ subagentType: metadata.agentType,
139
+ totalToolUseCount: agentResult.totalToolUseCount,
140
+ })
141
+ if (handoffWarning) {
142
+ finalMessage = `${handoffWarning}\n\n${finalMessage}`
143
+ }
144
+ }
145
+
146
+ const worktreeResult = await getWorktreeResult()
147
+
148
+ enqueueAgentNotification({
149
+ taskId,
150
+ description,
151
+ status: 'completed',
152
+ setAppState: rootSetAppState,
153
+ finalMessage,
154
+ usage: {
155
+ totalTokens: getTokenCountFromTracker(tracker),
156
+ toolUses: agentResult.totalToolUseCount,
157
+ durationMs: agentResult.totalDurationMs,
158
+ },
159
+ toolUseId: toolUseContext.toolUseId,
160
+ ...worktreeResult,
161
+ })
162
+ } catch (error) {
163
+ stopSummarization?.()
164
+ const asyncError =
165
+ error instanceof Error ? error : new Error(errorMessage(error))
166
+ if (asyncError instanceof AbortError) {
167
+ killAsyncAgent(taskId, rootSetAppState)
168
+ logEvent('tengu_agent_tool_terminated', {
169
+ agent_type:
170
+ metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
171
+ model:
172
+ metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
173
+ duration_ms: Date.now() - metadata.startTime,
174
+ is_async: true,
175
+ is_built_in_agent: metadata.isBuiltInAgent,
176
+ reason:
177
+ 'user_kill_async' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
178
+ })
179
+ const worktreeResult = await getWorktreeResult()
180
+ const partialResult = extractPartialResult(agentMessages)
181
+ enqueueAgentNotification({
182
+ taskId,
183
+ description,
184
+ status: 'killed',
185
+ setAppState: rootSetAppState,
186
+ toolUseId: toolUseContext.toolUseId,
187
+ finalMessage: partialResult,
188
+ ...worktreeResult,
189
+ })
190
+ return
191
+ }
192
+ const msg = errorMessage(asyncError)
193
+ failAsyncAgent(taskId, msg, rootSetAppState)
194
+ const worktreeResult = await getWorktreeResult()
195
+ enqueueAgentNotification({
196
+ taskId,
197
+ description,
198
+ status: 'failed',
199
+ error: msg,
200
+ setAppState: rootSetAppState,
201
+ toolUseId: toolUseContext.toolUseId,
202
+ ...worktreeResult,
203
+ })
204
+ } finally {
205
+ clearInvokedSkillsForAgent(agentIdForCleanup)
206
+ clearDumpState(agentIdForCleanup)
207
+ }
208
+ }
@@ -0,0 +1,153 @@
1
+ import type { AppState } from '../../state/AppState.js'
2
+ import type { ToolUseContext, Tools } from '../../Tool.js'
3
+ import { getSdkAgentProgressSummariesEnabled } from '../../bootstrap/state.js'
4
+ import {
5
+ registerAsyncAgent,
6
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
7
+ import { asAgentId } from '../../types/ids.js'
8
+ import type { AssistantMessage } from '../../types/message.js'
9
+ import { runWithAgentContext } from '../../utils/agentContext.js'
10
+ import { runWithCwdOverride } from '../../utils/cwd.js'
11
+ import { getParentSessionId } from '../../utils/teammate.js'
12
+ import { getTaskOutputPath } from '../../utils/task/diskOutput.js'
13
+ import { toolMatchesName } from '../../Tool.js'
14
+ import { BASH_TOOL_NAME } from '../BashTool/toolName.js'
15
+ import { FILE_READ_TOOL_NAME } from '../FileReadTool/prompt.js'
16
+ import { isForkSubagentEnabled } from './forkSubagent.js'
17
+ import { buildAgentSupportMetadata } from './orchestrationSupport.js'
18
+ import type { AgentDefinition } from './loadAgentsDir.js'
19
+ import { isBuiltInAgent } from './loadAgentsDir.js'
20
+ import { runAgent } from './runAgent.js'
21
+ import type {
22
+ AgentLifecycleMetadata,
23
+ AsyncLaunchedOutput,
24
+ WorktreeResult,
25
+ } from './schemas.js'
26
+
27
+ type SetAppState = (f: (prev: AppState) => AppState) => void
28
+ type RunAgentParams = Parameters<typeof runAgent>[0]
29
+
30
+ export function canReadAgentOutputFile(tools: Tools): boolean {
31
+ return tools.some(
32
+ tool => toolMatchesName(tool, FILE_READ_TOOL_NAME) || toolMatchesName(tool, BASH_TOOL_NAME),
33
+ )
34
+ }
35
+
36
+ export function registerAgentName({
37
+ name,
38
+ agentId,
39
+ rootSetAppState,
40
+ }: {
41
+ readonly name?: string
42
+ readonly agentId: string
43
+ readonly rootSetAppState: SetAppState
44
+ }): void {
45
+ if (!name) return
46
+ rootSetAppState(prev => {
47
+ const next = new Map(prev.agentNameRegistry)
48
+ next.set(name, asAgentId(agentId))
49
+ return { ...prev, agentNameRegistry: next }
50
+ })
51
+ }
52
+
53
+ export function launchAsyncAgent({
54
+ asyncAgentId,
55
+ description,
56
+ prompt,
57
+ selectedAgent,
58
+ rootSetAppState,
59
+ toolUseContext,
60
+ runAgentParams,
61
+ metadata,
62
+ assistantMessage,
63
+ cwdOverridePath,
64
+ isCoordinator,
65
+ getWorktreeResult,
66
+ }: {
67
+ readonly asyncAgentId: string
68
+ readonly description: string
69
+ readonly prompt: string
70
+ readonly selectedAgent: AgentDefinition
71
+ readonly rootSetAppState: SetAppState
72
+ readonly toolUseContext: ToolUseContext
73
+ readonly runAgentParams: RunAgentParams
74
+ readonly metadata: AgentLifecycleMetadata
75
+ readonly assistantMessage?: AssistantMessage
76
+ readonly cwdOverridePath?: string
77
+ readonly isCoordinator: boolean
78
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
79
+ }): AsyncLaunchedOutput {
80
+ const agentBackgroundTask = registerAsyncAgent({
81
+ agentId: asyncAgentId,
82
+ description,
83
+ prompt,
84
+ selectedAgent,
85
+ setAppState: rootSetAppState,
86
+ toolUseId: toolUseContext.toolUseId,
87
+ })
88
+ const abortController = agentBackgroundTask.abortController
89
+ if (!abortController) {
90
+ throw new Error(
91
+ `Cannot launch agent ${agentBackgroundTask.agentId}: missing abort controller`,
92
+ )
93
+ }
94
+ void runWithAgentContext(
95
+ {
96
+ agentId: asyncAgentId,
97
+ parentSessionId: getParentSessionId(),
98
+ agentType: 'subagent',
99
+ subagentName: selectedAgent.agentType,
100
+ isBuiltIn: isBuiltInAgent(selectedAgent),
101
+ invokingRequestId: assistantMessage?.requestId,
102
+ invocationKind: 'spawn',
103
+ invocationEmitted: false,
104
+ },
105
+ async () =>
106
+ withCwd(cwdOverridePath, () =>
107
+ import('./asyncAgentLifecycle.js').then(
108
+ ({ runAsyncAgentLifecycle }) =>
109
+ runAsyncAgentLifecycle({
110
+ taskId: agentBackgroundTask.agentId,
111
+ abortController,
112
+ makeStream: onCacheSafeParams =>
113
+ runAgent({
114
+ ...runAgentParams,
115
+ override: {
116
+ ...runAgentParams.override,
117
+ agentId: asAgentId(agentBackgroundTask.agentId),
118
+ abortController,
119
+ },
120
+ onCacheSafeParams,
121
+ }),
122
+ metadata,
123
+ description,
124
+ toolUseContext,
125
+ rootSetAppState,
126
+ agentIdForCleanup: asyncAgentId,
127
+ enableSummarization:
128
+ isCoordinator ||
129
+ isForkSubagentEnabled() ||
130
+ getSdkAgentProgressSummariesEnabled(),
131
+ getWorktreeResult,
132
+ }),
133
+ ),
134
+ ),
135
+ )
136
+ return {
137
+ isAsync: true,
138
+ status: 'async_launched',
139
+ agentId: agentBackgroundTask.agentId,
140
+ description,
141
+ prompt,
142
+ outputFile: getTaskOutputPath(agentBackgroundTask.agentId),
143
+ canReadOutputFile: canReadAgentOutputFile(toolUseContext.options.tools),
144
+ ...buildAgentSupportMetadata({
145
+ agentId: agentBackgroundTask.agentId,
146
+ parentToolUseId: toolUseContext.toolUseId,
147
+ }),
148
+ }
149
+ }
150
+
151
+ function withCwd<T>(cwdOverridePath: string | undefined, fn: () => T): T {
152
+ return cwdOverridePath ? runWithCwdOverride(cwdOverridePath, fn) : fn()
153
+ }
@@ -0,0 +1,126 @@
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 {
4
+ completeAgentTask as completeAsyncAgent,
5
+ createProgressTracker,
6
+ enqueueAgentNotification,
7
+ failAgentTask as failAsyncAgent,
8
+ getTokenCountFromTracker,
9
+ killAsyncAgent,
10
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
11
+ import type { Message as MessageType } from '../../types/message.js'
12
+ import { AbortError, errorMessage } from '../../utils/errors.js'
13
+ import { extractTextContent } from '../../utils/messages.js'
14
+ import { classifyHandoffIfNeeded } from './agentToolHandoff.js'
15
+ import { extractPartialResult } from './agentToolPartialResult.js'
16
+ import { finalizeAgentTool } from './agentToolResult.js'
17
+ import { runAgent } from './runAgent.js'
18
+ import type { AgentLifecycleMetadata, WorktreeResult } from './schemas.js'
19
+
20
+ type SetAppState = Parameters<typeof completeAsyncAgent>[1]
21
+ type RunAgentParams = Parameters<typeof runAgent>[0]
22
+
23
+ export async function finishBackgroundedAgent({
24
+ backgroundedTaskId,
25
+ agentMessages,
26
+ metadata,
27
+ rootSetAppState,
28
+ tracker,
29
+ toolUseContext,
30
+ abortController,
31
+ description,
32
+ getWorktreeResult,
33
+ }: {
34
+ readonly backgroundedTaskId: string
35
+ readonly agentMessages: MessageType[]
36
+ readonly metadata: AgentLifecycleMetadata
37
+ readonly rootSetAppState: SetAppState
38
+ readonly tracker: ReturnType<typeof createProgressTracker>
39
+ readonly toolUseContext: RunAgentParams['toolUseContext']
40
+ readonly abortController: AbortController
41
+ readonly description: string
42
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
43
+ }): Promise<void> {
44
+ const agentResult = finalizeAgentTool(agentMessages, backgroundedTaskId, metadata)
45
+ completeAsyncAgent(agentResult, rootSetAppState)
46
+ let finalMessage = extractTextContent(agentResult.content, '\n')
47
+ if (feature('TRANSCRIPT_CLASSIFIER')) {
48
+ const handoffWarning = await classifyHandoffIfNeeded({
49
+ agentMessages,
50
+ tools: toolUseContext.options.tools,
51
+ toolPermissionContext: toolUseContext.getAppState().toolPermissionContext,
52
+ abortSignal: abortController.signal,
53
+ subagentType: metadata.agentType,
54
+ totalToolUseCount: agentResult.totalToolUseCount,
55
+ })
56
+ if (handoffWarning) finalMessage = `${handoffWarning}\n\n${finalMessage}`
57
+ }
58
+ enqueueAgentNotification({
59
+ taskId: backgroundedTaskId,
60
+ description,
61
+ status: 'completed',
62
+ setAppState: rootSetAppState,
63
+ finalMessage,
64
+ usage: {
65
+ totalTokens: getTokenCountFromTracker(tracker),
66
+ toolUses: agentResult.totalToolUseCount,
67
+ durationMs: agentResult.totalDurationMs,
68
+ },
69
+ toolUseId: toolUseContext.toolUseId,
70
+ ...(await getWorktreeResult()),
71
+ })
72
+ }
73
+
74
+ export async function failBackgroundedAgent({
75
+ error,
76
+ backgroundedTaskId,
77
+ rootSetAppState,
78
+ metadata,
79
+ description,
80
+ agentMessages,
81
+ getWorktreeResult,
82
+ toolUseContext,
83
+ }: {
84
+ readonly error: unknown
85
+ readonly backgroundedTaskId: string
86
+ readonly rootSetAppState: SetAppState
87
+ readonly metadata: AgentLifecycleMetadata
88
+ readonly description: string
89
+ readonly agentMessages: MessageType[]
90
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
91
+ readonly toolUseContext: RunAgentParams['toolUseContext']
92
+ }): Promise<void> {
93
+ const worktreeResult = await getWorktreeResult()
94
+ if (error instanceof AbortError) {
95
+ killAsyncAgent(backgroundedTaskId, rootSetAppState)
96
+ logEvent('tengu_agent_tool_terminated', {
97
+ agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
98
+ model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
99
+ duration_ms: Date.now() - metadata.startTime,
100
+ is_async: true,
101
+ is_built_in_agent: metadata.isBuiltInAgent,
102
+ reason: 'user_cancel_background' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
103
+ })
104
+ enqueueAgentNotification({
105
+ taskId: backgroundedTaskId,
106
+ description,
107
+ status: 'killed',
108
+ setAppState: rootSetAppState,
109
+ toolUseId: toolUseContext.toolUseId,
110
+ finalMessage: extractPartialResult(agentMessages),
111
+ ...worktreeResult,
112
+ })
113
+ return
114
+ }
115
+ const errMsg = errorMessage(error)
116
+ failAsyncAgent(backgroundedTaskId, errMsg, rootSetAppState)
117
+ enqueueAgentNotification({
118
+ taskId: backgroundedTaskId,
119
+ description,
120
+ status: 'failed',
121
+ error: errMsg,
122
+ setAppState: rootSetAppState,
123
+ toolUseId: toolUseContext.toolUseId,
124
+ ...worktreeResult,
125
+ })
126
+ }
@@ -0,0 +1,174 @@
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 {
5
+ completeAgentTask as completeAsyncAgent,
6
+ createActivityDescriptionResolver,
7
+ createProgressTracker,
8
+ getProgressUpdate,
9
+ type LocalAgentTaskState,
10
+ updateAgentProgress as updateAsyncAgentProgress,
11
+ updateProgressFromMessage,
12
+ } from '../../tasks/LocalAgentTask/LocalAgentTask.js'
13
+ import { asAgentId } from '../../types/ids.js'
14
+ import type { Message as MessageType } from '../../types/message.js'
15
+ import { runWithAgentContext } from '../../utils/agentContext.js'
16
+ import { errorMessage } from '../../utils/errors.js'
17
+ import type { CacheSafeParams } from '../../utils/forkedAgent.js'
18
+ import { logForDebugging } from '../../utils/debug.js'
19
+ import { sleep } from '../../utils/sleep.js'
20
+ import {
21
+ emitTaskProgress,
22
+ getLastToolUseName,
23
+ } from './agentToolProgress.js'
24
+ import type { AgentLifecycleMetadata, WorktreeResult } from './schemas.js'
25
+ import { runAgent } from './runAgent.js'
26
+ import {
27
+ failBackgroundedAgent,
28
+ finishBackgroundedAgent,
29
+ } from './backgroundedCompletion.js'
30
+
31
+ type SetAppState = Parameters<typeof completeAsyncAgent>[1]
32
+ type RunAgentParams = Parameters<typeof runAgent>[0]
33
+ type AgentContextCallback = Parameters<typeof runWithAgentContext>[0]
34
+
35
+ export function continueForegroundAgentInBackground({
36
+ backgroundedTaskId,
37
+ task,
38
+ syncAgentContext,
39
+ agentIterator,
40
+ agentMessages,
41
+ runAgentParams,
42
+ rootSetAppState,
43
+ toolUseContext,
44
+ metadata,
45
+ description,
46
+ syncAgentId,
47
+ getWorktreeResult,
48
+ }: {
49
+ readonly backgroundedTaskId: string
50
+ readonly task: LocalAgentTaskState
51
+ readonly syncAgentContext: AgentContextCallback
52
+ readonly agentIterator: AsyncIterator<MessageType>
53
+ readonly agentMessages: MessageType[]
54
+ readonly runAgentParams: RunAgentParams
55
+ readonly rootSetAppState: SetAppState
56
+ readonly toolUseContext: RunAgentParams['toolUseContext']
57
+ readonly metadata: AgentLifecycleMetadata
58
+ readonly description: string
59
+ readonly syncAgentId: string
60
+ readonly getWorktreeResult: () => Promise<WorktreeResult>
61
+ }): void {
62
+ const abortController = task.abortController
63
+ if (!abortController) {
64
+ throw new Error(
65
+ `Cannot background agent ${backgroundedTaskId}: missing abort controller`,
66
+ )
67
+ }
68
+
69
+ void runWithAgentContext(syncAgentContext, async () => {
70
+ let stopBackgroundedSummarization: (() => void) | undefined
71
+ try {
72
+ await closeIterator(agentIterator)
73
+ const tracker = createProgressTracker()
74
+ const resolveActivity = createActivityDescriptionResolver(
75
+ toolUseContext.options.tools,
76
+ )
77
+ for (const existingMsg of agentMessages) {
78
+ updateProgressFromMessage(
79
+ tracker,
80
+ existingMsg,
81
+ resolveActivity,
82
+ toolUseContext.options.tools,
83
+ )
84
+ }
85
+ for await (const msg of runAgent({
86
+ ...runAgentParams,
87
+ isAsync: true,
88
+ override: {
89
+ ...runAgentParams.override,
90
+ agentId: asAgentId(backgroundedTaskId),
91
+ abortController,
92
+ },
93
+ onCacheSafeParams: getSdkAgentProgressSummariesEnabled()
94
+ ? (params: CacheSafeParams) => {
95
+ const { stop } = startAgentSummarization(
96
+ backgroundedTaskId,
97
+ asAgentId(backgroundedTaskId),
98
+ params,
99
+ rootSetAppState,
100
+ )
101
+ stopBackgroundedSummarization = stop
102
+ }
103
+ : undefined,
104
+ })) {
105
+ agentMessages.push(msg)
106
+ updateProgressFromMessage(
107
+ tracker,
108
+ msg,
109
+ resolveActivity,
110
+ toolUseContext.options.tools,
111
+ )
112
+ updateAsyncAgentProgress(
113
+ backgroundedTaskId,
114
+ getProgressUpdate(tracker),
115
+ rootSetAppState,
116
+ )
117
+ const lastToolName = getLastToolUseName(msg)
118
+ if (lastToolName) {
119
+ emitTaskProgress(
120
+ tracker,
121
+ backgroundedTaskId,
122
+ toolUseContext.toolUseId,
123
+ description,
124
+ metadata.startTime,
125
+ lastToolName,
126
+ )
127
+ }
128
+ }
129
+ await finishBackgroundedAgent({
130
+ backgroundedTaskId,
131
+ agentMessages,
132
+ metadata,
133
+ rootSetAppState,
134
+ tracker,
135
+ toolUseContext,
136
+ abortController,
137
+ description,
138
+ getWorktreeResult,
139
+ })
140
+ } catch (error) {
141
+ const handledError =
142
+ error instanceof Error ? error : new Error(errorMessage(error))
143
+ await failBackgroundedAgent({
144
+ error: handledError,
145
+ backgroundedTaskId,
146
+ rootSetAppState,
147
+ metadata,
148
+ description,
149
+ agentMessages,
150
+ getWorktreeResult,
151
+ toolUseContext,
152
+ })
153
+ } finally {
154
+ stopBackgroundedSummarization?.()
155
+ clearInvokedSkillsForAgent(syncAgentId)
156
+ clearDumpState(syncAgentId)
157
+ }
158
+ })
159
+ }
160
+
161
+ async function closeIterator(agentIterator: AsyncIterator<MessageType>): Promise<void> {
162
+ const close = agentIterator.return
163
+ ? agentIterator.return(undefined).then(
164
+ () => undefined,
165
+ error => {
166
+ logForDebugging(
167
+ `Agent iterator cleanup failed: ${errorMessage(error)}`,
168
+ { level: 'warn' },
169
+ )
170
+ },
171
+ )
172
+ : Promise.resolve()
173
+ await Promise.race([close, sleep(1000)])
174
+ }