ummaya 0.2.4 → 0.2.6

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 (482) hide show
  1. package/README.md +15 -2
  2. package/bin/ummaya +10 -1
  3. package/bun.lock +180 -244
  4. package/npm-shrinkwrap.json +760 -1760
  5. package/package.json +39 -22
  6. package/prompts/manifest.yaml +1 -1
  7. package/prompts/system_v1.md +1 -0
  8. package/pyproject.toml +27 -2
  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/_canonical/baselines.yaml +113 -0
  12. package/src/ummaya/engine/engine.py +29 -132
  13. package/src/ummaya/evidence/__init__.py +21 -2
  14. package/src/ummaya/evidence/dataset_contract.py +193 -0
  15. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  16. package/src/ummaya/evidence/document_harness.py +313 -0
  17. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  18. package/src/ummaya/evidence/gates.py +70 -0
  19. package/src/ummaya/evidence/json_types.py +20 -0
  20. package/src/ummaya/evidence/models.py +88 -1
  21. package/src/ummaya/evidence/output_payload.py +89 -0
  22. package/src/ummaya/evidence/payload_documents.py +233 -0
  23. package/src/ummaya/evidence/route_contracts.py +224 -0
  24. package/src/ummaya/evidence/route_helpers.py +150 -0
  25. package/src/ummaya/evidence/runner.py +81 -212
  26. package/src/ummaya/evidence/source_provenance.py +246 -0
  27. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  28. package/src/ummaya/evidence/tool_layer.py +39 -0
  29. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  30. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  31. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  32. package/src/ummaya/ipc/frame_schema.py +5 -5
  33. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  34. package/src/ummaya/ipc/stdio.py +1109 -477
  35. package/src/ummaya/llm/client.py +102 -3
  36. package/src/ummaya/llm/config.py +8 -3
  37. package/src/ummaya/primitives/__init__.py +6 -2
  38. package/src/ummaya/primitives/delegation.py +1 -1
  39. package/src/ummaya/primitives/document.py +28 -0
  40. package/src/ummaya/settings.py +0 -3
  41. package/src/ummaya/tools/discovery_bridge.py +17 -1
  42. package/src/ummaya/tools/documents/__init__.py +297 -0
  43. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  44. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  45. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  46. package/src/ummaya/tools/documents/authoring.py +283 -0
  47. package/src/ummaya/tools/documents/baselines.py +132 -0
  48. package/src/ummaya/tools/documents/capability.py +331 -0
  49. package/src/ummaya/tools/documents/contracts.py +112 -0
  50. package/src/ummaya/tools/documents/conversion.py +521 -0
  51. package/src/ummaya/tools/documents/diff.py +275 -0
  52. package/src/ummaya/tools/documents/engines.py +163 -0
  53. package/src/ummaya/tools/documents/evaluation.py +291 -0
  54. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  55. package/src/ummaya/tools/documents/fixtures.py +174 -0
  56. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  57. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  58. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  59. package/src/ummaya/tools/documents/formats/base.py +41 -0
  60. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  61. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  62. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  63. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  64. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  65. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  66. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  67. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  68. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  69. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  70. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  71. package/src/ummaya/tools/documents/inspection.py +289 -0
  72. package/src/ummaya/tools/documents/intake.py +1079 -0
  73. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  74. package/src/ummaya/tools/documents/models.py +1598 -0
  75. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  76. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  77. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  78. package/src/ummaya/tools/documents/patch.py +170 -0
  79. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  80. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  81. package/src/ummaya/tools/documents/permissions.py +110 -0
  82. package/src/ummaya/tools/documents/planner.py +616 -0
  83. package/src/ummaya/tools/documents/registry.py +2733 -0
  84. package/src/ummaya/tools/documents/render.py +978 -0
  85. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  86. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  87. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  88. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  89. package/src/ummaya/tools/documents/reread.py +157 -0
  90. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  91. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  92. package/src/ummaya/tools/documents/scorecard.py +184 -0
  93. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  94. package/src/ummaya/tools/documents/style.py +48 -0
  95. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  96. package/src/ummaya/tools/documents/validate.py +347 -0
  97. package/src/ummaya/tools/executor.py +29 -0
  98. package/src/ummaya/tools/live_proxy.py +0 -3
  99. package/src/ummaya/tools/models.py +5 -1
  100. package/src/ummaya/tools/register_all.py +8 -0
  101. package/src/ummaya/tools/registry.py +10 -1
  102. package/src/ummaya/tools/routing/__init__.py +59 -0
  103. package/src/ummaya/tools/routing/builder.py +105 -0
  104. package/src/ummaya/tools/routing/cards.py +29 -0
  105. package/src/ummaya/tools/routing/decision_service.py +534 -0
  106. package/src/ummaya/tools/routing/decision_types.py +74 -0
  107. package/src/ummaya/tools/routing/feasibility.py +122 -0
  108. package/src/ummaya/tools/routing/intent.py +17 -0
  109. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  110. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  111. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  112. package/src/ummaya/tools/routing/intent_types.py +48 -0
  113. package/src/ummaya/tools/routing/lint.py +78 -0
  114. package/src/ummaya/tools/routing/metadata.py +174 -0
  115. package/src/ummaya/tools/routing/projection.py +340 -0
  116. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  117. package/src/ummaya/tools/routing/schema.py +81 -0
  118. package/src/ummaya/tools/routing/types.py +96 -0
  119. package/src/ummaya/tools/routing_index.py +2 -2
  120. package/src/ummaya/tools/search.py +34 -746
  121. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  122. package/tui/bun.lock +126 -305
  123. package/tui/package.json +35 -22
  124. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  125. package/tui/src/QueryEngine.ts +12 -8
  126. package/tui/src/bridge/inboundAttachments.ts +3 -3
  127. package/tui/src/cli/handlers/auth.ts +3 -12
  128. package/tui/src/cli/handlers/mcp.tsx +0 -1
  129. package/tui/src/cli/print.ts +8 -9
  130. package/tui/src/commands/insights.ts +1 -1
  131. package/tui/src/commands/install-github-app/types.ts +8 -30
  132. package/tui/src/commands/plugin/types.ts +6 -28
  133. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  134. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  135. package/tui/src/components/Feedback.tsx +1 -1
  136. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  137. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  138. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  139. package/tui/src/components/Spinner/types.ts +6 -28
  140. package/tui/src/components/agents/generateAgent.ts +1 -1
  141. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  142. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  143. package/tui/src/components/mcp/types.ts +16 -38
  144. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  145. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  146. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  147. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  148. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  149. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  150. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  151. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  152. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  153. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  154. package/tui/src/components/primitive/index.tsx +43 -1
  155. package/tui/src/components/primitive/types.ts +137 -0
  156. package/tui/src/components/ui/option.ts +4 -26
  157. package/tui/src/constants/common.ts +0 -2
  158. package/tui/src/constants/prompts.ts +4 -3
  159. package/tui/src/constants/querySource.ts +4 -26
  160. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  161. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  162. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  163. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  164. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  165. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  166. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  167. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  168. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  169. package/tui/src/ink/ink.tsx +33 -14
  170. package/tui/src/ink/reconciler.ts +2 -3
  171. package/tui/src/ink/render-to-screen.ts +30 -10
  172. package/tui/src/ipc/bridge.ts +62 -15
  173. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  174. package/tui/src/ipc/codec.ts +3 -3
  175. package/tui/src/ipc/frames.generated.ts +12 -12
  176. package/tui/src/ipc/llmClient.ts +151 -27
  177. package/tui/src/ipc/schema/frame.schema.json +1 -1
  178. package/tui/src/keybindings/defaultBindings.ts +4 -0
  179. package/tui/src/main.tsx +32 -15
  180. package/tui/src/native-ts/file-index/index.ts +33 -3
  181. package/tui/src/observability/surface.ts +2 -2
  182. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  183. package/tui/src/projectOnboardingState.ts +7 -6
  184. package/tui/src/query/chatMessageTypes.ts +18 -0
  185. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  186. package/tui/src/query/deps.ts +1 -1
  187. package/tui/src/query/messageGuards.ts +106 -0
  188. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  189. package/tui/src/query/run.ts +1075 -0
  190. package/tui/src/query/supportBoundary.ts +168 -0
  191. package/tui/src/query/toolResultErrors.ts +103 -0
  192. package/tui/src/query/toolRunner.ts +687 -0
  193. package/tui/src/query/unavailableToolRepair.ts +118 -0
  194. package/tui/src/query.ts +9 -2186
  195. package/tui/src/screens/REPL.tsx +40 -29
  196. package/tui/src/services/api/adapterManifest.ts +4 -0
  197. package/tui/src/services/api/backendChat/events.ts +117 -0
  198. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  199. package/tui/src/services/api/backendChat/frame.ts +9 -0
  200. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  201. package/tui/src/services/api/backendChat/types.ts +62 -0
  202. package/tui/src/services/api/backendChat.ts +1 -0
  203. package/tui/src/services/api/client.ts +65 -2
  204. package/tui/src/services/api/errorUtils.ts +5 -5
  205. package/tui/src/services/api/errors.ts +1 -1
  206. package/tui/src/services/api/logging.ts +1 -1
  207. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  208. package/tui/src/services/api/ummaya/messages.ts +255 -0
  209. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  210. package/tui/src/services/api/ummaya/provider.ts +200 -0
  211. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  212. package/tui/src/services/api/ummaya/request.ts +200 -0
  213. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  214. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  215. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  216. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  217. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  218. package/tui/src/services/api/ummaya/types.ts +110 -0
  219. package/tui/src/services/api/ummaya/usage.ts +30 -0
  220. package/tui/src/services/api/ummaya.ts +26 -418
  221. package/tui/src/services/api/withRetry.ts +1 -1
  222. package/tui/src/services/awaySummary.ts +2 -2
  223. package/tui/src/services/claudeAiLimits.ts +1 -1
  224. package/tui/src/services/compact/autoCompact.ts +1 -1
  225. package/tui/src/services/compact/compact.ts +1 -1
  226. package/tui/src/services/lsp/types.ts +8 -30
  227. package/tui/src/services/tips/types.ts +6 -28
  228. package/tui/src/services/tokenEstimation.ts +1 -1
  229. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  230. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  231. package/tui/src/services/tools/toolExecution.ts +94 -1
  232. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  233. package/tui/src/store/session-store.ts +10 -36
  234. package/tui/src/stubs/any-stub.ts +15 -10
  235. package/tui/src/stubs/color-diff-napi.ts +37 -23
  236. package/tui/src/stubs/globals.d.ts +3 -3
  237. package/tui/src/stubs/macro-preload.ts +23 -12
  238. package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
  239. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  240. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  241. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  242. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  243. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  244. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  245. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  246. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  247. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  248. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  249. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  250. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  251. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  252. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  253. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  254. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  255. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  256. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  257. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  258. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  259. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  260. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  261. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  262. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  263. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  264. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  265. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  266. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  267. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  268. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  269. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  270. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  271. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  272. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  273. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  274. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  275. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  276. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  277. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  278. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  279. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  280. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  281. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  282. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  283. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  284. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  285. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  286. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  287. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  288. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  289. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  290. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  291. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  292. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  293. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  294. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  295. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  296. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  297. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  298. package/tui/src/tools/BashTool/call.ts +202 -0
  299. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  300. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  301. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  302. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  303. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  304. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  305. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  306. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  307. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  308. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  309. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  310. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  311. package/tui/src/tools/BashTool/schemas.ts +65 -0
  312. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  313. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  314. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  315. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  316. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  317. package/tui/src/tools/BriefTool/upload.ts +1 -1
  318. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  319. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  320. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  321. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  322. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  323. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  324. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  325. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  326. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  327. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  328. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  329. package/tui/src/tools/FileEditTool/call.ts +228 -0
  330. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  331. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  332. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  333. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  334. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  335. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  336. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
  337. package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
  338. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  339. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  340. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  341. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  342. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  343. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  344. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  345. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  346. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  347. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  348. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  349. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  350. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  351. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  352. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  353. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  354. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  355. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  356. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  357. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  358. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  359. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  360. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
  361. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  362. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  363. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
  364. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  365. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  366. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  367. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  368. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  369. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  370. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  371. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  372. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  373. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  374. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  375. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  376. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  377. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  378. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  379. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  380. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  381. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  382. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  383. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  384. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  385. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  386. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  387. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  388. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  389. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
  390. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  391. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  392. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  393. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  394. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  395. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  396. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  397. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  398. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  399. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  400. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  401. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  402. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  403. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  404. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  405. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  406. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  407. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  408. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  409. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  410. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  411. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  412. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  413. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  414. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  415. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  416. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  417. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  418. package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
  419. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  420. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  421. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  422. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  423. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  424. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  425. package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
  426. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  427. package/tui/src/tools.ts +39 -190
  428. package/tui/src/types/fileSuggestion.ts +4 -26
  429. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  430. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  431. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  432. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  433. package/tui/src/types/message.ts +80 -102
  434. package/tui/src/types/messageQueueTypes.ts +6 -28
  435. package/tui/src/types/notebook.ts +16 -38
  436. package/tui/src/types/statusLine.ts +4 -26
  437. package/tui/src/types/tools.ts +24 -46
  438. package/tui/src/types/utils.ts +6 -28
  439. package/tui/src/upstreamproxy/relay.ts +7 -3
  440. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  441. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  442. package/tui/src/utils/auth.ts +129 -139
  443. package/tui/src/utils/bash/ast.ts +23 -23
  444. package/tui/src/utils/bash/bashParser.ts +5 -5
  445. package/tui/src/utils/billing.ts +1 -1
  446. package/tui/src/utils/claudeDesktop.ts +4 -4
  447. package/tui/src/utils/collapseReadSearch.ts +3 -3
  448. package/tui/src/utils/cronTasks.ts +1 -1
  449. package/tui/src/utils/execFileNoThrow.ts +1 -1
  450. package/tui/src/utils/filePersistence/types.ts +16 -38
  451. package/tui/src/utils/forkedAgent.ts +1 -1
  452. package/tui/src/utils/gracefulShutdown.ts +4 -4
  453. package/tui/src/utils/heapDumpService.ts +12 -8
  454. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  455. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  456. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  457. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  458. package/tui/src/utils/messages.ts +18 -0
  459. package/tui/src/utils/migrateSessions.ts +3 -3
  460. package/tui/src/utils/model/model.ts +6 -6
  461. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  462. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  463. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  464. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  465. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  466. package/tui/src/utils/protectedNamespace.ts +5 -3
  467. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  468. package/tui/src/utils/ripgrep.ts +16 -7
  469. package/tui/src/utils/sessionTitle.ts +1 -1
  470. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  471. package/tui/src/utils/shell/prefix.ts +1 -1
  472. package/tui/src/utils/sideQuery.ts +1 -1
  473. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  474. package/tui/src/utils/teleport.tsx +1 -1
  475. package/uv.lock +426 -45
  476. package/tui/src/services/api/claude.ts +0 -3540
  477. package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
  478. package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
  479. package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
  480. package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
  481. package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
  482. package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
