ummaya 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/README.md +15 -2
  2. package/bin/ummaya +10 -1
  3. package/npm-shrinkwrap.json +253 -2
  4. package/package.json +5 -1
  5. package/prompts/manifest.yaml +1 -1
  6. package/prompts/system_v1.md +1 -0
  7. package/pyproject.toml +26 -2
  8. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  9. package/src/ummaya/_canonical/__init__.py +2 -0
  10. package/src/ummaya/engine/engine.py +29 -132
  11. package/src/ummaya/evidence/__init__.py +21 -2
  12. package/src/ummaya/evidence/dataset_contract.py +193 -0
  13. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  14. package/src/ummaya/evidence/document_harness.py +313 -0
  15. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  16. package/src/ummaya/evidence/gates.py +70 -0
  17. package/src/ummaya/evidence/json_types.py +20 -0
  18. package/src/ummaya/evidence/models.py +88 -1
  19. package/src/ummaya/evidence/output_payload.py +89 -0
  20. package/src/ummaya/evidence/payload_documents.py +233 -0
  21. package/src/ummaya/evidence/route_contracts.py +224 -0
  22. package/src/ummaya/evidence/route_helpers.py +150 -0
  23. package/src/ummaya/evidence/runner.py +81 -212
  24. package/src/ummaya/evidence/source_provenance.py +246 -0
  25. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  26. package/src/ummaya/evidence/tool_layer.py +39 -0
  27. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  28. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  29. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  30. package/src/ummaya/ipc/frame_schema.py +5 -5
  31. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  32. package/src/ummaya/ipc/stdio.py +1109 -477
  33. package/src/ummaya/llm/client.py +102 -3
  34. package/src/ummaya/llm/config.py +8 -3
  35. package/src/ummaya/primitives/__init__.py +6 -2
  36. package/src/ummaya/primitives/delegation.py +1 -1
  37. package/src/ummaya/primitives/document.py +28 -0
  38. package/src/ummaya/settings.py +0 -3
  39. package/src/ummaya/tools/discovery_bridge.py +17 -1
  40. package/src/ummaya/tools/documents/__init__.py +297 -0
  41. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  42. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  43. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  44. package/src/ummaya/tools/documents/authoring.py +283 -0
  45. package/src/ummaya/tools/documents/baselines.py +114 -0
  46. package/src/ummaya/tools/documents/capability.py +331 -0
  47. package/src/ummaya/tools/documents/contracts.py +112 -0
  48. package/src/ummaya/tools/documents/conversion.py +521 -0
  49. package/src/ummaya/tools/documents/diff.py +275 -0
  50. package/src/ummaya/tools/documents/engines.py +163 -0
  51. package/src/ummaya/tools/documents/evaluation.py +291 -0
  52. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  53. package/src/ummaya/tools/documents/fixtures.py +174 -0
  54. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  55. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  56. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  57. package/src/ummaya/tools/documents/formats/base.py +41 -0
  58. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  59. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  60. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  61. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  62. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  63. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  64. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  65. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  66. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  67. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  68. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  69. package/src/ummaya/tools/documents/inspection.py +289 -0
  70. package/src/ummaya/tools/documents/intake.py +1079 -0
  71. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  72. package/src/ummaya/tools/documents/models.py +1598 -0
  73. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  74. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  75. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  76. package/src/ummaya/tools/documents/patch.py +170 -0
  77. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  78. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  79. package/src/ummaya/tools/documents/permissions.py +110 -0
  80. package/src/ummaya/tools/documents/planner.py +616 -0
  81. package/src/ummaya/tools/documents/registry.py +2733 -0
  82. package/src/ummaya/tools/documents/render.py +978 -0
  83. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  84. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  85. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  86. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  87. package/src/ummaya/tools/documents/reread.py +157 -0
  88. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  89. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  90. package/src/ummaya/tools/documents/scorecard.py +184 -0
  91. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  92. package/src/ummaya/tools/documents/style.py +48 -0
  93. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  94. package/src/ummaya/tools/documents/validate.py +347 -0
  95. package/src/ummaya/tools/executor.py +29 -0
  96. package/src/ummaya/tools/live_proxy.py +0 -3
  97. package/src/ummaya/tools/models.py +5 -1
  98. package/src/ummaya/tools/register_all.py +8 -0
  99. package/src/ummaya/tools/registry.py +10 -1
  100. package/src/ummaya/tools/routing/__init__.py +59 -0
  101. package/src/ummaya/tools/routing/builder.py +105 -0
  102. package/src/ummaya/tools/routing/cards.py +29 -0
  103. package/src/ummaya/tools/routing/decision_service.py +534 -0
  104. package/src/ummaya/tools/routing/decision_types.py +74 -0
  105. package/src/ummaya/tools/routing/feasibility.py +122 -0
  106. package/src/ummaya/tools/routing/intent.py +17 -0
  107. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  108. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  109. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  110. package/src/ummaya/tools/routing/intent_types.py +48 -0
  111. package/src/ummaya/tools/routing/lint.py +78 -0
  112. package/src/ummaya/tools/routing/metadata.py +174 -0
  113. package/src/ummaya/tools/routing/projection.py +340 -0
  114. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  115. package/src/ummaya/tools/routing/schema.py +81 -0
  116. package/src/ummaya/tools/routing/types.py +96 -0
  117. package/src/ummaya/tools/routing_index.py +2 -2
  118. package/src/ummaya/tools/search.py +34 -746
  119. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  120. package/tui/package.json +1 -1
  121. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  122. package/tui/src/QueryEngine.ts +12 -8
  123. package/tui/src/bridge/inboundAttachments.ts +3 -3
  124. package/tui/src/cli/handlers/auth.ts +3 -12
  125. package/tui/src/cli/print.ts +7 -7
  126. package/tui/src/commands/insights.ts +1 -1
  127. package/tui/src/commands/install-github-app/types.ts +8 -30
  128. package/tui/src/commands/plugin/types.ts +6 -28
  129. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  130. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  131. package/tui/src/components/Feedback.tsx +1 -1
  132. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  133. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  134. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  135. package/tui/src/components/Spinner/types.ts +6 -28
  136. package/tui/src/components/agents/generateAgent.ts +1 -1
  137. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  138. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  139. package/tui/src/components/mcp/types.ts +16 -38
  140. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  141. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  142. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  143. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  144. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  145. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  146. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  147. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  148. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  149. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  150. package/tui/src/components/primitive/index.tsx +43 -1
  151. package/tui/src/components/primitive/types.ts +137 -0
  152. package/tui/src/components/ui/option.ts +4 -26
  153. package/tui/src/constants/common.ts +0 -2
  154. package/tui/src/constants/prompts.ts +4 -3
  155. package/tui/src/constants/querySource.ts +4 -26
  156. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  157. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  158. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  159. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  160. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  161. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  162. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  163. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  164. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  165. package/tui/src/ink/ink.tsx +33 -14
  166. package/tui/src/ink/reconciler.ts +2 -3
  167. package/tui/src/ink/render-to-screen.ts +30 -10
  168. package/tui/src/ipc/bridge.ts +62 -15
  169. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  170. package/tui/src/ipc/codec.ts +3 -3
  171. package/tui/src/ipc/frames.generated.ts +12 -12
  172. package/tui/src/ipc/llmClient.ts +151 -27
  173. package/tui/src/ipc/schema/frame.schema.json +1 -1
  174. package/tui/src/keybindings/defaultBindings.ts +4 -0
  175. package/tui/src/main.tsx +29 -11
  176. package/tui/src/native-ts/file-index/index.ts +33 -3
  177. package/tui/src/observability/surface.ts +2 -2
  178. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  179. package/tui/src/projectOnboardingState.ts +7 -6
  180. package/tui/src/query/chatMessageTypes.ts +18 -0
  181. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  182. package/tui/src/query/deps.ts +1 -1
  183. package/tui/src/query/messageGuards.ts +106 -0
  184. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  185. package/tui/src/query/run.ts +1075 -0
  186. package/tui/src/query/supportBoundary.ts +168 -0
  187. package/tui/src/query/toolResultErrors.ts +103 -0
  188. package/tui/src/query/toolRunner.ts +687 -0
  189. package/tui/src/query/unavailableToolRepair.ts +118 -0
  190. package/tui/src/query.ts +9 -2186
  191. package/tui/src/screens/REPL.tsx +40 -29
  192. package/tui/src/services/api/adapterManifest.ts +4 -0
  193. package/tui/src/services/api/backendChat/events.ts +117 -0
  194. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  195. package/tui/src/services/api/backendChat/frame.ts +9 -0
  196. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  197. package/tui/src/services/api/backendChat/types.ts +62 -0
  198. package/tui/src/services/api/backendChat.ts +1 -0
  199. package/tui/src/services/api/client.ts +65 -2
  200. package/tui/src/services/api/errorUtils.ts +5 -5
  201. package/tui/src/services/api/errors.ts +1 -1
  202. package/tui/src/services/api/logging.ts +1 -1
  203. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  204. package/tui/src/services/api/ummaya/messages.ts +255 -0
  205. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  206. package/tui/src/services/api/ummaya/provider.ts +200 -0
  207. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  208. package/tui/src/services/api/ummaya/request.ts +200 -0
  209. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  210. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  211. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  212. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  213. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  214. package/tui/src/services/api/ummaya/types.ts +110 -0
  215. package/tui/src/services/api/ummaya/usage.ts +30 -0
  216. package/tui/src/services/api/ummaya.ts +26 -418
  217. package/tui/src/services/api/withRetry.ts +1 -1
  218. package/tui/src/services/awaySummary.ts +2 -2
  219. package/tui/src/services/claudeAiLimits.ts +1 -1
  220. package/tui/src/services/compact/autoCompact.ts +1 -1
  221. package/tui/src/services/compact/compact.ts +1 -1
  222. package/tui/src/services/lsp/types.ts +8 -30
  223. package/tui/src/services/tips/types.ts +6 -28
  224. package/tui/src/services/tokenEstimation.ts +1 -1
  225. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  226. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  227. package/tui/src/services/tools/toolExecution.ts +94 -1
  228. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  229. package/tui/src/store/session-store.ts +10 -36
  230. package/tui/src/stubs/any-stub.ts +15 -10
  231. package/tui/src/stubs/color-diff-napi.ts +37 -23
  232. package/tui/src/stubs/globals.d.ts +3 -3
  233. package/tui/src/stubs/macro-preload.ts +23 -12
  234. package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
  235. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  236. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  237. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  238. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  239. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  240. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  241. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  242. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  243. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  244. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  245. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  246. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  247. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  248. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  249. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  250. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  251. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  252. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  253. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  254. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  255. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  256. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  257. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  258. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  259. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  260. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  261. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  262. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  263. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  264. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  265. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  266. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  267. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  268. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  269. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  270. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  271. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  272. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  273. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  274. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  275. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  276. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  277. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  278. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  279. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  280. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  281. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  282. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  283. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  284. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  285. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  286. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  287. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  288. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  289. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  290. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  291. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  292. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  293. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  294. package/tui/src/tools/BashTool/call.ts +202 -0
  295. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  296. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  297. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  298. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  299. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  300. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  301. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  302. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  303. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  304. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  305. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  306. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  307. package/tui/src/tools/BashTool/schemas.ts +65 -0
  308. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  309. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  310. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  311. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  312. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  313. package/tui/src/tools/BriefTool/upload.ts +1 -1
  314. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  315. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  316. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  317. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  318. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  319. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  320. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  321. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  322. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  323. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  324. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  325. package/tui/src/tools/FileEditTool/call.ts +228 -0
  326. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  327. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  328. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  329. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  330. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  331. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  332. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
  333. package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
  334. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  335. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  336. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  337. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  338. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  339. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  340. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  341. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  342. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  343. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  344. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  345. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  346. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  347. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  348. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  349. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  350. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  351. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  352. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  353. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  354. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  355. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  356. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
  357. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  358. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  359. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
  360. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  361. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  362. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  363. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  364. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  365. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  366. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  367. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  368. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  369. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  370. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  371. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  372. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  373. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  374. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  375. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  376. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  377. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  378. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  379. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  380. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  381. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  382. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  383. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  384. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  385. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
  386. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  387. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  388. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  389. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  390. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  391. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  392. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  393. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  394. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  395. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  396. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  397. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  398. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  399. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  400. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  401. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  402. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  403. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  404. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  405. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  406. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  407. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  408. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  409. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  410. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  411. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  412. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  413. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  414. package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
  415. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  416. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  417. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  418. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  419. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  420. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  421. package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
  422. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  423. package/tui/src/tools.ts +39 -190
  424. package/tui/src/types/fileSuggestion.ts +4 -26
  425. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  426. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  427. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  428. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  429. package/tui/src/types/message.ts +80 -102
  430. package/tui/src/types/messageQueueTypes.ts +6 -28
  431. package/tui/src/types/notebook.ts +16 -38
  432. package/tui/src/types/statusLine.ts +4 -26
  433. package/tui/src/types/tools.ts +24 -46
  434. package/tui/src/types/utils.ts +6 -28
  435. package/tui/src/upstreamproxy/relay.ts +7 -3
  436. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  437. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  438. package/tui/src/utils/auth.ts +129 -139
  439. package/tui/src/utils/bash/ast.ts +23 -23
  440. package/tui/src/utils/bash/bashParser.ts +5 -5
  441. package/tui/src/utils/billing.ts +1 -1
  442. package/tui/src/utils/collapseReadSearch.ts +3 -3
  443. package/tui/src/utils/cronTasks.ts +1 -1
  444. package/tui/src/utils/execFileNoThrow.ts +1 -1
  445. package/tui/src/utils/filePersistence/types.ts +16 -38
  446. package/tui/src/utils/forkedAgent.ts +1 -1
  447. package/tui/src/utils/gracefulShutdown.ts +4 -4
  448. package/tui/src/utils/heapDumpService.ts +12 -8
  449. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  450. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  451. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  452. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  453. package/tui/src/utils/messages.ts +18 -0
  454. package/tui/src/utils/migrateSessions.ts +3 -3
  455. package/tui/src/utils/model/model.ts +6 -6
  456. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  457. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  458. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  459. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  460. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  461. package/tui/src/utils/protectedNamespace.ts +5 -3
  462. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  463. package/tui/src/utils/ripgrep.ts +16 -7
  464. package/tui/src/utils/sessionTitle.ts +1 -1
  465. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  466. package/tui/src/utils/shell/prefix.ts +1 -1
  467. package/tui/src/utils/sideQuery.ts +1 -1
  468. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  469. package/tui/src/utils/teleport.tsx +1 -1
  470. package/uv.lock +400 -14
  471. package/tui/src/services/api/claude.ts +0 -3540
  472. package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
  473. package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
  474. package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
  475. package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
  476. package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
  477. package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
