ummaya 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/README.md +17 -3
  2. package/bin/ummaya +10 -1
  3. package/npm-shrinkwrap.json +253 -2
  4. package/package.json +5 -1
  5. package/prompts/manifest.yaml +2 -2
  6. package/prompts/session_guidance_v1.md +3 -1
  7. package/prompts/system_v1.md +9 -7
  8. package/pyproject.toml +26 -7
  9. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  10. package/src/ummaya/_canonical/__init__.py +2 -0
  11. package/src/ummaya/context/builder.py +17 -11
  12. package/src/ummaya/engine/engine.py +30 -113
  13. package/src/ummaya/engine/query.py +20 -0
  14. package/src/ummaya/evidence/__init__.py +44 -0
  15. package/src/ummaya/evidence/__main__.py +7 -0
  16. package/src/ummaya/evidence/dataset_contract.py +193 -0
  17. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  18. package/src/ummaya/evidence/document_harness.py +313 -0
  19. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  20. package/src/ummaya/evidence/gates.py +70 -0
  21. package/src/ummaya/evidence/json_types.py +20 -0
  22. package/src/ummaya/evidence/models.py +145 -0
  23. package/src/ummaya/evidence/output_payload.py +89 -0
  24. package/src/ummaya/evidence/payload_documents.py +233 -0
  25. package/src/ummaya/evidence/route_contracts.py +224 -0
  26. package/src/ummaya/evidence/route_helpers.py +150 -0
  27. package/src/ummaya/evidence/runner.py +177 -0
  28. package/src/ummaya/evidence/source_provenance.py +246 -0
  29. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  30. package/src/ummaya/evidence/task_registry.py +264 -0
  31. package/src/ummaya/evidence/tool_layer.py +39 -0
  32. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  33. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  34. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  35. package/src/ummaya/ipc/frame_schema.py +52 -5
  36. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  37. package/src/ummaya/ipc/stdio.py +2282 -417
  38. package/src/ummaya/llm/client.py +234 -59
  39. package/src/ummaya/llm/config.py +8 -3
  40. package/src/ummaya/llm/reasoning.py +84 -0
  41. package/src/ummaya/primitives/__init__.py +6 -2
  42. package/src/ummaya/primitives/delegation.py +1 -1
  43. package/src/ummaya/primitives/document.py +28 -0
  44. package/src/ummaya/settings.py +0 -3
  45. package/src/ummaya/tools/discovery_bridge.py +34 -2
  46. package/src/ummaya/tools/documents/__init__.py +297 -0
  47. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  48. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  49. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  50. package/src/ummaya/tools/documents/authoring.py +283 -0
  51. package/src/ummaya/tools/documents/baselines.py +114 -0
  52. package/src/ummaya/tools/documents/capability.py +331 -0
  53. package/src/ummaya/tools/documents/contracts.py +112 -0
  54. package/src/ummaya/tools/documents/conversion.py +521 -0
  55. package/src/ummaya/tools/documents/diff.py +275 -0
  56. package/src/ummaya/tools/documents/engines.py +163 -0
  57. package/src/ummaya/tools/documents/evaluation.py +291 -0
  58. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  59. package/src/ummaya/tools/documents/fixtures.py +174 -0
  60. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  61. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  62. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  63. package/src/ummaya/tools/documents/formats/base.py +41 -0
  64. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  65. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  66. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  67. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  68. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  69. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  70. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  71. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  72. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  73. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  74. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  75. package/src/ummaya/tools/documents/inspection.py +289 -0
  76. package/src/ummaya/tools/documents/intake.py +1079 -0
  77. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  78. package/src/ummaya/tools/documents/models.py +1598 -0
  79. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  80. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  81. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  82. package/src/ummaya/tools/documents/patch.py +170 -0
  83. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  84. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  85. package/src/ummaya/tools/documents/permissions.py +110 -0
  86. package/src/ummaya/tools/documents/planner.py +616 -0
  87. package/src/ummaya/tools/documents/registry.py +2733 -0
  88. package/src/ummaya/tools/documents/render.py +978 -0
  89. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  90. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  91. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  92. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  93. package/src/ummaya/tools/documents/reread.py +157 -0
  94. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  95. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  96. package/src/ummaya/tools/documents/scorecard.py +184 -0
  97. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  98. package/src/ummaya/tools/documents/style.py +48 -0
  99. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  100. package/src/ummaya/tools/documents/validate.py +347 -0
  101. package/src/ummaya/tools/executor.py +61 -12
  102. package/src/ummaya/tools/geocoding/kakao_client.py +1 -2
  103. package/src/ummaya/tools/kma/apihub_catalog.py +984 -1
  104. package/src/ummaya/tools/kma/apihub_structured_adapter.py +86 -6
  105. package/src/ummaya/tools/kma/apihub_url_adapter.py +593 -0
  106. package/src/ummaya/tools/kma/apihub_url_catalog.py +296 -0
  107. package/src/ummaya/tools/live_proxy.py +0 -3
  108. package/src/ummaya/tools/location_adapters.py +8 -6
  109. package/src/ummaya/tools/manifest_metadata.py +16 -3
  110. package/src/ummaya/tools/models.py +5 -1
  111. package/src/ummaya/tools/mvp_surface.py +2 -2
  112. package/src/ummaya/tools/nmc/emergency_search.py +8 -6
  113. package/src/ummaya/tools/register_all.py +17 -0
  114. package/src/ummaya/tools/registry.py +10 -1
  115. package/src/ummaya/tools/resolve_location.py +4 -4
  116. package/src/ummaya/tools/routing/__init__.py +59 -0
  117. package/src/ummaya/tools/routing/builder.py +105 -0
  118. package/src/ummaya/tools/routing/cards.py +29 -0
  119. package/src/ummaya/tools/routing/decision_service.py +534 -0
  120. package/src/ummaya/tools/routing/decision_types.py +74 -0
  121. package/src/ummaya/tools/routing/feasibility.py +122 -0
  122. package/src/ummaya/tools/routing/intent.py +17 -0
  123. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  124. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  125. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  126. package/src/ummaya/tools/routing/intent_types.py +48 -0
  127. package/src/ummaya/tools/routing/lint.py +78 -0
  128. package/src/ummaya/tools/routing/metadata.py +174 -0
  129. package/src/ummaya/tools/routing/projection.py +340 -0
  130. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  131. package/src/ummaya/tools/routing/schema.py +81 -0
  132. package/src/ummaya/tools/routing/types.py +96 -0
  133. package/src/ummaya/tools/routing_index.py +2 -2
  134. package/src/ummaya/tools/search.py +40 -106
  135. package/src/ummaya/tools/verified_data_go_kr/_manifest.py +115 -25
  136. package/src/ummaya/tools/verified_data_go_kr/airkorea_air_quality.py +109 -4
  137. package/src/ummaya/tools/verified_data_go_kr/nmc_aed_site.py +108 -2
  138. package/src/ummaya/tools/verified_data_go_kr/pps_bid_public_info.py +174 -9
  139. package/src/ummaya/tools/verified_data_go_kr/tago_bus_arrival.py +66 -3
  140. package/src/ummaya/tools/verified_data_go_kr/tago_bus_location.py +12 -2
  141. package/src/ummaya/tools/verified_data_go_kr/tago_bus_route.py +8 -2
  142. package/src/ummaya/tools/verified_data_go_kr/tago_bus_route_station.py +114 -0
  143. package/src/ummaya/tools/verified_data_go_kr/tago_bus_station.py +14 -3
  144. package/src/ummaya/tools/verify_canonical_map.py +21 -0
  145. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  146. package/tui/package.json +1 -2
  147. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  148. package/tui/src/QueryEngine.ts +12 -4
  149. package/tui/src/bridge/inboundAttachments.ts +3 -3
  150. package/tui/src/cli/handlers/auth.ts +4 -13
  151. package/tui/src/cli/handlers/mcp.tsx +3 -3
  152. package/tui/src/cli/print.ts +69 -18
  153. package/tui/src/cli/update.ts +13 -13
  154. package/tui/src/commands/copy/index.ts +1 -1
  155. package/tui/src/commands/cost/cost.ts +2 -2
  156. package/tui/src/commands/init-verifiers.ts +5 -5
  157. package/tui/src/commands/init.ts +30 -30
  158. package/tui/src/commands/insights.ts +44 -44
  159. package/tui/src/commands/install-github-app/install-github-app.tsx +2 -2
  160. package/tui/src/commands/install-github-app/setupGitHubActions.ts +3 -3
  161. package/tui/src/commands/install-github-app/types.ts +8 -30
  162. package/tui/src/commands/install.tsx +5 -5
  163. package/tui/src/commands/mcp/addCommand.ts +5 -5
  164. package/tui/src/commands/mcp/xaaIdpCommand.ts +2 -2
  165. package/tui/src/commands/plugin/ManageMarketplaces.tsx +2 -2
  166. package/tui/src/commands/plugin/types.ts +6 -28
  167. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  168. package/tui/src/commands/reasoning/index.ts +13 -0
  169. package/tui/src/commands/reasoning/reasoning.tsx +177 -0
  170. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  171. package/tui/src/commands/thinkback/thinkback.tsx +3 -3
  172. package/tui/src/commands.ts +2 -0
  173. package/tui/src/components/Feedback.tsx +1 -1
  174. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  175. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  176. package/tui/src/components/Messages.tsx +2 -1
  177. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  178. package/tui/src/components/Spinner/types.ts +6 -28
  179. package/tui/src/components/Spinner.tsx +2 -2
  180. package/tui/src/components/agents/generateAgent.ts +1 -1
  181. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  182. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  183. package/tui/src/components/design-system/LoadingState.tsx +2 -2
  184. package/tui/src/components/mcp/types.ts +16 -38
  185. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  186. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  187. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  188. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  189. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  190. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  191. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  192. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  193. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  194. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  195. package/tui/src/components/primitive/index.tsx +43 -1
  196. package/tui/src/components/primitive/types.ts +137 -0
  197. package/tui/src/components/ui/option.ts +4 -26
  198. package/tui/src/constants/common.ts +0 -2
  199. package/tui/src/constants/prompts.ts +4 -3
  200. package/tui/src/constants/querySource.ts +4 -26
  201. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  202. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  203. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  204. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  205. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  206. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  207. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  208. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  209. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  210. package/tui/src/ink/ink.tsx +33 -14
  211. package/tui/src/ink/reconciler.ts +2 -3
  212. package/tui/src/ink/render-to-screen.ts +30 -10
  213. package/tui/src/ipc/bridge.ts +62 -15
  214. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  215. package/tui/src/ipc/codec.ts +29 -3
  216. package/tui/src/ipc/frames.generated.ts +407 -312
  217. package/tui/src/ipc/llmClient.ts +279 -76
  218. package/tui/src/ipc/llmTypes.ts +16 -1
  219. package/tui/src/ipc/schema/frame.schema.json +1 -3475
  220. package/tui/src/keybindings/defaultBindings.ts +4 -0
  221. package/tui/src/main.tsx +32 -11
  222. package/tui/src/native-ts/file-index/index.ts +33 -3
  223. package/tui/src/observability/surface.ts +2 -2
  224. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  225. package/tui/src/projectOnboardingState.ts +7 -6
  226. package/tui/src/query/chatMessageTypes.ts +18 -0
  227. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  228. package/tui/src/query/deps.ts +1 -1
  229. package/tui/src/query/messageGuards.ts +106 -0
  230. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  231. package/tui/src/query/run.ts +1075 -0
  232. package/tui/src/query/supportBoundary.ts +168 -0
  233. package/tui/src/query/toolResultErrors.ts +103 -0
  234. package/tui/src/query/toolRunner.ts +687 -0
  235. package/tui/src/query/unavailableToolRepair.ts +118 -0
  236. package/tui/src/query.ts +9 -1721
  237. package/tui/src/screens/REPL.tsx +42 -31
  238. package/tui/src/services/api/adapterManifest.ts +4 -0
  239. package/tui/src/services/api/backendChat/events.ts +117 -0
  240. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  241. package/tui/src/services/api/backendChat/frame.ts +9 -0
  242. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  243. package/tui/src/services/api/backendChat/types.ts +62 -0
  244. package/tui/src/services/api/backendChat.ts +1 -0
  245. package/tui/src/services/api/client.ts +98 -14
  246. package/tui/src/services/api/errorUtils.ts +5 -5
  247. package/tui/src/services/api/errors.ts +1 -1
  248. package/tui/src/services/api/logging.ts +1 -1
  249. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  250. package/tui/src/services/api/ummaya/messages.ts +255 -0
  251. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  252. package/tui/src/services/api/ummaya/provider.ts +200 -0
  253. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  254. package/tui/src/services/api/ummaya/request.ts +200 -0
  255. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  256. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  257. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  258. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  259. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  260. package/tui/src/services/api/ummaya/types.ts +110 -0
  261. package/tui/src/services/api/ummaya/usage.ts +30 -0
  262. package/tui/src/services/api/ummaya.ts +26 -364
  263. package/tui/src/services/api/withRetry.ts +1 -1
  264. package/tui/src/services/awaySummary.ts +2 -2
  265. package/tui/src/services/claudeAiLimits.ts +1 -1
  266. package/tui/src/services/compact/autoCompact.ts +1 -1
  267. package/tui/src/services/compact/compact.ts +1 -1
  268. package/tui/src/services/lsp/types.ts +8 -30
  269. package/tui/src/services/tips/types.ts +6 -28
  270. package/tui/src/services/tokenEstimation.ts +1 -1
  271. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  272. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  273. package/tui/src/services/tools/toolExecution.ts +94 -1
  274. package/tui/src/skills/bundled/stuck.ts +12 -12
  275. package/tui/src/state/AppStateStore.ts +7 -0
  276. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  277. package/tui/src/store/session-store.ts +10 -36
  278. package/tui/src/stubs/any-stub.ts +15 -10
  279. package/tui/src/stubs/color-diff-napi.ts +37 -23
  280. package/tui/src/stubs/globals.d.ts +3 -3
  281. package/tui/src/stubs/macro-preload.ts +23 -12
  282. package/tui/src/tools/AdapterTool/AdapterTool.ts +1239 -163
  283. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  284. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  285. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  286. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  287. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  288. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  289. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  290. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  291. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  292. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  293. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  294. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  295. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  296. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  297. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  298. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  299. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  300. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  301. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  302. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  303. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  304. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  305. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  306. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  307. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  308. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  309. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  310. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  311. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  312. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  313. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  314. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  315. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  316. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  317. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  318. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  319. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  320. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  321. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  322. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  323. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  324. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  325. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  326. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  327. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  328. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  329. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  330. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  331. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  332. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  333. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  334. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  335. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  336. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  337. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  338. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  339. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  340. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  341. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  342. package/tui/src/tools/BashTool/call.ts +202 -0
  343. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  344. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  345. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  346. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  347. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  348. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  349. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  350. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  351. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  352. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  353. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  354. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  355. package/tui/src/tools/BashTool/schemas.ts +65 -0
  356. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  357. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  358. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  359. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  360. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  361. package/tui/src/tools/BriefTool/upload.ts +1 -1
  362. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  363. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  364. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  365. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  366. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  367. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  368. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  369. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  370. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  371. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  372. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  373. package/tui/src/tools/FileEditTool/call.ts +228 -0
  374. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  375. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  376. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  377. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  378. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  379. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  380. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +48 -29
  381. package/tui/src/tools/LookupPrimitive/prompt.ts +6 -7
  382. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  383. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  384. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  385. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  386. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  387. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  388. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  389. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  390. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  391. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  392. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  393. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  394. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  395. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  396. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  397. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  398. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  399. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  400. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  401. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  402. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  403. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  404. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +30 -19
  405. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  406. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  407. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +51 -18
  408. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  409. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  410. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  411. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  412. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  413. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  414. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  415. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  416. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  417. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  418. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  419. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  420. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  421. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  422. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  423. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  424. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  425. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  426. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  427. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  428. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  429. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  430. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  431. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  432. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  433. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +27 -10
  434. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  435. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  436. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  437. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  438. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  439. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  440. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  441. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  442. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  443. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  444. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  445. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  446. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  447. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  448. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  449. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  450. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  451. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  452. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  453. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  454. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  455. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  456. package/tui/src/tools/_shared/citizenUserText.ts +49 -0
  457. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  458. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  459. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  460. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  461. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  462. package/tui/src/tools/_shared/locationInputRepair.ts +112 -0
  463. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  464. package/tui/src/tools/_shared/rootPrimitiveInput.ts +68 -0
  465. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  466. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  467. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  468. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  469. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  470. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  471. package/tui/src/tools/_shared/toolChoiceRepair.ts +61 -0
  472. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  473. package/tui/src/tools.ts +39 -190
  474. package/tui/src/types/fileSuggestion.ts +4 -26
  475. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  476. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  477. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  478. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  479. package/tui/src/types/message.ts +80 -102
  480. package/tui/src/types/messageQueueTypes.ts +6 -28
  481. package/tui/src/types/notebook.ts +16 -38
  482. package/tui/src/types/statusLine.ts +4 -26
  483. package/tui/src/types/tools.ts +24 -46
  484. package/tui/src/types/utils.ts +6 -28
  485. package/tui/src/upstreamproxy/relay.ts +7 -3
  486. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  487. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  488. package/tui/src/utils/attachments.ts +1 -1
  489. package/tui/src/utils/auth.ts +129 -139
  490. package/tui/src/utils/bash/ast.ts +23 -23
  491. package/tui/src/utils/bash/bashParser.ts +5 -5
  492. package/tui/src/utils/billing.ts +1 -1
  493. package/tui/src/utils/collapseReadSearch.ts +3 -3
  494. package/tui/src/utils/cronTasks.ts +1 -1
  495. package/tui/src/utils/execFileNoThrow.ts +1 -1
  496. package/tui/src/utils/filePersistence/types.ts +16 -38
  497. package/tui/src/utils/forkedAgent.ts +1 -1
  498. package/tui/src/utils/gracefulShutdown.ts +4 -4
  499. package/tui/src/utils/heapDumpService.ts +12 -8
  500. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  501. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  502. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  503. package/tui/src/utils/kExaoneReasoning.ts +138 -0
  504. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  505. package/tui/src/utils/messages.ts +19 -0
  506. package/tui/src/utils/migrateSessions.ts +3 -3
  507. package/tui/src/utils/model/model.ts +6 -6
  508. package/tui/src/utils/multiToolLayout.ts +13 -0
  509. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  510. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  511. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  512. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  513. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  514. package/tui/src/utils/processUserInput/processSlashCommand.tsx +2 -2
  515. package/tui/src/utils/processUserInput/processUserInput.ts +26 -0
  516. package/tui/src/utils/protectedNamespace.ts +5 -3
  517. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  518. package/tui/src/utils/ripgrep.ts +16 -7
  519. package/tui/src/utils/sessionTitle.ts +1 -1
  520. package/tui/src/utils/settings/applySettingsChange.ts +4 -0
  521. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  522. package/tui/src/utils/settings/types.ts +9 -3
  523. package/tui/src/utils/shell/prefix.ts +1 -1
  524. package/tui/src/utils/sideQuery.ts +1 -1
  525. package/tui/src/utils/stats.ts +1 -1
  526. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  527. package/tui/src/utils/teleport.tsx +1 -1
  528. package/uv.lock +394 -22
  529. package/assets/copilot-gate-logo.svg +0 -58
  530. package/assets/govon-logo.svg +0 -40
  531. package/src/ummaya/eval/__init__.py +0 -5
  532. package/src/ummaya/eval/retrieval.py +0 -713
  533. package/tui/src/services/api/claude.ts +0 -3510
  534. package/tui/src/utils/messageStream.ts +0 -186
