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,296 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """KMA APIHub non-structured URL operation catalog.
3
+
4
+ These endpoints are official KMA APIHub surfaces, but they are not
5
+ ``typ02/openApi`` operations and do not share the structured XML/JSON envelope.
6
+ Keep them in a separate catalog so text, image, and binary response contracts do
7
+ not contaminate the structured OpenAPI wrapper.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import re
13
+ from typing import Literal
14
+
15
+ from pydantic import BaseModel, ConfigDict
16
+
17
+ type KmaApiHubUrlScalar = str | int | float | bool | None
18
+ type KmaApiHubUrlApprovalState = Literal["approved", "approval_pending"]
19
+ type KmaApiHubUrlResponseKind = Literal["text", "image", "binary"]
20
+
21
+
22
+ class KmaApiHubUrlParam(BaseModel):
23
+ """Official request parameter metadata for one APIHub URL operation."""
24
+
25
+ model_config = ConfigDict(frozen=True)
26
+
27
+ name: str
28
+ field_name: str
29
+ required: bool = True
30
+ default: KmaApiHubUrlScalar = None
31
+ value_type: Literal["string", "integer", "number", "boolean"] = "string"
32
+ is_credential: bool = False
33
+
34
+
35
+ class KmaApiHubUrlOperation(BaseModel):
36
+ """One official non-structured KMA APIHub URL operation."""
37
+
38
+ model_config = ConfigDict(frozen=True)
39
+
40
+ operation_id: str
41
+ category_seq: int
42
+ category_name_ko: str
43
+ title_ko: str
44
+ endpoint_path: str
45
+ request_params: tuple[KmaApiHubUrlParam, ...]
46
+ response_kind: KmaApiHubUrlResponseKind
47
+ approval_state: KmaApiHubUrlApprovalState = "approval_pending"
48
+ purpose: str
49
+ selection_rule: str
50
+ search_keywords: str
51
+ official_page_url: str
52
+
53
+ @property
54
+ def tool_id(self) -> str:
55
+ """Return the stable UMMAYA tool id for this URL operation."""
56
+ return f"kma_apihub_url_{self.operation_id}"
57
+
58
+ @property
59
+ def non_credential_params(self) -> tuple[KmaApiHubUrlParam, ...]:
60
+ """Return request parameters that are safe for model/user input."""
61
+ return tuple(param for param in self.request_params if not param.is_credential)
62
+
63
+
64
+ def _snake(value: str) -> str:
65
+ value = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", value)
66
+ value = re.sub(r"[^A-Za-z0-9]+", "_", value)
67
+ return value.strip("_").lower()
68
+
69
+
70
+ def _value_type(value: KmaApiHubUrlScalar) -> Literal["string", "integer", "number", "boolean"]:
71
+ if isinstance(value, bool):
72
+ return "boolean"
73
+ if isinstance(value, int):
74
+ return "integer"
75
+ if isinstance(value, float):
76
+ return "number"
77
+ return "string"
78
+
79
+
80
+ def _param(
81
+ name: str,
82
+ default: KmaApiHubUrlScalar,
83
+ *,
84
+ required: bool = True,
85
+ value_type: Literal["string", "integer", "number", "boolean"] | None = None,
86
+ ) -> KmaApiHubUrlParam:
87
+ is_credential = name == "authKey"
88
+ return KmaApiHubUrlParam(
89
+ name=name,
90
+ field_name=_snake(name),
91
+ required=False if is_credential else required,
92
+ default=None if is_credential else default,
93
+ value_type=value_type or _value_type(default),
94
+ is_credential=is_credential,
95
+ )
96
+
97
+
98
+ KMA_APIHUB_URL_OPERATIONS: tuple[KmaApiHubUrlOperation, ...] = (
99
+ KmaApiHubUrlOperation(
100
+ operation_id="air_metar_decoded",
101
+ category_seq=14,
102
+ category_name_ko="항공기상",
103
+ title_ko="기상청 METAR 해독자료",
104
+ endpoint_path="/api/typ01/url/air_metar_dec.php",
105
+ request_params=(
106
+ _param("tm", None, required=False),
107
+ _param("org", "K"),
108
+ _param("help", 1),
109
+ _param("authKey", None, required=False),
110
+ ),
111
+ response_kind="text",
112
+ approval_state="approved",
113
+ purpose=(
114
+ "Fetch official KMA decoded METAR/SPECI aviation weather text. "
115
+ "This is the approved APIHub URL product for the Korean METAR "
116
+ "decoded-data channel."
117
+ ),
118
+ selection_rule=(
119
+ "Choose this for METAR decoded-data requests and as the primary "
120
+ "fallback when the structured AmmIwxxmService/getMetar endpoint "
121
+ "returns APIHub APPLICATION_ERROR. It returns KMA decoded text "
122
+ "for the requested time slot, not the structured IWXXM envelope. "
123
+ "The normalized summary identifies known airport stations: station "
124
+ "153 is Gimhae Airport / RKPK, station 110 is Gimpo Airport / RKSS. "
125
+ "Use decoded_records[].safe_weather only for weather values; never "
126
+ "derive values from raw_fields or raw_report. If a wind cardinal "
127
+ "label is needed, use safe_weather.wind.direction_from_cardinal_ko "
128
+ "or direction_from_cardinal_en; do not infer your own label from "
129
+ "degrees."
130
+ ),
131
+ search_keywords=(
132
+ "METAR SPECI 해독자료 항공기상전문 공항기상 항공 실황 "
133
+ "비행기 항공편 비행편 운항 이륙 착륙 결항 지연 시정 "
134
+ "air_metar_dec decoded aviation weather flight takeoff landing delay"
135
+ ),
136
+ official_page_url="https://apihub.kma.go.kr/apiList.do?seqApi=14",
137
+ ),
138
+ KmaApiHubUrlOperation(
139
+ operation_id="air_amos_minute",
140
+ category_seq=14,
141
+ category_name_ko="항공기상",
142
+ title_ko="기상청 AMOS 매분자료 조회",
143
+ endpoint_path="/api/typ01/url/amos.php",
144
+ request_params=(
145
+ _param("tm", None, required=False),
146
+ _param("dtm", 60),
147
+ _param("stn", None),
148
+ _param("help", 1),
149
+ _param("authKey", None, required=False),
150
+ ),
151
+ response_kind="text",
152
+ approval_state="approved",
153
+ purpose=(
154
+ "Fetch official AMOS minute observations for supported airports. "
155
+ "AMOS reports runway-area aviation weather such as visibility, RVR, "
156
+ "cloud height, temperature, humidity, pressure, rain, and wind."
157
+ ),
158
+ selection_rule=(
159
+ "Choose this for supported-airport runway-area current conditions or "
160
+ "AMOS requests. It covers official AMOS stations such as 110 Gimpo, "
161
+ "but the official APIHub station list does not include Gimhae. "
162
+ "Do not use AMOS for Gimhae; 182 is Jeju, not Gimhae. Use METAR "
163
+ "RKPK for Gimhae aviation weather."
164
+ ),
165
+ search_keywords=(
166
+ "AMOS 공항기상관측 매분자료 활주로 기상실황 김포공항 stn110 "
167
+ "비행기 항공편 운항 이륙 착륙 결항 지연 "
168
+ "airport runway minute observation visibility RVR wind flight delay"
169
+ ),
170
+ official_page_url=(
171
+ "https://apihub.kma.go.kr/apiList.do?apiMov=%EA%B8%B0%EC%83%81%EC%B2%AD+"
172
+ "AMOS+%EB%A7%A4%EB%B6%84%EC%9E%90%EB%A3%8C+%EC%A1%B0%ED%9A%8C&seqApi=14&seqApiSub=259"
173
+ ),
174
+ ),
175
+ KmaApiHubUrlOperation(
176
+ operation_id="high_resolution_grid_point",
177
+ category_seq=971,
178
+ category_name_ko="융합기상",
179
+ title_ko="고해상도 격자자료 특정지점 다중요소 조회",
180
+ endpoint_path="/api/typ01/url/sfc_nc_var.php",
181
+ request_params=(
182
+ _param("tm1", None, required=False),
183
+ _param("tm2", None, required=False),
184
+ _param("obs", "ta,td,hm,ws_10m,wd_10m,vs,rn_60m"),
185
+ _param("itv", 10),
186
+ _param("lon", None, value_type="number"),
187
+ _param("lat", None, value_type="number"),
188
+ _param("help", 1),
189
+ _param("authKey", None, required=False),
190
+ ),
191
+ response_kind="text",
192
+ approval_state="approved",
193
+ purpose=(
194
+ "Fetch KMA 500m high-resolution analyzed grid values for one "
195
+ "latitude/longitude point. The product applies objective analysis "
196
+ "to KMA and public-agency observations with terrain effects."
197
+ ),
198
+ selection_rule=(
199
+ "Choose this when a citizen asks for analyzed weather values at a "
200
+ "coordinate or when point observations are sparse. It complements, "
201
+ "not replaces, official airport METAR/AMOS for flight safety wording. "
202
+ "After locate returns coordinates, call this tool with lat/lon instead "
203
+ "of switching to current-observation or forecast adapters."
204
+ ),
205
+ search_keywords=(
206
+ "고해상도 격자자료 분석자료 객관분석 500m 특정지점 다중요소 "
207
+ "기온 습도 풍속 풍향 시정 objective analysis grid point lat lon 융합기상"
208
+ ),
209
+ official_page_url=(
210
+ "https://apihub.kma.go.kr/apiList.do?apiMov=1.+%EA%B3%A0%ED%95%B4%EC%83%81%EB%8F%84+"
211
+ "%EA%B2%A9%EC%9E%90%EC%9E%90%EB%A3%8C+%EC%A1%B0%ED%9A%8C%28%ED%95%B4%EC%83%81%EB%8F%84%3A+500m%29"
212
+ "&seqApi=971&seqApiSub=936"
213
+ ),
214
+ ),
215
+ KmaApiHubUrlOperation(
216
+ operation_id="aws_objective_analysis_grid",
217
+ category_seq=2,
218
+ category_name_ko="지상관측",
219
+ title_ko="AWS 객관분석 격자자료 조회",
220
+ endpoint_path="/api/typ01/cgi-bin/aws/nph-aws_min_obj",
221
+ request_params=(
222
+ _param("obs", "ta"),
223
+ _param("tm", None, required=False),
224
+ _param("obj", "mq"),
225
+ _param("map", "D3"),
226
+ _param("grid", 1),
227
+ _param("stn", 0),
228
+ _param("gov", "", required=False),
229
+ _param("authKey", None, required=False),
230
+ ),
231
+ response_kind="text",
232
+ approval_state="approved",
233
+ purpose=(
234
+ "Fetch AWS objective-analysis grid data produced from automatic "
235
+ "weather-station observations."
236
+ ),
237
+ selection_rule=(
238
+ "Choose this for AWS objective-analysis grid products, not for a "
239
+ "single airport METAR or ordinary address forecast."
240
+ ),
241
+ search_keywords=(
242
+ "AWS 객관분석 격자자료 분석자료 objective analysis grid Multi Quadric Barnes"
243
+ ),
244
+ official_page_url=(
245
+ "https://apihub.kma.go.kr/apiList.do?apiMov=AWS%20%EA%B0%9D%EA%B4%80%EB%B6%84%EC%84%9D"
246
+ "&seqApi=2&seqApiSub=248"
247
+ ),
248
+ ),
249
+ KmaApiHubUrlOperation(
250
+ operation_id="analysis_weather_chart_image",
251
+ category_seq=9,
252
+ category_name_ko="수치모델",
253
+ title_ko="분석일기도 이미지 조회",
254
+ endpoint_path="/api/typ07/afsiwa/iwa/api/iwaImgUrlApi/retRecreateImgUrl.kfrm",
255
+ request_params=(
256
+ _param("analTime", None),
257
+ _param("isTyp", "false"),
258
+ _param("imageType", "png"),
259
+ _param("groupName", "925_default"),
260
+ _param("meta", 1),
261
+ _param("authKey", None, required=False),
262
+ ),
263
+ response_kind="image",
264
+ approval_state="approved",
265
+ purpose=("Fetch KMA analyzed weather-chart imagery or metadata for a UTC analysis time."),
266
+ selection_rule=(
267
+ "Choose this for analyzed weather charts or synoptic chart images. "
268
+ "It is not a tabular airport-weather observation source. "
269
+ "For WthrChartInfoService/getSurfaceChart wording, the structured "
270
+ "service is cataloged-disabled after resultCode=99 probes; this URL "
271
+ "image product uses anal_time, not code. Use anal_time, not code. "
272
+ "anal_time is UTC YYYYMMDDHHMM; include minutes and convert from KST "
273
+ "instead of sending a 10-digit local hour."
274
+ ),
275
+ search_keywords=(
276
+ "분석일기도 일기도 이미지 수치모델 분석자료 synoptic chart image analTime"
277
+ ),
278
+ official_page_url=(
279
+ "https://apihub.kma.go.kr/apiList.do?apiMov=1.+%28%EA%B7%B8%EB%9E%98%ED%94%BD%29+"
280
+ "%EB%B6%84%EC%84%9D%EC%9D%BC%EA%B8%B0%EB%8F%84+%EC%A1%B0%ED%9A%8C&seqApi=9&seqApiSub=285"
281
+ ),
282
+ ),
283
+ )
284
+
285
+
286
+ def iter_url_operations() -> tuple[KmaApiHubUrlOperation, ...]:
287
+ """Return all cataloged non-structured URL operations."""
288
+ return KMA_APIHUB_URL_OPERATIONS
289
+
290
+
291
+ def get_url_operation_by_id(operation_id: str) -> KmaApiHubUrlOperation:
292
+ """Return one URL operation by stable operation id."""
293
+ for operation in KMA_APIHUB_URL_OPERATIONS:
294
+ if operation.operation_id == operation_id:
295
+ return operation
296
+ raise KeyError(f"Unknown KMA APIHub URL operation: {operation_id}")
@@ -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",
@@ -2,9 +2,12 @@
2
2
  """Locate primitive adapters.
