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
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Route trace and route-selection contract builders."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from collections.abc import Sequence
7
+ from typing import Literal
8
+
9
+ from ummaya.evidence.dataset_contract import Scenario, ScenarioDataset
10
+ from ummaya.evidence.models import RouteSelectionAssertion, RouteTraceRecord
11
+ from ummaya.evidence.route_helpers import (
12
+ adapter_family_for_scenario,
13
+ argument_feasibility_for_scenario,
14
+ correlation_id,
15
+ coverage_tags_for_scenario,
16
+ failure_recovery_for_stop_reason,
17
+ prompt_manifest_hash,
18
+ stop_reason_for_scenario,
19
+ tool_catalog_hash,
20
+ )
21
+ from ummaya.tools.routing.decision_types import RouteStopReason
22
+ from ummaya.tools.routing.schema import sha256
23
+
24
+
25
+ def route_trace_records(dataset: ScenarioDataset) -> tuple[RouteTraceRecord, ...]:
26
+ """Build route traces from scenario contracts without selecting concrete tools."""
27
+ records: list[RouteTraceRecord] = []
28
+ prompt_hash = prompt_manifest_hash(dataset)
29
+ catalog_hash = tool_catalog_hash(dataset)
30
+ for scenario in dataset.scenarios:
31
+ records.append(_scenario_route_trace(scenario, prompt_hash, catalog_hash))
32
+ records.extend(_negative_control_route_records(prompt_hash, catalog_hash))
33
+ return tuple(records)
34
+
35
+
36
+ def route_selection_assertions(
37
+ dataset: ScenarioDataset,
38
+ records: Sequence[RouteTraceRecord],
39
+ ) -> tuple[RouteSelectionAssertion, ...]:
40
+ """Build route-selection assertions from trace records."""
41
+ scenarios_by_id = {scenario.id: scenario for scenario in dataset.scenarios}
42
+ assertions: list[RouteSelectionAssertion] = []
43
+ for record in records:
44
+ if record.trace_kind == "negative_control":
45
+ assertions.append(_negative_control_assertion(record))
46
+ continue
47
+ scenario = scenarios_by_id[record.scenario_id]
48
+ expected_primitives = tuple(step.primitive for step in scenario.expected_ax_chain)
49
+ status: Literal["pass", "fail"] = (
50
+ "pass"
51
+ if scenario.lifecycle_domain == record.selected_domain
52
+ and expected_primitives == record.selected_primitives
53
+ and not record.selected_tools
54
+ else "fail"
55
+ )
56
+ assertions.append(_route_assertion(scenario, record, expected_primitives, status))
57
+ return tuple(assertions)
58
+
59
+
60
+ def _scenario_route_trace(
61
+ scenario: Scenario,
62
+ prompt_hash: str,
63
+ catalog_hash: str,
64
+ ) -> RouteTraceRecord:
65
+ selected_primitives = tuple(step.primitive for step in scenario.expected_ax_chain)
66
+ stop_reason = stop_reason_for_scenario(scenario)
67
+ trace_id = f"route-{scenario.id.lower()}"
68
+ corr_id = correlation_id(trace_id)
69
+ return RouteTraceRecord(
70
+ trace_kind="scenario_route",
71
+ route_source="expected_route_contract",
72
+ scenario_id=scenario.id,
73
+ trace_id=trace_id,
74
+ correlation_id=corr_id,
75
+ query_hash=sha256(scenario.request_ko),
76
+ manifest_hash=sha256(
77
+ {
78
+ "correlation_id": corr_id,
79
+ "scenario_id": scenario.id,
80
+ "selected_domain": scenario.lifecycle_domain,
81
+ "selected_primitives": selected_primitives,
82
+ "stop_reason": stop_reason,
83
+ "trace_kind": "scenario_route",
84
+ "route_source": "expected_route_contract",
85
+ }
86
+ ),
87
+ prompt_manifest_hash=prompt_hash,
88
+ tool_catalog_hash=catalog_hash,
89
+ selected_domain=scenario.lifecycle_domain,
90
+ selected_primitives=selected_primitives,
91
+ clarification_reason=None,
92
+ stop_reason=stop_reason,
93
+ evidence_events=("evidence_fabric.route_trace.contract", f"route_stop:{stop_reason}"),
94
+ )
95
+
96
+
97
+ def _negative_control_route_records(
98
+ prompt_hash: str,
99
+ catalog_hash: str,
100
+ ) -> tuple[RouteTraceRecord, ...]:
101
+ controls: tuple[tuple[str, str, RouteStopReason, str], ...] = (
102
+ (
103
+ "NEG-DIRECT-ANSWER-001",
104
+ "Explain the difference between a public notice and a civil petition "
105
+ "without taking action.",
106
+ "answerable",
107
+ "negative_control:direct_answer",
108
+ ),
109
+ (
110
+ "NEG-NO-ADAPTER-001",
111
+ "Change a closed internal agency review score that has no public callable channel.",
112
+ "blocked_no_adapter",
113
+ "negative_control:no_adapter",
114
+ ),
115
+ )
116
+ return tuple(
117
+ _negative_control_route_trace(
118
+ scenario_id, query, stop_reason, event, prompt_hash, catalog_hash
119
+ )
120
+ for scenario_id, query, stop_reason, event in controls
121
+ )
122
+
123
+
124
+ def _negative_control_route_trace(
125
+ scenario_id: str,
126
+ query: str,
127
+ stop_reason: RouteStopReason,
128
+ event: str,
129
+ prompt_hash: str,
130
+ catalog_hash: str,
131
+ ) -> RouteTraceRecord:
132
+ trace_id = f"route-{scenario_id.lower()}"
133
+ corr_id = correlation_id(trace_id)
134
+ return RouteTraceRecord(
135
+ trace_kind="negative_control",
136
+ route_source="expected_route_contract",
137
+ scenario_id=scenario_id,
138
+ trace_id=trace_id,
139
+ correlation_id=corr_id,
140
+ query_hash=sha256(query),
141
+ manifest_hash=sha256(
142
+ {
143
+ "correlation_id": corr_id,
144
+ "scenario_id": scenario_id,
145
+ "selected_domain": "general_information",
146
+ "selected_primitives": (),
147
+ "stop_reason": stop_reason,
148
+ "trace_kind": "negative_control",
149
+ "route_source": "expected_route_contract",
150
+ }
151
+ ),
152
+ prompt_manifest_hash=prompt_hash,
153
+ tool_catalog_hash=catalog_hash,
154
+ selected_domain="general_information",
155
+ selected_primitives=(),
156
+ selected_tools=(),
157
+ clarification_reason=None,
158
+ stop_reason=stop_reason,
159
+ evidence_events=(event, f"route_stop:{stop_reason}"),
160
+ )
161
+
162
+
163
+ def _negative_control_assertion(record: RouteTraceRecord) -> RouteSelectionAssertion:
164
+ return RouteSelectionAssertion(
165
+ assertion_kind="negative_control",
166
+ route_source=record.route_source,
167
+ status="pass",
168
+ scenario_id=record.scenario_id,
169
+ trace_id=record.trace_id,
170
+ correlation_id=record.correlation_id,
171
+ prompt_manifest_hash=record.prompt_manifest_hash,
172
+ tool_catalog_hash=record.tool_catalog_hash,
173
+ expected_domain="general_information",
174
+ selected_domain="general_information",
175
+ expected_primitives=(),
176
+ selected_primitives=(),
177
+ adapter_family="no_tool",
178
+ argument_feasibility="sufficient" if record.stop_reason == "answerable" else "blocked",
179
+ clarification_expected=False,
180
+ clarification_reason=None,
181
+ stop_reason=record.stop_reason,
182
+ failure_recovery=failure_recovery_for_stop_reason(record.stop_reason),
183
+ coverage_tags=("negative_control",),
184
+ selected_tool_ids=(),
185
+ assertion_events=(
186
+ "route_assertion:negative_control",
187
+ "route_assertion:no_internal_tool_id",
188
+ ),
189
+ )
190
+
191
+
192
+ def _route_assertion(
193
+ scenario: Scenario,
194
+ record: RouteTraceRecord,
195
+ expected_primitives: tuple[str, ...],
196
+ status: Literal["pass", "fail"],
197
+ ) -> RouteSelectionAssertion:
198
+ return RouteSelectionAssertion(
199
+ assertion_kind="scenario_route",
200
+ route_source=record.route_source,
201
+ status=status,
202
+ scenario_id=scenario.id,
203
+ trace_id=record.trace_id,
204
+ correlation_id=record.correlation_id,
205
+ prompt_manifest_hash=record.prompt_manifest_hash,
206
+ tool_catalog_hash=record.tool_catalog_hash,
207
+ expected_domain=scenario.lifecycle_domain,
208
+ selected_domain=record.selected_domain,
209
+ expected_primitives=expected_primitives,
210
+ selected_primitives=record.selected_primitives,
211
+ adapter_family=adapter_family_for_scenario(scenario, record.selected_primitives),
212
+ argument_feasibility=argument_feasibility_for_scenario(scenario),
213
+ clarification_expected=record.stop_reason == "needs_input",
214
+ clarification_reason=record.clarification_reason,
215
+ stop_reason=record.stop_reason,
216
+ failure_recovery=failure_recovery_for_stop_reason(record.stop_reason),
217
+ coverage_tags=coverage_tags_for_scenario(scenario, record.selected_primitives),
218
+ selected_tool_ids=(),
219
+ assertion_events=(
220
+ "route_assertion:domain_match",
221
+ "route_assertion:primitive_match",
222
+ "route_assertion:no_internal_tool_id",
223
+ ),
224
+ )
@@ -0,0 +1,150 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Small route-classification helpers for Evidence Fabric contracts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from collections.abc import Sequence
7
+
8
+ from ummaya.evidence.dataset_contract import Scenario, ScenarioDataset
9
+ from ummaya.evidence.models import (
10
+ RouteAdapterFamily,
11
+ RouteArgumentFeasibility,
12
+ RouteFailureRecovery,
13
+ )
14
+ from ummaya.tools.routing.decision_types import RouteStopReason
15
+ from ummaya.tools.routing.schema import sha256, unique
16
+
17
+
18
+ def stop_reason_for_scenario(scenario: Scenario) -> RouteStopReason:
19
+ """Return the expected stop reason for a static scenario contract."""
20
+ return (
21
+ "permission_required"
22
+ if scenario.permission_requirements.user_confirmations
23
+ else "answerable"
24
+ )
25
+
26
+
27
+ def argument_feasibility_for_scenario(scenario: Scenario) -> RouteArgumentFeasibility:
28
+ """Classify whether the scenario carries enough arguments for dispatch."""
29
+ if not scenario.request_ko.strip() or not scenario.expected_ax_chain:
30
+ return "blocked"
31
+ return "sufficient"
32
+
33
+
34
+ def failure_recovery_for_stop_reason(stop_reason: RouteStopReason) -> RouteFailureRecovery:
35
+ """Map a route stop reason to the Evidence Fabric recovery family."""
36
+ if stop_reason == "permission_required":
37
+ return "permission_gate"
38
+ if stop_reason == "needs_input":
39
+ return "clarification"
40
+ if stop_reason == "handoff_required":
41
+ return "handoff"
42
+ if stop_reason.startswith("blocked_") or stop_reason in {
43
+ "max_turns",
44
+ "repeated_tool_mismatch",
45
+ "no_new_evidence",
46
+ "runtime_tool_failure_unrecovered",
47
+ }:
48
+ return "blocked"
49
+ return "not_required"
50
+
51
+
52
+ def adapter_family_for_scenario(
53
+ scenario: Scenario,
54
+ selected_primitives: Sequence[str],
55
+ ) -> RouteAdapterFamily:
56
+ """Classify the expected adapter family without exposing concrete tool IDs."""
57
+ text = scenario_text(scenario)
58
+ if "procurement" in text or "bid" in text or "나라장터" in text:
59
+ return "procurement_channel"
60
+ if scenario.lifecycle_domain == "public_data" or "public data" in text or "공공데이터" in text:
61
+ return "public_data_channel"
62
+ if "aed" in text or "defibrillator" in text or "automated external" in text:
63
+ return "safety_channel"
64
+ if "aviation" in text or "airport" in text or "flight" in text or "weather" in text:
65
+ return "weather_channel"
66
+ if scenario.lifecycle_domain == "safety":
67
+ return "safety_channel"
68
+ if "resolve_location" in selected_primitives:
69
+ return "location_channel"
70
+ return "public_service_channel"
71
+
72
+
73
+ def coverage_tags_for_scenario(
74
+ scenario: Scenario,
75
+ selected_primitives: Sequence[str],
76
+ ) -> tuple[str, ...]:
77
+ """Build Evidence Fabric coverage tags from scenario text and primitives."""
78
+ text = scenario_text(scenario)
79
+ tags = [f"domain:{scenario.lifecycle_domain}"]
80
+ if "document" in text:
81
+ tags.append("document_harness")
82
+ if "aviation" in text or "airport" in text or "flight" in text:
83
+ tags.append("aviation_weather")
84
+ if "aed" in text or "defibrillator" in text or "automated external" in text:
85
+ tags.append("aed_safety")
86
+ if "procurement" in text or "bid" in text or "나라장터" in text:
87
+ tags.append("procurement")
88
+ if scenario.lifecycle_domain == "public_data" or "public data" in text or "공공데이터" in text:
89
+ tags.append("public_data_search")
90
+ if "resolve_location" in selected_primitives:
91
+ tags.append("location")
92
+ if {"verify", "submit", "subscribe"} & set(selected_primitives):
93
+ tags.append("side_effecting_government_request")
94
+ return tuple(unique(tags))
95
+
96
+
97
+ def scenario_text(scenario: Scenario) -> str:
98
+ """Flatten scenario text fields for deterministic route-family classification."""
99
+ parts = [
100
+ scenario.lifecycle_domain,
101
+ scenario.request_ko,
102
+ scenario.request_en or "",
103
+ *scenario.agencies_or_infrastructure,
104
+ *scenario.citizen_intent_verbs,
105
+ *scenario.expected_system_behavior,
106
+ *scenario.evaluation_focus,
107
+ *(step.primitive for step in scenario.expected_ax_chain),
108
+ *(step.purpose for step in scenario.expected_ax_chain),
109
+ ]
110
+ return " ".join(parts).lower()
111
+
112
+
113
+ def prompt_manifest_hash(dataset: ScenarioDataset) -> str:
114
+ """Hash prompt-facing dataset metadata."""
115
+ return sha256(
116
+ {
117
+ "allowed_primitives": dataset.allowed_primitives,
118
+ "dataset_id": dataset.dataset_id,
119
+ "source_basis": dataset.source_basis,
120
+ "target_system": dataset.target_system,
121
+ "version": dataset.version,
122
+ }
123
+ )
124
+
125
+
126
+ def tool_catalog_hash(dataset: ScenarioDataset) -> str:
127
+ """Hash the abstract adapter-family catalog implied by the dataset."""
128
+ return sha256(
129
+ {
130
+ "adapter_families": tuple(
131
+ sorted(
132
+ {
133
+ adapter_family_for_scenario(
134
+ scenario,
135
+ tuple(step.primitive for step in scenario.expected_ax_chain),
136
+ )
137
+ for scenario in dataset.scenarios
138
+ }
139
+ )
140
+ ),
141
+ "coverage_domains": dataset.coverage_domains,
142
+ "dataset_id": dataset.dataset_id,
143
+ "scenario_count": len(dataset.scenarios),
144
+ }
145
+ )
146
+
147
+
148
+ def correlation_id(trace_id: str) -> str:
149
+ """Build the deterministic route correlation id used by Evidence Fabric."""
150
+ return f"corr-route-{sha256(trace_id)[:16]}"
@@ -0,0 +1,177 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Evidence Fabric v2 dataset runner.
3
+
4
+ The runner is intentionally local and deterministic. It validates scenario
5
+ contracts and emits a typed RunEvidence document without calling live public
6
+ service channels, LLM providers, or observability backends.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import argparse
12
+ import json
13
+ from pathlib import Path
14
+
15
+ from ummaya.evidence.dataset_contract import (
16
+ DEFAULT_DATASET_REF,
17
+ DEFAULT_SCENARIO_PATH,
18
+ DEFAULT_TASK_REGISTRY_PATH,
19
+ EvidenceContractError,
20
+ resolve_repo_path,
21
+ )
22
+ from ummaya.evidence.dataset_contract import (
23
+ parse_dataset as _parse_dataset,
24
+ )
25
+ from ummaya.evidence.document_viewer_ux import DocumentViewerUxArtifact
26
+ from ummaya.evidence.gates import build_gates
27
+ from ummaya.evidence.models import RunEvidence
28
+ from ummaya.evidence.output_payload import build_evidence_output_payload
29
+ from ummaya.evidence.route_contracts import (
30
+ route_selection_assertions as _route_selection_assertions,
31
+ )
32
+ from ummaya.evidence.route_contracts import (
33
+ route_trace_records as _route_trace_records,
34
+ )
35
+ from ummaya.evidence.task_registry import EvidenceDatasetRef, load_task_registry
36
+ from ummaya.evidence.tool_layer import build_tool_layer_events
37
+
38
+
39
+ def _resolve_task_dataset(
40
+ *,
41
+ dataset_id: str,
42
+ scenario_path: Path,
43
+ task_registry_path: Path | None,
44
+ dataset_ref: str,
45
+ ) -> tuple[str | None, EvidenceDatasetRef | None]:
46
+ if task_registry_path is None:
47
+ return None, None
48
+ registry = load_task_registry(task_registry_path)
49
+ task_dataset = registry.resolve_dataset(dataset_ref)
50
+ if task_dataset.dataset_id != dataset_id:
51
+ raise EvidenceContractError(
52
+ f"task registry dataset_id {task_dataset.dataset_id!r} does not match "
53
+ f"scenario dataset_id {dataset_id!r}"
54
+ )
55
+ if resolve_repo_path(task_dataset.scenario_path) != resolve_repo_path(scenario_path):
56
+ raise EvidenceContractError(
57
+ f"task registry scenario_path {task_dataset.scenario_path} does not match "
58
+ f"run scenario_path {scenario_path}"
59
+ )
60
+ return registry.registry_id, task_dataset
61
+
62
+
63
+ def run_dataset(
64
+ *,
65
+ scenario_path: Path = DEFAULT_SCENARIO_PATH,
66
+ source_ref: str = "local",
67
+ task_registry_path: Path | None = DEFAULT_TASK_REGISTRY_PATH,
68
+ dataset_ref: str = DEFAULT_DATASET_REF,
69
+ ) -> RunEvidence:
70
+ """Validate a scenario dataset and return a typed evidence document."""
71
+
72
+ dataset = _parse_dataset(scenario_path)
73
+ task_registry_id, task_dataset = _resolve_task_dataset(
74
+ dataset_id=dataset.dataset_id,
75
+ scenario_path=scenario_path,
76
+ task_registry_path=task_registry_path,
77
+ dataset_ref=dataset_ref,
78
+ )
79
+ traces = _route_trace_records(dataset)
80
+ return RunEvidence(
81
+ source_ref=source_ref,
82
+ dataset_id=dataset.dataset_id,
83
+ task_registry_id=task_registry_id,
84
+ dataset_ref=task_dataset.ref if task_dataset else None,
85
+ task_count=len(task_dataset.tasks) if task_dataset else 0,
86
+ task_ids=tuple(task.task_id for task in task_dataset.tasks) if task_dataset else (),
87
+ scenario_count=len(dataset.scenarios),
88
+ scenario_ids=tuple(scenario.id for scenario in dataset.scenarios),
89
+ route_trace_records=traces,
90
+ route_selection_assertions=_route_selection_assertions(dataset, traces),
91
+ tool_layer_events=build_tool_layer_events(traces),
92
+ gates=build_gates(dataset),
93
+ )
94
+
95
+
96
+ def main() -> None:
97
+ """CLI entrypoint for `python -m ummaya.evidence`."""
98
+
99
+ parser = argparse.ArgumentParser(prog="python -m ummaya.evidence")
100
+ parser.add_argument(
101
+ "--scenarios",
102
+ type=Path,
103
+ default=DEFAULT_SCENARIO_PATH,
104
+ help="Path to the Evidence Fabric scenario dataset.",
105
+ )
106
+ parser.add_argument(
107
+ "--source-ref",
108
+ default="local",
109
+ help="Source revision or label recorded in the evidence document.",
110
+ )
111
+ parser.add_argument(
112
+ "--task-registry",
113
+ type=Path,
114
+ default=DEFAULT_TASK_REGISTRY_PATH,
115
+ help="Path to the Harbor-style Evidence Fabric task registry.",
116
+ )
117
+ parser.add_argument(
118
+ "--dataset-ref",
119
+ default=DEFAULT_DATASET_REF,
120
+ help="Harbor-style dataset ref to resolve from the task registry.",
121
+ )
122
+ parser.add_argument(
123
+ "--out", type=Path, default=Path(".evidence/run.json"), help="Output JSON path."
124
+ )
125
+ parser.add_argument(
126
+ "--document-viewer-html",
127
+ type=Path,
128
+ action="append",
129
+ default=None,
130
+ help="Local document viewer HTML path to capture as a Playwright UX artifact.",
131
+ )
132
+ parser.add_argument(
133
+ "--document-viewer-ux-out-dir",
134
+ type=Path,
135
+ default=None,
136
+ help="Directory for Playwright document viewer PNG artifacts.",
137
+ )
138
+ parser.add_argument(
139
+ "--document-viewer-correlation-id",
140
+ default=None,
141
+ help="Correlation ID to attach when the viewer manifest does not carry one.",
142
+ )
143
+ parser.add_argument(
144
+ "--document-viewer-diff-id",
145
+ default=None,
146
+ help="Document diff ID to attach when the viewer manifest does not carry one.",
147
+ )
148
+ args = parser.parse_args()
149
+
150
+ evidence = run_dataset(
151
+ scenario_path=args.scenarios,
152
+ source_ref=args.source_ref,
153
+ task_registry_path=args.task_registry,
154
+ dataset_ref=args.dataset_ref,
155
+ )
156
+ args.out.parent.mkdir(parents=True, exist_ok=True)
157
+ ux_out_dir = args.document_viewer_ux_out_dir or args.out.parent / "ux-artifacts"
158
+ document_viewer_ux_artifacts: list[DocumentViewerUxArtifact] = []
159
+ document_viewer_html_paths = tuple(args.document_viewer_html or ())
160
+ if document_viewer_html_paths:
161
+ from ummaya.evidence.document_viewer_ux import capture_document_viewer_ux_artifact
162
+
163
+ for viewer_html_path in document_viewer_html_paths:
164
+ document_viewer_ux_artifacts.append(
165
+ capture_document_viewer_ux_artifact(
166
+ viewer_html_path=viewer_html_path,
167
+ output_dir=ux_out_dir,
168
+ source_ref=args.source_ref,
169
+ correlation_id=args.document_viewer_correlation_id,
170
+ document_diff_id=args.document_viewer_diff_id,
171
+ )
172
+ )
173
+ payload = build_evidence_output_payload(
174
+ evidence,
175
+ document_viewer_ux_artifacts=tuple(document_viewer_ux_artifacts),
176
+ )
177
+ args.out.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")