@@ -12,6 +12,8 @@ depending on the source-tree layout:
12
12
  * ``checklist_manifest.yaml`` — 50-row plugin validation checklist.
13
13
  Loaded by :mod:`ummaya.plugins.checks.framework` and the
14
14
  ``ummaya-plugin-validate`` CLI.
15
+ * ``document-tools.schema.json`` — Public AX document harness tool
16
+ contract. Loaded by :mod:`ummaya.tools.documents.contracts`.
15
17
 
16
18
  The mapping is in pyproject.toml under
17
19
  ``[tool.hatch.build.targets.wheel.force-include]``.
@@ -0,0 +1,113 @@
1
+ version: 1
2
+ catalog_id: public-form-conformance-baselines-v1
3
+ source_policy: offline_fixtures_only
4
+ live_network_allowed: false
5
+ baselines:
6
+ - template_id: birth-benefit-application-hwpx
7
+ schema_id: birth-benefit-application-v1
8
+ format: hwpx
9
+ authoritative_standard: KS X 6101 OWPML/HWPX
10
+ authority_refs:
11
+ - specs/2803-document-production-hardening/spec.md#FR-002
12
+ - specs/2803-document-production-hardening/spec.md#FR-012
13
+ supports_conformance: true
14
+ expected_page_count: 2
15
+ required_fields:
16
+ - field_id: applicant_name
17
+ label: Applicant name
18
+ path: /body/section[1]/field[applicant_name]
19
+ - field_id: child_birth_date
20
+ label: Child birth date
21
+ path: /body/section[1]/field[child_birth_date]
22
+ protected_text:
23
+ - text: Birth benefit application
24
+ anchor: /body/section[1]/p[1]
25
+ - text: Required attachments
26
+ anchor: /body/section[2]/p[1]
27
+ required_labels:
28
+ - text: Applicant
29
+ anchor: /body/section[1]/table[1]/cell[1,1]
30
+ - text: Name
31
+ anchor: /body/section[1]/table[1]/cell[1,2]
32
+ - text: Child
33
+ anchor: /body/section[1]/table[1]/cell[2,1]
34
+ - text: Date of birth
35
+ anchor: /body/section[1]/table[1]/cell[2,2]
36
+ table_geometries:
37
+ - table_id: applicant-table
38
+ anchor: /body/section[1]/table[1]
39
+ rows: 2
40
+ columns: 2
41
+ signature_regions:
42
+ - text: Applicant signature or seal
43
+ anchor: /body/section[1]/p[2]
44
+ metadata_exact_matches:
45
+ page_count: 2
46
+ margin_top_mm: 20
47
+ margin_bottom_mm: 15
48
+ - template_id: civil-form-docx
49
+ schema_id: civil-form-ooxml-v1
50
+ format: docx
51
+ authoritative_standard: ECMA-376 Office Open XML
52
+ authority_refs:
53
+ - specs/2803-document-production-hardening/spec.md#FR-012
54
+ supports_conformance: true
55
+ required_fields: []
56
+ protected_text: []
57
+ required_labels: []
58
+ table_geometries: []
59
+ signature_regions: []
60
+ metadata_exact_matches: {}
61
+ - template_id: civil-ledger-xlsx
62
+ schema_id: civil-ledger-ooxml-v1
63
+ format: xlsx
64
+ authoritative_standard: ECMA-376 Office Open XML
65
+ authority_refs:
66
+ - specs/2803-document-production-hardening/spec.md#FR-012
67
+ supports_conformance: true
68
+ required_fields: []
69
+ protected_text: []
70
+ required_labels: []
71
+ table_geometries: []
72
+ signature_regions: []
73
+ metadata_exact_matches: {}
74
+ - template_id: civil-briefing-pptx
75
+ schema_id: civil-briefing-ooxml-v1
76
+ format: pptx
77
+ authoritative_standard: ECMA-376 Office Open XML
78
+ authority_refs:
79
+ - specs/2803-document-production-hardening/spec.md#FR-012
80
+ supports_conformance: true
81
+ required_fields: []
82
+ protected_text: []
83
+ required_labels: []
84
+ table_geometries: []
85
+ signature_regions: []
86
+ metadata_exact_matches: {}
87
+ - template_id: fillable-permit-pdf
88
+ schema_id: fillable-permit-pdf-v1
89
+ format: pdf
90
+ authoritative_standard: PDF AcroForm and rendered appearance
91
+ authority_refs:
92
+ - specs/2803-document-production-hardening/spec.md#FR-014
93
+ supports_conformance: true
94
+ required_fields: []
95
+ protected_text: []
96
+ required_labels: []
97
+ table_geometries: []
98
+ signature_regions: []
99
+ metadata_exact_matches: {}
100
+ - template_id: legacy-hwp-readonly
101
+ schema_id: legacy-hwp-readonly-v1
102
+ format: hwp
103
+ authoritative_standard: HWP binary read-only boundary
104
+ authority_refs:
105
+ - specs/2803-document-production-hardening/spec.md#FR-017
106
+ supports_conformance: false
107
+ unsupported_reason: HWP binary write is blocked in this epic; conformance-ready output requires HWPX or another promoted editable derivative.
108
+ required_fields: []
109
+ protected_text: []
110
+ required_labels: []
111
+ table_geometries: []
112
+ signature_regions: []
113
+ metadata_exact_matches: {}
@@ -8,7 +8,6 @@ the standalone ``query()`` async generator.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
- import json
12
11
  import logging
