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
@@ -1,89 +1,18 @@
1
- import { feature } from 'bun:bundle'
2
- import { z } from 'zod/v4'
3
- import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
4
1
  import { buildTool, type ToolDef } from '../../Tool.js'
5
- import { isAgentSwarmsEnabled } from '../../utils/agentSwarmsEnabled.js'
6
- import {
7
- executeTaskCompletedHooks,
8
- getTaskCompletedHookMessage,
9
- } from '../../utils/hooks.js'
10
- import { lazySchema } from '../../utils/lazySchema.js'
11
- import {
12
- blockTask,
13
- deleteTask,
14
- getTask,
15
- getTaskListId,
16
- isTodoV2Enabled,
17
- listTasks,
18
- type TaskStatus,
19
- TaskStatusSchema,
20
- updateTask,
21
- } from '../../utils/tasks.js'
22
- import {
23
- getAgentId,
24
- getAgentName,
25
- getTeammateColor,
26
- getTeamName,
27
- } from '../../utils/teammate.js'
28
- import { writeToMailbox } from '../../utils/teammateMailbox.js'
29
- import { VERIFICATION_AGENT_TYPE } from '../AgentTool/constants.js'
2
+ import { isTodoV2Enabled } from '../../utils/tasks.js'
30
3
  import { TASK_UPDATE_TOOL_NAME } from './constants.js'
31
4
  import { DESCRIPTION, PROMPT } from './prompt.js'
5
+ import {
6
+ inputSchema,
7
+ outputSchema,
8
+ type InputSchema,
9
+ type Output,
10
+ type OutputSchema,
11
+ } from './schemas.js'
12
+ import { mapTaskUpdateResultToToolResultBlockParam } from './serialization.js'
13
+ import { callTaskUpdateTool } from './statusUpdate.js'
32
14
 
33
- const inputSchema = lazySchema(() => {
34
- // Extended status schema that includes 'deleted' as a special action
35
- const TaskUpdateStatusSchema = TaskStatusSchema().or(z.literal('deleted'))
36
-
37
- return z.strictObject({
38
- taskId: z.string().describe('The ID of the task to update'),
39
- subject: z.string().optional().describe('New subject for the task'),
40
- description: z.string().optional().describe('New description for the task'),
41
- activeForm: z
42
- .string()
43
- .optional()
44
- .describe(
45
- 'Present continuous form shown in spinner when in_progress (e.g., "Running tests")',
46
- ),
47
- status: TaskUpdateStatusSchema.optional().describe(
48
- 'New status for the task',
49
- ),
50
- addBlocks: z
51
- .array(z.string())
52
- .optional()
53
- .describe('Task IDs that this task blocks'),
54
- addBlockedBy: z
55
- .array(z.string())
56
- .optional()
57
- .describe('Task IDs that block this task'),
58
- owner: z.string().optional().describe('New owner for the task'),
59
- metadata: z
60
- .record(z.string(), z.unknown())
61
- .optional()
62
- .describe(
63
- 'Metadata keys to merge into the task. Set a key to null to delete it.',
64
- ),
65
- })
66
- })
67
- type InputSchema = ReturnType<typeof inputSchema>
68
-
69
- const outputSchema = lazySchema(() =>
70
- z.object({
71
- success: z.boolean(),
72
- taskId: z.string(),
73
- updatedFields: z.array(z.string()),
74
- error: z.string().optional(),
75
- statusChange: z
76
- .object({
77
- from: z.string(),
78
- to: z.string(),
79
- })
80
- .optional(),
81
- verificationNudgeNeeded: z.boolean().optional(),
82
- }),
83
- )
84
- type OutputSchema = ReturnType<typeof outputSchema>
85
-
86
- export type Output = z.infer<OutputSchema>
15
+ export type { Output } from './schemas.js'
87
16
 
