ummaya 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/README.md +15 -2
  2. package/bin/ummaya +10 -1
  3. package/npm-shrinkwrap.json +253 -2
  4. package/package.json +5 -1
  5. package/prompts/manifest.yaml +1 -1
  6. package/prompts/system_v1.md +1 -0
  7. package/pyproject.toml +26 -2
  8. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  9. package/src/ummaya/_canonical/__init__.py +2 -0
  10. package/src/ummaya/engine/engine.py +29 -132
  11. package/src/ummaya/evidence/__init__.py +21 -2
  12. package/src/ummaya/evidence/dataset_contract.py +193 -0
  13. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  14. package/src/ummaya/evidence/document_harness.py +313 -0
  15. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  16. package/src/ummaya/evidence/gates.py +70 -0
  17. package/src/ummaya/evidence/json_types.py +20 -0
  18. package/src/ummaya/evidence/models.py +88 -1
  19. package/src/ummaya/evidence/output_payload.py +89 -0
  20. package/src/ummaya/evidence/payload_documents.py +233 -0
  21. package/src/ummaya/evidence/route_contracts.py +224 -0
  22. package/src/ummaya/evidence/route_helpers.py +150 -0
  23. package/src/ummaya/evidence/runner.py +81 -212
  24. package/src/ummaya/evidence/source_provenance.py +246 -0
  25. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  26. package/src/ummaya/evidence/tool_layer.py +39 -0
  27. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  28. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  29. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  30. package/src/ummaya/ipc/frame_schema.py +5 -5
  31. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  32. package/src/ummaya/ipc/stdio.py +1109 -477
  33. package/src/ummaya/llm/client.py +102 -3
  34. package/src/ummaya/llm/config.py +8 -3
  35. package/src/ummaya/primitives/__init__.py +6 -2
  36. package/src/ummaya/primitives/delegation.py +1 -1
  37. package/src/ummaya/primitives/document.py +28 -0
  38. package/src/ummaya/settings.py +0 -3
  39. package/src/ummaya/tools/discovery_bridge.py +17 -1
  40. package/src/ummaya/tools/documents/__init__.py +297 -0
  41. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  42. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  43. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  44. package/src/ummaya/tools/documents/authoring.py +283 -0
  45. package/src/ummaya/tools/documents/baselines.py +114 -0
  46. package/src/ummaya/tools/documents/capability.py +331 -0
  47. package/src/ummaya/tools/documents/contracts.py +112 -0
  48. package/src/ummaya/tools/documents/conversion.py +521 -0
  49. package/src/ummaya/tools/documents/diff.py +275 -0
  50. package/src/ummaya/tools/documents/engines.py +163 -0
  51. package/src/ummaya/tools/documents/evaluation.py +291 -0
  52. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  53. package/src/ummaya/tools/documents/fixtures.py +174 -0
  54. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  55. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  56. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  57. package/src/ummaya/tools/documents/formats/base.py +41 -0
  58. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  59. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  60. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  61. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  62. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  63. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  64. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  65. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  66. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  67. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  68. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  69. package/src/ummaya/tools/documents/inspection.py +289 -0
  70. package/src/ummaya/tools/documents/intake.py +1079 -0
  71. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  72. package/src/ummaya/tools/documents/models.py +1598 -0
  73. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  74. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  75. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  76. package/src/ummaya/tools/documents/patch.py +170 -0
  77. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  78. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  79. package/src/ummaya/tools/documents/permissions.py +110 -0
  80. package/src/ummaya/tools/documents/planner.py +616 -0
  81. package/src/ummaya/tools/documents/registry.py +2733 -0
  82. package/src/ummaya/tools/documents/render.py +978 -0
  83. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  84. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  85. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  86. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  87. package/src/ummaya/tools/documents/reread.py +157 -0
  88. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  89. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  90. package/src/ummaya/tools/documents/scorecard.py +184 -0
  91. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  92. package/src/ummaya/tools/documents/style.py +48 -0
  93. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  94. package/src/ummaya/tools/documents/validate.py +347 -0
  95. package/src/ummaya/tools/executor.py +29 -0
  96. package/src/ummaya/tools/live_proxy.py +0 -3
  97. package/src/ummaya/tools/models.py +5 -1
  98. package/src/ummaya/tools/register_all.py +8 -0
  99. package/src/ummaya/tools/registry.py +10 -1
  100. package/src/ummaya/tools/routing/__init__.py +59 -0
  101. package/src/ummaya/tools/routing/builder.py +105 -0
  102. package/src/ummaya/tools/routing/cards.py +29 -0
  103. package/src/ummaya/tools/routing/decision_service.py +534 -0
  104. package/src/ummaya/tools/routing/decision_types.py +74 -0
  105. package/src/ummaya/tools/routing/feasibility.py +122 -0
  106. package/src/ummaya/tools/routing/intent.py +17 -0
  107. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  108. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  109. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  110. package/src/ummaya/tools/routing/intent_types.py +48 -0
  111. package/src/ummaya/tools/routing/lint.py +78 -0
  112. package/src/ummaya/tools/routing/metadata.py +174 -0
  113. package/src/ummaya/tools/routing/projection.py +340 -0
  114. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  115. package/src/ummaya/tools/routing/schema.py +81 -0
  116. package/src/ummaya/tools/routing/types.py +96 -0
  117. package/src/ummaya/tools/routing_index.py +2 -2
  118. package/src/ummaya/tools/search.py +34 -746
  119. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  120. package/tui/package.json +1 -1
  121. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  122. package/tui/src/QueryEngine.ts +12 -8
  123. package/tui/src/bridge/inboundAttachments.ts +3 -3
  124. package/tui/src/cli/handlers/auth.ts +3 -12
  125. package/tui/src/cli/print.ts +7 -7
  126. package/tui/src/commands/insights.ts +1 -1
  127. package/tui/src/commands/install-github-app/types.ts +8 -30
  128. package/tui/src/commands/plugin/types.ts +6 -28
  129. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  130. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  131. package/tui/src/components/Feedback.tsx +1 -1
  132. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  133. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  134. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  135. package/tui/src/components/Spinner/types.ts +6 -28
  136. package/tui/src/components/agents/generateAgent.ts +1 -1
  137. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  138. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  139. package/tui/src/components/mcp/types.ts +16 -38
  140. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  141. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  142. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  143. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  144. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  145. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  146. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  147. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  148. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  149. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  150. package/tui/src/components/primitive/index.tsx +43 -1
  151. package/tui/src/components/primitive/types.ts +137 -0
  152. package/tui/src/components/ui/option.ts +4 -26
  153. package/tui/src/constants/common.ts +0 -2
  154. package/tui/src/constants/prompts.ts +4 -3
  155. package/tui/src/constants/querySource.ts +4 -26
  156. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  157. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  158. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  159. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  160. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  161. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  162. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  163. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  164. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  165. package/tui/src/ink/ink.tsx +33 -14
  166. package/tui/src/ink/reconciler.ts +2 -3
  167. package/tui/src/ink/render-to-screen.ts +30 -10
  168. package/tui/src/ipc/bridge.ts +62 -15
  169. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  170. package/tui/src/ipc/codec.ts +3 -3
  171. package/tui/src/ipc/frames.generated.ts +12 -12
  172. package/tui/src/ipc/llmClient.ts +151 -27
  173. package/tui/src/ipc/schema/frame.schema.json +1 -1
  174. package/tui/src/keybindings/defaultBindings.ts +4 -0
  175. package/tui/src/main.tsx +29 -11
  176. package/tui/src/native-ts/file-index/index.ts +33 -3
  177. package/tui/src/observability/surface.ts +2 -2
  178. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  179. package/tui/src/projectOnboardingState.ts +7 -6
  180. package/tui/src/query/chatMessageTypes.ts +18 -0
  181. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  182. package/tui/src/query/deps.ts +1 -1
  183. package/tui/src/query/messageGuards.ts +106 -0
  184. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  185. package/tui/src/query/run.ts +1075 -0
  186. package/tui/src/query/supportBoundary.ts +168 -0
  187. package/tui/src/query/toolResultErrors.ts +103 -0
  188. package/tui/src/query/toolRunner.ts +687 -0
  189. package/tui/src/query/unavailableToolRepair.ts +118 -0
  190. package/tui/src/query.ts +9 -2186
  191. package/tui/src/screens/REPL.tsx +40 -29
  192. package/tui/src/services/api/adapterManifest.ts +4 -0
  193. package/tui/src/services/api/backendChat/events.ts +117 -0
  194. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  195. package/tui/src/services/api/backendChat/frame.ts +9 -0
  196. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  197. package/tui/src/services/api/backendChat/types.ts +62 -0
  198. package/tui/src/services/api/backendChat.ts +1 -0
  199. package/tui/src/services/api/client.ts +65 -2
  200. package/tui/src/services/api/errorUtils.ts +5 -5
  201. package/tui/src/services/api/errors.ts +1 -1
  202. package/tui/src/services/api/logging.ts +1 -1
  203. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  204. package/tui/src/services/api/ummaya/messages.ts +255 -0
  205. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  206. package/tui/src/services/api/ummaya/provider.ts +200 -0
  207. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  208. package/tui/src/services/api/ummaya/request.ts +200 -0
  209. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  210. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  211. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  212. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  213. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  214. package/tui/src/services/api/ummaya/types.ts +110 -0
  215. package/tui/src/services/api/ummaya/usage.ts +30 -0
  216. package/tui/src/services/api/ummaya.ts +26 -418
  217. package/tui/src/services/api/withRetry.ts +1 -1
  218. package/tui/src/services/awaySummary.ts +2 -2
  219. package/tui/src/services/claudeAiLimits.ts +1 -1
  220. package/tui/src/services/compact/autoCompact.ts +1 -1
  221. package/tui/src/services/compact/compact.ts +1 -1
  222. package/tui/src/services/lsp/types.ts +8 -30
  223. package/tui/src/services/tips/types.ts +6 -28
  224. package/tui/src/services/tokenEstimation.ts +1 -1
  225. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  226. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  227. package/tui/src/services/tools/toolExecution.ts +94 -1
  228. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  229. package/tui/src/store/session-store.ts +10 -36
  230. package/tui/src/stubs/any-stub.ts +15 -10
  231. package/tui/src/stubs/color-diff-napi.ts +37 -23
  232. package/tui/src/stubs/globals.d.ts +3 -3
  233. package/tui/src/stubs/macro-preload.ts +23 -12
  234. package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
  235. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  236. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  237. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  238. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  239. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  240. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  241. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  242. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  243. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  244. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  245. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  246. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  247. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  248. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  249. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  250. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  251. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  252. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  253. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  254. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  255. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  256. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  257. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  258. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  259. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  260. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  261. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  262. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  263. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  264. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  265. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  266. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  267. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  268. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  269. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  270. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  271. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  272. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  273. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  274. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  275. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  276. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  277. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  278. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  279. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  280. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  281. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  282. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  283. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  284. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  285. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  286. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  287. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  288. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  289. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  290. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  291. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  292. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  293. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  294. package/tui/src/tools/BashTool/call.ts +202 -0
  295. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  296. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  297. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  298. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  299. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  300. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  301. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  302. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  303. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  304. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  305. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  306. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  307. package/tui/src/tools/BashTool/schemas.ts +65 -0
  308. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  309. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  310. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  311. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  312. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  313. package/tui/src/tools/BriefTool/upload.ts +1 -1
  314. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  315. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  316. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  317. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  318. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  319. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  320. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  321. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  322. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  323. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  324. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  325. package/tui/src/tools/FileEditTool/call.ts +228 -0
  326. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  327. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  328. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  329. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  330. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  331. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  332. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
  333. package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
  334. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  335. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  336. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  337. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  338. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  339. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  340. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  341. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  342. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  343. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  344. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  345. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  346. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  347. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  348. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  349. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  350. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  351. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  352. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  353. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  354. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  355. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  356. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
  357. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  358. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  359. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
  360. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  361. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  362. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  363. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  364. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  365. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  366. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  367. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  368. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  369. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  370. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  371. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  372. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  373. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  374. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  375. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  376. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  377. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  378. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  379. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  380. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  381. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  382. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  383. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  384. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  385. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
  386. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  387. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  388. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  389. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  390. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  391. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  392. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  393. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  394. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  395. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  396. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  397. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  398. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  399. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  400. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  401. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  402. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  403. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  404. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  405. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  406. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  407. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  408. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  409. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  410. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  411. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  412. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  413. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  414. package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
  415. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  416. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  417. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  418. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  419. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  420. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  421. package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
  422. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  423. package/tui/src/tools.ts +39 -190
  424. package/tui/src/types/fileSuggestion.ts +4 -26
  425. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  426. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  427. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  428. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  429. package/tui/src/types/message.ts +80 -102
  430. package/tui/src/types/messageQueueTypes.ts +6 -28
  431. package/tui/src/types/notebook.ts +16 -38
  432. package/tui/src/types/statusLine.ts +4 -26
  433. package/tui/src/types/tools.ts +24 -46
  434. package/tui/src/types/utils.ts +6 -28
  435. package/tui/src/upstreamproxy/relay.ts +7 -3
  436. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  437. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  438. package/tui/src/utils/auth.ts +129 -139
  439. package/tui/src/utils/bash/ast.ts +23 -23
  440. package/tui/src/utils/bash/bashParser.ts +5 -5
  441. package/tui/src/utils/billing.ts +1 -1
  442. package/tui/src/utils/collapseReadSearch.ts +3 -3
  443. package/tui/src/utils/cronTasks.ts +1 -1
  444. package/tui/src/utils/execFileNoThrow.ts +1 -1
  445. package/tui/src/utils/filePersistence/types.ts +16 -38
  446. package/tui/src/utils/forkedAgent.ts +1 -1
  447. package/tui/src/utils/gracefulShutdown.ts +4 -4
  448. package/tui/src/utils/heapDumpService.ts +12 -8
  449. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  450. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  451. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  452. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  453. package/tui/src/utils/messages.ts +18 -0
  454. package/tui/src/utils/migrateSessions.ts +3 -3
  455. package/tui/src/utils/model/model.ts +6 -6
  456. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  457. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  458. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  459. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  460. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  461. package/tui/src/utils/protectedNamespace.ts +5 -3
  462. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  463. package/tui/src/utils/ripgrep.ts +16 -7
  464. package/tui/src/utils/sessionTitle.ts +1 -1
  465. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  466. package/tui/src/utils/shell/prefix.ts +1 -1
  467. package/tui/src/utils/sideQuery.ts +1 -1
  468. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  469. package/tui/src/utils/teleport.tsx +1 -1
  470. package/uv.lock +400 -14
  471. package/tui/src/services/api/claude.ts +0 -3540
  472. package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
  473. package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
  474. package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
  475. package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
  476. package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
  477. package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