13
12
  from collections.abc import AsyncIterator
14
13
  from typing import TYPE_CHECKING
@@ -20,9 +19,13 @@ from ummaya.engine.models import QueryContext, QueryState, SessionBudget
20
19
  from ummaya.engine.query import query
21
20
  from ummaya.llm.client import LLMClient
22
21
  from ummaya.llm.models import ChatMessage
23
- from ummaya.tools.errors import ToolNotFoundError
24
22
  from ummaya.tools.executor import ToolExecutor
25
23
  from ummaya.tools.registry import ToolRegistry
24
+ from ummaya.tools.routing import (
25
+ RouteDecisionService,
26
+ build_available_adapters_projection,
27
+ selected_concrete_adapter_tools,
28
+ )
26
29
 
27
30
  if TYPE_CHECKING:
28
31
  from ummaya.permissions.models import SessionContext
@@ -31,66 +34,6 @@ logger = logging.getLogger(__name__)
31
34
 
32
35
  _INTERNAL_CONTEXT_TOOL_IDS = frozenset({"find", "locate", "check", "send", "search_tools"})
33
36
 
34
- _LOCATION_DEPENDENT_SCHEMA_KEYS = frozenset(
35
- {
36
- "adm_cd",
37
- "admcd",
38
- "admin_code",
39
- "administrative_code",
40
- "latitude",
41
- "lat",
42
- "longitude",
43
- "lon",
44
- "lng",
45
- "nx",
46
- "ny",
47
- "region_cd",
48
- "region_code",
49
- }
50
- )
51
-
52
-
53
- def _schema_requires_location_resolution(
54
- input_schema_json: object,
55
- required_params: object,
56
- ) -> bool:
57
- """Return True when an adapter schema needs prior locate output."""
58
-
59
- return _contains_location_dependent_key(
60
- required_params
61
- ) or _schema_required_fields_contain_location_key(input_schema_json)
62
-
63
-
64
- def _schema_required_fields_contain_location_key(value: object) -> bool:
65
- """Return True when JSON Schema required fields demand locate-derived data."""
66
-
67
- if isinstance(value, dict):
68
- required = value.get("required")
69
- if _contains_location_dependent_key(required):
70
- return True
71
- return any(
72
- _schema_required_fields_contain_location_key(nested) for nested in value.values()
73
- )
74
- if isinstance(value, list):
75
- return any(_schema_required_fields_contain_location_key(item) for item in value)
76
- return False
77
-
78
-
79
- def _contains_location_dependent_key(value: object) -> bool:
80
- """Recursively detect coordinate/admin-code schema fields."""
81
-
82
- if isinstance(value, dict):
83
- for key, nested in value.items():
84
- if str(key).lower() in _LOCATION_DEPENDENT_SCHEMA_KEYS:
85
- return True
86
- if _contains_location_dependent_key(nested):
87
- return True
88
- elif isinstance(value, list):
89
- return any(_contains_location_dependent_key(item) for item in value)
90
- elif isinstance(value, str):
91
- return value.lower() in _LOCATION_DEPENDENT_SCHEMA_KEYS
92
- return False
93
-
94
37
 