@@ -0,0 +1,224 @@
1
+ /**
2
+ * UMMAYA — document harness result renderer.
3
+ *
4
+ * Renders document mutations through the Claude Code edit-result shape:
5
+ * a concise change summary followed immediately by the structured diff body.
6
+ * There is deliberately no rounded card frame, browser/graphics viewer, tool-id
7
+ * header, artifact summary, or revdiff status rail in the compact success path.
8
+ */
9
+ import React, { useContext } from 'react'
10
+ import { Box, Text } from '../../ink.js'
11
+ import { TerminalSizeContext } from '../../ink/components/TerminalSizeContext.js'
12
+ import { truncateToWidth } from '../../utils/format.js'
13
+ import { useTheme } from '@/theme/provider'
14
+ import { MessageResponse } from '../MessageResponse.js'
15
+ import { StructuredDiffFallback } from '../StructuredDiff/Fallback.js'
16
+ import { DocumentSocraticReviewBlock } from './DocumentSocraticReviewBlock.js'
17
+ import {
18
+ documentChangeToPatch,
19
+ documentVisibleChanges,
20
+ } from '../../tools/_shared/documentChangeToPatch.js'
21
+ import { extractDocumentSocraticReview } from './documentSocraticReview.js'
22
+ import type {
23
+ DocumentDiffPayload,
24
+ DocumentToolResultPayload,
25
+ DocumentToolStatus,
26
+ } from './types'
27
+
28
+ export interface DocumentToolResultCardProps {
29
+ payload: DocumentToolResultPayload
30
+ expanded?: boolean
31
+ }
32
+
33
+ /** Compact inline view caps the change list; Ctrl+O / verbose expands to all. */
34
+ const COMPACT_CHANGE_CAP = 6
35
+ const EXPANDED_CHANGE_CAP = 256
36
+
37
+ export function DocumentToolResultCard({
38
+ payload,
39
+ expanded = false,
40
+ }: DocumentToolResultCardProps): React.JSX.Element {
41
+ const theme = useTheme()
42
+ const terminalSize = useContext(TerminalSizeContext)
43
+ const surfaceWidth = Math.max(24, terminalSize?.columns ?? 100)
44
+
45
+ const diff = payload.diff ?? undefined
46
+ const statusColor = colorForStatus(payload.status, theme)
47
+ const statusLabel = labelForStatus(payload.status)
48
+ const promotionGate = payload.promotion_gate_result ?? undefined
49
+ const promotionChecklistCount = promotionGate?.promotion_checklist?.length ?? 0
50
+ const visibleChanges = diff === undefined ? [] : documentVisibleChanges(diff)
51
+ const changeCap = expanded ? EXPANDED_CHANGE_CAP : COMPACT_CHANGE_CAP
52
+ const reviewDocumentName =
53
+ diff === undefined ? payload.tool_id : documentNameFor(payload, diff)
54
+ const savedExportPaths = savedExportPathsFor(payload)
55
+ const socraticReview = extractDocumentSocraticReview(payload)
56
+
57
+ const patch =
58
+ diff !== undefined && visibleChanges.length > 0
59
+ ? documentChangeToPatch(diff, {
60
+ documentName: reviewDocumentName,
61
+ maxChanges: changeCap,
62
+ })
63
+ : undefined
64
+ const omittedChangeCount = patch === undefined ? 0 : patch.changeCount - patch.renderedChangeCount
65
+ const diffWidth = Math.max(20, surfaceWidth - 12)
66
+
67
+ if (payload.status === 'ok' && patch !== undefined && patch.hunks.length > 0) {
68
+ return (
69
+ <MessageResponse>
70
+ <Box flexDirection="column" width={surfaceWidth}>
71
+ <Text>{changedFieldsSummary(patch.changeCount)}</Text>
72
+ {patch.hunks.map((hunk, index) => (
73
+ <React.Fragment key={`${hunk.oldStart}-${hunk.newStart}-${index}`}>
74
+ {index > 0 && <Text dimColor>...</Text>}
75
+ <StructuredDiffFallback
76
+ patch={hunk}
77
+ dim={false}
78
+ width={diffWidth}
79
+ />
80
+ </React.Fragment>
81
+ ))}
82
+ {patch.truncated && omittedChangeCount > 0 && (
83
+ <Text color={theme.inactive}>
84
+ {truncateToWidth(
85
+ `… +${omittedChangeCount} more ${omittedChangeCount === 1 ? 'change' : 'changes'} · Ctrl+O to expand`,
86
+ surfaceWidth,
87
+ )}
88
+ </Text>
89
+ )}
90
+ {savedExportPaths.map((localPath) => (
91
+ <Text key={localPath} color={theme.success}>
92
+ {truncateToWidth(`Saved: ${localPath}`, surfaceWidth)}
93
+ </Text>
94
+ ))}
95
+ <DocumentSocraticReviewBlock review={socraticReview} width={surfaceWidth} />
96
+ </Box>
97
+ </MessageResponse>
98
+ )
99
+ }
100
+
101
+ return (
102
+ <Box flexDirection="column" width={surfaceWidth}>
103
+ <Box flexDirection="row" gap={1} width={surfaceWidth}>
104
+ <Text bold color={statusColor}>{statusLabel}</Text>
105
+ </Box>
106
+ <Text color={theme.text} wrap="wrap">
107
+ {truncateToWidth(summaryForDisplay(payload, expanded), surfaceWidth)}
108
+ </Text>
109
+ {payload.blocked_reason !== undefined && payload.blocked_reason !== null && (
110
+ <Text color={theme.warning}>{`Reason: ${payload.blocked_reason}`}</Text>
111
+ )}
112
+ <DocumentSocraticReviewBlock review={socraticReview} width={surfaceWidth} />
113
+ {promotionGate !== undefined && (
114
+ <Box flexDirection="column" marginTop={1}>
115
+ <Text color={theme.warning} wrap="wrap">
116
+ {truncateToWidth(
117
+ `Gate: ${promotionGate.capability ?? 'capability'} ${promotionGate.promotion_state ?? 'unknown'}`,
118
+ surfaceWidth,
119
+ )}
120
+ </Text>
121
+ {(promotionGate.hard_gate_failures ?? []).length > 0 && (
122
+ <Text color={theme.warning} wrap="wrap">
123
+ {truncateToWidth(
124
+ `Hard gates: ${(promotionGate.hard_gate_failures ?? []).join(', ')}`,
125
+ surfaceWidth,
126
+ )}
127
+ </Text>
128
+ )}
129
+ {promotionChecklistCount > 0 && (
130
+ <Text color={theme.inactive} wrap="wrap">
131
+ {truncateToWidth(
132
+ `Checklist: ${promotionChecklistCount} render promotion evidence item(s) required`,
133
+ surfaceWidth,
134
+ )}
135
+ </Text>
136
+ )}
137
+ </Box>
138
+ )}
139
+ {expanded && diff !== undefined && (diff.diff_id !== undefined || diff.derivative_artifact_id !== undefined) && (
140
+ <Text color={theme.inactive} wrap="wrap">
141
+ {truncateToWidth(
142
+ `Evidence: ${diff.diff_id ?? 'untracked'} · ${diff.source_artifact_id} -> ${diff.derivative_artifact_id}`,
143
+ surfaceWidth,
144
+ )}
145
+ </Text>
146
+ )}
147
+ {savedExportPaths.map((localPath) => (
148
+ <Text key={localPath} color={theme.success}>
149
+ {truncateToWidth(`Saved: ${localPath}`, surfaceWidth)}
150
+ </Text>
151
+ ))}
152
+ </Box>
153
+ )
154
+ }
155
+
156
+ function changedFieldsSummary(changeCount: number): string {
157
+ return `Changed ${changeCount} ${changeCount === 1 ? 'field' : 'fields'}`
158
+ }
159
+
160
+ function summaryForDisplay(
161
+ payload: DocumentToolResultPayload,
162
+ expanded: boolean,
163
+ ): string {
164
+ if (expanded) {
165
+ return payload.text_summary
166
+ }
167
+ const [firstLine] = payload.text_summary.split(/\r?\n/u)
168
+ const candidateCount = payload.text_summary
169
+ .split(/\r?\n/u)
170
+ .filter(line => line.trim().startsWith('- ')).length
171
+ if (candidateCount > 0) {
172
+ return `${firstLine} ${candidateCount} matching candidate${candidateCount === 1 ? '' : 's'} available · Ctrl+O to expand.`
173
+ }
174
+ return firstLine ?? payload.text_summary
175
+ }
176
+
177
+ function savedExportPathsFor(payload: DocumentToolResultPayload): string[] {
178
+ return (payload.saved_exports ?? [])
179
+ .map(savedExport => savedExport.local_path?.trim())
180
+ .filter((localPath): localPath is string => localPath !== undefined && localPath.length > 0)
181
+ }
182
+
183
+ /**
184
+ * Synthetic file name for the diff. Only used by CC's language detection; for
185
+ * documents it falls back to plain-text rendering, which is what we want for
186
+ * `label: value` field lines. Prefer a real filename sniffed from the summary.
187
+ */
188
+ function documentNameFor(
189
+ payload: DocumentToolResultPayload,
190
+ diff: DocumentDiffPayload,
191
+ ): string {
192
+ const sniffed = /([^\s/\\]+\.(?:hwpx|hwp|docx|pdf|xlsx|pptx))/iu.exec(
193
+ payload.text_summary,
194
+ )?.[1]
195
+ return sniffed ?? diff.derivative_artifact_id ?? payload.tool_id
196
+ }
197
+
198
+ function labelForStatus(status: DocumentToolStatus): string {
199
+ switch (status) {
200
+ case 'ok':
201
+ return 'Document OK'
202
+ case 'blocked':
203
+ return 'Document blocked'
204
+ case 'failed':
205
+ return 'Document failed'
206
+ case 'needs_input':
207
+ return 'Document needs input'
208
+ }
209
+ }
210
+
211
+ function colorForStatus(
212
+ status: DocumentToolStatus,
213
+ theme: ReturnType<typeof useTheme>,
214
+ ): string {
215
+ switch (status) {
216
+ case 'ok':
217
+ return theme.success
218
+ case 'blocked':
219
+ case 'needs_input':
220
+ return theme.warning
221
+ case 'failed':
222
+ return theme.error
223
+ }
224
+ }
@@ -0,0 +1,215 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ const REVIEW_STATUSES = ['pass', 'failed', 'blocked'] as const
4
+ const INTERNAL_TOKEN_PATTERN =
5
+ /\b(?:document_[A-Za-z0-9_]+|[A-Za-z0-9_-]*fixture[A-Za-z0-9_-]*)\b/gu
6
+
7
+ export type RenderComparisonStatus = (typeof REVIEW_STATUSES)[number]
8
+
9
+ export type DocumentSocraticRenderComparison = {
10
+ readonly status: RenderComparisonStatus
11
+ readonly changedRegionCount: number
12
+ readonly detail?: string
13
+ }
14
+
15
+ export type DocumentSocraticReviewState = {
16
+ readonly missingQuestions: readonly string[]
17
+ readonly collectedAnswers: readonly string[]
18
+ readonly draftPreview?: string
19
+ readonly approvalLabel?: string
20
+ readonly renderComparison?: DocumentSocraticRenderComparison
21
+ }
22
+
23
+ type ParsedQuestion = {
24
+ readonly questionId?: string
25
+ readonly prompt: string
26
+ readonly required: boolean
27
+ }
28
+
29
+ type ParsedAnswer = {
30
+ readonly questionId?: string
31
+ readonly summary: string
32
+ }
33
+
34
+ export function extractDocumentSocraticReview(
35
+ payload: unknown,
36
+ ): DocumentSocraticReviewState | null {
37
+ const payloadRecord = asRecord(payload)
38
+ if (payloadRecord === null) {
39
+ return null
40
+ }
41
+
42
+ const authoring = asRecord(payloadRecord.authoring)
43
+ const renderComparison = parseRenderComparison(payloadRecord.render_comparison)
44
+ if (authoring === null && renderComparison === undefined) {
45
+ return null
46
+ }
47
+
48
+ const questions = parseQuestions(authoring?.questions)
49
+ const answers = parseAnswers(authoring?.answers)
50
+ const missingQuestions = missingRequiredQuestions(questions, answers)
51
+ const collectedAnswers = collectedAnswerSummaries(answers, authoring)
52
+ const draftPreview = parseDraftPreview(authoring?.draft)
53
+ const approvalLabel = parseApprovalLabel(authoring)
54
+
55
+ const review = {
56
+ missingQuestions,
57
+ collectedAnswers,
58
+ ...(draftPreview !== undefined ? { draftPreview } : {}),
59
+ ...(approvalLabel !== undefined ? { approvalLabel } : {}),
60
+ ...(renderComparison !== undefined ? { renderComparison } : {}),
61
+ } satisfies DocumentSocraticReviewState
62
+
63
+ return hasReviewContent(review) ? review : null
64
+ }
65
+
66
+ function parseQuestions(value: unknown): readonly ParsedQuestion[] {
67
+ return recordsFrom(value)
68
+ .map((record): ParsedQuestion | null => {
69
+ const prompt = cleanDisplayText(readString(record.prompt))
70
+ if (prompt === undefined) {
71
+ return null
72
+ }
73
+ const questionId = readString(record.question_id)
74
+ const required = record.required === true
75
+ return {
76
+ ...(questionId !== undefined ? { questionId } : {}),
77
+ prompt,
78
+ required,
79
+ }
80
+ })
81
+ .filter((question): question is ParsedQuestion => question !== null)
82
+ }
83
+
84
+ function parseAnswers(value: unknown): readonly ParsedAnswer[] {
85
+ return recordsFrom(value)
86
+ .map((record): ParsedAnswer | null => {
87
+ const summary = cleanDisplayText(readString(record.response_summary))
88
+ if (summary === undefined) {
89
+ return null
90
+ }
91
+ const questionId = readString(record.question_id)
92
+ return {
93
+ ...(questionId !== undefined ? { questionId } : {}),
94
+ summary,
95
+ }
96
+ })
97
+ .filter((answer): answer is ParsedAnswer => answer !== null)
98
+ }
99
+
100
+ function missingRequiredQuestions(
101
+ questions: readonly ParsedQuestion[],
102
+ answers: readonly ParsedAnswer[],
103
+ ): readonly string[] {
104
+ const answeredIds = new Set(
105
+ answers
106
+ .map(answer => answer.questionId)
107
+ .filter((questionId): questionId is string => questionId !== undefined),
108
+ )
109
+ return questions
110
+ .filter(question => question.required)
111
+ .filter(question => question.questionId === undefined || !answeredIds.has(question.questionId))
112
+ .map(question => question.prompt)
113
+ }
114
+
115
+ function collectedAnswerSummaries(
116
+ answers: readonly ParsedAnswer[],
117
+ authoring: Readonly<Record<string, unknown>> | null,
118
+ ): readonly string[] {
119
+ if (answers.length > 0) {
120
+ return answers.map(answer => answer.summary)
121
+ }
122
+ return recordsFrom(authoring?.evidence_items)
123
+ .map(record => cleanDisplayText(readString(record.summary)))
124
+ .filter((summary): summary is string => summary !== undefined)
125
+ }
126
+
127
+ function parseDraftPreview(value: unknown): string | undefined {
128
+ const draft = asRecord(value)
129
+ return draft === null ? undefined : cleanDisplayText(readString(draft.draft_text))
130
+ }
131
+
132
+ function parseApprovalLabel(
133
+ authoring: Readonly<Record<string, unknown>> | null,
134
+ ): string | undefined {
135
+ if (authoring === null) {
136
+ return undefined
137
+ }
138
+ const approval = asRecord(authoring.approval)
139
+ const decision = approval === null ? undefined : readString(approval.decision)
140
+ if (decision !== undefined) {
141
+ return approvalDecisionLabel(decision)
142
+ }
143
+ if (parseDraftPreview(authoring.draft) !== undefined) {
144
+ return 'awaiting approval'
145
+ }
146
+ const state = readString(authoring.state)
147
+ return state === 'needs_input' || state === 'blocked_missing_evidence' ? 'not ready' : undefined
148
+ }
149
+
150
+ function approvalDecisionLabel(decision: string): string {
151
+ switch (decision) {
152
+ case 'approved':
153
+ return 'approved'
154
+ case 'edited':
155
+ return 'approved with edits'
156
+ case 'leave_blank':
157
+ return 'leave blank'
158
+ case 'cancel':
159
+ return 'cancelled'
160
+ default:
161
+ return 'unknown'
162
+ }
163
+ }
164
+
165
+ function parseRenderComparison(value: unknown): DocumentSocraticRenderComparison | undefined {
166
+ const record = asRecord(value)
167
+ if (record === null) {
168
+ return undefined
169
+ }
170
+ const rawStatus = readString(record.status) ?? readString(record.threshold_status)
171
+ if (rawStatus === undefined || !isRenderComparisonStatus(rawStatus)) {
172
+ return undefined
173
+ }
174
+ const changedRegionCount = recordsFrom(record.changed_regions).length
175
+ const detail = cleanDisplayText(readString(record.failure_reason))
176
+ return {
177
+ status: rawStatus,
178
+ changedRegionCount,
179
+ ...(detail !== undefined ? { detail } : {}),
180
+ }
181
+ }
182
+
183
+ function hasReviewContent(review: DocumentSocraticReviewState): boolean {
184
+ return (
185
+ review.missingQuestions.length > 0 ||
186
+ review.collectedAnswers.length > 0 ||
187
+ review.draftPreview !== undefined ||
188
+ review.approvalLabel !== undefined ||
189
+ review.renderComparison !== undefined
190
+ )
191
+ }
192
+
193
+ function isRenderComparisonStatus(value: string): value is RenderComparisonStatus {
194
+ return REVIEW_STATUSES.some(status => status === value)
195
+ }
196
+
197
+ function recordsFrom(value: unknown): readonly Readonly<Record<string, unknown>>[] {
198
+ return Array.isArray(value) ? value.filter(isRecord) : []
199
+ }
200
+
201
+ function asRecord(value: unknown): Readonly<Record<string, unknown>> | null {
202
+ return isRecord(value) ? value : null
203
+ }
204
+
205
+ function isRecord(value: unknown): value is Readonly<Record<string, unknown>> {
206
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
207
+ }
208
+
209
+ function readString(value: unknown): string | undefined {
210
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined
211
+ }
212
+
213
+ function cleanDisplayText(value: string | undefined): string | undefined {
214
+ return value?.replace(INTERNAL_TOKEN_PATTERN, 'internal step')
215
+ }
@@ -36,6 +36,7 @@ import { SubmitReceipt } from './SubmitReceipt'
36
36
  import { SubmitErrorBanner } from './SubmitErrorBanner'
