ummaya 0.2.4 → 0.2.6

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