95
38
  class QueryEngine:
96
39
  """Per-session orchestrator for the UMMAYA query engine.
@@ -296,85 +239,39 @@ class QueryEngine:
296
239
  """Build dynamic adapter context and per-turn concrete tool exposure."""
297
240
 
298
241
  try:
299
- from ummaya.tools.search import search # noqa: PLC0415
300
-
301
- candidates = search(
242
+ decision = RouteDecisionService(self._tool_registry).select_adapters(
302
243
  user_message,
303
- self._tool_registry.bm25_index,
304
- self._tool_registry,
305
244
  top_k=15,
245
+ max_selected=5,
306
246
  )
307
- except Exception: # noqa: BLE001
308
- logger.exception("available_adapters auto-inject failed")
309
- return None, ()
310
-
311
- adapter_lines: list[str] = []
312
- selected_tool_ids: list[str] = []
313
- primary_find_without_location = False
314
- visible_count = 0
315
- for candidate in candidates:
316
- try:
317
- tool = self._tool_registry.find(candidate.tool_id)
318
- except ToolNotFoundError:
319
- continue
320
- if candidate.score <= 0:
321
- continue
322
- if tool.id in _INTERNAL_CONTEXT_TOOL_IDS:
323
- continue
324
- primitive = candidate.primitive if isinstance(candidate.primitive, str) else None
325
- requires_location = _schema_requires_location_resolution(
326
- candidate.input_schema_json,
327
- candidate.required_params,
328
- )
329
- primary_find_without_location = primary_find_without_location or (
330
- visible_count == 0 and primitive == "find" and not requires_location
247
+ concrete_tools = selected_concrete_adapter_tools(
248
+ decision,
249
+ self._tool_registry,
250
+ exclude_tool_ids=_INTERNAL_CONTEXT_TOOL_IDS,
251
+ max_tools=5,
331
252
  )
332
- if visible_count > 0 and primary_find_without_location and requires_location:
333
- continue
334
- schema_json = json.dumps(
335
- candidate.input_schema_json,
336
- ensure_ascii=False,
337
- sort_keys=True,
253
+ tool_ids = tuple(tool.id for tool in concrete_tools)
254
+ if not tool_ids:
255
+ return None, ()
256
+ projection_level = (
257
+ decision.schema_projection_level if decision.selected_tools else "summary"
338
258
  )
339
- selected_tool_ids.append(candidate.tool_id)
340
- adapter_lines.extend(
341
- [
342
- f"- tool_id: {candidate.tool_id}",
343
- f" primitive: {candidate.primitive}",
344
- f" description: {candidate.llm_description or tool.name_ko}",
345
- f" required_params: {candidate.required_params}",
346
- f" input_schema_json: {schema_json}",
347
- f" call_hint: {candidate.tool_id}({{...}})",
348
- f" policy_url: {candidate.real_classification_url or ''}",
349
- ]
259
+ projection = build_available_adapters_projection(
260
+ decision,
261
+ self._tool_registry,
262
+ query=user_message,
263
+ projection_level=projection_level,
264
+ max_visible=len(tool_ids),
265
+ visible_tool_ids=tool_ids,
350
266
  )
351
- visible_count += 1
352
- if visible_count >= 5:
353
- break
267
+ except Exception: # noqa: BLE001
268
+ logger.exception("available_adapters auto-inject failed")
269
+ return None, ()
354
270
 
355
- if not adapter_lines:
271
+ if projection.content is None:
356
272
  return None, ()
357
273
 
358
- content = "\n".join(
359
- [
360
- "<available_adapters>",
361
- "Use these adapter candidates for this citizen request. "
362
- "The model-facing function name is the concrete tool_id shown "
363
- "below when that function is present in tools[]. Call the "
364
- "concrete adapter directly with exactly the input_schema_json "
365
- "fields. Do not wrap tool_id/params inside a concrete adapter "
366
- "call. The root primitives (find, locate, check, send) are "
367
- "legacy compatibility wrappers only when a concrete adapter "
368
- "function is not loaded. "
369
- "Do not call locate just because the citizen text contains a "
370
- "city/province name; treat that as the dataset/filter term. "
371
- "Call locate only when the selected adapter schema requires "
372
- "coordinates, administrative codes, or a place-to-region conversion.",
373
- *adapter_lines,
374
- "</available_adapters>",
375
- ]
376
- )
377
- return ChatMessage(role="system", content=content), tuple(selected_tool_ids)
274
+ return ChatMessage(role="system", content=projection.content), tool_ids
378
275
 
379
276
  def set_permission_session(self, session: SessionContext | None) -> None:
380
277
  """Update the permission-pipeline session used for subsequent turns.