37
37
  import { AuthContextCard } from './AuthContextCard'
38
38
  import { AuthWarningBanner } from './AuthWarningBanner'
39
+ import { DocumentToolResultCard } from './DocumentToolResultCard'
39
40
  import { UnrecognizedPayload } from './UnrecognizedPayload'
40
41
 
41
42
  import type {
@@ -44,6 +45,8 @@ import type {
44
45
  ResolveLocationPayload,
45
46
  SubmitPayload,
46
47
  VerifyPayload,
48
+ DocumentToolResultPayload,
49
+ DocumentToolStatus,
47
50
  } from './types'
48
51
 
49
52
  // ---------------------------------------------------------------------------
@@ -131,11 +134,19 @@ export interface PrimitiveDispatcherProps {
131
134
  * Accepts any object; unknown shapes fall through to <UnrecognizedPayload>.
132
135
  */
133
136
  payload: PrimitivePayload | Record<string, unknown>
137
+ expanded?: boolean
134
138
  }
135
139
 
136
- export function PrimitiveDispatcher({ payload }: PrimitiveDispatcherProps): React.JSX.Element {
140
+ export function PrimitiveDispatcher({
141
+ payload,
142
+ expanded = false,
143
+ }: PrimitiveDispatcherProps): React.JSX.Element {
137
144
  const _theme = useTheme() // ensure ThemeProvider is present in the tree
138
145
 
146
+ if (isDocumentToolResultPayload(payload)) {
147
+ return <DocumentToolResultCard payload={payload} expanded={expanded} />
148
+ }
149
+
139
150
  const kind = (payload as { kind?: string }).kind
140
151
 
141
152
  switch (kind) {
@@ -176,5 +187,36 @@ export { SubmitReceipt } from './SubmitReceipt'
176
187
  export { SubmitErrorBanner } from './SubmitErrorBanner'
177
188
  export { AuthContextCard } from './AuthContextCard'
178
189
  export { AuthWarningBanner } from './AuthWarningBanner'
190
+ export { DocumentToolResultCard } from './DocumentToolResultCard'
179
191
  export { UnrecognizedPayload } from './UnrecognizedPayload'
180
192
  export type * from './types'
193
+
194
+ function isDocumentToolResultPayload(
195
+ payload: PrimitivePayload | Record<string, unknown>,
196
+ ): payload is DocumentToolResultPayload {
197
+ if (!isRecord(payload)) {
198
+ return false
199
+ }
200
+ const toolId = payload.tool_id
201
+ const status = payload.status
202
+ return (
203
+ typeof toolId === 'string' &&
204
+ (toolId === 'document' || toolId.startsWith('document_')) &&
205
+ isDocumentToolStatus(status) &&
206
+ typeof payload.correlation_id === 'string' &&
207
+ typeof payload.text_summary === 'string'
208
+ )
209
+ }
210
+
211
+ function isDocumentToolStatus(status: unknown): status is DocumentToolStatus {
212
+ return (
213
+ status === 'ok' ||
214
+ status === 'blocked' ||
215
+ status === 'failed' ||
216
+ status === 'needs_input'
217
+ )
218
+ }
219
+
220
+ function isRecord(value: unknown): value is Record<string, unknown> {
221
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
222
+ }
@@ -205,6 +205,143 @@ export interface VerifyFailPayload {
205
205
 
206
206
  export type VerifyPayload = VerifySuccessPayload | VerifyFailPayload
207
207
 
208
+ // ---------------------------------------------------------------------------
209
+ // Public document harness mode
210
+ // ---------------------------------------------------------------------------
211
+
212
+ export type DocumentToolStatus = 'ok' | 'blocked' | 'failed' | 'needs_input'
213
+ export type DocumentWorkflowStepStatus =
214
+ | 'pending'
215
+ | 'completed'
216
+ | 'current'
217
+ | 'blocked'
218
+ | 'failed'
219
+ | 'skipped'
220
+
221
+ export interface DocumentChangePayload {
222
+ change_id: string
223
+ operation_id: string
224
+ change_type: 'field' | 'table_cell' | 'text' | 'style' | 'metadata' | 'copy'
225
+ target_path: string
226
+ display_label?: string | null
227
+ before_value?: string | null
228
+ after_value?: string | null
229
+ }
230
+
231
+ export interface DocumentDiffPayload {
232
+ diff_id?: string
233
+ diff_sha256?: string
234
+ resource_ref?: string
235
+ source_artifact_id: string
236
+ derivative_artifact_id: string
237
+ changes: DocumentChangePayload[]
238
+ render_artifacts?: DocumentRenderArtifactPayload[]
239
+ baseline_render_artifacts?: DocumentRenderArtifactPayload[]
240
+ changed_viewports?: DocumentChangedViewportPayload[]
241
+ viewport_cameras?: DocumentViewportCameraPayload[]
242
+ inline_truncated?: boolean
243
+ omitted_change_count?: number
244
+ }
245
+
246
+ export interface DocumentClipRectPayload {
247
+ x: number | string
248
+ y: number | string
249
+ width: number | string
250
+ height: number | string
251
+ }
252
+
253
+ export interface DocumentChangedViewportPayload {
254
+ viewport_id: string
255
+ change_ids: string[]
256
+ page_number: number
257
+ source_render_artifact_id: string
258
+ clip_rect: DocumentClipRectPayload
259
+ padding_x?: number | string
260
+ padding_y?: number | string
261
+ svg_artifact_ref?: string | null
262
+ svg_artifact_path?: string | null
263
+ png_artifact_ref?: string | null
264
+ png_artifact_path?: string | null
265
+ before_svg_artifact_ref?: string | null
266
+ before_svg_artifact_path?: string | null
267
+ before_png_artifact_ref?: string | null
268
+ before_png_artifact_path?: string | null
269
+ after_svg_artifact_ref?: string | null
270
+ after_svg_artifact_path?: string | null
271
+ after_png_artifact_ref?: string | null
272
+ after_png_artifact_path?: string | null
273
+ text_fallback?: string[]
274
+ anchor_strategy?: string
275
+ confidence?: number | string
276
+ warnings?: string[]
277
+ }
278
+
279
+ export interface DocumentViewportCameraPayload {
280
+ source_render_artifact_id: string
281
+ baseline_render_artifact_id: string
282
+ page_index: number
283
+ viewport_rect: DocumentClipRectPayload
284
+ zoom: number | string
285
+ change_ids: string[]
286
+ }
287
+
288
+ export interface DocumentRenderArtifactPayload {
289
+ render_artifact_id: string
290
+ source_artifact_id?: string
291
+ render_sha256?: string
292
+ render_path?: string
293
+ render_mime_type?: string | null
294
+ raster_artifact_ref?: string | null
295
+ raster_artifact_path?: string | null
296
+ raster_mime_type?: string | null
297
+ page_number?: number
298
+ engine_id?: string
299
+ }
300
+
301
+ export interface DocumentPromotionGatePayload {
302
+ capability?: string
303
+ promotion_state?: string
304
+ hard_gate_failures?: string[]
305
+ promotion_checklist?: Array<{
306
+ check_id: string
307
+ capability?: string
308
+ status?: string
309
+ evidence_required?: string
310
+ detail?: string | null
311
+ }>
312
+ }
313
+
314
+ export interface DocumentWorkflowStepPayload {
315
+ step_id: string
316
+ label: string
317
+ status: DocumentWorkflowStepStatus
318
+ artifact_id?: string | null
319
+ artifact_sha256?: string | null
320
+ detail?: string | null
321
+ }
322
+
323
+ export interface DocumentSavedExportPayload {
324
+ export_id?: string | null
325
+ artifact_id?: string | null
326
+ local_path?: string | null
327
+ sha256?: string | null
328
+ mime_type?: string | null
329
+ }
330
+
331
+ export interface DocumentToolResultPayload {
332
+ tool_id: string
333
+ correlation_id: string
334
+ status: DocumentToolStatus
335
+ artifact_refs?: string[]
336
+ text_summary: string
337
+ blocked_reason?: string | null
338
+ diff?: DocumentDiffPayload | null
339
+ render_artifacts?: DocumentRenderArtifactPayload[]
340
+ promotion_gate_result?: DocumentPromotionGatePayload | null
341
+ workflow_steps?: DocumentWorkflowStepPayload[]
342
+ saved_exports?: DocumentSavedExportPayload[]
343
+ }
344
+
208
345
  // ---------------------------------------------------------------------------
209
346
  // Unrecognized payload (FR-033)
210
347
  // ---------------------------------------------------------------------------
@@ -1,32 +1,10 @@
1
1
  // [P0 reconstructed · rebuild-stubs.ts · symbol-complete stub]
2
2
  // Aggregated from every consumer import across src/.
3
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import { createStub } from '../../stubs/any-stub'
4
4
 
5
- const __noop = (..._args: unknown[]): any => undefined as any;
6
- const __stub: any = new Proxy(function () {} as any, {
7
- get(_t, p) {
8
- if (p === Symbol.toPrimitive) return () => ""
9
- if (p === Symbol.iterator) return function* () {}
10
- if (p === Symbol.asyncIterator) return async function* () {}
11
- if (p === Symbol.toStringTag) return "Stub"
12
- if (p === Symbol.for("nodejs.util.inspect.custom")) return () => "<Stub>"
13
- if (p === "inspect") return () => "<Stub>"
14
- if (p === "then") return undefined
15
- if (p === "toString") return () => ""
16
- if (p === "valueOf") return () => undefined
17
- if (p === "toJSON") return () => null
18
- if (p === "length") return 0
19
- if (p === "name") return "Stub"
20
- if (p === "message") return ""
21
- if (p === "stack") return ""
22
- if (p === "constructor") return Object
23
- return __stub
24
- },
25
- apply() { return __stub },
26
- construct() { return __stub },
27
- });
5
+ const __stub = createStub()
28
6
 
29
- export type Option = any;
30
- export const Option: any = __stub;
7
+ export type Option = unknown;
8
+ export const Option = __stub;
31
9
 
32
10
  export default __stub;