@@ -0,0 +1,116 @@
1
+ import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'
2
+ import { BASH_TOOL_NAME } from '../BashTool/toolName.js'
3
+ import { FILE_READ_TOOL_NAME } from '../FileReadTool/prompt.js'
4
+ import { formatSourceVerificationForModel } from '../WebFetchTool/sourceVerification.js'
5
+ import { ONE_SHOT_BUILTIN_AGENT_TYPES } from './constants.js'
6
+ import type { AgentToolOutput } from './schemas.js'
7
+
8
+ function assertNever(value: never): never {
9
+ throw new Error(`Unexpected agent tool result status: ${JSON.stringify(value)}`)
10
+ }
11
+
12
+ export function mapAgentToolResultToToolResultBlockParam(
13
+ data: AgentToolOutput,
14
+ toolUseID: string,
15
+ ): ToolResultBlockParam {
16
+ switch (data.status) {
17
+ case 'teammate_spawned':
18
+ return {
19
+ tool_use_id: toolUseID,
20
+ type: 'tool_result',
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: `Spawned successfully.
25
+ agent_id: ${data.teammate_id}
26
+ name: ${data.name}
27
+ team_name: ${data.team_name}
28
+ evidence_join_key: ${data.evidenceJoinKey}
29
+ parent_tool_use_id: ${data.parentToolUseId}
30
+ resume_token: ${data.resumeToken}
31
+ permission_flow: ${data.permissionFlow}
32
+ The agent is now running and will receive instructions via mailbox.`,
33
+ },
34
+ ],
35
+ }
36
+ case 'remote_launched':
37
+ return {
38
+ tool_use_id: toolUseID,
39
+ type: 'tool_result',
40
+ content: [
41
+ {
42
+ type: 'text',
43
+ text: `Remote agent launched in CCR.\ntaskId: ${data.taskId}\nsession_url: ${data.sessionUrl}\noutput_file: ${data.outputFile}\nThe agent is running remotely. You will be notified automatically when it completes.\nBriefly tell the user what you launched and end your response.`,
44
+ },
45
+ ],
46
+ }
47
+ case 'async_launched':
48
+ return mapAsyncAgentResult(data, toolUseID)
49
+ case 'completed':
50
+ return mapCompletedAgentResult(data, toolUseID)
51
+ default:
52
+ return assertNever(data)
53
+ }
54
+ }
55
+
56
+ function mapAsyncAgentResult(
57
+ data: Extract<AgentToolOutput, { readonly status: 'async_launched' }>,
58
+ toolUseID: string,
59
+ ): ToolResultBlockParam {
60
+ const supportMetadata = `evidence_join_key: ${data.evidenceJoinKey}\nparent_tool_use_id: ${data.parentToolUseId}\nresume_token: ${data.resumeToken}\npermission_flow: ${data.permissionFlow}`
61
+ const prefix = `Async agent launched successfully.\nagentId: ${data.agentId} (internal ID - do not mention to user. Use SendMessage with to: '${data.agentId}' to continue this agent.)\n${supportMetadata}\nThe agent is working in the background. You will be notified automatically when it completes.`
62
+ const instructions = data.canReadOutputFile
63
+ ? `Do not duplicate this agent's work — avoid working with the same files or topics it is using. Work on non-overlapping tasks, or briefly tell the user what you launched and end your response.\noutput_file: ${data.outputFile}\nIf asked, you can check progress before completion by using ${FILE_READ_TOOL_NAME} or ${BASH_TOOL_NAME} tail on the output file.`
64
+ : `Briefly tell the user what you launched and end your response. Do not generate any other text — agent results will arrive in a subsequent message.`
65
+ return {
66
+ tool_use_id: toolUseID,
67
+ type: 'tool_result',
68
+ content: [{ type: 'text', text: `${prefix}\n${instructions}` }],
69
+ }
70
+ }
71
+
72
+ function mapCompletedAgentResult(
73
+ data: Extract<AgentToolOutput, { readonly status: 'completed' }>,
74
+ toolUseID: string,
75
+ ): ToolResultBlockParam {
76
+ const worktreeInfoText = data.worktreePath
77
+ ? `\nworktreePath: ${data.worktreePath}\nworktreeBranch: ${data.worktreeBranch}`
78
+ : ''
79
+ const sourceVerificationText = formatSourceVerificationForModel(
80
+ data.sourceVerification,
81
+ )
82
+ const sourceVerificationSuffix = sourceVerificationText
83
+ ? `\n${sourceVerificationText}`
84
+ : ''
85
+ const contentOrMarker =
86
+ data.content.length > 0
87
+ ? data.content
88
+ : [{ type: 'text' as const, text: '(Subagent completed but returned no output.)' }]
89
+
90
+ if (
91
+ data.agentType &&
92
+ ONE_SHOT_BUILTIN_AGENT_TYPES.has(data.agentType) &&
93
+ !worktreeInfoText
94
+ ) {
95
+ return { tool_use_id: toolUseID, type: 'tool_result', content: contentOrMarker }
96
+ }
97
+
98
+ return {
99
+ tool_use_id: toolUseID,
100
+ type: 'tool_result',
101
+ content: [
102
+ ...contentOrMarker,
103
+ {
104
+ type: 'text',
105
+ text: `agentId: ${data.agentId} (use SendMessage with to: '${data.agentId}' to continue this agent)${worktreeInfoText}
106
+ evidence_join_key: ${data.evidenceJoinKey}
107
+ parent_tool_use_id: ${data.parentToolUseId}
108
+ resume_token: ${data.resumeToken}
109
+ permission_flow: ${data.permissionFlow}
110
+ <usage>total_tokens: ${data.totalTokens}
111
+ tool_uses: ${data.totalToolUseCount}
112
+ duration_ms: ${data.totalDurationMs}</usage>${sourceVerificationSuffix}`,
113
+ },
114
+ ],
115
+ }
116
+ }
@@ -1,6 +1,4 @@
1
- import { promises as fsp } from 'fs'
2
1
  import { getSdkAgentProgressSummariesEnabled } from '../../bootstrap/state.js'