@@ -1,8 +1,20 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
  """Evidence Fabric v2 public API."""
3
3
 
4
- from ummaya.evidence.models import EvidenceGate, EvidenceStatus, RunEvidence
5
- from ummaya.evidence.runner import EvidenceContractError, run_dataset
4
+ from ummaya.evidence.dataset_contract import EvidenceContractError
5
+ from ummaya.evidence.models import (
6
+ EvidenceGate,
7
+ EvidenceStatus,
8
+ RunEvidence,
9
+ )
10
+ from ummaya.evidence.runner import run_dataset
11
+ from ummaya.evidence.source_provenance import (
12
+ SourceProvenanceDecision,
13
+ SourceProvenanceLedger,
14
+ SourceProvenanceRecord,
15
+ SourceRedactionMetadata,
16
+ build_source_provenance_record,
17
+ )
6
18
  from ummaya.evidence.task_registry import (
7
19
  EvidenceDatasetRef,
8
20
  EvidenceTask,
@@ -10,6 +22,7 @@ from ummaya.evidence.task_registry import (
10
22
  TaskRegistryError,
11
23
  load_task_registry,
12
24
  )
25
+ from ummaya.evidence.tool_layer_models import ToolLayerEvidenceEvent
13
26
 
14
27
  __all__ = [
15
28
  "EvidenceDatasetRef",
@@ -19,7 +32,13 @@ __all__ = [
19
32
  "EvidenceTask",
20
33
  "EvidenceTaskRegistry",
21
34
  "RunEvidence",
35
+ "SourceProvenanceDecision",
36
+ "SourceProvenanceLedger",
37
+ "SourceProvenanceRecord",
38
+ "SourceRedactionMetadata",
22
39
  "TaskRegistryError",
40
+ "ToolLayerEvidenceEvent",
41
+ "build_source_provenance_record",
23
42
  "load_task_registry",
24
43
  "run_dataset",
25
44
  ]
@@ -0,0 +1,193 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Scenario dataset parsing for Evidence Fabric v2."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+ from typing import assert_never
8
+
9
+ import yaml
10
+ from pydantic import BaseModel, ConfigDict, Field, ValidationError
11
+
12
+ from ummaya.evidence.json_types import JsonObject, JsonValue, parse_json_object
13
+
14
+ _REPO_ROOT = Path(__file__).resolve().parents[3]
15
+ DEFAULT_SCENARIO_PATH = _REPO_ROOT / "evidence/scenarios/national_ax_citizen_requests_v1.yaml"
16
+ DEFAULT_TASK_REGISTRY_PATH = _REPO_ROOT / "evidence/registry.yaml"
17
+ DEFAULT_DATASET_REF = "ummaya/national-ax-core@local"
18
+ BANNED_MODEL_VISIBLE_KEYS = frozenset(
19
+ {
20
+ "adapter_id",
21
+ "adapter_ids",
22
+ "adapter_family",
23
+ "expected_adapter_id",
24
+ "tool_id",
25
+ "tool_ids",
26
+ "expected_tool_id",
27
+ "expected_tool_ids",
28
+ "expected_adapter_family",
29
+ "expected_route_trace",
30
+ "route_trace",
31
+ "route_selection_assertion",
32
+ "route_selection_assertions",
33
+ "route_adapter_family",
34
+ "selected_adapter_family",
35
+ "selected_adapter_id",
36
+ "selected_tool",
37
+ "selected_tool_id",
38
+ "selected_tool_ids",
39
+ "selected_tools",
40
+ "fixture_refs",
41
+ "fixture_ref",
42
+ "current_adapter_id",
43
+ "assertion_events",
44
+ "assertion_kind",
45
+ "argument_feasibility",
46
+ "clarification_expected",
47
+ "clarification_reason",
48
+ "correlation_id",
49
+ "coverage_tags",
50
+ "evidence_events",
51
+ "expected_domain",
52
+ "expected_primitives",
53
+ "failure_recovery",
54
+ "manifest_hash",
55
+ "prompt_manifest_hash",
56
+ "query_hash",
57
+ "route_source",
58
+ "selected_domain",
59
+ "selected_primitives",
60
+ "status",
61
+ "stop_reason",
62
+ "tool_catalog_hash",
63
+ "trace_id",
64
+ "trace_kind",
65
+ }
66
+ )
67
+ REQUIRED_DOMAINS = frozenset(
68
+ {
69
+ "tax",
70
+ "civil_affairs",
71
+ "payments",
72
+ "utilities",
73
+ "identity",
74
+ "welfare",
75
+ "healthcare",
76
+ "housing",
77
+ "mobility",
78
+ "business",
79
+ "labor",
80
+ "education",
81
+ "safety",
82
+ "immigration",
83
+ "legal",
84
+ "personal_data",
85
+ "public_data",
86
+ }
87
+ )
88
+
89
+
90
+ class EvidenceContractError(ValueError):
91
+ """Raised when a scenario dataset violates the Evidence Fabric contract."""
92
+
93
+
94
+ class ExpectedStep(BaseModel):
95
+ """One expected public-service loop step in a scenario."""
96
+
97
+ model_config = ConfigDict(frozen=True, extra="forbid")
98
+
99
+ primitive: str
100
+ purpose: str
101
+
102
+
103
+ class PermissionRequirements(BaseModel):
104
+ """Permission requirements attached to a citizen scenario."""
105
+
106
+ model_config = ConfigDict(frozen=True, extra="allow")
107
+
108
+ identity_assurance: str
109
+ user_confirmations: tuple[str, ...] = Field(default_factory=tuple)
110
+ sensitive_data: tuple[str, ...] = Field(default_factory=tuple)
111
+
112
+
113
+ class Scenario(BaseModel):
114
+ """Minimum scenario shape needed by Evidence Fabric v2."""
115
+
116
+ model_config = ConfigDict(frozen=True, extra="allow")
117
+
118
+ id: str
119
+ priority: str = "P2"
120
+ lifecycle_domain: str
121
+ request_ko: str
122
+ request_en: str | None = None
123
+ agencies_or_infrastructure: tuple[str, ...] = Field(default_factory=tuple)
124
+ citizen_intent_verbs: tuple[str, ...] = Field(default_factory=tuple)
125
+ expected_ax_chain: tuple[ExpectedStep, ...]
126
+ permission_requirements: PermissionRequirements
127
+ expected_system_behavior: tuple[str, ...] = Field(default_factory=tuple)
128
+ evaluation_focus: tuple[str, ...] = Field(default_factory=tuple)
129
+
130
+
131
+ class ScenarioDataset(BaseModel):
132
+ """Versioned citizen-demand scenario dataset."""
133
+
134
+ model_config = ConfigDict(frozen=True, extra="allow")
135
+
136
+ version: int
137
+ dataset_id: str
138
+ source_basis: str | None = None
139
+ target_system: str | None = None
140
+ allowed_primitives: tuple[str, ...] = Field(default_factory=tuple)
141
+ coverage_domains: tuple[str, ...]
142
+ scenarios: tuple[Scenario, ...]
143
+
144
+
145
+ def parse_dataset(path: Path) -> ScenarioDataset:
146
+ """Parse and validate a scenario dataset file."""
147
+ raw = _load_yaml_mapping(path)
148
+ banned = _find_banned_keys(raw)
149
+ if banned:
150
+ raise EvidenceContractError(
151
+ "model-visible scenario dataset contains banned implementation keys: "
152
+ + ", ".join(banned)
153
+ )
154
+ try:
155
+ return ScenarioDataset.model_validate(raw)
156
+ except ValidationError as exc:
157
+ raise EvidenceContractError(str(exc)) from exc
158
+
159
+
160
+ def resolve_repo_path(path: Path) -> Path:
161
+ """Resolve a repository-relative path from the Evidence Fabric root."""
162
+ return path if path.is_absolute() else _REPO_ROOT / path
163
+
164
+
165
+ def _load_yaml_mapping(path: Path) -> JsonObject:
166
+ if not path.exists():
167
+ raise EvidenceContractError(f"scenario dataset not found: {path}")
168
+ loaded = yaml.safe_load(path.read_text(encoding="utf-8"))
169
+ try:
170
+ return parse_json_object(loaded)
171
+ except ValidationError as exc:
172
+ raise EvidenceContractError(f"scenario dataset must be a JSON mapping: {path}") from exc
173
+
174
+
175
+ def _find_banned_keys(value: JsonValue, path: str = "$") -> tuple[str, ...]:
176
+ match value:
177
+ case dict():
178
+ hits: list[str] = []
179
+ for key, nested in value.items():
180
+ nested_path = f"{path}.{key}"
181
+ if key in BANNED_MODEL_VISIBLE_KEYS:
182
+ hits.append(nested_path)
183
+ hits.extend(_find_banned_keys(nested, nested_path))
184
+ return tuple(hits)
185
+ case list():
186
+ hits = []
187
+ for index, nested in enumerate(value):
188
+ hits.extend(_find_banned_keys(nested, f"{path}[{index}]"))
189
+ return tuple(hits)
190
+ case str() | int() | float() | bool() | None:
191
+ return ()
192
+ case unreachable:
193
+ assert_never(unreachable)
@@ -0,0 +1,33 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ from __future__ import annotations
3
+
4
+ from typing import Literal
5
+
6
+ from pydantic import BaseModel, ConfigDict
7
+
8
+ DocumentAuthoringScenarioClass = Literal[
9
+ "public_form_completion",
10
+ "narrative_authoring",
11
+ "unsupported_plausible_writing",
12
+ "protected_field",
13
+ "direct_hwp_path",
14
+ "render_comparison",
15
+ ]
16
+ DocumentAuthoringStatus = Literal["ready_for_review", "needs_input", "blocked"]
17
+ DocumentHwpDirectWriteState = Literal["blocked", "promoted", "not_applicable"]
18
+
19
+
20
+ class DocumentAuthoringCase(BaseModel):
21
+ model_config = ConfigDict(frozen=True, extra="forbid")
22
+
23
+ case_id: str
24
+ scenario_class: DocumentAuthoringScenarioClass
25
+ correlation_id: str
26
+ expected_status: DocumentAuthoringStatus
27
+ requires_socratic_loop: bool
28
+ requires_user_approval: bool
29
+ mutation_allowed: bool
30
+ render_comparison_required: bool
31
+ hwp_direct_write_state: DocumentHwpDirectWriteState = "not_applicable"
32
+ fixture_id: str | None = None
33
+ evidence_ref: str