3
3
 
4
4
  Each provider endpoint is exposed as a separate ``GovAPITool`` bound to the
5
- ``locate`` primitive. The root ``locate`` tool stays a thin envelope:
5
+ ``locate`` primitive. The model-facing path is the concrete adapter function:
6
6
 
7
- locate({"tool_id": "<adapter>", "params": {...}})
7
+ kakao_keyword_search({"query": "<place>"})
8
+
9
+ The root ``locate({"tool_id": "<adapter>", "params": {...}})`` tool stays as
10
+ a thin envelope for legacy transcripts and compatibility paths.
8
11
 
9
12
  This keeps provider semantics in adapter descriptions and schemas instead of
10
13
  pre-processing citizen queries inside the primitive dispatcher.
@@ -426,7 +429,7 @@ KAKAO_ADDRESS_SEARCH_TOOL = GovAPITool(
426
429
  "search for bare Korean admin-area wording like '부산 다대1동', '사하구 하단동', "
427
430
  "or any query ending in 동/읍/면/구 without a named POI. Returns a bundle containing "
428
431
  "address, coordinates, KMA nx/ny when in domain, and Kakao b_code when present. "
429
- "Call as locate({tool_id:'kakao_address_search', params:{query:'...'}})."
432
+ "Call as kakao_address_search({query:'...'})."
430
433
  ),