@@ -0,0 +1,347 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Public-form conformance validation for extracted document artifacts."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import hashlib
7
+ from decimal import Decimal
8
+
9
+ from ummaya.tools.documents.baselines import (
10
+ BaselineTableGeometry,
11
+ BaselineTextAnchor,
12
+ ConformanceBaseline,
13
+ )
14
+ from ummaya.tools.documents.models import (
15
+ BlockedReason,
16
+ DocumentExtraction,
17
+ DocumentToolResult,
18
+ PublicFormValidationReport,
19
+ ToolResultStatus,
20
+ ValidationDecision,
21
+ ValidationFinding,
22
+ ValidationReadiness,
23
+ )
24
+ from ummaya.tools.documents.scorecard import compute_public_form_metrics, table_shape
25
+
26
+
27
+ def validate_public_form(
28
+ extraction: DocumentExtraction,
29
+ *,
30
+ baseline: ConformanceBaseline,
31
+ artifact_id: str,
32
+ correlation_id: str,
33
+ round_trip_passed: bool = True,
34
+ render_passed: bool = True,
35
+ security_passed: bool = True,
36
+ ) -> DocumentToolResult:
37
+ """Validate one extracted derivative against a public-form baseline."""
38
+ if not baseline.supports_conformance:
39
+ finding = _finding(
40
+ code="unsupported_for_conformance",
41
+ message=baseline.unsupported_reason or "Public-form conformance is not supported.",
42
+ anchor=f"template:{baseline.template_id}",
43
+ remediation_hint="Use a promoted editable format with conformance evidence.",
44
+ )
45
+ report = _report(
46
+ extraction,
47
+ baseline=baseline,
48
+ artifact_id=artifact_id,
49
+ findings=[finding],
50
+ decision=ValidationDecision.blocked,
51
+ readiness=ValidationReadiness.unsupported,
52
+ round_trip_passed=round_trip_passed,
53
+ render_passed=render_passed,
54
+ security_passed=security_passed,
55
+ )
56
+ return _result(
57
+ report,
58
+ status=ToolResultStatus.blocked,
59
+ blocked_reason=BlockedReason.unsupported_operation,
60
+ summary="Public-form validation blocked: conformance is unsupported.",
61
+ correlation_id=correlation_id,
62
+ )
63
+
64
+ findings = _hard_rule_findings(extraction, baseline)
65
+ if not security_passed:
66
+ findings.append(
67
+ _finding(
68
+ code="security_check_failed",
69
+ message="Security validation failed before public-form readiness.",
70
+ anchor=f"artifact:{artifact_id}",
71
+ remediation_hint="Resolve document security findings before validation.",
72
+ )
73
+ )
74
+ if not round_trip_passed:
75
+ findings.append(
76
+ _finding(
77
+ code="round_trip_mismatch",
78
+ message="Round-trip extraction did not match intended document values.",
79
+ anchor=f"artifact:{artifact_id}",
80
+ remediation_hint="Re-read the derivative and repair mismatched values.",
81
+ )
82
+ )
83
+ if not render_passed:
84
+ findings.append(
85
+ _finding(
86
+ code="render_mismatch",
87
+ message="Rendered derivative evidence did not match the expected layout.",
88
+ anchor=f"artifact:{artifact_id}",
89
+ remediation_hint="Repair layout drift and regenerate render evidence.",
90
+ )
91
+ )
92
+
93
+ metrics = compute_public_form_metrics(extraction, baseline)
94
+ hard_failure = any(finding.severity == "hard_failure" for finding in findings)
95
+ decision, readiness = _decision(
96
+ aggregate_score=metrics.aggregate_score,
97
+ hard_failure=hard_failure,
98
+ round_trip_passed=round_trip_passed,
99
+ render_passed=render_passed,
100
+ security_passed=security_passed,
101
+ )
102
+ report = _report(
103
+ extraction,
104
+ baseline=baseline,
105
+ artifact_id=artifact_id,
106
+ findings=findings,
107
+ decision=decision,
108
+ readiness=readiness,
109
+ round_trip_passed=round_trip_passed,
110
+ render_passed=render_passed,
111
+ security_passed=security_passed,
112
+ )
113
+ if decision is ValidationDecision.pass_:
114
+ return _result(
115
+ report,
116
+ status=ToolResultStatus.ok,
117
+ blocked_reason=None,
118
+ summary="Public-form validation passed; artifact is ready for human review.",
119
+ correlation_id=correlation_id,
120
+ )
121
+ blocked_reason = (
122
+ BlockedReason.unsupported_operation
123
+ if readiness is ValidationReadiness.unsupported
124
+ else BlockedReason.validation_failed
125
+ )
126
+ return _result(
127
+ report,
128
+ status=ToolResultStatus.blocked,
129
+ blocked_reason=blocked_reason,
130
+ summary="Public-form validation failed; artifact is not ready.",
131
+ correlation_id=correlation_id,
132
+ )
133
+
134
+
135
+ def _hard_rule_findings(
136
+ extraction: DocumentExtraction,
137
+ baseline: ConformanceBaseline,
138
+ ) -> list[ValidationFinding]:
139
+ findings: list[ValidationFinding] = []
140
+ findings.extend(_required_field_findings(extraction, baseline))
141
+ findings.extend(
142
+ _required_text_findings(
143
+ extraction,
144
+ baseline.protected_text,
145
+ "protected_text_missing",
146
+ )
147
+ )
148
+ findings.extend(
149
+ _required_text_findings(
150
+ extraction,
151
+ baseline.required_labels,
152
+ "required_label_missing",
153
+ )
154
+ )
155
+ findings.extend(_table_geometry_findings(extraction, baseline.table_geometries))
156
+ findings.extend(
157
+ _required_text_findings(
158
+ extraction,
159
+ baseline.signature_regions,
160
+ "signature_or_seal_region_missing",
161
+ )
162
+ )
163
+ findings.extend(_metadata_findings(extraction, baseline))
164
+ return findings
165
+
166
+
167
+ def _required_field_findings(
168
+ extraction: DocumentExtraction,
169
+ baseline: ConformanceBaseline,
170
+ ) -> list[ValidationFinding]:
171
+ by_field_id = {field.field_id: field for field in extraction.fields}
172
+ findings: list[ValidationFinding] = []
173
+ for required in baseline.required_fields:
174
+ observed = by_field_id.get(required.field_id)
175
+ if observed is None or observed.current_value in {None, ""}:
176
+ findings.append(
177
+ _finding(
178
+ code="required_field_missing",
179
+ message=f"Required field {required.label!r} is missing or empty.",
180
+ anchor=required.path,
181
+ remediation_hint=f"Fill the {required.label!r} field before export.",
182
+ )
183
+ )
184
+ return findings
185
+
186
+
187
+ def _required_text_findings(
188
+ extraction: DocumentExtraction,
189
+ expected: tuple[BaselineTextAnchor, ...],
190
+ code: str,
191
+ ) -> list[ValidationFinding]:
192
+ observed_text = _combined_text(extraction)
193
+ findings: list[ValidationFinding] = []
194
+ for item in expected:
195
+ if item.text not in observed_text:
196
+ findings.append(
197
+ _finding(
198
+ code=code,
199
+ message=f"Required public-form text {item.text!r} is missing.",
200
+ anchor=item.anchor,
201
+ remediation_hint=f"Restore required text {item.text!r} at the baseline anchor.",
202
+ )
203
+ )
204
+ return findings
205
+
206
+
207
+ def _table_geometry_findings(
208
+ extraction: DocumentExtraction,
209
+ expected: tuple[BaselineTableGeometry, ...],
210
+ ) -> list[ValidationFinding]:
211
+ tables_by_id = {table.block_id: table for table in extraction.tables}
212
+ findings: list[ValidationFinding] = []
213
+ for geometry in expected:
214
+ observed = tables_by_id.get(geometry.table_id)
215
+ observed_rows, observed_columns = table_shape(observed)
216
+ if observed_rows != geometry.rows or observed_columns != geometry.columns:
217
+ findings.append(
218
+ _finding(
219
+ code="table_geometry_mismatch",
220
+ message=(
221
+ f"Table {geometry.table_id!r} shape is "
222
+ f"{observed_rows}x{observed_columns}, expected "
223
+ f"{geometry.rows}x{geometry.columns}."
224
+ ),
225
+ anchor=geometry.anchor,
226
+ remediation_hint="Restore the protected table row and column geometry.",
227
+ )
228
+ )
229
+ return findings
230
+
231
+
232
+ def _metadata_findings(
233
+ extraction: DocumentExtraction,
234
+ baseline: ConformanceBaseline,
235
+ ) -> list[ValidationFinding]:
236
+ findings: list[ValidationFinding] = []
237
+ expected_metadata = dict(baseline.metadata_exact_matches)
238
+ if baseline.expected_page_count is not None:
239
+ expected_metadata["page_count"] = baseline.expected_page_count
240
+ for key, expected in expected_metadata.items():
241
+ observed = extraction.metadata.get(key)
242
+ if observed != expected:
243
+ findings.append(
244
+ _finding(
245
+ code="metadata_mismatch",
246
+ message=f"Metadata {key!r} is {observed!r}, expected {expected!r}.",
247
+ anchor=f"metadata:{key}",
248
+ remediation_hint=f"Restore metadata {key!r} to the baseline value.",
249
+ )
250
+ )
251
+ return findings
252
+
253
+
254
+ def _report(
255
+ extraction: DocumentExtraction,
256
+ *,
257
+ baseline: ConformanceBaseline,
258
+ artifact_id: str,
259
+ findings: list[ValidationFinding],
260
+ decision: ValidationDecision,
261
+ readiness: ValidationReadiness,
262
+ round_trip_passed: bool,
263
+ render_passed: bool,
264
+ security_passed: bool,
265
+ ) -> PublicFormValidationReport:
266
+ metrics = compute_public_form_metrics(extraction, baseline)
267
+ return PublicFormValidationReport(
268
+ report_id=f"validation-{artifact_id}-{baseline.template_id}",
269
+ artifact_id=artifact_id,
270
+ template_id=baseline.template_id,
271
+ schema_id=baseline.schema_id,
272
+ paragraph_block_f1=metrics.paragraph_block_f1,
273
+ table_cell_f1=metrics.table_cell_f1,
274
+ image_reference_f1=metrics.image_reference_f1,
275
+ metadata_exact_match=metrics.metadata_exact_match,
276
+ aggregate_score=metrics.aggregate_score,
277
+ round_trip_passed=round_trip_passed,
278
+ render_passed=render_passed,
279
+ security_passed=security_passed,
280
+ findings=findings,
281
+ decision=decision,
282
+ readiness=readiness,
283
+ )
284
+
285
+
286
+ def _result(
287
+ report: PublicFormValidationReport,
288
+ *,
289
+ status: ToolResultStatus,
290
+ blocked_reason: BlockedReason | None,
291
+ summary: str,
292
+ correlation_id: str,
293
+ ) -> DocumentToolResult:
294
+ return DocumentToolResult(
295
+ tool_id="document_validate_public_form",
296
+ correlation_id=correlation_id,
297
+ status=status,
298
+ artifact_refs=[report.artifact_id],
299
+ validation_report=report,
300
+ findings=list(report.findings),
301
+ text_summary=summary,
302
+ blocked_reason=blocked_reason,
303
+ )
304
+
305
+
306
+ def _decision(
307
+ *,
308
+ aggregate_score: Decimal,
309
+ hard_failure: bool,
310
+ round_trip_passed: bool,
311
+ render_passed: bool,
312
+ security_passed: bool,
313
+ ) -> tuple[ValidationDecision, ValidationReadiness]:
314
+ if not security_passed:
315
+ return ValidationDecision.blocked, ValidationReadiness.blocked
316
+ if hard_failure or not round_trip_passed or not render_passed:
317
+ if not round_trip_passed or not render_passed:
318
+ return ValidationDecision.needs_manual_review, ValidationReadiness.not_ready
319
+ return ValidationDecision.fail, ValidationReadiness.not_ready
320
+ if aggregate_score < Decimal("0.85"):
321
+ return ValidationDecision.fail, ValidationReadiness.not_ready
322
+ return ValidationDecision.pass_, ValidationReadiness.ready_for_review
323
+
324
+
325
+ def _combined_text(extraction: DocumentExtraction) -> str:
326
+ parts = [paragraph.text for paragraph in extraction.paragraphs]
327
+ parts.extend(cell.text for table in extraction.tables for cell in table.cells)
328
+ parts.extend(field.label for field in extraction.fields)
329
+ return "\n".join(parts)
330
+
331
+
332
+ def _finding(
333
+ *,
334
+ code: str,
335
+ message: str,
336
+ anchor: str,
337
+ remediation_hint: str,
338
+ ) -> ValidationFinding:
339
+ digest = hashlib.sha256(f"{code}\0{anchor}\0{message}".encode()).hexdigest()[:12]
340
+ return ValidationFinding(
341
+ finding_id=f"validation-{code}-{digest}",
342
+ severity="hard_failure",
343
+ code=code,
344
+ message=message,
345
+ anchor=anchor,
346
+ remediation_hint=remediation_hint,
347
+ )
@@ -47,6 +47,7 @@ logger = logging.getLogger(__name__)
47
47
  _tracer = trace.get_tracer(__name__)
