ummaya 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/README.md +17 -3
  2. package/bin/ummaya +10 -1
  3. package/npm-shrinkwrap.json +253 -2
  4. package/package.json +5 -1
  5. package/prompts/manifest.yaml +2 -2
  6. package/prompts/session_guidance_v1.md +3 -1
  7. package/prompts/system_v1.md +9 -7
  8. package/pyproject.toml +26 -7
  9. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  10. package/src/ummaya/_canonical/__init__.py +2 -0
  11. package/src/ummaya/context/builder.py +17 -11
  12. package/src/ummaya/engine/engine.py +30 -113
  13. package/src/ummaya/engine/query.py +20 -0
  14. package/src/ummaya/evidence/__init__.py +44 -0
  15. package/src/ummaya/evidence/__main__.py +7 -0
  16. package/src/ummaya/evidence/dataset_contract.py +193 -0
  17. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  18. package/src/ummaya/evidence/document_harness.py +313 -0
  19. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  20. package/src/ummaya/evidence/gates.py +70 -0
  21. package/src/ummaya/evidence/json_types.py +20 -0
  22. package/src/ummaya/evidence/models.py +145 -0
  23. package/src/ummaya/evidence/output_payload.py +89 -0
  24. package/src/ummaya/evidence/payload_documents.py +233 -0
  25. package/src/ummaya/evidence/route_contracts.py +224 -0
  26. package/src/ummaya/evidence/route_helpers.py +150 -0
  27. package/src/ummaya/evidence/runner.py +177 -0
  28. package/src/ummaya/evidence/source_provenance.py +246 -0
  29. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  30. package/src/ummaya/evidence/task_registry.py +264 -0
  31. package/src/ummaya/evidence/tool_layer.py +39 -0
  32. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  33. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  34. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  35. package/src/ummaya/ipc/frame_schema.py +52 -5
  36. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  37. package/src/ummaya/ipc/stdio.py +2282 -417
  38. package/src/ummaya/llm/client.py +234 -59
  39. package/src/ummaya/llm/config.py +8 -3
  40. package/src/ummaya/llm/reasoning.py +84 -0
  41. package/src/ummaya/primitives/__init__.py +6 -2
  42. package/src/ummaya/primitives/delegation.py +1 -1
  43. package/src/ummaya/primitives/document.py +28 -0
  44. package/src/ummaya/settings.py +0 -3
  45. package/src/ummaya/tools/discovery_bridge.py +34 -2
  46. package/src/ummaya/tools/documents/__init__.py +297 -0
  47. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  48. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  49. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  50. package/src/ummaya/tools/documents/authoring.py +283 -0
  51. package/src/ummaya/tools/documents/baselines.py +114 -0
  52. package/src/ummaya/tools/documents/capability.py +331 -0
  53. package/src/ummaya/tools/documents/contracts.py +112 -0
  54. package/src/ummaya/tools/documents/conversion.py +521 -0
  55. package/src/ummaya/tools/documents/diff.py +275 -0
  56. package/src/ummaya/tools/documents/engines.py +163 -0
  57. package/src/ummaya/tools/documents/evaluation.py +291 -0
  58. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  59. package/src/ummaya/tools/documents/fixtures.py +174 -0
  60. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  61. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  62. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  63. package/src/ummaya/tools/documents/formats/base.py +41 -0
  64. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  65. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  66. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  67. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  68. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  69. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  70. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  71. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  72. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  73. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  74. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  75. package/src/ummaya/tools/documents/inspection.py +289 -0
  76. package/src/ummaya/tools/documents/intake.py +1079 -0
  77. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  78. package/src/ummaya/tools/documents/models.py +1598 -0
  79. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  80. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  81. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  82. package/src/ummaya/tools/documents/patch.py +170 -0
  83. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  84. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  85. package/src/ummaya/tools/documents/permissions.py +110 -0
  86. package/src/ummaya/tools/documents/planner.py +616 -0
  87. package/src/ummaya/tools/documents/registry.py +2733 -0
  88. package/src/ummaya/tools/documents/render.py +978 -0
  89. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  90. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  91. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  92. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  93. package/src/ummaya/tools/documents/reread.py +157 -0
  94. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  95. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  96. package/src/ummaya/tools/documents/scorecard.py +184 -0
  97. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  98. package/src/ummaya/tools/documents/style.py +48 -0
  99. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  100. package/src/ummaya/tools/documents/validate.py +347 -0
  101. package/src/ummaya/tools/executor.py +61 -12
  102. package/src/ummaya/tools/geocoding/kakao_client.py +1 -2
  103. package/src/ummaya/tools/kma/apihub_catalog.py +984 -1
  104. package/src/ummaya/tools/kma/apihub_structured_adapter.py +86 -6
  105. package/src/ummaya/tools/kma/apihub_url_adapter.py +593 -0
  106. package/src/ummaya/tools/kma/apihub_url_catalog.py +296 -0
  107. package/src/ummaya/tools/live_proxy.py +0 -3
  108. package/src/ummaya/tools/location_adapters.py +8 -6
  109. package/src/ummaya/tools/manifest_metadata.py +16 -3
  110. package/src/ummaya/tools/models.py +5 -1
  111. package/src/ummaya/tools/mvp_surface.py +2 -2
  112. package/src/ummaya/tools/nmc/emergency_search.py +8 -6
  113. package/src/ummaya/tools/register_all.py +17 -0
  114. package/src/ummaya/tools/registry.py +10 -1
  115. package/src/ummaya/tools/resolve_location.py +4 -4
  116. package/src/ummaya/tools/routing/__init__.py +59 -0
  117. package/src/ummaya/tools/routing/builder.py +105 -0
  118. package/src/ummaya/tools/routing/cards.py +29 -0
  119. package/src/ummaya/tools/routing/decision_service.py +534 -0
  120. package/src/ummaya/tools/routing/decision_types.py +74 -0
  121. package/src/ummaya/tools/routing/feasibility.py +122 -0
  122. package/src/ummaya/tools/routing/intent.py +17 -0
  123. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  124. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  125. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  126. package/src/ummaya/tools/routing/intent_types.py +48 -0
  127. package/src/ummaya/tools/routing/lint.py +78 -0
  128. package/src/ummaya/tools/routing/metadata.py +174 -0
  129. package/src/ummaya/tools/routing/projection.py +340 -0
  130. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  131. package/src/ummaya/tools/routing/schema.py +81 -0
  132. package/src/ummaya/tools/routing/types.py +96 -0
  133. package/src/ummaya/tools/routing_index.py +2 -2
  134. package/src/ummaya/tools/search.py +40 -106
  135. package/src/ummaya/tools/verified_data_go_kr/_manifest.py +115 -25
  136. package/src/ummaya/tools/verified_data_go_kr/airkorea_air_quality.py +109 -4
  137. package/src/ummaya/tools/verified_data_go_kr/nmc_aed_site.py +108 -2
  138. package/src/ummaya/tools/verified_data_go_kr/pps_bid_public_info.py +174 -9
  139. package/src/ummaya/tools/verified_data_go_kr/tago_bus_arrival.py +66 -3
  140. package/src/ummaya/tools/verified_data_go_kr/tago_bus_location.py +12 -2
  141. package/src/ummaya/tools/verified_data_go_kr/tago_bus_route.py +8 -2
  142. package/src/ummaya/tools/verified_data_go_kr/tago_bus_route_station.py +114 -0
  143. package/src/ummaya/tools/verified_data_go_kr/tago_bus_station.py +14 -3
  144. package/src/ummaya/tools/verify_canonical_map.py +21 -0
  145. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  146. package/tui/package.json +1 -2
  147. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  148. package/tui/src/QueryEngine.ts +12 -4
  149. package/tui/src/bridge/inboundAttachments.ts +3 -3
  150. package/tui/src/cli/handlers/auth.ts +4 -13
  151. package/tui/src/cli/handlers/mcp.tsx +3 -3
  152. package/tui/src/cli/print.ts +69 -18
  153. package/tui/src/cli/update.ts +13 -13
  154. package/tui/src/commands/copy/index.ts +1 -1
  155. package/tui/src/commands/cost/cost.ts +2 -2
  156. package/tui/src/commands/init-verifiers.ts +5 -5
  157. package/tui/src/commands/init.ts +30 -30
  158. package/tui/src/commands/insights.ts +44 -44
  159. package/tui/src/commands/install-github-app/install-github-app.tsx +2 -2
  160. package/tui/src/commands/install-github-app/setupGitHubActions.ts +3 -3
  161. package/tui/src/commands/install-github-app/types.ts +8 -30
  162. package/tui/src/commands/install.tsx +5 -5
  163. package/tui/src/commands/mcp/addCommand.ts +5 -5
  164. package/tui/src/commands/mcp/xaaIdpCommand.ts +2 -2
  165. package/tui/src/commands/plugin/ManageMarketplaces.tsx +2 -2
  166. package/tui/src/commands/plugin/types.ts +6 -28
  167. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  168. package/tui/src/commands/reasoning/index.ts +13 -0
  169. package/tui/src/commands/reasoning/reasoning.tsx +177 -0
  170. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  171. package/tui/src/commands/thinkback/thinkback.tsx +3 -3
  172. package/tui/src/commands.ts +2 -0
  173. package/tui/src/components/Feedback.tsx +1 -1
  174. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  175. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  176. package/tui/src/components/Messages.tsx +2 -1
  177. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  178. package/tui/src/components/Spinner/types.ts +6 -28
  179. package/tui/src/components/Spinner.tsx +2 -2
  180. package/tui/src/components/agents/generateAgent.ts +1 -1
  181. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  182. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  183. package/tui/src/components/design-system/LoadingState.tsx +2 -2
  184. package/tui/src/components/mcp/types.ts +16 -38
  185. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  186. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  187. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  188. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  189. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  190. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  191. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  192. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  193. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  194. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  195. package/tui/src/components/primitive/index.tsx +43 -1
  196. package/tui/src/components/primitive/types.ts +137 -0
  197. package/tui/src/components/ui/option.ts +4 -26
  198. package/tui/src/constants/common.ts +0 -2
  199. package/tui/src/constants/prompts.ts +4 -3
  200. package/tui/src/constants/querySource.ts +4 -26
  201. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  202. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  203. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  204. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  205. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  206. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  207. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  208. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  209. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  210. package/tui/src/ink/ink.tsx +33 -14
  211. package/tui/src/ink/reconciler.ts +2 -3
  212. package/tui/src/ink/render-to-screen.ts +30 -10
  213. package/tui/src/ipc/bridge.ts +62 -15
  214. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  215. package/tui/src/ipc/codec.ts +29 -3
  216. package/tui/src/ipc/frames.generated.ts +407 -312
  217. package/tui/src/ipc/llmClient.ts +279 -76
  218. package/tui/src/ipc/llmTypes.ts +16 -1
  219. package/tui/src/ipc/schema/frame.schema.json +1 -3475
  220. package/tui/src/keybindings/defaultBindings.ts +4 -0
  221. package/tui/src/main.tsx +32 -11
  222. package/tui/src/native-ts/file-index/index.ts +33 -3
  223. package/tui/src/observability/surface.ts +2 -2
  224. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  225. package/tui/src/projectOnboardingState.ts +7 -6
  226. package/tui/src/query/chatMessageTypes.ts +18 -0
  227. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  228. package/tui/src/query/deps.ts +1 -1
  229. package/tui/src/query/messageGuards.ts +106 -0
  230. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  231. package/tui/src/query/run.ts +1075 -0
  232. package/tui/src/query/supportBoundary.ts +168 -0
  233. package/tui/src/query/toolResultErrors.ts +103 -0
  234. package/tui/src/query/toolRunner.ts +687 -0
  235. package/tui/src/query/unavailableToolRepair.ts +118 -0
  236. package/tui/src/query.ts +9 -1721
  237. package/tui/src/screens/REPL.tsx +42 -31
  238. package/tui/src/services/api/adapterManifest.ts +4 -0
  239. package/tui/src/services/api/backendChat/events.ts +117 -0
  240. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  241. package/tui/src/services/api/backendChat/frame.ts +9 -0
  242. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  243. package/tui/src/services/api/backendChat/types.ts +62 -0
  244. package/tui/src/services/api/backendChat.ts +1 -0
  245. package/tui/src/services/api/client.ts +98 -14
  246. package/tui/src/services/api/errorUtils.ts +5 -5
  247. package/tui/src/services/api/errors.ts +1 -1
  248. package/tui/src/services/api/logging.ts +1 -1
  249. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  250. package/tui/src/services/api/ummaya/messages.ts +255 -0
  251. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  252. package/tui/src/services/api/ummaya/provider.ts +200 -0
  253. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  254. package/tui/src/services/api/ummaya/request.ts +200 -0
  255. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  256. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  257. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  258. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  259. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  260. package/tui/src/services/api/ummaya/types.ts +110 -0
  261. package/tui/src/services/api/ummaya/usage.ts +30 -0
  262. package/tui/src/services/api/ummaya.ts +26 -364
  263. package/tui/src/services/api/withRetry.ts +1 -1
  264. package/tui/src/services/awaySummary.ts +2 -2
  265. package/tui/src/services/claudeAiLimits.ts +1 -1
  266. package/tui/src/services/compact/autoCompact.ts +1 -1
  267. package/tui/src/services/compact/compact.ts +1 -1
  268. package/tui/src/services/lsp/types.ts +8 -30
  269. package/tui/src/services/tips/types.ts +6 -28
  270. package/tui/src/services/tokenEstimation.ts +1 -1
  271. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  272. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  273. package/tui/src/services/tools/toolExecution.ts +94 -1
  274. package/tui/src/skills/bundled/stuck.ts +12 -12
  275. package/tui/src/state/AppStateStore.ts +7 -0
  276. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  277. package/tui/src/store/session-store.ts +10 -36
  278. package/tui/src/stubs/any-stub.ts +15 -10
  279. package/tui/src/stubs/color-diff-napi.ts +37 -23
  280. package/tui/src/stubs/globals.d.ts +3 -3
  281. package/tui/src/stubs/macro-preload.ts +23 -12
  282. package/tui/src/tools/AdapterTool/AdapterTool.ts +1239 -163
  283. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  284. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  285. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  286. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  287. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  288. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  289. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  290. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  291. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  292. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  293. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  294. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  295. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  296. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  297. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  298. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  299. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  300. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  301. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  302. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  303. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  304. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  305. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  306. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  307. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  308. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  309. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  310. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  311. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  312. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  313. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  314. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  315. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  316. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  317. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  318. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  319. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  320. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  321. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  322. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  323. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  324. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  325. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  326. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  327. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  328. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  329. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  330. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  331. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  332. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  333. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  334. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  335. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  336. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  337. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  338. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  339. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  340. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  341. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  342. package/tui/src/tools/BashTool/call.ts +202 -0
  343. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  344. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  345. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  346. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  347. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  348. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  349. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  350. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  351. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  352. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  353. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  354. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  355. package/tui/src/tools/BashTool/schemas.ts +65 -0
  356. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  357. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  358. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  359. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  360. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  361. package/tui/src/tools/BriefTool/upload.ts +1 -1
  362. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  363. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  364. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  365. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  366. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  367. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  368. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  369. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  370. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  371. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  372. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  373. package/tui/src/tools/FileEditTool/call.ts +228 -0
  374. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  375. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  376. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  377. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  378. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  379. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  380. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +48 -29
  381. package/tui/src/tools/LookupPrimitive/prompt.ts +6 -7
  382. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  383. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  384. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  385. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  386. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  387. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  388. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  389. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  390. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  391. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  392. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  393. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  394. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  395. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  396. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  397. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  398. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  399. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  400. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  401. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  402. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  403. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  404. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +30 -19
  405. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  406. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  407. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +51 -18
  408. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  409. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  410. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  411. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  412. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  413. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  414. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  415. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  416. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  417. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  418. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  419. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  420. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  421. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  422. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  423. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  424. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  425. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  426. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  427. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  428. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  429. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  430. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  431. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  432. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  433. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +27 -10
  434. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  435. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  436. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  437. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  438. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  439. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  440. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  441. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  442. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  443. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  444. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  445. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  446. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  447. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  448. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  449. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  450. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  451. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  452. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  453. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  454. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  455. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  456. package/tui/src/tools/_shared/citizenUserText.ts +49 -0
  457. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  458. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  459. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  460. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  461. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  462. package/tui/src/tools/_shared/locationInputRepair.ts +112 -0
  463. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  464. package/tui/src/tools/_shared/rootPrimitiveInput.ts +68 -0
  465. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  466. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  467. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  468. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  469. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  470. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  471. package/tui/src/tools/_shared/toolChoiceRepair.ts +61 -0
  472. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  473. package/tui/src/tools.ts +39 -190
  474. package/tui/src/types/fileSuggestion.ts +4 -26
  475. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  476. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  477. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  478. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  479. package/tui/src/types/message.ts +80 -102
  480. package/tui/src/types/messageQueueTypes.ts +6 -28
  481. package/tui/src/types/notebook.ts +16 -38
  482. package/tui/src/types/statusLine.ts +4 -26
  483. package/tui/src/types/tools.ts +24 -46
  484. package/tui/src/types/utils.ts +6 -28
  485. package/tui/src/upstreamproxy/relay.ts +7 -3
  486. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  487. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  488. package/tui/src/utils/attachments.ts +1 -1
  489. package/tui/src/utils/auth.ts +129 -139
  490. package/tui/src/utils/bash/ast.ts +23 -23
  491. package/tui/src/utils/bash/bashParser.ts +5 -5
  492. package/tui/src/utils/billing.ts +1 -1
  493. package/tui/src/utils/collapseReadSearch.ts +3 -3
  494. package/tui/src/utils/cronTasks.ts +1 -1
  495. package/tui/src/utils/execFileNoThrow.ts +1 -1
  496. package/tui/src/utils/filePersistence/types.ts +16 -38
  497. package/tui/src/utils/forkedAgent.ts +1 -1
  498. package/tui/src/utils/gracefulShutdown.ts +4 -4
  499. package/tui/src/utils/heapDumpService.ts +12 -8
  500. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  501. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  502. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  503. package/tui/src/utils/kExaoneReasoning.ts +138 -0
  504. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  505. package/tui/src/utils/messages.ts +19 -0
  506. package/tui/src/utils/migrateSessions.ts +3 -3
  507. package/tui/src/utils/model/model.ts +6 -6
  508. package/tui/src/utils/multiToolLayout.ts +13 -0
  509. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  510. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  511. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  512. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  513. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  514. package/tui/src/utils/processUserInput/processSlashCommand.tsx +2 -2
  515. package/tui/src/utils/processUserInput/processUserInput.ts +26 -0
  516. package/tui/src/utils/protectedNamespace.ts +5 -3
  517. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  518. package/tui/src/utils/ripgrep.ts +16 -7
  519. package/tui/src/utils/sessionTitle.ts +1 -1
  520. package/tui/src/utils/settings/applySettingsChange.ts +4 -0
  521. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  522. package/tui/src/utils/settings/types.ts +9 -3
  523. package/tui/src/utils/shell/prefix.ts +1 -1
  524. package/tui/src/utils/sideQuery.ts +1 -1
  525. package/tui/src/utils/stats.ts +1 -1
  526. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  527. package/tui/src/utils/teleport.tsx +1 -1
  528. package/uv.lock +394 -22
  529. package/assets/copilot-gate-logo.svg +0 -58
  530. package/assets/govon-logo.svg +0 -40
  531. package/src/ummaya/eval/__init__.py +0 -5
  532. package/src/ummaya/eval/retrieval.py +0 -713
  533. package/tui/src/services/api/claude.ts +0 -3510
  534. package/tui/src/utils/messageStream.ts +0 -186