88
17
  export const TaskUpdateTool = buildTool({
89
18
  name: TASK_UPDATE_TOOL_NAME,
@@ -120,287 +49,8 @@ export const TaskUpdateTool = buildTool({
120
49
  renderToolUseMessage() {
121
50
  return null
122
51
  },
123
- async call(
124
- {
125
- taskId,
126
- subject,
127
- description,
128
- activeForm,
129
- status,
130
- owner,
131
- addBlocks,
132
- addBlockedBy,
133
- metadata,
134
- },
135
- context,
136
- ) {
137
- const taskListId = getTaskListId()
138
-
139
- // Auto-expand task list when updating tasks
140
- context.setAppState(prev => {
141
- if (prev.expandedView === 'tasks') return prev
142
- return { ...prev, expandedView: 'tasks' as const }
143
- })
144
-
145
- // Check if task exists
146
- const existingTask = await getTask(taskListId, taskId)
147
- if (!existingTask) {
148
- return {
149
- data: {
150
- success: false,
151
- taskId,
152
- updatedFields: [],
153
- error: 'Task not found',
154
- },
155
- }
156
- }
157
-
158
- const updatedFields: string[] = []
159
-
160
- // Update basic fields if provided and different from current value
161
- const updates: {
162
- subject?: string
163
- description?: string
164
- activeForm?: string
165
- status?: TaskStatus
166
- owner?: string
167
- metadata?: Record<string, unknown>
168
- } = {}
169
- if (subject !== undefined && subject !== existingTask.subject) {
170
- updates.subject = subject
171
- updatedFields.push('subject')
172
- }
173
- if (description !== undefined && description !== existingTask.description) {
174
- updates.description = description
175
- updatedFields.push('description')
176
- }
177
- if (activeForm !== undefined && activeForm !== existingTask.activeForm) {
178
- updates.activeForm = activeForm
179
- updatedFields.push('activeForm')
180
- }
181
- if (owner !== undefined && owner !== existingTask.owner) {
182
- updates.owner = owner
183
- updatedFields.push('owner')
184
- }
185
- // Auto-set owner when a teammate marks a task as in_progress without
186
- // explicitly providing an owner. This ensures the task list can match
187
- // todo items to teammates for showing activity status.
188
- if (
189
- isAgentSwarmsEnabled() &&
190
- status === 'in_progress' &&
191
- owner === undefined &&
192
- !existingTask.owner
193
- ) {
194
- const agentName = getAgentName()
195
- if (agentName) {
196
- updates.owner = agentName
197
- updatedFields.push('owner')
198
- }
199
- }
200
- if (metadata !== undefined) {
201
- const merged = { ...(existingTask.metadata ?? {}) }
202
- for (const [key, value] of Object.entries(metadata)) {
203
- if (value === null) {
204
- delete merged[key]
205
- } else {
206
- merged[key] = value
207
- }
208
- }
209
- updates.metadata = merged
210
- updatedFields.push('metadata')
211
- }
212
- if (status !== undefined) {
213
- // Handle deletion - delete the task file and return early
214
- if (status === 'deleted') {
215
- const deleted = await deleteTask(taskListId, taskId)
216
- return {
217
- data: {
218
- success: deleted,
219
- taskId,
220
- updatedFields: deleted ? ['deleted'] : [],
221
- error: deleted ? undefined : 'Failed to delete task',
222
- statusChange: deleted
223
- ? { from: existingTask.status, to: 'deleted' }
224
- : undefined,
225
- },
226
- }
227
- }
228
-
229
- // For regular status updates, validate and apply if different
230
- if (status !== existingTask.status) {
231
- // Run TaskCompleted hooks when marking a task as completed
232
- if (status === 'completed') {
233
- const blockingErrors: string[] = []
234
-
235
- const generator = executeTaskCompletedHooks(
236
- taskId,
237
- existingTask.subject,
238
- existingTask.description,
239
- getAgentName(),
240
- getTeamName(),
241
- undefined,
242
- context?.abortController?.signal,
243
- undefined,
244
- context,
245
- )
246
-
247
- for await (const result of generator) {
248
- if (result.blockingError) {
249
- blockingErrors.push(
250
- getTaskCompletedHookMessage(result.blockingError),
251
- )
252
- }
253
- }
254
-
255
- if (blockingErrors.length > 0) {
256
- return {
257
- data: {
258
- success: false,
259
- taskId,
260
- updatedFields: [],
261
- error: blockingErrors.join('\n'),
262
- },
263
- }
264
- }
265
- }
266
-
267
- updates.status = status
268
- updatedFields.push('status')
269
- }
270
- }
271
-
272
- if (Object.keys(updates).length > 0) {
273
- await updateTask(taskListId, taskId, updates)
274
- }
275
-
276
- // Notify new owner via mailbox when ownership changes
277
- if (updates.owner && isAgentSwarmsEnabled()) {
278
- const senderName = getAgentName() || 'team-lead'
279
- const senderColor = getTeammateColor()
280
- const assignmentMessage = JSON.stringify({
281
- type: 'task_assignment',
282
- taskId,
283
- subject: existingTask.subject,
284
- description: existingTask.description,
285
- assignedBy: senderName,
286
- timestamp: new Date().toISOString(),
287
- })
288
- await writeToMailbox(
289
- updates.owner,
290
- {
291
- from: senderName,
292
- text: assignmentMessage,
293
- timestamp: new Date().toISOString(),
294
- color: senderColor,
295
- },
296
- taskListId,
297
- )
298
- }
299
-
300
- // Add blocks if provided and not already present
301
- if (addBlocks && addBlocks.length > 0) {
302
- const newBlocks = addBlocks.filter(
303
- id => !existingTask.blocks.includes(id),
304
- )
305
- for (const blockId of newBlocks) {
306
- await blockTask(taskListId, taskId, blockId)
307
- }
308
- if (newBlocks.length > 0) {
309
- updatedFields.push('blocks')
310
- }
311
- }
312
-
313
- // Add blockedBy if provided and not already present (reverse: the blocker blocks this task)
314
- if (addBlockedBy && addBlockedBy.length > 0) {
315
- const newBlockedBy = addBlockedBy.filter(
316
- id => !existingTask.blockedBy.includes(id),
317
- )
318
- for (const blockerId of newBlockedBy) {
319
- await blockTask(taskListId, blockerId, taskId)
320
- }
321
- if (newBlockedBy.length > 0) {
322
- updatedFields.push('blockedBy')
323
- }
324
- }
325
-
326
- // Structural verification nudge: if the main-thread agent just closed
327
- // out a 3+ task list and none of those tasks was a verification step,
328
- // append a reminder to the tool result. Fires at the loop-exit moment
329
- // where skips happen ("when the last task closed, the loop exited").
330
- // Mirrors the TodoWriteTool nudge for V1 sessions; this covers V2
331
- // (interactive CLI). TaskUpdateToolOutput is @internal so this field
332
- // does not touch the public SDK surface.
333
- let verificationNudgeNeeded = false
334
- if (
335
- feature('VERIFICATION_AGENT') &&
336
- getFeatureValue_CACHED_MAY_BE_STALE('tengu_hive_evidence', false) &&
337
- !context.agentId &&
338
- updates.status === 'completed'
339
- ) {
340
- const allTasks = await listTasks(taskListId)
341
- const allDone = allTasks.every(t => t.status === 'completed')
342
- if (
343
- allDone &&
344
- allTasks.length >= 3 &&
345
- !allTasks.some(t => /verif/i.test(t.subject))
346
- ) {
347
- verificationNudgeNeeded = true
348
- }
349
- }
350
-
351
- return {
352
- data: {
353
- success: true,
354
- taskId,
355
- updatedFields,
356
- statusChange:
357
- updates.status !== undefined
358
- ? { from: existingTask.status, to: updates.status }
359
- : undefined,
360
- verificationNudgeNeeded,
361
- },
362
- }
363
- },
364
- mapToolResultToToolResultBlockParam(content, toolUseID) {
365
- const {
366
- success,
367
- taskId,
368
- updatedFields,
369
- error,
370
- statusChange,
371
- verificationNudgeNeeded,
372
- } = content as Output
373
- if (!success) {
374
- // Return as non-error so it doesn't trigger sibling tool cancellation
375
- // in StreamingToolExecutor. "Task not found" is a benign condition
376
- // (e.g., task list already cleaned up) that the model can handle.
377
- return {
378
- tool_use_id: toolUseID,
379
- type: 'tool_result',
380
- content: error || `Task #${taskId} not found`,
381
- }
382
- }
383
-
384
- let resultContent = `Updated task #${taskId} ${updatedFields.join(', ')}`
385
-
386
- // Add reminder for teammates when they complete a task (supports in-process teammates)
387
- if (
388
- statusChange?.to === 'completed' &&
389
- getAgentId() &&
390
- isAgentSwarmsEnabled()
391
- ) {
392
- resultContent +=
393
- '\n\nTask completed. Call TaskList now to find your next available task or see if your work unblocked others.'
394
- }
395
-
396
- if (verificationNudgeNeeded) {
397
- resultContent += `\n\nNOTE: You just closed out 3+ tasks and none of them was a verification step. Before writing your final summary, spawn the verification agent (subagent_type="${VERIFICATION_AGENT_TYPE}"). You cannot self-assign PARTIAL by listing caveats in your summary — only the verifier issues a verdict.`
398
- }
399
-
400
- return {
401
- tool_use_id: toolUseID,
402
- type: 'tool_result',
403
- content: resultContent,
404
- }
52
+ call(input, context) {
53
+ return callTaskUpdateTool(input, context)
405
54
  },
55
+ mapToolResultToToolResultBlockParam: mapTaskUpdateResultToToolResultBlockParam,
406
56
  } satisfies ToolDef<InputSchema, Output>)
@@ -0,0 +1,62 @@
1
+ import { feature } from 'bun:bundle'
2
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
3
+ import type { ToolUseContext } from '../../Tool.js'
4
+ import {
5
+ executeTaskCompletedHooks,
6
+ getTaskCompletedHookMessage,
7
+ } from '../../utils/hooks.js'
8
+ import { listTasks, type Task, type TaskStatus } from '../../utils/tasks.js'
9
+ import { getAgentName, getTeamName } from '../../utils/teammate.js'
10
+ import type { TaskUpdateToolInput } from './schemas.js'
11
+
12
+ export type CompletionStatusUpdate = {
13
+ readonly status?: TaskStatus
14
+ }
15
+
16
+ export async function collectCompletedHookErrors(
17
+ input: TaskUpdateToolInput,
18
+ context: ToolUseContext,
19
+ existingTask: Task,
20
+ ): Promise<string[]> {
21
+ const blockingErrors: string[] = []
22
+ const generator = executeTaskCompletedHooks(
23
+ input.taskId,
24
+ existingTask.subject,
25
+ existingTask.description,
26
+ getAgentName(),
27
+ getTeamName(),
28
+ undefined,
29
+ context.abortController.signal,
30
+ undefined,
31
+ context,
32
+ )
33
+
34
+ for await (const result of generator) {
35
+ if (result.blockingError) {
36
+ blockingErrors.push(getTaskCompletedHookMessage(result.blockingError))
37
+ }
38
+ }
39
+ return blockingErrors
40
+ }
41
+
42
+ export async function needsVerificationNudge(
43
+ taskListId: string,
44
+ context: ToolUseContext,
45
+ updates: CompletionStatusUpdate,
46
+ ): Promise<boolean> {
47
+ if (
48
+ !feature('VERIFICATION_AGENT') ||
49
+ !getFeatureValue_CACHED_MAY_BE_STALE('tengu_hive_evidence', false) ||
50
+ context.agentId ||
51
+ updates.status !== 'completed'
52
+ ) {
53
+ return false
54
+ }
55
+
56
+ const allTasks = await listTasks(taskListId)
57
+ return (
58
+ allTasks.every(task => task.status === 'completed') &&
59
+ allTasks.length >= 3 &&
60
+ !allTasks.some(task => /verif/i.test(task.subject))
61
+ )
62
+ }
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod/v4'
2
+ import { lazySchema } from '../../utils/lazySchema.js'
3
+ import { TaskStatusSchema } from '../../utils/tasks.js'
4
+
5
+ export const inputSchema = lazySchema(() => {
6
+ const taskUpdateStatusSchema = TaskStatusSchema().or(z.literal('deleted'))
7
+
8
+ return z.strictObject({
9
+ taskId: z.string().describe('The ID of the task to update'),
10
+ subject: z.string().optional().describe('New subject for the task'),
11
+ description: z.string().optional().describe('New description for the task'),
12
+ activeForm: z
13
+ .string()
14
+ .optional()
15
+ .describe(
16
+ 'Present continuous form shown in spinner when in_progress (e.g., "Running tests")',
17
+ ),
18
+ status: taskUpdateStatusSchema.optional().describe(
19
+ 'New status for the task',
20
+ ),
21
+ addBlocks: z
22
+ .array(z.string())
23
+ .optional()
24
+ .describe('Task IDs that this task blocks'),
25
+ addBlockedBy: z
26
+ .array(z.string())
27
+ .optional()
28
+ .describe('Task IDs that block this task'),
29
+ owner: z.string().optional().describe('New owner for the task'),
30
+ metadata: z
31
+ .record(z.string(), z.unknown())
32
+ .optional()
33
+ .describe(
34
+ 'Metadata keys to merge into the task. Set a key to null to delete it.',
35
+ ),
36
+ })
37
+ })
38
+
39
+ export const outputSchema = lazySchema(() =>
40
+ z.object({
41
+ success: z.boolean(),
42
+ taskId: z.string(),
43
+ updatedFields: z.array(z.string()),
44
+ error: z.string().optional(),
45
+ statusChange: z
46
+ .object({
47
+ from: z.string(),
48
+ to: z.string(),
49
+ })
50
+ .optional(),
51
+ verificationNudgeNeeded: z.boolean().optional(),
52
+ evidenceJoinKey: z.string(),
53
+ parentToolUseId: z.string(),
54
+ resumeToken: z.string(),
55
+ permissionFlow: z.literal('coordinator_parent_round_trip'),
56
+ }),
57
+ )
58
+
59
+ export type InputSchema = ReturnType<typeof inputSchema>
60
+ export type OutputSchema = ReturnType<typeof outputSchema>
61
+ export type TaskUpdateToolInput = z.infer<InputSchema>
62
+ export type Output = z.infer<OutputSchema>
@@ -0,0 +1,46 @@
1
+ import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'
2
+ import { isAgentSwarmsEnabled } from '../../utils/agentSwarmsEnabled.js'
3
+ import { getAgentId } from '../../utils/teammate.js'
4
+ import { VERIFICATION_AGENT_TYPE } from '../AgentTool/constants.js'
5
+ import type { Output } from './schemas.js'
6
+
7
+ function supportMetadataText(content: Output): string {
8
+ return `evidence_join_key: ${content.evidenceJoinKey}
9
+ parent_tool_use_id: ${content.parentToolUseId}
10
+ resume_token: ${content.resumeToken}
11
+ permission_flow: ${content.permissionFlow}`
12
+ }
13
+
14
+ function completedTaskReminder(content: Output): string {
15
+ if (content.statusChange?.to !== 'completed') return ''
16
+ if (!getAgentId() || !isAgentSwarmsEnabled()) return ''
17
+ return '\n\nTask completed. Call TaskList now to find your next available task or see if your work unblocked others.'
18
+ }
19
+
20
+ function verificationReminder(content: Output): string {
21
+ if (!content.verificationNudgeNeeded) return ''
22
+ return `\n\nNOTE: You just closed out 3+ tasks and none of them was a verification step. Before writing your final summary, spawn the verification agent (subagent_type="${VERIFICATION_AGENT_TYPE}"). You cannot self-assign PARTIAL by listing caveats in your summary — only the verifier issues a verdict.`
23
+ }
24
+
25
+ export function mapTaskUpdateResultToToolResultBlockParam(
26
+ content: Output,
27
+ toolUseID: string,
28
+ ): ToolResultBlockParam {
29
+ const metadata = supportMetadataText(content)
30
+ if (!content.success) {
31
+ return {
32
+ tool_use_id: toolUseID,
33
+ type: 'tool_result',
34
+ content: `${content.error || `Task #${content.taskId} not found`}\n${metadata}`,
35
+ }
36
+ }
37
+
38
+ const resultContent = `Updated task #${content.taskId} ${content.updatedFields.join(', ')}
39
+ ${metadata}${completedTaskReminder(content)}${verificationReminder(content)}`
40
+
41
+ return {
42
+ tool_use_id: toolUseID,
43
+ type: 'tool_result',
44
+ content: resultContent,
45
+ }
46
+ }