ummaya 0.2.3 → 0.2.5

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