@@ -0,0 +1,96 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Final, Literal
6
+
7
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
8
+
9
+ from ummaya.tools.models import MockFidelityGrade
10
+
11
+ PrimitiveFamily = Literal["find", "locate", "send", "check", "document"]
12
+ SourceMode = Literal["live", "mock", "internal"]
13
+ SideEffectLevel = Literal["read_only", "login", "action", "sign", "send", "verify"]
14
+
15
+ LEGACY_ALIASES: Final[dict[PrimitiveFamily, tuple[str, ...]]] = {
16
+ "find": ("lookup",),
17
+ "locate": ("resolve_location",),
18
+ "send": ("submit",),
19
+ "check": ("verify",),
20
+ "document": (),
21
+ }
22
+
23
+ INTENT_VERBS: Final[dict[PrimitiveFamily, tuple[str, ...]]] = {
24
+ "find": ("find", "search", "lookup"),
25
+ "locate": ("locate", "geocode", "resolve_location"),
26
+ "send": ("send", "submit"),
27
+ "check": ("check", "verify"),
28
+ "document": ("inspect", "fill", "validate"),
29
+ }
30
+
31
+ RAW_SCHEMA_MARKERS: Final[tuple[str, ...]] = (
32
+ "{",
33
+ "$defs",
34
+ '"properties"',
35
+ "'properties'",
36
+ "input_schema_json",
37
+ "output_schema_json",
38
+ )
39
+
40
+
41
+ class AdapterCardError(ValueError):
42
+ pass
43
+
44
+
45
+ class SchemaFieldSummary(BaseModel):
46
+ model_config = ConfigDict(frozen=True, extra="forbid")
47
+
48
+ name: str = Field(min_length=1)
49
+ type: str = Field(min_length=1)
50
+ required: bool
51
+ description: str | None = None
52
+
53
+
54
+ class AdapterCard(BaseModel):
55
+ model_config = ConfigDict(frozen=True, extra="forbid")
56
+
57
+ tool_id: str = Field(min_length=1)
58
+ primitive_family: PrimitiveFamily
59
+ legacy_primitive_aliases: tuple[str, ...]
60
+ domain: str = Field(min_length=1)
61
+ agency: str = Field(min_length=1)
62
+ source_mode: SourceMode
63
+ capabilities: tuple[str, ...]
64
+ intent_verbs: tuple[str, ...]
65
+ entity_types: tuple[str, ...]
66
+ required_slots: tuple[str, ...]
67
+ optional_slots: tuple[str, ...]
68
+ prerequisite_tools: tuple[str, ...]
69
+ input_schema_hash: str
70
+ input_schema_summary: tuple[SchemaFieldSummary, ...]
71
+ output_schema_summary: tuple[SchemaFieldSummary, ...]
72
+ policy_authority_url: str | None
73
+ safety_annotations: tuple[str, ...]
74
+ side_effect_level: SideEffectLevel
75
+ credential_requirements: tuple[str, ...]
76
+ mock_fidelity_grade: MockFidelityGrade
77
+ examples_ko: tuple[str, ...]
78
+ examples_en: tuple[str, ...]
79
+ negative_examples: tuple[str, ...]
80
+ limitations: tuple[str, ...]
81
+ manifest_hash: str
82
+ routing_text: str = Field(min_length=1, max_length=4096)
83
+
84
+ @field_validator("input_schema_hash", "manifest_hash")
85
+ @classmethod
86
+ def _validate_sha256(cls, value: str) -> str:
87
+ if len(value) != 64 or any(ch not in "0123456789abcdef" for ch in value):
88
+ raise ValueError("hash fields must be lowercase SHA-256 hex")
89
+ return value
90
+
91
+
92
+ class AdapterCardQualityViolation(BaseModel):
93
+ model_config = ConfigDict(frozen=True, extra="forbid")
94
+
95
+ code: str = Field(min_length=1)
96
+ message: str = Field(min_length=1)
@@ -17,14 +17,14 @@ from pydantic import BaseModel, ConfigDict
17
17
  from ummaya.tools.models import GovAPITool
