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
@@ -14,6 +14,7 @@ import type { IPCBridge } from '../../ipc/bridge.js'
14
14
  import type { ToolCallFrame, ToolResultFrame } from '../../ipc/frames.generated.js'
15
15
  import { getUmmayaBridgeSessionId } from '../../ipc/bridgeSingleton.js'
16
16
  import type { ToolUseContext, ToolResult } from '../../Tool.js'
17
+ import { argumentsForPrimitive } from './documentDispatchArguments.js'
17
18
  import { PendingCallRegistry } from './pendingCallRegistry.js'
18
19
 
19
20
  // ---------------------------------------------------------------------------
@@ -49,7 +50,7 @@ function _resolveTimeoutMs(override?: number): number {
49
50
  // ---------------------------------------------------------------------------
50
51
 
51
52
  export interface DispatchPrimitiveOpts {
52
- primitive: 'find' | 'locate' | 'check' | 'send'
53
+ primitive: 'find' | 'locate' | 'check' | 'send' | 'document'
53
54
  /** Concrete model-facing tool name. Defaults to the primitive for legacy root calls. */
54
55
  toolName?: string
55
56
  /** Forwarded verbatim into tool_call frame arguments (FR-009). */
@@ -78,7 +79,7 @@ export function _resetCheckpointState(): void {
78
79
  }
79
80
 
80
81
  function _maybeEmitCheckpoint(
81
- primitive: 'find' | 'locate' | 'check' | 'send',
82
+ primitive: 'find' | 'locate' | 'check' | 'send' | 'document',
82
83
  frame: ToolResultFrame,
83
84
  ): void {
84
85
  if (process.env['UMMAYA_SMOKE_CHECKPOINTS'] !== 'true') return
@@ -146,8 +147,7 @@ export async function dispatchPrimitive<O = unknown>(
146
147
  // it does not synthesize the follow-up assistant turn for this Tool.call().
147
148
  // ------------------------------------------------------------------
148
149
 
149
- const toolUseId =
150
- (opts.context as Record<string, unknown>)['toolUseId'] as string | undefined
150
+ const toolUseId = opts.context.toolUseId
151
151
  if (!toolUseId) {
152
152
  span.setAttribute('ummaya.tui.primitive.error', 'missing_tool_use_id')
153
153
  span.end()
@@ -198,7 +198,7 @@ export async function dispatchPrimitive<O = unknown>(
198
198
  kind: 'tool_call',
199
199
  call_id: toolUseId,
200
200
  name: toolName,
201
- arguments: opts.args,
201
+ arguments: argumentsForPrimitive(opts),
202
202
  }
203
203
 
204
204
  const sent = opts.bridge.send(toolCallFrame)
@@ -281,7 +281,7 @@ export async function dispatchPrimitive<O = unknown>(
281
281
  // Classification rules (all OR'd, evaluated against ``inner`` only):
282
282
  // - ``inner.family === "mismatch_error"`` — VerifyMismatchError dump.
283
283
  // - ``inner.kind === "error"`` — lookup / submit error sentinel.
284
- // - ``inner.reason ∈ FATAL_REASONS`` — defense-in-depth: any adapter that
284
+ // - ``inner.reason ∈ FATAL_REASONS`` — defense-in-depth: an adapter that
285
285
  // emits a known-fatal reason code is classified as failure even if it
286
286
  // forgot to set ``kind``/``family``.
287
287
  const FATAL_REASONS = new Set([
@@ -0,0 +1,125 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * UMMAYA — document-change → Claude Code diff-pipeline migration boundary.
4
+ *
5
+ * Deep-research-migration note (selected approach D):
6
+ * specs/2802-public-doc-harness/deep-research-migration-document-render.md
7
+ *
8
+ * Document work renders in the TUI the same way Claude Code renders a code
9
+ * edit: automatically, inline, per-mutation, via `renderToolResultMessage`.
10
+ * Rather than invent a renderer, this module routes structural field-level
11
+ * document changes INTO the already-ported CC diff pipeline by representing the
12
+ * changed form as `label: value` text and producing the `StructuredPatchHunk[]`
13
+ * shape that `StructuredDiffList` already consumes byte-identically. The
14
+ * "structural" choice (difftastic / json-diff / daff convergence) is that the
15
+ * text is built from semantic fields, not from raw document bytes.
16
+ */
17
+ import type { StructuredPatchHunk } from 'diff'
18
+ import { getPatchFromContents } from '../../utils/diff.js'
19
+ import type {
20
+ DocumentChangePayload,
21
+ DocumentDiffPayload,
22
+ } from '../../components/primitive/types.js'
23
+
24
+ /** Default inline cap; beyond this the inline view shows a "+N more" affordance. */
25
+ export const DEFAULT_INLINE_CHANGE_CAP = 20
26
+
27
+ export interface DocumentPatchResult {
28
+ /** Hunks ready for `<StructuredDiffList hunks={...} />` (CC pipeline). */
29
+ hunks: StructuredPatchHunk[]
30
+ /** Synthetic file path = document name; drives CC language detection. */
31
+ filePath: string
32
+ /** Actual visible changes after no-op entries are removed. */
33
+ changeCount: number
34
+ /** Changes actually rendered into the patch (≤ cap). */
35
+ renderedChangeCount: number
36
+ /** True when changes were dropped from the inline view, or the backend
37
+ * already flagged inline truncation. */
38
+ truncated: boolean
39
+ }
40
+
41
+ interface DocumentChangeToPatchOptions {
42
+ documentName?: string
43
+ maxChanges?: number
44
+ }
45
+
46
+ export function documentChangeToPatch(
47
+ diff: DocumentDiffPayload,
48
+ options: DocumentChangeToPatchOptions = {},
49
+ ): DocumentPatchResult {
50
+ const filePath = nonEmpty(options.documentName) ?? 'document'
51
+ const cap = Math.max(0, options.maxChanges ?? DEFAULT_INLINE_CHANGE_CAP)
52
+ const changes = documentVisibleChanges(diff)
53
+ const changeCount = changes.length
54
+ const rendered = changes.slice(0, cap)
55
+ const renderedChangeCount = rendered.length
56
+ const truncated =
57
+ changeCount > renderedChangeCount || diff.inline_truncated === true
58
+
59
+ if (renderedChangeCount === 0) {
60
+ return { hunks: [], filePath, changeCount, renderedChangeCount, truncated }
61
+ }
62
+
63
+ // Trailing newline on both sides so the `diff` package does not emit a
64
+ // "" marker — that marker would also break the
65
+ // fallback renderer's remove/add adjacency pairing (and thus its word-level
66
+ // value highlighting).
67
+ const before = `${rendered.map((change) => fieldLine(change, 'before')).join('\n')}\n`
68
+ const after = `${rendered.map((change) => fieldLine(change, 'after')).join('\n')}\n`
69
+ const hunks = getPatchFromContents({
70
+ filePath,
71
+ oldContent: before,
72
+ newContent: after,
73
+ singleHunk: true,
74
+ })
75
+ return { hunks, filePath, changeCount, renderedChangeCount, truncated }
76
+ }
77
+
78
+ function fieldLine(change: DocumentChangePayload, side: 'before' | 'after'): string {
79
+ const fallbackLabel = humanizeDocumentTargetPath(change.target_path) || change.change_type
80
+ const label = nonEmpty(change.display_label) ?? fallbackLabel
81
+ const value = sanitizeValue(
82
+ side === 'before' ? change.before_value : change.after_value,
83
+ )
84
+ return `${label}: ${value}`
85
+ }
86
+
87
+ export function documentVisibleChanges(
88
+ diff: DocumentDiffPayload,
89
+ ): DocumentChangePayload[] {
90
+ return diff.changes.filter(hasVisibleChange)
91
+ }
92
+
93
+ function hasVisibleChange(change: DocumentChangePayload): boolean {
94
+ return sanitizeValue(change.before_value) !== sanitizeValue(change.after_value)
95
+ }
96
+
97
+ /**
98
+ * Structural path is the location (difftastic philosophy). Strip the leading
99
+ * slash and render nested segments with a breadcrumb separator so
100
+ * `/hwpx/text[12]` reads as `hwpx › text[12]`. No pixel coordinates — the field
101
+ * path is honest and precise about where the change lives.
102
+ */
103
+ export function humanizeDocumentTargetPath(path: string): string {
104
+ const trimmed = path.trim().replace(/^\/+/u, '')
105
+ if (trimmed === '') {
106
+ return ''
107
+ }
108
+ return trimmed.replace(/\/+/gu, ' › ')
109
+ }
110
+
111
+ /** Collapse newlines so one field change stays one diff line. */
112
+ function sanitizeValue(value: string | null | undefined): string {
113
+ if (value === null || value === undefined) {
114
+ return ''
115
+ }
116
+ return value.replace(/\r?\n/gu, ' ')
117
+ }
118
+
119
+ function nonEmpty(value: string | null | undefined): string | undefined {
120
+ if (value === null || value === undefined) {
121
+ return undefined
122
+ }
123
+ const trimmed = value.trim()
124
+ return trimmed === '' ? undefined : trimmed
125
+ }
@@ -0,0 +1,87 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ const DOCUMENT_READ_ONLY_OPERATIONS = new Set(['inspect', 'extract', 'validate'])
4
+
5
+ type PrimitiveName = 'find' | 'locate' | 'check' | 'send' | 'document'
6
+
7
+ export interface PrimitiveArgumentsOpts {
8
+ readonly primitive: PrimitiveName
9
+ readonly args: Record<string, unknown>
10
+ readonly context: {
11
+ readonly messages?: readonly unknown[]
12
+ }
13
+ }
14
+
15
+ export function argumentsForPrimitive(
16
+ opts: PrimitiveArgumentsOpts,
17
+ ): Record<string, unknown> {
18
+ if (opts.primitive !== 'document') return opts.args
19
+ if (isReadOnlyDocumentOperation(opts.args) && hasDocumentDispatchContract(opts.args)) {
20
+ return opts.args
21
+ }
22
+ const userQuery = latestUserTextFromContext(opts.context)
23
+ if (!userQuery) return opts.args
24
+ return {
25
+ ...opts.args,
26
+ __ummaya_user_query: userQuery,
27
+ }
28
+ }
29
+
30
+ function isReadOnlyDocumentOperation(args: Record<string, unknown>): boolean {
31
+ const operation = typeof args.operation === 'string'
32
+ ? args.operation.toLowerCase()
33
+ : 'fill'
34
+ return DOCUMENT_READ_ONLY_OPERATIONS.has(operation)
35
+ }
36
+
37
+ function hasDocumentDispatchContract(args: Record<string, unknown>): boolean {
38
+ const correlationId = args.correlation_id
39
+ const instruction = args.instruction
40
+ const document = recordFrom(args.document)
41
+ if (typeof correlationId !== 'string' || correlationId.trim() === '') return false
42
+ if (typeof instruction !== 'string' || instruction.trim() === '') return false
43
+ if (document === undefined) return false
44
+ const path = document.path
45
+ const artifactId = document.artifact_id
46
+ return (
47
+ (typeof path === 'string' && path.trim() !== '') ||
48
+ (typeof artifactId === 'string' && artifactId.trim() !== '')
49
+ )
50
+ }
51
+
52
+ function latestUserTextFromContext(context: PrimitiveArgumentsOpts['context']): string | undefined {
53
+ const messages = context.messages ?? []
54
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
55
+ const message = recordFrom(messages[index])
56
+ if (message === undefined || message.type !== 'user') continue
57
+ const sdkMessage = recordFrom(message.message)
58
+ if (sdkMessage === undefined || sdkMessage.role !== 'user') continue
59
+ const content = sdkMessage.content
60
+ if (typeof content === 'string' && content.trim() !== '') {
61
+ return content
62
+ }
63
+ const text = textFromContentBlocks(content)
64
+ if (text !== undefined) return text
65
+ }
66
+ return undefined
67
+ }
68
+
69
+ function textFromContentBlocks(content: unknown): string | undefined {
70
+ if (!Array.isArray(content)) return undefined
71
+ const text = content
72
+ .map(block => {
73
+ const item = recordFrom(block)
74
+ if (item?.type !== 'text') return ''
75
+ return typeof item.text === 'string' ? item.text : ''
76
+ })
77
+ .filter(Boolean)
78
+ .join('\n')
79
+ .trim()
80
+ return text === '' ? undefined : text
81
+ }
82
+
83
+ function recordFrom(value: unknown): Record<string, unknown> | undefined {
84
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
85
+ ? Object.fromEntries(Object.entries(value))
86
+ : undefined
87
+ }
@@ -0,0 +1,13 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // UMMAYA-original — document primitive timeout policy.
3
+
4
+ const DEFAULT_DOCUMENT_TIMEOUT_MS = 120_000
5
+
6
+ export function resolveDocumentPrimitiveTimeoutMs(): number {
7
+ const env = process.env['UMMAYA_TUI_DOCUMENT_TIMEOUT_MS']
8
+ if (env) {
9
+ const parsed = Number.parseInt(env, 10)
10
+ if (Number.isFinite(parsed) && parsed > 0) return parsed
11
+ }
12
+ return DEFAULT_DOCUMENT_TIMEOUT_MS
13
+ }
@@ -0,0 +1,98 @@
1
+ import React from 'react'
2
+ import { PrimitiveDispatcher } from '../../components/primitive/index.js'
3
+
4
+ type DocumentRenderOptions = {
5
+ verbose?: boolean
6
+ isTranscriptMode?: boolean
7
+ }
8
+
9
+ /**
10
+ * Auto-render a document tool result inline in the TUI — the same way Claude
11
+ * Code renders a code diff after an edit, with no "show viewer" query. Driven
12
+ * by `renderToolResultMessage`, invoked by the message loop for every resolved
13
+ * tool result. See deep-research-migration-document-render.md (approach D).
14
+ */
15
+ export function renderDocumentToolResultIfPresent(
16
+ output: unknown,
17
+ options: DocumentRenderOptions = {},
18
+ ): React.ReactNode | null {
19
+ const payload = extractDocumentToolResultPayload(output)
20
+ if (payload === null) {
21
+ return null
22
+ }
23
+ return React.createElement(PrimitiveDispatcher, {
24
+ payload,
25
+ expanded: options.verbose === true || options.isTranscriptMode === true,
26
+ })
27
+ }
28
+
29
+ /**
30
+ * Retired raster-availability gate.
31
+ *
32
+ * Previously this converted a successful `document_render` into a failure when
33
+ * a page raster was unreadable, because review happened in an external browser
34
+ * viewer that needed the image. Under deep-research-migration approach D the
35
+ * user surface is the structural field-level diff (`StructuredDiffList`), which
36
+ * renders from `diff.changes` and never depends on a raster — so the TUI no
37
+ * longer fabricates a visual-render failure. Page rasters remain Evidence
38
+ * Fabric evidence only (joinable by `correlation_id`).
39
+ *
40
+ * Kept as an identity pass-through so the model-facing primitive tools
41
+ * (AdapterTool / LookupPrimitive / SubmitPrimitive) keep a stable call boundary;
42
+ * full call-site removal is a tracked follow-up.
43
+ */
44
+ export function applyDocumentVisualRenderGateToOutput(output: unknown): unknown {
45
+ return output
46
+ }
47
+
48
+ /** The TUI never fabricates a render failure under approach D; backend status
49
+ * governs. Retained for call-boundary stability (see above). */
50
+ export function isDocumentVisualRenderFailedOutput(_output: unknown): boolean {
51
+ return false
52
+ }
53
+
54
+ export function extractDocumentToolResultPayload(
55
+ output: unknown,
56
+ ): Record<string, unknown> | null {
57
+ const direct = asDocumentToolResultPayload(output)
58
+ if (direct !== null) {
59
+ return direct
60
+ }
61
+
62
+ const wrapped = asRecord(output)
63
+ if (wrapped === null) {
64
+ return null
65
+ }
66
+ return asDocumentToolResultPayload(wrapped.result)
67
+ }
68
+
69
+ function asDocumentToolResultPayload(output: unknown): Record<string, unknown> | null {
70
+ const record = asRecord(output)
71
+ if (record === null) {
72
+ return null
73
+ }
74
+ return (
75
+ typeof record.tool_id === 'string' &&
76
+ (record.tool_id === 'document' || record.tool_id.startsWith('document_')) &&
77
+ typeof record.correlation_id === 'string' &&
78
+ typeof record.text_summary === 'string' &&
79
+ isDocumentStatus(record.status)
80
+ )
81
+ ? record
82
+ : null
83
+ }
84
+
85
+ function isDocumentStatus(status: unknown): boolean {
86
+ return (
87
+ status === 'ok' ||
88
+ status === 'blocked' ||
89
+ status === 'failed' ||
90
+ status === 'needs_input'
91
+ )
92
+ }
93
+
94
+ function asRecord(value: unknown): Record<string, unknown> | null {
95
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
96
+ ? value as Record<string, unknown>
97
+ : null
98
+ }
@@ -16,7 +16,7 @@ import type { ToolResultFrame } from '../../ipc/frames.generated.js'
16
16
 
17
17
  export interface PendingCall {
18
18
  callId: string
19
- primitive: 'find' | 'locate' | 'check' | 'send'
19
+ primitive: 'find' | 'locate' | 'check' | 'send' | 'document'
20
20
  resolve: (frame: ToolResultFrame) => void
21
21
  reject: (err: Error) => void
22
22
  timeoutHandle: ReturnType<typeof setTimeout>
@@ -45,11 +45,6 @@ export interface PendingCall {
45
45
  */
46
46
  export class PendingCallRegistry {
47
47
  private _pending = new Map<string, PendingCall>()
48
- // UMMAYA hotfix #2519 — race-safe buffering for ToolResultFrame frames
49
- // that arrive BEFORE the matching dispatchPrimitive call has registered
50
- // (the backend's _dispatch_primitive runs as a parallel asyncio.Task and
51
- // can complete in <1s for cached / mock adapters, often beating the
52
- // SDK's tool_use block parse → Tool.call() invocation timeline).
53
48
  private _buffered = new Map<string, ToolResultFrame>()
54
49
 
55
50
  /**
@@ -3,6 +3,7 @@ export const ROOT_PRIMITIVE_TOOL_IDS = new Set([
3
3
  'locate',
4
4
  'check',
5
5
  'send',
6
+ 'document',
6
7
  ])
7
8
 
8
9
  function asRecord(value: unknown): Record<string, unknown> | null {
@@ -0,0 +1,58 @@
1
+ export const DOCUMENT_TOOL_NAME = 'document'
2
+ export const DOCUMENT_RENDER_TOOL_NAME = 'document_render'
3
+ export type DocumentToolName =
4
+ | typeof DOCUMENT_TOOL_NAME
5
+ | typeof DOCUMENT_RENDER_TOOL_NAME
6
+
7
+ export const DOCUMENT_COMPLETION_PROMPT_MARKER = 'Document primitive result complete'
8
+ export const DOCUMENT_COMPLETION_PROMPT =
9
+ `${DOCUMENT_COMPLETION_PROMPT_MARKER}: the document tool_result for the latest citizen request is already visible in the TUI. Do not call another document, workspace, render, or tool-search tool in this turn. Answer in Korean only. Write the final Korean answer now from the actual tool_result only. Keep it to one or two short sentences: state whether the document was updated, blocked, failed, or needs explicit input; when the status is needs_input or the path is missing, ask the user to provide an exact existing file path or make an explicit selection; mention only changed field labels/values or required selection that are present in the visible diff; include the saved path only when the tool_result reports one. Do not invent units, parenthetical labels, workflow steps, style claims, or extra facts. Do not say an image, screenshot, viewport, render artifact, browser view, viewer, or visual artifact was generated. The inline TUI diff above is the user-visible proof.`
10
+ export const DOCUMENT_INTENT_RE =
11
+ /(문서|공문서|양식|서식|파일|작성|저장|렌더|미리보기|변경사항|\bdiff\b|\bcompact\b|\bdocument\b|\bfile\b|\bform\b|\brender\b|\bsave\b|\bwrite\b)/iu
12
+ export const DOCUMENT_WRITE_RE =
13
+ /(작성|수정|편집|채우|채워|입력|변경|저장|write|edit|fill|apply|save)/iu
14
+ export const DOCUMENT_READ_ONLY_RE =
15
+ /(읽기\s*전용|수정\s*없이|변경\s*없이|저장\s*없이|수정하지\s*마|저장하지\s*마|작성하지\s*마|쓰지\s*마|열람만|확인만|inspect|extract|read\s*only)/iu
16
+ export const DOCUMENT_DIFF_ONLY_FINAL_RE =
17
+ /(실제(?:로)?\s*바뀐\s*내용만|바뀐\s*내용만|변경된\s*부분만|변경사항만|actual\s+changed\s+content\s+only|only\s+changed)/iu
18
+ export const DOCUMENT_DIFF_AND_SAVE_ONLY_FINAL_RE =
19
+ /(실제(?:로)?\s*바뀐\s*내용\s*(?:과|및|랑|하고)\s*저장\s*(?:위치|경로)만|변경(?:된)?\s*(?:내용|부분|사항).{0,24}저장\s*(?:위치|경로)만|changed.{0,24}(?:save|saved).{0,24}(?:location|path).{0,24}only)/iu
20
+ const LOCAL_DOCUMENT_PATH_RE =
21
+ /(?:^|[\s"'(])((?:~|\/|\.{1,2}\/)[^\s"'<>]+?\.(?:hwpx|hwp|docx|pdf|xlsx|pptx))(?=$|[\s"'),.?!:;,。]|[가-힣])/iu
22
+ const DOCUMENT_INSPECT_STRUCTURE_RE =
23
+ /(구조|빈칸|문항|양식|필드|항목|inspect|extract)/iu
24
+
25
+ export type DocumentExpectedFormat =
26
+ | 'hwpx'
27
+ | 'hwp'
28
+ | 'docx'
29
+ | 'pdf'
30
+ | 'xlsx'
31
+ | 'pptx'
32
+
33
+ export function localDocumentPathFromText(userText: string): string | undefined {
34
+ return LOCAL_DOCUMENT_PATH_RE.exec(userText)?.[1]
35
+ }
36
+
37
+ export function documentExpectedFormatFromPath(
38
+ path: string,
39
+ ): DocumentExpectedFormat | undefined {
40
+ const ext = path.split('.').pop()?.toLowerCase()
41
+ switch (ext) {
42
+ case 'hwpx':
43
+ case 'hwp':
44
+ case 'docx':
45
+ case 'pdf':
46
+ case 'xlsx':
47
+ case 'pptx':
48
+ return ext
49
+ default:
50
+ return undefined
51
+ }
52
+ }
53
+
54
+ export function isExactLocalReadOnlyDocumentPrompt(userText: string): boolean {
55
+ return localDocumentPathFromText(userText) !== undefined &&
56
+ (DOCUMENT_READ_ONLY_RE.test(userText) ||
57
+ DOCUMENT_INSPECT_STRUCTURE_RE.test(userText))
58
+ }