431
434
  search_hint=(
432
435
  "locate 위치 주소 도로명 지번 행정동 법정동 동 읍 면 구 좌표 geocode kakao address "
@@ -454,8 +457,7 @@ KAKAO_KEYWORD_SEARCH_TOOL = GovAPITool(
454
457
  "or '강남역'. Do not use for bare administrative districts like '부산 다대1동'; "
455
458
  "use kakao_address_search for those. Returns POI name/category, WGS-84 "
456
459
  "lat/lon, and KMA nx/ny when in domain. If a downstream adapter needs q0/q1 "
457
- "region names, follow with locate({tool_id:'kakao_coord_to_region', "
458
- "params:{lat:<lat>, lon:<lon>}})."
460
+ "region names, follow with kakao_coord_to_region({lat:<lat>, lon:<lon>})."
459
461
  ),
460
462
  search_hint=(
461
463
  "locate 위치 장소 키워드 POI 랜드마크 캠퍼스 역 병원 좌표 kakao keyword "
@@ -481,7 +483,7 @@ KAKAO_COORD_TO_REGION_TOOL = GovAPITool(
481
483
  "Locate adapter for Kakao coord2regioncode. Use after a coordinate-producing "
482
484
  "locate adapter when a downstream public API needs region_1depth_name/q0, "
483
485
  "region_2depth_name/q1, or a 10-digit legal/admin code. "
484
- "Call as locate({tool_id:'kakao_coord_to_region', params:{lat:<lat>, lon:<lon>}})."
486
+ "Call as kakao_coord_to_region({lat:<lat>, lon:<lon>})."
485
487
  ),
486
488
  search_hint=("locate 지역 시도 시군구 행정동 법정동 q0 q1 coord2region reverse geocode kakao"),
487
489
  policy=_provider_policy("Kakao", "https://www.kakao.com/policy/privacy"),
@@ -43,7 +43,9 @@ _COMMON_FIELD_DESCRIPTIONS: dict[str, str] = {
43
43
  ),
44
44
  "city_code": (
45
45
  "Official TAGO cityCode identifying the municipality for bus route, arrival, "
46
- "location, or station queries."
46
+ "location, or station queries. Use the provider's getCtyCodeList contract; "
47
+ "common metropolitan examples from the TAGO city-code list include "
48
+ "Busan=21, Daegu=22, Incheon=23, Gwangju=24, Daejeon=25, and Ulsan=26."
47
49
  ),
48
50
  "route_no": "Bus route number visible to citizens, mapped to the provider routeNo filter.",
49
51
  "route_id": "Official provider routeId returned by a prior route lookup.",
@@ -62,8 +64,19 @@ _COMMON_FIELD_DESCRIPTIONS: dict[str, str] = {
62
64
  ),
63
65
  "job_se_code": "Fair Trade Commission job-section code from the public-data contract.",
64
66
  "schl_div_cd": "University school-division code from the KCUE public-data contract.",
65
- "inqry_div": "Procurement inquiry division code used by the PPS bid-public-info endpoint.",
66
- "bid_ntce_no": "Bid notice number used by the PPS public procurement endpoint.",
67
+ "inqry_div": (
68
+ "Procurement inquiry division code used by the PPS endpoint. For PPS bid "
69
+ "search-condition operations, use 1 for notice-publication datetime and 2 "
70
+ "for bid-opening datetime."
71
+ ),
72
+ "bid_ntce_no": "Bid notice number used by PPS detail-style procurement endpoints.",
73
+ "inqry_bgn_dt": "PPS search start datetime in official YYYYMMDDHHMM format.",
74
+ "inqry_end_dt": "PPS search end datetime in official YYYYMMDDHHMM format.",
75
+ "bid_ntce_nm": "PPS bid notice-name keyword; partial Korean notice names are allowed.",
76
+ "ntce_instt_nm": "PPS public notice agency-name filter; partial agency names are allowed.",
77
+ "dminstt_nm": "PPS demand agency-name filter; partial agency names are allowed.",
78
+ "prtcpt_lmt_rgn_nm": "PPS participation-limit region-name filter, such as 부산광역시.",
79
+ "indstryty_nm": "PPS industry or license-name filter, such as 전기공사업.",
67
80
  "prdct_clsfc_no_nm": (
68
81
  "Product classification number or name search term for the PPS shopping endpoint."
69
82
  ),
@@ -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).
@@ -71,8 +71,8 @@ class _LookupInputForLLM(BaseModel):
71
71
  2. The LLM-visible ``find`` tool is fetch-only: pick a ``tool_id``
72
72
  from the injected suffix, supply ``params``, get a typed result.
73
73
  3. ``LookupSearchInput`` / ``LookupSearchResults`` survive as
74
- internal API consumed by the auto-inject path + the eval harness
75
- (``ummaya.eval.retrieval``); they are NOT exposed to the LLM.
74
+ internal API consumed by the auto-inject path and deterministic
75
+ retrieval tests; they are NOT exposed to the LLM.
76
76
  """
77
77
 
78
78
  model_config = ConfigDict(extra="forbid")
@@ -111,8 +111,8 @@ class NmcEmergencySearchInput(BaseModel):
111
111
  le=90,
112
112
  description=(
113
113
  "Coordinate-mode latitude in decimal degrees (WGS-84). Required "
114
- "when mode='coordinate'. Obtain from a coordinate-producing locate adapter "
115
- "such as kakao_keyword_search or kakao_address_search."
114
+ "when mode='coordinate'. Obtain from a prior coordinate-producing "
115
+ "locate result; never guess from place names."
116
116
  ),
117
117
  )
118
118
  lon: float | None = Field(
@@ -121,8 +121,8 @@ class NmcEmergencySearchInput(BaseModel):
121
121
  le=180,
122
122
  description=(
123
123
  "Coordinate-mode longitude in decimal degrees (WGS-84). Required "
124
- "when mode='coordinate'. Obtain from a coordinate-producing locate adapter "
125
- "such as kakao_keyword_search or kakao_address_search."
124
+ "when mode='coordinate'. Obtain from a prior coordinate-producing "
125
+ "locate result; never guess from place names."
126
126
  ),
127
127
  )
128
128
  q0: str | None = Field(
@@ -785,8 +785,10 @@ NMC_EMERGENCY_SEARCH_TOOL = GovAPITool(
785
785
  "비인증 시 auth_required."
786
786
  ),
787
787
  self_contained_decl=(
788
- "ORDERING: turn1 locate(kakao_keyword_search 또는 kakao_address_search), "
789
- "turn2 locate(kakao_coord_to_region), turn3 본 도구. "
788
+ "ORDERING: turn1 use a coordinate-producing locate adapter, "
789
+ "turn2 use a region-resolving locate adapter, turn3 본 도구. "
790
+ "If the same citizen request also mentions AED/자동심장충격기, call "
791
+ "nmc_aed_site_locate as a separate find adapter; ER data does not answer AED. "
790
792
  "응급실 시간은 '24시간 운영', "
791
793
  "outpatient_hours_display는 외래진료로만 설명."
792
794
  ),
@@ -88,6 +88,9 @@ def register_all_tools(registry: ToolRegistry, executor: ToolExecutor) -> Routin
88
88
  from ummaya.tools.kma.apihub_structured_adapter import (
89
89
  register as reg_kma_apihub_structured,
90
90
  )
91
+ from ummaya.tools.kma.apihub_url_adapter import (
92
+ register as reg_kma_apihub_url,
93
+ )
91
94
  from ummaya.tools.kma.forecast_fetch import (
92
95
  register as reg_kma_forecast_fetch,
93
96
  )
@@ -141,6 +144,12 @@ def register_all_tools(registry: ToolRegistry, executor: ToolExecutor) -> Routin
141
144
  # adapters above for citizen-facing forecast/current-weather flows.
142
145
  reg_kma_apihub_structured(registry, executor)
143
146
 
147
+ # KMA APIHub non-structured URL families needed for official AMOS and
148
+ # analyzed-data products. These are kept separate from typ02/openApi because
149
+ # their response contracts are text, image, or binary rather than the
150
+ # structured OpenAPI XML/JSON envelope.
151
+ reg_kma_apihub_url(registry, executor)
152
+
144
153
  # Phase 2 adapters (spec 029 — NFA 119 + MOHW SSIS, Layer 3 gated stubs)
145
154
  reg_nfa(registry, executor) # T014 — NFA EMS statistics (interface-only)
146
155
  reg_mohw(registry, executor) # T025 — MOHW welfare eligibility search (real XML handler)
@@ -155,6 +164,14 @@ def register_all_tools(registry: ToolRegistry, executor: ToolExecutor) -> Routin
155
164
  reg_mock_hometax_simplified(registry, executor) # T028 — Hometax simplified data
156
165
  reg_mock_gov24_cert(registry, executor) # T029 — Gov24 certificate lookup
157
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
+
158
175
  # Epic ζ #2297 path B (live smoke 2026-04-30 follow-up) — bridge per-primitive
159
176
  # registries (verify/submit) into the main ToolRegistry's BM25 corpus
160
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
 
@@ -5,8 +5,9 @@ Single entry point for converting a natural-language place reference into
5
5
  structured location data (coordinates, 10-digit 행정동 code, address, POI).
6
6
 
7
7
  Legacy compatibility resolver chain: kakao → juso → sgis.
8
- New LLM-visible calls should use the root ``locate({tool_id, params})`` tool
9
- with provider adapters from ``ummaya.tools.location_adapters``.
8
+ New LLM-visible calls should use concrete provider adapters from
9
+ ``ummaya.tools.location_adapters``. The root ``locate({tool_id, params})``
10
+ shape is retained only for legacy transcripts and compatibility paths.
10
11
 
11
12
  FR-002: Accepts ``query``, ``want``, and optional ``near`` anchor.
12
13
  FR-003: Kakao / JUSO / SGIS are exposed as separate locate adapters; this
@@ -682,8 +683,7 @@ async def resolve_location( # noqa: C901
682
683
  # Was previously routed through search_address — a structural bug:
683
684
  # the address endpoint returns empty for POI queries like
684
685
  # "동아대학교", so every want='poi' call ended in not_found and the
685
- # LLM fell back to fabricated coordinates (frame:
686
- # `specs/integration-verification/donga-univ-poi-bug/`). Routing
686
+ # LLM fell back to fabricated coordinates. Routing
687
687
  # through the keyword endpoint is the byte-correct PyKakao mapping
688
688
  # for POI queries.
689
689
  try:
@@ -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
+ ]