18
18
 
19
19
  # Primitive literal type — the closed set enforced by invariant 1.
20
- _PrimitiveT = Literal["find", "locate", "send", "check"]
20
+ _PrimitiveT = Literal["find", "locate", "send", "check", "document"]
21
21
 
22
22
 
23
23
  class RoutingIndex(BaseModel):
24
24
  model_config = ConfigDict(frozen=True, arbitrary_types_allowed=True)
25
25
 
26
26
  by_primitive: dict[
27
- Literal["find", "locate", "send", "check"],
27
+ Literal["find", "locate", "send", "check", "document"],
28
28
  tuple[GovAPITool, ...],
29
29
  ]
30
30
  by_tool_id: dict[str, GovAPITool]
@@ -15,7 +15,6 @@ Public API (for external callers):
15
15
  from __future__ import annotations
16
16
 
17
17
  import logging
18
- import re
19
18
  from typing import TYPE_CHECKING
20
19
 
21
20
  from ummaya.tools.bm25_index import BM25Index
@@ -26,6 +25,19 @@ from ummaya.tools.models import (
26
25
  SearchToolsOutput,
27
26
  ToolSearchResult,
28
27
  )
28
+ from ummaya.tools.routing.intent import ToolSelectionIntent, extract_tool_selection_intent
29
+ from ummaya.tools.routing.retrieval_policy import (
30
+ expand_query_for_adapter_retrieval as _policy_expand_query_for_adapter_retrieval,
31
+ )
32
+ from ummaya.tools.routing.retrieval_policy import (
33
+ expand_query_for_intent as _policy_expand_query_for_intent,
34
+ )
35
+ from ummaya.tools.routing.retrieval_policy import (
36
+ filter_special_case_scores as _policy_filter_special_case_scores,
37
+ )
38
+ from ummaya.tools.routing.retrieval_policy import (
39
+ is_document_harness_query as _policy_is_document_harness_query,
40
+ )
29
41
 