3
- import { getSystemPrompt } from '../../constants/prompts.js'
4
2
  import { isCoordinatorMode } from '../../coordinator/coordinatorMode.js'
5
3
  import type { CanUseToolFn } from '../../hooks/useCanUseTool.js'
6
4
  import type { ToolUseContext } from '../../Tool.js'
@@ -9,29 +7,21 @@ import { assembleToolPool } from '../../tools.js'
9
7
  import { asAgentId } from '../../types/ids.js'
10
8
  import { runWithAgentContext } from '../../utils/agentContext.js'
11
9
  import { runWithCwdOverride } from '../../utils/cwd.js'
12
- import { logForDebugging } from '../../utils/debug.js'
13
- import {
14
- createUserMessage,
15
- filterOrphanedThinkingOnlyMessages,
16
- filterUnresolvedToolUses,
17
- filterWhitespaceOnlyAssistantMessages,
18
- } from '../../utils/messages.js'
10
+ import { createUserMessage } from '../../utils/messages.js'
19
11
  import { getAgentModel } from '../../utils/model/agent.js'
20
12
  import { getQuerySourceForAgent } from '../../utils/promptCategory.js'
21
- import {
22
- getAgentTranscript,
23
- readAgentMetadata,
24
- } from '../../utils/sessionStorage.js'
25
- import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js'
26
- import type { SystemPrompt } from '../../utils/systemPromptType.js'
27
13
  import { getTaskOutputPath } from '../../utils/task/diskOutput.js'