48
48
 
49
49
  AdapterFn = Callable[[BaseModel], Awaitable[dict[str, Any]]]
50
+ SessionAwareAdapterFn = Callable[[BaseModel, object | None], Awaitable[dict[str, Any]]]
50
51
 
51
52
  _LOOKUP_ENVELOPE_KINDS: frozenset[str] = frozenset(
52
53
  {"record", "collection", "timeseries", "error", "search"}
@@ -195,6 +196,7 @@ class ToolExecutor:
195
196
  """
196
197
  self._registry = registry
197
198
  self._adapters: dict[str, AdapterFn] = {}
199
+ self._session_adapters: dict[str, SessionAwareAdapterFn] = {}
198
200
  self._recovery_executor = recovery_executor
199
201
  self._metrics: MetricsCollector | None = metrics
200
202
  self._event_logger: ObservabilityEventLogger | None = event_logger
@@ -211,6 +213,31 @@ class ToolExecutor:
211
213
  self._adapters[tool_id] = adapter
212
214
  logger.debug("Registered adapter for tool: %s", tool_id)
213
215
 
216
+ def register_session_adapter(self, tool_id: str, adapter: SessionAwareAdapterFn) -> None:
217
+ """Register an adapter that also receives the caller session identity."""
218
+
219
+ async def _without_session(inp: BaseModel) -> dict[str, Any]:
220
+ return await adapter(inp, None)
221
+
222
+ self._adapters[tool_id] = _without_session
223
+ self._session_adapters[tool_id] = adapter
224
+ logger.debug("Registered session-aware adapter for tool: %s", tool_id)
225
+
226
+ def _adapter_for_session(
227
+ self,
228
+ tool_id: str,
229
+ adapter: AdapterFn,
230
+ session_identity: object | None,
231
+ ) -> AdapterFn:
232
+ session_adapter = self._session_adapters.get(tool_id)
233
+ if session_adapter is None:
234
+ return adapter
235
+
236
+ async def _with_session(inp: BaseModel) -> dict[str, Any]:
237
+ return await session_adapter(inp, session_identity)
238
+
239
+ return _with_session
240
+
214
241
  async def invoke_raw( # noqa: C901
215
242
  self,
216
243
  tool_id: str,
@@ -269,6 +296,7 @@ class ToolExecutor:
269
296
  elapsed_ms=_elapsed(),
270
297
  retryable=False,
271
298
  )
299
+ adapter = self._adapter_for_session(tool_id, adapter, session_identity)
272
300
 
273
301
  try:
274
302
  validated_input = tool.input_schema.model_validate(params)
@@ -458,6 +486,7 @@ class ToolExecutor:
458
486
  elapsed_ms=_elapsed(),
459
487
  retryable=False,
460
488
  )
489
+ adapter = self._adapter_for_session(tool_id, adapter, session_identity)
461
490
 
462
491
  # --- Input validation ---------------------------------------------------
463
492
  try:
@@ -117,14 +117,11 @@ async def invoke_live_adapter_proxy(
117
117
  )
118
118
 
119
119
  timeout = _configured_timeout(settings.live_adapter_proxy_timeout_seconds)
120
- token = os.environ.get("UMMAYA_LIVE_ADAPTER_PROXY_TOKEN", settings.live_adapter_proxy_token)
121
120
  headers = {
122
121
  "Accept": "application/json",
123
122
  "Content-Type": "application/json",
124
123
  "User-Agent": f"UMMAYA/{get_version()} live-adapter-client",
125
124
  }
126
- if token.strip():
127
- headers["Authorization"] = f"Bearer {token.strip()}"
128
125
 
129
126
  payload: dict[str, object] = {
130
127
  "schema_version": "ummaya.live_adapter.v1",
@@ -31,6 +31,8 @@ _AUTH_TYPE_LEVEL_MAPPING: Final[dict[str, frozenset[str]]] = {
31
31
  "oauth": frozenset({"AAL1", "AAL2", "AAL3"}),
32
32
  }
33
33
 
34
+ MockFidelityGrade = Literal["OPENAPI", "OOS", "HARNESS_ONLY", "unknown", "not_applicable"]
35
+
34
36
  # Spec 1634 (P3 Tool System Wiring) — closed ministry / institution enum.
35
37
  # Typed replacement for the former free-form ``provider: str`` field. New
36
38
  # institutions are added by enum extension (small dedicated PR, ADR not
@@ -215,8 +217,10 @@ class GovAPITool(BaseModel):
215
217
  ``mock`` = adapter returns recorded fixture or shape-compatible synthetic.
216
218
  Distinct from ``AdapterRegistration.source_mode`` (mirror fidelity axis)."""
217
219
 
220
+ mock_fidelity_grade: MockFidelityGrade = "not_applicable"
221
+
218
222
  # Spec 031 T032 dual-axis fields — None during pre-v1.2 compatibility window FR-028
219
- primitive: Literal["find", "locate", "send", "check"] | None = None
223
+ primitive: Literal["find", "locate", "send", "check", "document"] | None = None
220
224
  """Active primitive surface this adapter binds to (Spec 031 AdapterPrimitive).
221
225
 
222
226
  Set to the appropriate value during Spec 031 Phase 4 (T033).
@@ -164,6 +164,14 @@ def register_all_tools(registry: ToolRegistry, executor: ToolExecutor) -> Routin
164
164
  reg_mock_hometax_simplified(registry, executor) # T028 — Hometax simplified data
165
165
  reg_mock_gov24_cert(registry, executor) # T029 — Gov24 certificate lookup
166
166
 
167
+ # Spec #2802 — Public AX document harness. These local tools expose
168
+ # inspect/extract/form-schema/copy/fill/style/render/validate/save through
169
+ # the existing ToolRegistry and permission gate; no external agency channel
170
+ # is called at registration time.
171
+ from ummaya.tools.documents.registry import register_document_tools
172
+
173
+ register_document_tools(registry, executor)
174
+
167
175
  # Epic ζ #2297 path B (live smoke 2026-04-30 follow-up) — bridge per-primitive
168
176
  # registries (verify/submit) into the main ToolRegistry's BM25 corpus
169
177
  # so `lookup(mode="search", query="…")` can surface verify/submit
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
 
6
6
  import logging
7
7
  from enum import StrEnum
8
- from typing import Literal
8
+ from typing import TYPE_CHECKING, Literal
9
9
 
10
10
  from pydantic import BaseModel, ConfigDict, Field, computed_field, model_validator
11
11
 
@@ -32,6 +32,9 @@ from ummaya.tools.search import search_tools
32
32
 
33
33
  logger = logging.getLogger(__name__)
34
34
 
35
+ if TYPE_CHECKING:
36
+ from ummaya.tools.routing.cards import AdapterCard
37
+
35
38
 
36
39
  # ---------------------------------------------------------------------------
37
40
  # Spec 031 Phase 2 — active primitive registry metadata (T007–T009).
@@ -49,6 +52,7 @@ class AdapterPrimitive(StrEnum):
49
52
  locate = "locate"
50
53
  send = "send"
51
54
  check = "check"
55
+ document = "document"
52
56
 
53
57
 
54
58
  class AdapterSourceMode(StrEnum):
@@ -387,6 +391,11 @@ class ToolRegistry:
387
391
  """Return non-core, active tools."""
388
392
  return [t for tid, t in self._tools.items() if not t.is_core and tid not in self._inactive]
389
393
 
394
+ def adapter_cards(self) -> list[AdapterCard]:
395
+ from ummaya.tools.routing.cards import build_adapter_cards
396
+
397
+ return list(build_adapter_cards(self.all_tools()))
398
+
390
399
  def export_core_tools_openai(self) -> list[dict[str, object]]:
391
400
  """Export core tools as OpenAI function-calling definitions.
392
401
 
@@ -0,0 +1,59 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ from ummaya.tools.routing.cards import (
4
+ AdapterCard,
5
+ AdapterCardError,
6
+ AdapterCardQualityViolation,
7
+ SchemaFieldSummary,
8
+ assert_adapter_card_quality,
9
+ build_adapter_card,
10
+ build_adapter_cards,
11
+ lint_adapter_card,
12
+ )
13
+ from ummaya.tools.routing.decision_service import RouteDecisionService
14
+ from ummaya.tools.routing.decision_types import (
15
+ FeasibilityStatus,
16
+ RouteCandidate,
17
+ RouteClarificationDecision,
18
+ RouteClarificationReason,
19
+ RouteDecision,
20
+ RouteStopReason,
21
+ SchemaProjectionLevel,
22
+ )
23
+ from ummaya.tools.routing.intent import (
24
+ ACTIVE_PRIMITIVES,
25
+ LEGACY_PRIMITIVE_ALIASES,
26
+ ToolSelectionIntent,
27
+ extract_tool_selection_intent,
28
+ )
29
+ from ummaya.tools.routing.projection import (
30
+ AvailableAdaptersProjection,
31
+ build_available_adapters_projection,
32
+ selected_concrete_adapter_tools,
33
+ )
34
+
35
+ __all__ = [
36
+ "ACTIVE_PRIMITIVES",
37
+ "AdapterCard",
38
+ "AdapterCardError",
39
+ "AdapterCardQualityViolation",
40
+ "AvailableAdaptersProjection",
41
+ "FeasibilityStatus",
42
+ "LEGACY_PRIMITIVE_ALIASES",
43
+ "RouteCandidate",
44
+ "RouteClarificationDecision",
45
+ "RouteClarificationReason",
46
+ "RouteDecision",
47
+ "RouteStopReason",
48
+ "RouteDecisionService",
49
+ "SchemaFieldSummary",
50
+ "SchemaProjectionLevel",
51
+ "ToolSelectionIntent",
52
+ "assert_adapter_card_quality",
53
+ "build_adapter_card",
54
+ "build_adapter_cards",
55
+ "build_available_adapters_projection",
56
+ "extract_tool_selection_intent",
57
+ "lint_adapter_card",
58
+ "selected_concrete_adapter_tools",
59
+ ]
@@ -0,0 +1,105 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Iterable
6
+
7
+ from ummaya.tools.models import GovAPITool
8
+ from ummaya.tools.routing.metadata import (
9
+ capabilities_for_tool,
10
+ credential_requirements_for_tool,
11
+ domain_for_tool,
12
+ entity_types_for_tool,
13
+ examples_en_for_tool,
14
+ examples_ko_for_tool,
15
+ limitations_for_tool,
16
+ mock_fidelity_grade_for_tool,
17
+ prerequisite_tools_for_tool,
18
+ primitive_family,
19
+ routing_text,
20
+ safety_annotations_for_tool,
21
+ side_effect_level_for_tool,
22
+ source_mode_for_tool,
23
+ )
24
+ from ummaya.tools.routing.schema import model_json_schema, schema_summary, sha256
25
+ from ummaya.tools.routing.types import (
26
+ INTENT_VERBS,
27
+ LEGACY_ALIASES,
28
+ AdapterCard,
29
+ )
30
+
31
+
32
+ def build_adapter_cards(tools: Iterable[GovAPITool]) -> tuple[AdapterCard, ...]:
33
+ return tuple(build_adapter_card(tool) for tool in sorted(tools, key=lambda item: item.id))
34
+
35
+
36
+ def build_adapter_card(tool: GovAPITool) -> AdapterCard:
37
+ primitive = primitive_family(tool.primitive)
38
+ input_schema = model_json_schema(tool.input_schema)
39
+ output_schema = model_json_schema(tool.output_schema)
40
+ input_summary = schema_summary(input_schema)
41
+ output_summary = schema_summary(output_schema)
42
+ required_slots = tuple(field.name for field in input_summary if field.required)
43
+ optional_slots = tuple(field.name for field in input_summary if not field.required)
44
+ source_mode = source_mode_for_tool(tool)
45
+ policy_authority_url = tool.policy.real_classification_url if tool.policy is not None else None
46
+ side_effect_level = side_effect_level_for_tool(tool, primitive)
47
+ credential_requirements = credential_requirements_for_tool(tool)
48
+ capabilities = capabilities_for_tool(tool, primitive)
49
+ entity_types = entity_types_for_tool(input_summary, tool.category)
50
+ prerequisite_tools = prerequisite_tools_for_tool(tool, primitive)
51
+ input_schema_hash = sha256(input_schema)
52
+ manifest_hash = sha256(
53
+ {
54
+ "tool_id": tool.id,
55
+ "primitive_family": primitive,
56
+ "agency": str(tool.ministry),
57
+ "source_mode": source_mode,
58
+ "policy_authority_url": policy_authority_url,
59
+ "input_schema_hash": input_schema_hash,
60
+ "output_schema_hash": sha256(output_schema),
61
+ }
62
+ )
63
+ examples_ko = examples_ko_for_tool(tool)
64
+ examples_en = examples_en_for_tool(tool, primitive)
65
+ negative_examples = (f"Do not use for requests outside primitive {primitive}.",)
66
+ limitations = limitations_for_tool(tool, source_mode, policy_authority_url)
67
+ safety_annotations = safety_annotations_for_tool(tool, side_effect_level)
68
+
69
+ return AdapterCard(
70
+ tool_id=tool.id,
71
+ primitive_family=primitive,
72
+ legacy_primitive_aliases=LEGACY_ALIASES[primitive],
73
+ domain=domain_for_tool(tool),
74
+ agency=str(tool.ministry),
75
+ source_mode=source_mode,
76
+ capabilities=capabilities,
77
+ intent_verbs=INTENT_VERBS[primitive],
78
+ entity_types=entity_types,
79
+ required_slots=required_slots,
80
+ optional_slots=optional_slots,
81
+ prerequisite_tools=prerequisite_tools,
82
+ input_schema_hash=input_schema_hash,
83
+ input_schema_summary=input_summary,
84
+ output_schema_summary=output_summary,
85
+ policy_authority_url=policy_authority_url,
86
+ safety_annotations=safety_annotations,
87
+ side_effect_level=side_effect_level,
88
+ credential_requirements=credential_requirements,
89
+ mock_fidelity_grade=mock_fidelity_grade_for_tool(tool),
90
+ examples_ko=examples_ko,
91
+ examples_en=examples_en,
92
+ negative_examples=negative_examples,
93
+ limitations=limitations,
94
+ manifest_hash=manifest_hash,
95
+ routing_text=routing_text(
96
+ tool_id=tool.id,
97
+ primitive=primitive,
98
+ agency=str(tool.ministry),
99
+ domain=domain_for_tool(tool),
100
+ capabilities=capabilities,
101
+ required_slots=required_slots,
102
+ examples_ko=examples_ko,
103
+ limitations=limitations,
104
+ ),
105
+ )
@@ -0,0 +1,29 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ from __future__ import annotations
4
+
5
+ from ummaya.tools.routing.builder import build_adapter_card, build_adapter_cards
6
+ from ummaya.tools.routing.lint import assert_adapter_card_quality, lint_adapter_card
7
+ from ummaya.tools.routing.types import (
8
+ AdapterCard,
9
+ AdapterCardError,
10
+ AdapterCardQualityViolation,
11
+ PrimitiveFamily,
12
+ SchemaFieldSummary,
13
+ SideEffectLevel,
14
+ SourceMode,
15
+ )
16
+
17
+ __all__ = [
18
+ "AdapterCard",
19
+ "AdapterCardError",
20
+ "AdapterCardQualityViolation",
21
+ "PrimitiveFamily",
22
+ "SchemaFieldSummary",
23
+ "SideEffectLevel",
24
+ "SourceMode",
25
+ "assert_adapter_card_quality",
26
+ "build_adapter_card",
27
+ "build_adapter_cards",
28
+ "lint_adapter_card",
29
+ ]