30
42
  if TYPE_CHECKING:
31
43
  from ummaya.tools.registry import ToolRegistry
@@ -33,59 +45,22 @@ if TYPE_CHECKING:
33
45
  logger = logging.getLogger(__name__)
34
46
 
35
47
 
36
- _POI_LOCATION_RE = re.compile(
37
- r"(근처|주변|인근|가까운|역|터미널|공항|캠퍼스|대학교|대학|해수욕장|시장|공원|랜드마크)"
38
- )
39
- _ADMIN_LOCATION_RE = re.compile(
40
- r"(?:[가-힣]{2,}(?:시|군|구|동|읍|면)\b|[가-힣0-9]{2,}(?<!으)(?:로|길)\b)"
41
- )
42
- _EMERGENCY_RE = re.compile(r"(응급|응급실|응급의료|\bemergency\b|\ber\b)", re.IGNORECASE)
43
- _TRAFFIC_HAZARD_RE = re.compile(
44
- r"(교통사고|사고\s*위험|사고다발|위험\s*(?:구간|도로|지점)|어린이보호구역|보호구역|"
45
- r"도로\s*구간|accident|hazard|hotspot)",
46
- re.IGNORECASE,
47
- )
48
- _TRAFFIC_HAZARD_SPECIFIC_RE = re.compile(
49
- r"(사고\s*위험|위험\s*(?:구간|도로|지점)|어린이보호구역|보호구역|스쿨존|"
50
- r"도로\s*구간|행정동코드|adm_cd|hazard|hotspot)",
51
- re.IGNORECASE,
52
- )
48
+ def is_document_harness_query(query: str) -> bool:
49
+ return _policy_is_document_harness_query(query)
53
50
 