28
14
  import { getParentSessionId } from '../../utils/teammate.js'
29
- import { reconstructForSubagentResume } from '../../utils/toolResultStorage.js'
30
- import { runAsyncAgentLifecycle } from './agentToolUtils.js'
31
- import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
15
+ import { runAsyncAgentLifecycle } from './asyncAgentLifecycle.js'
32
16
  import { FORK_AGENT, isForkSubagentEnabled } from './forkSubagent.js'
33
- import type { AgentDefinition } from './loadAgentsDir.js'
34
17
  import { isBuiltInAgent } from './loadAgentsDir.js'
18
+ import { buildCoordinatorWorkerPermissionContext } from './orchestrationSupport.js'
19
+ import {
20
+ buildForkParentSystemPrompt,
21
+ loadResumeTranscriptState,
22
+ resolveResumedWorktreePath,
23
+ selectResumeAgentDefinition,
24
+ } from './resumeAgentHelpers.js'
35
25
  import { runAgent } from './runAgent.js'
36
26
 
37
27
  export type ResumeAgentResult = {
@@ -39,6 +29,7 @@ export type ResumeAgentResult = {
39
29
  description: string
40
30
  outputFile: string
41
31
  }
32
+
42
33
  export async function resumeAgentBackground({
43
34
  agentId,
44
35
  prompt,
@@ -60,92 +51,25 @@ export async function resumeAgentBackground({
60
51
  toolUseContext.setAppStateForTasks ?? toolUseContext.setAppState
61
52
  const permissionMode = appState.toolPermissionContext.mode
62
53
 
63
- const [transcript, meta] = await Promise.all([
64
- getAgentTranscript(asAgentId(agentId)),
65
- readAgentMetadata(asAgentId(agentId)),
66
- ])
67
- if (!transcript) {
68
- throw new Error(`No transcript found for agent ID: ${agentId}`)
69
- }
70
- const resumedMessages = filterWhitespaceOnlyAssistantMessages(
71
- filterOrphanedThinkingOnlyMessages(
72
- filterUnresolvedToolUses(transcript.messages),
73
- ),
74
- )
75
- const resumedReplacementState = reconstructForSubagentResume(
76
- toolUseContext.contentReplacementState,
77
- resumedMessages,
78
- transcript.contentReplacements,
79
- )
80
- // Best-effort: if the original worktree was removed externally, fall back
81
- // to parent cwd rather than crashing on chdir later.
82
- const resumedWorktreePath = meta?.worktreePath
83
- ? await fsp.stat(meta.worktreePath).then(
84
- s => (s.isDirectory() ? meta.worktreePath : undefined),
85
- () => {
86
- logForDebugging(
87
- `Resumed worktree ${meta.worktreePath} no longer exists; falling back to parent cwd`,
88
- )
89
- return undefined
90
- },
91
- )
92
- : undefined
93
- if (resumedWorktreePath) {
94
- // Bump mtime so stale-worktree cleanup doesn't delete a just-resumed worktree (#22355)
95
- const now = new Date()
96
- await fsp.utimes(resumedWorktreePath, now, now)
97
- }
98
-
99
- // Skip filterDeniedAgents re-gating — original spawn already passed permission checks
100
- let selectedAgent: AgentDefinition
101
- let isResumedFork = false
102
- if (meta?.agentType === FORK_AGENT.agentType) {
103
- selectedAgent = FORK_AGENT
104
- isResumedFork = true
105
- } else if (meta?.agentType) {
106
- const found = toolUseContext.options.agentDefinitions.activeAgents.find(
107
- a => a.agentType === meta.agentType,
54
+ const resumeAgentId = asAgentId(agentId)
55
+ const { resumedMessages, resumedReplacementState, meta } =
56
+ await loadResumeTranscriptState(
57
+ resumeAgentId,
58
+ toolUseContext.contentReplacementState,
108
59
  )
109
- selectedAgent = found ?? GENERAL_PURPOSE_AGENT
110
- } else {
111
- selectedAgent = GENERAL_PURPOSE_AGENT
112
- }
60
+ const resumedWorktreePath = await resolveResumedWorktreePath(
61
+ meta?.worktreePath,
62
+ )
63
+ const { selectedAgent, isResumedFork } = selectResumeAgentDefinition({
64
+ agentType: meta?.agentType,
65
+ activeAgents: toolUseContext.options.agentDefinitions.activeAgents,
66
+ })
113
67
 
114
68
  const uiDescription = meta?.description ?? '(resumed)'
115
69
 
116
- let forkParentSystemPrompt: SystemPrompt | undefined
117
- if (isResumedFork) {
118
- if (toolUseContext.renderedSystemPrompt) {
119
- forkParentSystemPrompt = toolUseContext.renderedSystemPrompt
120
- } else {
121
- const mainThreadAgentDefinition = appState.agent
122
- ? appState.agentDefinitions.activeAgents.find(
123
- a => a.agentType === appState.agent,
124
- )
125
- : undefined
126
- const additionalWorkingDirectories = Array.from(
127
- appState.toolPermissionContext.additionalWorkingDirectories.keys(),
128
- )
129
- const defaultSystemPrompt = await getSystemPrompt(
130
- toolUseContext.options.tools,
131
- toolUseContext.options.mainLoopModel,
132
- additionalWorkingDirectories,
133
- toolUseContext.options.mcpClients,
134
- )
135
- forkParentSystemPrompt = buildEffectiveSystemPrompt({
136
- mainThreadAgentDefinition,
137
- toolUseContext,
138
- customSystemPrompt: toolUseContext.options.customSystemPrompt,
139
- defaultSystemPrompt,
140
- appendSystemPrompt: toolUseContext.options.appendSystemPrompt,
141
- })
142
- }
143
- if (!forkParentSystemPrompt) {
144
- throw new Error(
145
- 'Cannot resume fork agent: unable to reconstruct parent system prompt',
146
- )
147
- }
148
- }
70
+ const forkParentSystemPrompt = isResumedFork
71
+ ? await buildForkParentSystemPrompt({ toolUseContext, appState })
72
+ : undefined
149
73
 
150
74
  // Resolve model for analytics metadata (runAgent resolves its own internally)
151
75
  const resolvedAgentModel = getAgentModel(
@@ -155,10 +79,10 @@ export async function resumeAgentBackground({
155
79
  permissionMode,
156
80
  )
157
81
 
158
- const workerPermissionContext = {
159
- ...appState.toolPermissionContext,
160
- mode: selectedAgent.permissionMode ?? 'acceptEdits',
161
- }
82
+ const workerPermissionContext = buildCoordinatorWorkerPermissionContext(
83
+ appState.toolPermissionContext,
84
+ selectedAgent.permissionMode,
85
+ )
162
86
  const workerTools = isResumedFork
163
87
  ? toolUseContext.options.tools
164
88
  : assembleToolPool(workerPermissionContext, appState.mcp.tools)
@@ -211,6 +135,7 @@ export async function resumeAgentBackground({
211
135
  startTime,
212
136
  agentType: selectedAgent.agentType,
213
137
  isAsync: true,
138
+ parentToolUseId: toolUseContext.toolUseId,
214
139
  }
215
140
 
216
141
  const asyncAgentContext = {
@@ -227,18 +152,25 @@ export async function resumeAgentBackground({
227
152
  const wrapWithCwd = <T>(fn: () => T): T =>
228
153
  resumedWorktreePath ? runWithCwdOverride(resumedWorktreePath, fn) : fn()
229
154
 
155
+ const abortController = agentBackgroundTask.abortController
156
+ if (!abortController) {
157
+ throw new Error(
158
+ `Cannot resume agent ${agentBackgroundTask.agentId}: missing abort controller`,
159
+ )
160
+ }
161
+
230
162
  void runWithAgentContext(asyncAgentContext, () =>
231
163
  wrapWithCwd(() =>
232
164
  runAsyncAgentLifecycle({
233
165
  taskId: agentBackgroundTask.agentId,
234
- abortController: agentBackgroundTask.abortController!,
166
+ abortController,
235
167
  makeStream: onCacheSafeParams =>
236
168
  runAgent({
237
169
  ...runAgentParams,
238
170
  override: {
239
171
  ...runAgentParams.override,
240
172
  agentId: asAgentId(agentBackgroundTask.agentId),
241
- abortController: agentBackgroundTask.abortController!,
173
+ abortController,
242
174
  },
243
175
  onCacheSafeParams,
244
176
  }),
@@ -0,0 +1,140 @@
1
+ import { promises as fsp } from 'fs'
2
+ import { getSystemPrompt } from '../../constants/prompts.js'
3
+ import type { AppState } from '../../state/AppState.js'
4
+ import type { ToolUseContext } from '../../Tool.js'
5
+ import type { AgentId } from '../../types/ids.js'
6
+ import type { Message as MessageType } from '../../types/message.js'
7
+ import { logForDebugging } from '../../utils/debug.js'
8
+ import {
9
+ filterOrphanedThinkingOnlyMessages,
10
+ filterUnresolvedToolUses,
11
+ filterWhitespaceOnlyAssistantMessages,
12
+ } from '../../utils/messages.js'
13
+ import {
14
+ getAgentTranscript,
15
+ readAgentMetadata,
16
+ type AgentMetadata,
17
+ } from '../../utils/sessionStorage.js'
18
+ import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js'
19
+ import type { SystemPrompt } from '../../utils/systemPromptType.js'
20
+ import type { ContentReplacementState } from '../../utils/toolResultStorage.js'
21
+ import { reconstructForSubagentResume } from '../../utils/toolResultStorage.js'
22
+ import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
23
+ import { FORK_AGENT } from './forkSubagent.js'
24
+ import type { AgentDefinition } from './loadAgentsDir.js'
25
+
26
+ export type ResumeTranscriptState = {
27
+ readonly resumedMessages: MessageType[]
28
+ readonly resumedReplacementState: ContentReplacementState | undefined
29
+ readonly meta: AgentMetadata | null
30
+ }
31
+
32
+ export type ResumeAgentSelection = {
33
+ readonly selectedAgent: AgentDefinition
34
+ readonly isResumedFork: boolean
35
+ }
36
+
37
+ export async function loadResumeTranscriptState(
38
+ agentId: AgentId,
39
+ parentReplacementState: ContentReplacementState | undefined,
40
+ ): Promise<ResumeTranscriptState> {
41
+ const [transcript, meta] = await Promise.all([
42
+ getAgentTranscript(agentId),
43
+ readAgentMetadata(agentId),
44
+ ])
45
+ if (!transcript) {
46
+ throw new Error(`No transcript found for agent ID: ${agentId}`)
47
+ }
48
+
49
+ const resumedMessages = filterWhitespaceOnlyAssistantMessages(
50
+ filterOrphanedThinkingOnlyMessages(
51
+ filterUnresolvedToolUses(transcript.messages),
52
+ ),
53
+ )
54
+ const resumedReplacementState = reconstructForSubagentResume(
55
+ parentReplacementState,
56
+ resumedMessages,
57
+ transcript.contentReplacements,
58
+ )
59
+ return { resumedMessages, resumedReplacementState, meta }
60
+ }
61
+
62
+ export async function resolveResumedWorktreePath(
63
+ worktreePath: string | undefined,
64
+ ): Promise<string | undefined> {
65
+ if (!worktreePath) return undefined
66
+ const stat = await fsp.stat(worktreePath).then(
67
+ value => value,
68
+ () => undefined,
69
+ )
70
+ if (!stat?.isDirectory()) {
71
+ logForDebugging(
72
+ `Resumed worktree ${worktreePath} no longer exists; falling back to parent cwd`,
73
+ )
74
+ return undefined
75
+ }
76
+ const now = new Date()
77
+ await fsp.utimes(worktreePath, now, now)
78
+ return worktreePath
79
+ }
80
+
81
+ export function selectResumeAgentDefinition({
82
+ agentType,
83
+ activeAgents,
84
+ }: {
85
+ agentType: string | undefined
86
+ activeAgents: readonly AgentDefinition[]
87
+ }): ResumeAgentSelection {
88
+ if (agentType === FORK_AGENT.agentType) {
89
+ return { selectedAgent: FORK_AGENT, isResumedFork: true }
90
+ }
91
+ const selectedAgent = agentType
92
+ ? (activeAgents.find(agent => agent.agentType === agentType) ??
93
+ GENERAL_PURPOSE_AGENT)
94
+ : GENERAL_PURPOSE_AGENT
95
+ return { selectedAgent, isResumedFork: false }
96
+ }
97
+
98
+ export async function buildForkParentSystemPrompt({
99
+ toolUseContext,
100
+ appState,
101
+ }: {
102
+ toolUseContext: ToolUseContext
103
+ appState: AppState
104
+ }): Promise<SystemPrompt> {
105
+ if (toolUseContext.renderedSystemPrompt) {
106
+ return toolUseContext.renderedSystemPrompt
107
+ }
108
+ const mainThreadAgentDefinition = appState.agent
109
+ ? appState.agentDefinitions.activeAgents.find(
110
+ agent => agent.agentType === appState.agent,
111
+ )
112
+ : undefined
113
+ const defaultSystemPrompt = await getSystemPrompt(
114
+ toolUseContext.options.tools,
115
+ toolUseContext.options.mainLoopModel,
116
+ additionalWorkingDirectoryPaths(toolUseContext),
117
+ toolUseContext.options.mcpClients,
118
+ )
119
+ const forkParentSystemPrompt = buildEffectiveSystemPrompt({
120
+ mainThreadAgentDefinition,
121
+ toolUseContext,
122
+ customSystemPrompt: toolUseContext.options.customSystemPrompt,
123
+ defaultSystemPrompt,
124
+ appendSystemPrompt: toolUseContext.options.appendSystemPrompt,
125
+ })
126
+ if (!forkParentSystemPrompt) {
127
+ throw new Error(
128
+ 'Cannot resume fork agent: unable to reconstruct parent system prompt',
129
+ )
130
+ }
131
+ return forkParentSystemPrompt
132
+ }
133
+
134
+ function additionalWorkingDirectoryPaths(
135
+ toolUseContext: Pick<ToolUseContext, 'getAppState'>,
136
+ ): string[] {
137
+ return Array.from(
138
+ toolUseContext.getAppState().toolPermissionContext.additionalWorkingDirectories.keys(),
139
+ ).filter(path => typeof path === 'string')
140
+ }
@@ -887,7 +887,7 @@ export function filterIncompleteToolCalls(messages: Message[]): Message[] {
887
887
  const assistantMessage = message as AssistantMessage
888
888
  const content = assistantMessage.message.content
889
889
  if (Array.isArray(content)) {
890
- // Check if this assistant message has any tool uses without results
890
+ // Check if this assistant message includes tool uses without results
891
891
  const hasIncompleteToolCall = content.some(
892
892
  block =>
893
893
  block.type === 'tool_use' &&
@@ -0,0 +1,57 @@
1
+ import { feature } from 'bun:bundle'
2
+ import type { ToolUseContext } from '../../Tool.js'
3
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
4
+ import { isEnvTruthy } from '../../utils/envUtils.js'
5
+
6
+ type ProactiveModule = {
7
+ readonly isProactiveActive: () => boolean
8
+ }
9
+
10
+ const BUILD_FLAVOR = 'external'
11
+
12
+ /* eslint-disable @typescript-eslint/no-require-imports */
13
+ const proactiveModule: ProactiveModule | null =
14
+ feature('PROACTIVE') || feature('KAIROS')
15
+ ? require('../../proactive/index.js')
16
+ : null
17
+ /* eslint-enable @typescript-eslint/no-require-imports */
18
+
19
+ export const isBackgroundTasksDisabled =
20
+ // eslint-disable-next-line custom-rules/no-process-env-top-level -- Intentional: schema must be defined at module load
21
+ isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_BACKGROUND_TASKS)
22
+
23
+ export const PROGRESS_THRESHOLD_MS = 2000
24
+
25
+ export function isAntBuild(): boolean {
26
+ return BUILD_FLAVOR === 'ant'
27
+ }
28
+
29
+ export function getAutoBackgroundMs(): number {
30
+ if (
31
+ isEnvTruthy(process.env.CLAUDE_AUTO_BACKGROUND_TASKS) ||
32
+ getFeatureValue_CACHED_MAY_BE_STALE('tengu_auto_background_agents', false)
33
+ ) {
34
+ return 120_000
35
+ }
36
+ return 0
37
+ }
38
+
39
+ export function isCoordinatorEnvMode(): boolean {
40
+ return feature('COORDINATOR_MODE')
41
+ ? isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE)
42
+ : false
43
+ }
44
+
45
+ export function isProactiveAgentActive(): boolean {
46
+ return proactiveModule?.isProactiveActive() ?? false
47
+ }
48
+
49
+ export function additionalWorkingDirectoryPaths(
50
+ toolUseContext: Pick<ToolUseContext, 'getAppState'>,
51
+ ): string[] {
52
+ return Array.from(
53
+ toolUseContext
54
+ .getAppState()
55
+ .toolPermissionContext.additionalWorkingDirectories.keys(),
56
+ ).filter(path => typeof path === 'string')
57
+ }