54
51
 
55
52
  def _expand_query_for_adapter_retrieval(query: str) -> str:
56
- """Add domain-neutral retrieval hints that Korean spacing can hide.
57
-
58
- The retriever indexes adapter search hints, not a Korean morphological
59
- parse. A station query such as "하단역 근처 응급실" contains a POI suffix,
60
- but does not literally contain the "키워드/POI/랜드마크" terms in
61
- ``kakao_keyword_search``. Expanding only the retrieval query keeps the
62
- adapter contract unchanged while letting the concrete locate adapter stay
63
- visible to the model.
64
- """
65
- additions: list[str] = []
66
- if _POI_LOCATION_RE.search(query):
67
- additions.extend(["장소", "키워드", "POI", "랜드마크", "역", "keyword"])
68
- if _ADMIN_LOCATION_RE.search(query):
69
- additions.extend(["주소", "행정동", "법정동", "도로명", "지번", "address"])
70
- if _EMERGENCY_RE.search(query):
71
- additions.extend(["응급실", "응급의료", "NMC", "emergency"])
72
- if _TRAFFIC_HAZARD_RE.search(query):
73
- additions.extend(
74
- [
75
- "교통사고",
76
- "사고다발구역",
77
- "위험지점",
78
- "도로위험구역",
79
- "어린이보호구역",
80
- "행정동코드",
81
- "KOROAD",
82
- "accident",
83
- "hazard",
84
- ]
85
- )
86
- if not additions:
87
- return query
88
- return f"{query} {' '.join(additions)}"
53
+ return _policy_expand_query_for_adapter_retrieval(query)
54
+
55
+
56
+ def _expand_query_for_intent(query: str, intent: ToolSelectionIntent) -> str:
57
+ return _policy_expand_query_for_intent(query, intent)
58
+
59
+
60
+ def _filter_special_case_scores(
61
+ intent: ToolSelectionIntent, scored: list[tuple[str, float]]
62
+ ) -> list[tuple[str, float]]:
63
+ return _policy_filter_special_case_scores(intent, scored)
89
64
 
90
65
 
91
66
  def search(
@@ -126,69 +101,28 @@ def search(
126
101
  if registry_size == 0:
127
102
  return []
128
103
 
129
- retriever = registry._retriever
130
- try:
131
- scored = retriever.score(_expand_query_for_adapter_retrieval(query))
132
- except Exception as exc:
133
- # FR-002 fail-open: a mid-session retriever failure (dense OOM,
134
- # tokenizer crash, encoder corruption) must not surface as a 5xx
135
- # on the citizen path. The Retriever protocol does not forbid
136
- # score() from raising, so this is the last defensive boundary
137
- # before the public ``lookup`` contract. Try the retriever's BM25
138
- # companion (present on ``_DenseFailOpenWrapper`` and
139
- # ``HybridBackend``) before falling back to an empty ranking so
140
- # citizens still see lexical matches when the dense path crashes
141
- # outside its own catch-blocks.
142
- logger.warning(
143
- "search: retriever.score failed (%s: %s) — attempting BM25 companion fallback",
144
- type(exc).__name__,
145
- exc,
146
- )
147
- bm25_companion = getattr(retriever, "_bm25", None)
148
- if bm25_companion is None:
149
- logger.warning(
150
- "search: no BM25 companion on retriever %s — returning empty ranking",
151
- type(retriever).__name__,
152
- )
153
- return []
154
- try:
155
- scored = bm25_companion.score(_expand_query_for_adapter_retrieval(query))
156
- except Exception as bm25_exc:
157
- logger.warning(
158
- "search: BM25 companion also failed (%s: %s) — returning empty ranking",
159
- type(bm25_exc).__name__,
160
- bm25_exc,
161
- )
162
- return []
163
-
164
- if _TRAFFIC_HAZARD_SPECIFIC_RE.search(query):
165
- scored = [
166
- (tool_id, score) for tool_id, score in scored if tool_id != "koroad_accident_search"
167
- ]
168
-
169
- # Enforce the deterministic tie-break once, here. Backend-internal
170
- # orderings are not trusted (HybridBackend returns unordered union).
171
- scored = sorted(scored, key=lambda pair: (-pair[1], pair[0]))
172
-
173
- # Derive the backend label from the active retriever. Prefer the
174
- # explicit ``_requested_backend_label`` attribute (set on wrappers
175
- # like ``_DenseFailOpenWrapper`` that report a logical backend name
176
- # distinct from their Python class name) so ``why_matched`` reflects
177
- # the operator's configured backend, not an internal wrapper type.
178
- backend_label = getattr(
179
- retriever,
180
- "_requested_backend_label",
181
- type(retriever).__name__.removesuffix("Backend").lower() or "retrieval",
104
+ intent = extract_tool_selection_intent(query, known_tool_ids=registry._tools.keys())
105
+
106
+ from ummaya.tools.routing.decision_service import RouteDecisionService
107
+
108
+ decision = RouteDecisionService(registry).select_adapters(
109
+ query,
110
+ top_k=effective_top_k,
111
+ max_selected=effective_top_k,
112
+ intent=intent,
113
+ drop_zero_score_candidates=False,
182
114
  )
183
115
 
184
116
  results: list[AdapterCandidate] = []
185
- for tool_id, score in scored[:effective_top_k]:
117
+ for route_candidate in decision.candidate_set:
118
+ tool_id = route_candidate.tool_id
186
119
  try:
187
120
  tool = registry.find(tool_id)
188
121
  except Exception: # pragma: no cover
189
122
  logger.warning("search: tool %r in retriever but not in registry", tool_id)
190
123
  continue
191
124
 
125
+ score = route_candidate.retrieval_score
192
126
  input_schema_json, required_params = _input_schema_export(tool)
193
127
  output_schema_json = _output_schema_export(tool)
194
128
  candidate = AdapterCandidate(
@@ -196,7 +130,7 @@ def search(
196
130
  score=max(0.0, float(score)),
197
131
  required_params=required_params,
198
132
  search_hint=tool.search_hint,
199
- why_matched=f"{backend_label} score {score:.4f} on search_hint",
133
+ why_matched=f"{decision.backend_label} score {score:.4f} on search_hint",
200
134
  input_schema_json=input_schema_json,
201
135
  output_schema_json=output_schema_json,
202
136
  llm_description=tool.llm_description,
@@ -8,6 +8,7 @@ from datetime import UTC, datetime
8
8
  from ummaya.tools.verified_data_go_kr._models import VerifiedAdapterSpec
9
9
 
10
10
  _LAST_VERIFIED = datetime(2026, 5, 16, tzinfo=UTC)
11
+ _LAST_VERIFIED_2026_05_28 = datetime(2026, 5, 28, tzinfo=UTC)
11
12
  _DATA_GO_KR_KEY = "UMMAYA_DATA_GO_KR_API_KEY"
12
13
 
13
14
 
@@ -67,9 +68,14 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
67
68
  policy_url=_data_go_policy("15073861"),
68
69
  policy_text="공공데이터포털 인증키 기반 한국환경공단 에어코리아 대기오염정보 조회 OpenAPI.",
69
70
  last_verified=_LAST_VERIFIED,
70
- search_hint="15073861 AirKorea 에어코리아 대기오염 시도별 대기질 미세먼지 find",
71
+ search_hint=(
72
+ "15073861 AirKorea 에어코리아 대기오염 시도별 대기질 미세먼지 "
73
+ "sidoName 서울 부산 경기 find"
74
+ ),
71
75
  llm_description=(
72
- "시도명(sido_name)으로 에어코리아 시도별 실시간 측정소 대기질 공개 데이터를 조회한다."
76
+ "짧은 시도명(sido_name: 서울, 부산, 경기 등)으로 에어코리아 시도별 "
77
+ "실시간 측정소 대기질 공개 데이터를 조회한다. 부산광역시처럼 긴 행정명은 "
78
+ "AirKorea 계약상 부산으로 줄여 호출한다."
73
79
  ),
74
80
  trigger_examples=["서울 대기질 측정소 데이터 조회해줘"],
75
81
  ),
@@ -148,7 +154,9 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
148
154
  last_verified=_LAST_VERIFIED,
149
155
  search_hint="15098529 TAGO 버스노선 cityCode routeNo bus route find",
150
156
  llm_description=(
151
- "도시코드(city_code)와 노선번호(route_no)로 TAGO 버스노선 공개 데이터를 조회한다."
157
+ "Search official TAGO bus route data by city_code and citizen-visible "
158
+ "route_no. Use this before tago_bus_location_search when route_id is "
159
+ "unknown."
152
160
  ),
153
161
  ),
154
162
  VerifiedAdapterSpec(
@@ -172,9 +180,44 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
172
180
  policy_url=_data_go_policy("15098530"),
173
181
  policy_text="공공데이터포털 인증키 기반 국토교통부 TAGO 버스도착정보 조회 OpenAPI.",
174
182
  last_verified=_LAST_VERIFIED,
175
- search_hint="15098530 TAGO 버스도착 정류소 nodeId arrival bus find",
183
+ search_hint="15098530 TAGO 버스도착 정류소 nodeId routeno routeid arrival bus find",
176
184
  llm_description=(
177
- "도시코드(city_code)와 정류소 ID(node_id)로 TAGO 버스도착 예정 정보를 조회한다."
185
+ "Search official TAGO bus-arrival predictions by city_code and node_id. "
186
+ "If the citizen gives a stop name such as 부산역 instead of node_id, call "
187
+ "tago_bus_station_search first and reuse its nodeid. If the citizen names "
188
+ "a route such as 1001, pass route_no as an optional client-side filter "
189
+ "against the returned TAGO routeno field; use route_id from "
190
+ "tago_bus_route_search when the route number is ambiguous."
191
+ ),
192
+ ),
193
+ VerifiedAdapterSpec(
194
+ dataset_id="15098529",
195
+ tool_id="tago_bus_route_station_search",
196
+ module_name="tago_bus_route_station",
197
+ name_ko="국토교통부 TAGO 노선별 경유정류소 조회",
198
+ ministry="MOLIT",
199
+ category=["transport", "bus", "public-data"],
200
+ endpoint="https://apis.data.go.kr/1613000/BusRouteInfoInqireService/getRouteAcctoThrghSttnList",
201
+ env_var=_DATA_GO_KR_KEY,
202
+ auth_query_param="serviceKey",
203
+ response_format="xml",
204
+ query_param_map={
205
+ "city_code": "cityCode",
206
+ "route_id": "routeId",
207
+ "page_no": "pageNo",
208
+ "num_of_rows": "numOfRows",
209
+ },
210
+ evidence_path="docs/api/data-go-kr-candidate-docs/15098529/probes/live-2026-05-28/tago-bus-route-station.body.xml",
211
+ policy_url=_data_go_policy("15098529"),
212
+ policy_text="공공데이터포털 인증키 기반 국토교통부 TAGO 버스노선정보 조회 OpenAPI.",
213
+ last_verified=_LAST_VERIFIED_2026_05_28,
214
+ search_hint=("15098529 TAGO 노선별 경유정류소 routeId nodenm nodeid nodeord bus stop find"),
215
+ llm_description=(
216
+ "Search the official TAGO route-station list by city_code and route_id. "
217
+ "For a citizen query that combines a route number and place, call "
218
+ "tago_bus_route_search to get route_id, then call this tool with node_nm "
219
+ "as a client-side filter against returned nodenm values. Use the matching "
220
+ "nodeid with tago_bus_arrival_search and include route_no or route_id."
178
221
  ),
179
222
  ),
180
223
  VerifiedAdapterSpec(
@@ -199,7 +242,10 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
199
242
  policy_text="공공데이터포털 인증키 기반 국토교통부 TAGO 버스위치정보 조회 OpenAPI.",
200
243
  last_verified=_LAST_VERIFIED,
201
244
  search_hint="15098533 TAGO 버스위치 routeId bus location find",
202
- llm_description="도시코드(city_code)와 노선 ID(route_id)로 TAGO 버스 위치 정보를 조회한다.",
245
+ llm_description=(
246
+ "Search official TAGO bus-location data by city_code and route_id. "
247
+ "Use tago_bus_route_search first when the citizen gives only a route number."
248
+ ),
203
249
  ),
204
250
  VerifiedAdapterSpec(
205
251
  dataset_id="15098534",
@@ -225,8 +271,9 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
225
271
  last_verified=_LAST_VERIFIED,
226
272
  search_hint="15098534 TAGO 버스정류소 nodeNm nodeNo station find",
227
273
  llm_description=(
228
- "도시코드(city_code), 정류소명(node_nm), "
229
- "정류소번호(node_no) TAGO 정류소 정보를 조회한다."
274
+ "Search official TAGO bus-stop data by city_code, stop-name fragment "
275
+ "(node_nm), or stop number (node_no). For bus-arrival questions with a "
276
+ "named place or stop, call this before tago_bus_arrival_search to obtain nodeid."
230
277
  ),
231
278
  ),
232
279
  VerifiedAdapterSpec(
@@ -264,27 +311,51 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
264
311
  name_ko="조달청 나라장터 입찰공고 조회",
265
312
  ministry="PPS",
266
313
  category=["procurement", "bid", "public-data"],
267
- endpoint="https://apis.data.go.kr/1230000/ad/BidPublicInfoService/getBidPblancListInfoServc",
314
+ endpoint="https://apis.data.go.kr/1230000/ad/BidPublicInfoService/getBidPblancListInfoCnstwkPPSSrch",
268
315
  env_var=_DATA_GO_KR_KEY,
269
316
  auth_query_param="serviceKey",
270
317
  response_format="json",
271
318
  query_param_map={
272
- "inqry_div": "inqryDiv",
273
- "bid_ntce_no": "bidNtceNo",
274
319
  "page_no": "pageNo",
275
320
  "num_of_rows": "numOfRows",
321
+ "inqry_div": "inqryDiv",
322
+ "inqry_bgn_dt": "inqryBgnDt",
323
+ "inqry_end_dt": "inqryEndDt",
324
+ "bid_ntce_nm": "bidNtceNm",
325
+ "ntce_instt_nm": "ntceInsttNm",
326
+ "dminstt_nm": "dminsttNm",
327
+ "prtcpt_lmt_rgn_nm": "prtcptLmtRgnNm",
328
+ "indstryty_nm": "indstrytyNm",
276
329
  },
277
330
  static_query_params={"type": "json"},
278
- evidence_path="docs/api/data-go-kr-candidate-docs/15129394/probes/live-2026-05-16/pps-bid-service.body.json",
331
+ evidence_path="docs/api/data-go-kr-candidate-docs/15129394/probes/live-2026-05-27/pps-bid-construction-search.body.json",
279
332
  policy_url=_data_go_policy("15129394"),
280
333
  policy_text="공공데이터포털 인증키 기반 조달청 나라장터 입찰공고정보 조회 OpenAPI.",
281
334
  last_verified=_LAST_VERIFIED,
282
- search_hint="15129394 조달청 나라장터 입찰공고 bid public info find",
283
- llm_description=(
284
- "조회구분 inqry_div='2'와 필수 입찰공고번호(bid_ntce_no)로 "
285
- "나라장터 입찰공고 공개 데이터를 조회한다. 등록일시/변경일시 "
286
- "목록 검색은 adapter가 아니라 별도 PPS operation으로 감싸야 한다."
335
+ search_hint=(
336
+ "15129394 조달청 나라장터 입찰공고 검색조건 공사조회 전기공사 부산시 "
337
+ "공고게시일시 개찰일시 inqryBgnDt inqryEndDt bidNtceNm ntceInsttNm "
338
+ "dminsttNm prtcptLmtRgnNm cnstrtsiteRgnNm region_name indstrytyNm "
339
+ "bid public procurement construction find"
287
340
  ),
341
+ llm_description=(
342
+ "Wraps official PPS operation getBidPblancListInfoCnstwkPPSSrch, "
343
+ "the construction-bid search-condition endpoint. Use it for ordinary "
344
+ "citizen list searches such as '이번 주 부산시 전기공사 입찰'. "
345
+ "Fill inqry_bgn_dt and inqry_end_dt as YYYYMMDDHHMM. Use inqry_div='1' "
346
+ "for posted-this-week questions and '2' for bid-opening-date questions. "
347
+ "Keep each upstream call within a 31-day-or-smaller date window; split "
348
+ "broader citizen ranges across multiple calls instead of sending one "
349
+ "over-broad request. "
350
+ "Use bid_ntce_nm for notice keywords such as 전기공사, prtcpt_lmt_rgn_nm "
351
+ "for official participation-limit region restrictions such as 부산광역시, "
352
+ "region_name for UMMAYA client-side filtering against documented PPS "
353
+ "response fields such as cnstrtsiteRgnNm/ntceInsttNm/dminsttNm, and "
354
+ "indstryty_nm for license/industry names such as 전기공사업. Do not "
355
+ "invent notice-number detail inputs for list-search questions; this "
356
+ "adapter no longer exposes the bid-notice-number detail path."
357
+ ),
358
+ trigger_examples=["이번 주 부산시 전기공사 입찰 올라온 거 있어?"],
288
359
  ),
289
360
  VerifiedAdapterSpec(
290
361
  dataset_id="15134761",
@@ -450,11 +521,14 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
450
521
  ),
451
522
  last_verified=_LAST_VERIFIED,
452
523
  search_hint=(
453
- "15001699 HIRA 의료기관 상세정보 응급실 주차 진료시간 ykiho hospital detail find"
524
+ "15001699 HIRA 의료기관 상세정보 병원 상세 진료과 진료과목 응급실 "
525
+ "주차 진료시간 ykiho hospital detail specialty find"
454
526
  ),
455
527
  llm_description=(
456
528
  "암호화 요양기호(ykiho)로 의료기관 세부정보와 "
457
- "응급실/주차/진료시간 공개 데이터를 조회한다."
529
+ "응급실/주차/진료시간/진료과목 공개 데이터를 조회한다. "
530
+ "일반 병원명·지역 검색에는 hira_hospital_search를 먼저 쓰고, "
531
+ "상세정보나 진료과목 확인에는 이 어댑터를 이어서 쓴다."
458
532
  ),
459
533
  ),
460
534
  VerifiedAdapterSpec(
@@ -478,9 +552,13 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
478
552
  policy_url=_data_go_policy("15155046"),
479
553
  policy_text="공공데이터포털 인증키 기반 행정안전부 안전비상벨 위치정보 조회 OpenAPI.",
480
554
  last_verified=_LAST_VERIFIED,
481
- search_hint="15155046 행안부 안전비상벨 위치 경찰연계 방범 emergency call box find",
555
+ search_hint=(
556
+ "15155046 행안부 안전비상벨 비상벨 긴급신고함 위치 경찰연계 "
557
+ "방범 emergency call box safety bell find"
558
+ ),
482
559
  llm_description=(
483
- "도로명주소 조각으로 안전비상벨 설치 위치와 관리기관 공개 데이터를 조회한다."
560
+ "도로명주소 조각으로 안전비상벨·비상벨·긴급신고함 설치 위치와 "
561
+ "관리기관 공개 데이터를 조회한다."
484
562
  ),
485
563
  ),
486
564
  VerifiedAdapterSpec(
@@ -525,10 +603,12 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
525
603
  policy_text="공공데이터포털 인증키 기반 계룡시 장애인 전동보장구 충전 장소 조회 OpenAPI.",
526
604
  last_verified=_LAST_VERIFIED,
527
605
  search_hint=(
528
- "15096040 계룡시 전동휠체어 전동보장구 충전 장소 실내 accessibility charger find"
606
+ "15096040 계룡시 전동휠체어 전동보장구 보장구 충전소 충전 장소 "
607
+ "장애인 실내 accessibility charger find"
529
608
  ),
530
609
  llm_description=(
531
- "계룡시 장애인 전동보장구 충전 장소, 위치, 이용 가능 시간 공개 데이터를 조회한다."
610
+ "계룡시 장애인 전동보장구·전동휠체어 충전소/충전 장소, "
611
+ "위치, 이용 가능 시간 공개 데이터를 조회한다."
532
612
  ),
533
613
  ),
534
614
  VerifiedAdapterSpec(
@@ -554,9 +634,19 @@ VERIFIED_DATA_GO_KR_ADAPTERS: tuple[VerifiedAdapterSpec, ...] = (
554
634
  "공공데이터포털 인증키 기반 국립중앙의료원 전국 자동심장충격기 정보 조회 OpenAPI."
555
635
  ),
556
636
  last_verified=_LAST_VERIFIED,
557
- search_hint="15000652 국립중앙의료원 AED 자동심장충격기 자동제세동기 위치 locate find",
637
+ search_hint=(
638
+ "15000652 국립중앙의료원 AED 자동심장충격기 자동제세동기 "
639
+ "응급실 주변 시도 시군구 q0 q1 find"
640
+ ),
558
641
  llm_description=(
559
- "시도(q0)와 시군구(q1)로 전국 AED 설치 위치와 이용 가능 시간 공개 데이터를 조회한다."
642
+ "시도(q0)와 시군구(q1)로 전국 AED 설치 위치와 이용 가능 시간 공개 데이터를 "
643
+ "조회한다. 시민이 '응급실이나 AED', '응급실/AED', '자동심장충격기'를 같이 "
644
+ "묻는 경우 nmc_emergency_search 결과만으로 AED를 답하지 말고, 이 find "
645
+ "어댑터를 별도 호출한다. q0/q1은 좌표가 아니라 공식 지역 필터다. "
646
+ "origin_lat/origin_lon은 업스트림 파라미터가 아니라 응답 WGS84 좌표를 "
647
+ "거리순으로 정렬하기 위한 선택 필드다. 예: "
648
+ "부산역 근처는 locate 후 부산광역시/동구 또는 중구 지역 필터로 본 도구를 "
649
+ "추가 조회한다."
560
650
  ),
561
651
  ),
562
652
  VerifiedAdapterSpec(