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
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
  **Unified Multi-Ministry Agent for Your Administration.**
16
16
  읽으면, **엄마야**.
17
17
 
18
- UMMAYA is a terminal agent for Korean public-service workflows. You describe the outcome in natural language, and UMMAYA routes the request through four main tools: `find`, `locate`, `check`, and `send`.
18
+ UMMAYA is a terminal agent for Korean public-service workflows. You describe the outcome in natural language, and UMMAYA routes the request through five main tools: `find`, `locate`, `check`, `send`, and `document`.
19
19
 
20
20
  Read the full documentation at [ummaya-docs.pages.dev/ko](https://ummaya-docs.pages.dev/ko/). Start with the [Korean user guide](https://ummaya-docs.pages.dev/ko/start/why-ummaya/) if you want the product purpose first, or use [llms.txt](https://ummaya-docs.pages.dev/llms.txt) when an agent needs machine-readable project context.
21
21
 
@@ -92,7 +92,7 @@ Live public-information flows are shown most often in the demo because they can
92
92
 
93
93
  ## Main Tools
94
94
 
95
- UMMAYA keeps the model-facing surface small. Instead of exposing dozens of agency-specific APIs directly to the LLM, it gives the agent four durable primitives and lets adapters handle ministry-specific details behind them.
95
+ UMMAYA keeps the model-facing surface small. Instead of exposing dozens of agency-specific APIs directly to the LLM, it gives the agent five durable primitives and lets adapters handle ministry-specific details behind them.
96
96
 
97
97
  ### `locate`
98
98
 
@@ -142,6 +142,18 @@ Typical use:
142
142
 
143
143
  `send` is where UMMAYA moves beyond answer generation: if a live or permitted channel exists it calls that channel; if only a mock or official handoff is available it preserves the same receipt-shaped boundary and says so clearly.
144
144
 
145
+ ### `document`
146
+
147
+ `document` is the public-form authoring harness. Korean administrative work often ends in a filled form — HWP, HWPX, PDF, OOXML, or ODF — and `document` inspects the source form, extracts its field schema, copies it for safe editing, fills and styles fields, validates against the public-form rules, and renders the result.
148
+
149
+ Typical use:
150
+
151
+ ```text
152
+ 전입신고서 양식을 열어서 내 정보로 채워줘. 제출 전에 어떤 칸이 비었는지도 확인해줘.
153
+ ```
154
+
155
+ `document` does not silently write a government form. Authoring is gated: the harness requires Evidence Fabric coverage and an explicit in-session approval before it fills or renders, and the terminal surfaces an approval review so a person confirms the work before it is committed.
156
+
145
157
  ## Permissioned Work
146
158
 
147
159
  UMMAYA separates public information from protected action.
@@ -152,6 +164,7 @@ UMMAYA separates public information from protected action.
152
164
  | Location resolution | Use live geocoding/address/region adapters when available. |
153
165
  | Identity and delegation | Use `check` to call the wrapped identity/consent channel, such as Mobile ID, MyData, certificates, or OmniOne-style QR/app verification. |
154
166
  | Certificates, payment, submission, correction | Use `send` with the delegation context when a live or mock channel is registered; otherwise hand off to the official path. |
167
+ | Public-form authoring | Use `document` to inspect, fill, and render a Korean public form; stop for Evidence Fabric coverage and explicit approval before writing. |
155
168
  | API failure, zero result, missing authority | Stop clearly instead of inventing a result. |
156
169
 
157
170
  This is not a separate safety pitch. It is part of how `check` and `send` work: the model plans the task, calls the right wrapped public-service tools, and stops at the authority boundary instead of acting like a reference-only RAG answerer.
@@ -161,7 +174,8 @@ This is not a separate safety pitch. It is part of how `check` and `send` work:
161
174
  UMMAYA currently uses `LGAI-EXAONE/K-EXAONE-236B-A23B` through FriendliAI Serverless for LLM responses.
162
175
 
163
176
  - Model: [K-EXAONE-236B-A23B](https://huggingface.co/LGAI-EXAONE/K-EXAONE-236B-A23B)
164
- - Thinking channel: `UMMAYA_K_EXAONE_THINKING` default `false`; set it to `true` only for reasoning-channel diagnostics or benchmark runs.
177
+ - Reasoning mode: `/reasoning` or `UMMAYA_K_EXAONE_REASONING_MODE` selects `fast`, `balanced`, `deep`, `diagnostic`, or `auto`.
178
+ - Thinking channel: `UMMAYA_K_EXAONE_THINKING` default `false` remains as a legacy compatibility flag; set `/reasoning deep` or `UMMAYA_K_EXAONE_REASONING_MODE=deep` for reasoning-channel diagnostics or benchmark runs.
165
179
  - Model license: [K-EXAONE AI Model License Agreement](https://huggingface.co/LGAI-EXAONE/K-EXAONE-236B-A23B/blob/main/LICENSE)
166
180
  - Project license: [Apache License 2.0](LICENSE)
167
181
 
package/bin/ummaya CHANGED
@@ -135,13 +135,22 @@ export function loadPackageDotenv(root, env = process.env) {
135
135
 
136
136
  export function buildBackendCommand(root) {
137
137
  const packagedPython = join(root, '.venv', 'bin', 'python')
138
- if (existsSync(packagedPython)) {
138
+ if (canImportUmmayaCli(packagedPython)) {
139
139
  return [packagedPython, '-m', 'ummaya.cli', '--ipc', 'stdio']
140
140
  }
141
141
 
142
142
  return ['uv', '--directory', root, 'run', '--frozen', '--no-dev', 'ummaya', '--ipc', 'stdio']
143
143
  }
144
144
 
145
+ export function canImportUmmayaCli(pythonPath) {
146
+ if (!existsSync(pythonPath)) return false
147
+ const result = spawnSync(pythonPath, ['-c', 'import ummaya.cli'], {
148
+ encoding: 'utf8',
149
+ stdio: ['ignore', 'ignore', 'ignore'],
150
+ })
151
+ return !result.error && result.status === 0
152
+ }
153
+
145
154
  export function configurePackageEnv(root, env = process.env) {
146
155
  env.UMMAYA_PACKAGE_ROOT = root
147
156
  if (env.UMMAYA_ALLOW_BACKEND_CMD_OVERRIDE !== '1' || !env.UMMAYA_BACKEND_CMD_JSON) {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ummaya",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "ummaya",
9
- "version": "0.2.3",
9
+ "version": "0.2.5",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@alcalzone/ansi-tokenize": "^0.3.0",
@@ -38,6 +38,8 @@
38
38
  "@opentelemetry/sdk-trace-base": "^2.7.0",
39
39
  "@opentelemetry/semantic-conventions": "^1.40.0",
40
40
  "@pdf-lib/fontkit": "^1.1.1",
41
+ "@rhwp/core": "^0.7.13",
42
+ "@ssabrojs/hwpxjs": "0.4.0",
41
43
  "ajv": "^8.18.0",
42
44
  "asciichart": "^1.5.25",
43
45
  "auto-bind": "^5.0.1",
@@ -2137,6 +2139,12 @@
2137
2139
  "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
2138
2140
  "license": "BSD-3-Clause"
2139
2141
  },
2142
+ "node_modules/@rhwp/core": {
2143
+ "version": "0.7.13",
2144
+ "resolved": "https://registry.npmjs.org/@rhwp/core/-/core-0.7.13.tgz",
2145
+ "integrity": "sha512-IrAubU8/gfFJwXEdTrq/zgfO50uKEuo3p/m4FkcwS7QYFMS94bAHhrBr3mxPsFv5rwqiskI68pJjqaS9K/be1A==",
2146
+ "license": "MIT"
2147
+ },
2140
2148
  "node_modules/@sec-ant/readable-stream": {
2141
2149
  "version": "0.4.1",
2142
2150
  "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
@@ -2793,6 +2801,33 @@
2793
2801
  "node": ">=18.0.0"
2794
2802
  }
2795
2803
  },
2804
+ "node_modules/@ssabrojs/hwpxjs": {
2805
+ "version": "0.4.0",
2806
+ "resolved": "https://registry.npmjs.org/@ssabrojs/hwpxjs/-/hwpxjs-0.4.0.tgz",
2807
+ "integrity": "sha512-tJ42NS2ywHOnhnFQ/i73hQb9xZRQGRItr4P6qJEN3C4UeSDwGLgZsa8AeSpyL+2pK8ZDKuzLWAXGjGVvVPOUuA==",
2808
+ "license": "MIT",
2809
+ "dependencies": {
2810
+ "cfb": "^1.2.2",
2811
+ "fast-xml-parser": "^5.2.5",
2812
+ "htmlparser2": "^12.0.0",
2813
+ "jszip": "^3.10.1",
2814
+ "marked": "^18.0.2",
2815
+ "pako": "^2.1.0"
2816
+ },
2817
+ "bin": {
2818
+ "hwpx": "dist/cli.js",
2819
+ "hwpxjs": "dist/cli.js"
2820
+ },
2821
+ "engines": {
2822
+ "node": ">=18"
2823
+ }
2824
+ },
2825
+ "node_modules/@ssabrojs/hwpxjs/node_modules/pako": {
2826
+ "version": "2.1.0",
2827
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
2828
+ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==",
2829
+ "license": "(MIT AND Zlib)"
2830
+ },
2796
2831
  "node_modules/@types/mute-stream": {
2797
2832
  "version": "0.0.4",
2798
2833
  "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz",
@@ -2859,6 +2894,15 @@
2859
2894
  "node": ">= 0.6"
2860
2895
  }
2861
2896
  },
2897
+ "node_modules/adler-32": {
2898
+ "version": "1.3.1",
2899
+ "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
2900
+ "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
2901
+ "license": "Apache-2.0",
2902
+ "engines": {
2903
+ "node": ">=0.8"
2904
+ }
2905
+ },
2862
2906
  "node_modules/agent-base": {
2863
2907
  "version": "9.0.0",
2864
2908
  "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz",
@@ -3198,6 +3242,19 @@
3198
3242
  "node": "^18.12.0 || >= 20.9.0"
3199
3243
  }
3200
3244
  },
3245
+ "node_modules/cfb": {
3246
+ "version": "1.2.2",
3247
+ "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
3248
+ "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
3249
+ "license": "Apache-2.0",
3250
+ "dependencies": {
3251
+ "adler-32": "~1.3.0",
3252
+ "crc-32": "~1.2.0"
3253
+ },
3254
+ "engines": {
3255
+ "node": ">=0.8"
3256
+ }
3257
+ },
3201
3258
  "node_modules/chalk": {
3202
3259
  "version": "5.6.2",
3203
3260
  "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
@@ -3578,6 +3635,12 @@
3578
3635
  "node": ">=6.6.0"
3579
3636
  }
3580
3637
  },
3638
+ "node_modules/core-util-is": {
3639
+ "version": "1.0.3",
3640
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
3641
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
3642
+ "license": "MIT"
3643
+ },
3581
3644
  "node_modules/cors": {
3582
3645
  "version": "2.8.6",
3583
3646
  "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
@@ -3595,6 +3658,18 @@
3595
3658
  "url": "https://opencollective.com/express"
3596
3659
  }
3597
3660
  },
3661
+ "node_modules/crc-32": {
3662
+ "version": "1.2.2",
3663
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
3664
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
3665
+ "license": "Apache-2.0",
3666
+ "bin": {
3667
+ "crc32": "bin/crc32.njs"
3668
+ },
3669
+ "engines": {
3670
+ "node": ">=0.8"
3671
+ }
3672
+ },
3598
3673
  "node_modules/cross-spawn": {
3599
3674
  "version": "7.0.6",
3600
3675
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -3741,6 +3816,73 @@
3741
3816
  "node": ">=10"
3742
3817
  }
3743
3818
  },
3819
+ "node_modules/dom-serializer": {
3820
+ "version": "3.1.1",
3821
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-3.1.1.tgz",
3822
+ "integrity": "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==",
3823
+ "license": "MIT",
3824
+ "dependencies": {
3825
+ "domelementtype": "^3.0.0",
3826
+ "domhandler": "^6.0.0",
3827
+ "entities": "^8.0.0"
3828
+ },
3829
+ "engines": {
3830
+ "node": ">=20.19.0"
3831
+ },
3832
+ "funding": {
3833
+ "type": "github",
3834
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
3835
+ }
3836
+ },
3837
+ "node_modules/domelementtype": {
3838
+ "version": "3.0.0",
3839
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-3.0.0.tgz",
3840
+ "integrity": "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==",
3841
+ "funding": [
3842
+ {
3843
+ "type": "github",
3844
+ "url": "https://github.com/sponsors/fb55"
3845
+ }
3846
+ ],
3847
+ "license": "BSD-2-Clause",
3848
+ "engines": {
3849
+ "node": ">=20.19.0"
3850
+ }
3851
+ },
3852
+ "node_modules/domhandler": {
3853
+ "version": "6.0.1",
3854
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-6.0.1.tgz",
3855
+ "integrity": "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==",
3856
+ "license": "BSD-2-Clause",
3857
+ "dependencies": {
3858
+ "domelementtype": "^3.0.0"
3859
+ },
3860
+ "engines": {
3861
+ "node": ">=20.19.0"
3862
+ },
3863
+ "funding": {
3864
+ "type": "github",
3865
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
3866
+ }
3867
+ },
3868
+ "node_modules/domutils": {
3869
+ "version": "4.0.2",
3870
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-4.0.2.tgz",
3871
+ "integrity": "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==",
3872
+ "license": "BSD-2-Clause",
3873
+ "dependencies": {
3874
+ "dom-serializer": "^3.0.0",
3875
+ "domelementtype": "^3.0.0",
3876
+ "domhandler": "^6.0.0"
3877
+ },
3878
+ "engines": {
3879
+ "node": ">=20.19.0"
3880
+ },
3881
+ "funding": {
3882
+ "type": "github",
3883
+ "url": "https://github.com/fb55/domutils?sponsor=1"
3884
+ }
3885
+ },
3744
3886
  "node_modules/dunder-proto": {
3745
3887
  "version": "1.0.1",
3746
3888
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -3794,6 +3936,18 @@
3794
3936
  "once": "^1.4.0"
3795
3937
  }
3796
3938
  },
3939
+ "node_modules/entities": {
3940
+ "version": "8.0.0",
3941
+ "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz",
3942
+ "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==",
3943
+ "license": "BSD-2-Clause",
3944
+ "engines": {
3945
+ "node": ">=20.19.0"
3946
+ },
3947
+ "funding": {
3948
+ "url": "https://github.com/fb55/entities?sponsor=1"
3949
+ }
3950
+ },
3797
3951
  "node_modules/env-paths": {
3798
3952
  "version": "4.0.0",
3799
3953
  "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz",
@@ -4771,6 +4925,28 @@
4771
4925
  "node": ">=16.9.0"
4772
4926
  }
4773
4927
  },
4928
+ "node_modules/htmlparser2": {
4929
+ "version": "12.0.0",
4930
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-12.0.0.tgz",
4931
+ "integrity": "sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==",
4932
+ "funding": [
4933
+ "https://github.com/fb55/htmlparser2?sponsor=1",
4934
+ {
4935
+ "type": "github",
4936
+ "url": "https://github.com/sponsors/fb55"
4937
+ }
4938
+ ],
4939
+ "license": "MIT",
4940
+ "dependencies": {
4941
+ "domelementtype": "^3.0.0",
4942
+ "domhandler": "^6.0.0",
4943
+ "domutils": "^4.0.2",
4944
+ "entities": "^8.0.0"
4945
+ },
4946
+ "engines": {
4947
+ "node": ">=20.19.0"
4948
+ }
4949
+ },
4774
4950
  "node_modules/http-errors": {
4775
4951
  "version": "2.0.1",
4776
4952
  "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
@@ -4867,6 +5043,12 @@
4867
5043
  "node": ">= 4"
4868
5044
  }
4869
5045
  },
5046
+ "node_modules/immediate": {
5047
+ "version": "3.0.6",
5048
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
5049
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
5050
+ "license": "MIT"
5051
+ },
4870
5052
  "node_modules/indent-string": {
4871
5053
  "version": "5.0.0",
4872
5054
  "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
@@ -5181,6 +5363,12 @@
5181
5363
  "url": "https://github.com/sponsors/sindresorhus"
5182
5364
  }
5183
5365
  },
5366
+ "node_modules/isarray": {
5367
+ "version": "1.0.0",
5368
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
5369
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
5370
+ "license": "MIT"
5371
+ },
5184
5372
  "node_modules/isexe": {
5185
5373
  "version": "2.0.0",
5186
5374
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -5248,6 +5436,48 @@
5248
5436
  "graceful-fs": "^4.1.6"
5249
5437
  }
5250
5438
  },
5439
+ "node_modules/jszip": {
5440
+ "version": "3.10.1",
5441
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
5442
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
5443
+ "license": "(MIT OR GPL-3.0-or-later)",
5444
+ "dependencies": {
5445
+ "lie": "~3.3.0",
5446
+ "pako": "~1.0.2",
5447
+ "readable-stream": "~2.3.6",
5448
+ "setimmediate": "^1.0.5"
5449
+ }
5450
+ },
5451
+ "node_modules/jszip/node_modules/readable-stream": {
5452
+ "version": "2.3.8",
5453
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
5454
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
5455
+ "license": "MIT",
5456
+ "dependencies": {
5457
+ "core-util-is": "~1.0.0",
5458
+ "inherits": "~2.0.3",
5459
+ "isarray": "~1.0.0",
5460
+ "process-nextick-args": "~2.0.0",
5461
+ "safe-buffer": "~5.1.1",
5462
+ "string_decoder": "~1.1.1",
5463
+ "util-deprecate": "~1.0.1"
5464
+ }
5465
+ },
5466
+ "node_modules/jszip/node_modules/safe-buffer": {
5467
+ "version": "5.1.2",
5468
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
5469
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
5470
+ "license": "MIT"
5471
+ },
5472
+ "node_modules/jszip/node_modules/string_decoder": {
5473
+ "version": "1.1.1",
5474
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5475
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5476
+ "license": "MIT",
5477
+ "dependencies": {
5478
+ "safe-buffer": "~5.1.0"
5479
+ }
5480
+ },
5251
5481
  "node_modules/jwa": {
5252
5482
  "version": "2.0.1",
5253
5483
  "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
@@ -5269,6 +5499,15 @@
5269
5499
  "safe-buffer": "^5.0.1"
5270
5500
  }
5271
5501
  },
5502
+ "node_modules/lie": {
5503
+ "version": "3.3.0",
5504
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
5505
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
5506
+ "license": "MIT",
5507
+ "dependencies": {
5508
+ "immediate": "~3.0.5"
5509
+ }
5510
+ },
5272
5511
  "node_modules/locate-path": {
5273
5512
  "version": "5.0.0",
5274
5513
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -6081,6 +6320,12 @@
6081
6320
  "url": "https://github.com/sponsors/sindresorhus"
6082
6321
  }
6083
6322
  },
6323
+ "node_modules/process-nextick-args": {
6324
+ "version": "2.0.1",
6325
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
6326
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
6327
+ "license": "MIT"
6328
+ },
6084
6329
  "node_modules/proper-lockfile": {
6085
6330
  "version": "4.1.2",
6086
6331
  "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
@@ -6540,6 +6785,12 @@
6540
6785
  "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
6541
6786
  "license": "ISC"
6542
6787
  },
6788
+ "node_modules/setimmediate": {
6789
+ "version": "1.0.5",
6790
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
6791
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
6792
+ "license": "MIT"
6793
+ },
6543
6794
  "node_modules/setprototypeof": {
6544
6795
  "version": "1.2.0",
6545
6796
  "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ummaya",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Conversational multi-agent harness for Korean public-service channels",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -23,6 +23,8 @@
23
23
  "uv.lock",
24
24
  "docs/demo/**",
25
25
  "docs/plugins/security-review.md",
26
+ "specs/2803-document-production-hardening/contracts/document-tools.schema.json",
27
+ "tests/fixtures/documents/public_forms/baselines.yaml",
26
28
  "tests/fixtures/plugin_validation/checklist_manifest.yaml",
27
29
  "!**/.DS_Store",
28
30
  "!**/__pycache__/**",
@@ -98,6 +100,8 @@
98
100
  "@opentelemetry/sdk-trace-base": "^2.7.0",
99
101
  "@opentelemetry/semantic-conventions": "^1.40.0",
100
102
  "@pdf-lib/fontkit": "^1.1.1",
103
+ "@rhwp/core": "^0.7.13",
104
+ "@ssabrojs/hwpxjs": "0.4.0",
101
105
  "ajv": "^8.18.0",
102
106
  "asciichart": "^1.5.25",
103
107
  "auto-bind": "^5.0.1",
@@ -6,9 +6,9 @@ entries:
6
6
  path: compact_v1.md
7
7
  - prompt_id: session_guidance_v1
8
8
  version: 1
9
- sha256: 063e92b54886d624a80170ae8c5f62498d2b7817daa2743db6753279578902b1
9
+ sha256: 5464ca763790332b2d6a3969151b43723ec51cc43bdeaed09074f7a0a1f62f98
10
10
  path: session_guidance_v1.md
11
11
  - prompt_id: system_v1
12
12
  version: 1
13
- sha256: 0611f086efeaa50986521b9ded4bb30adf628cd51898dce340efc8a1ebec920c
13
+ sha256: b25e6d153c299f0b9ea67081b191e38de7a11dcfadc14db33473e9b53d476e2c
14
14
  path: system_v1.md
@@ -1,3 +1,5 @@
1
- When the citizen's message names a district, neighborhood, landmark, or address, invoke the geocoding tool before any tool that takes an administrative code. Do not fill administrative region codes from memory; pass them only after a geocoding tool has produced them in this session. In UMMAYA's active tool surface, "geocoding tool" means the locate primitive and its registered locate adapters. Also call locate when the citizen names a campus, station, POI, or nearby-search anchor before any downstream adapter that needs coordinates, KMA nx/ny, administrative codes, or region names. Choose a registered locate adapter from <available_adapters>: use kakao_keyword_search for POIs and named places, kakao_address_search for structured road/jibun addresses, kakao_coord_to_region after coordinates when a region-mode adapter needs q0/q1, and JUSO/SGIS adapters only when their schema better matches the required identifier. Do not fill coordinates, KMA grids, administrative codes, or region names from memory; pass only values produced by a locate adapter in this session. When the citizen's request matches a registered adapter's purpose (accident statistics, emergency rooms, hospitals, weather observations, forecast data, welfare eligibility, authentication, submissions, etc.), invoke the appropriate primitive and adapter to fetch or perform the authoritative action; do not answer factual public-service queries from parametric memory. For current/today weather, call kma_current_observation with nx/ny from locate before final prose; call kma_forecast_fetch as a companion when the citizen also needs today's later forecast. For emergency-room search near a named place, first call locate with {"tool_id":"kakao_keyword_search","params":{"query":"<citizen-place-text>"}}, then call locate with {"tool_id":"kakao_coord_to_region","params":{"lat":"<locate lat>","lon":"<locate lon>"}} if the NMC adapter needs q0/q1 region-mode parameters. Always use tools for location-based factual queries even when you recognize the place name. Never call a tool with an empty or whitespace-only argument value.
1
+ Prefer concrete adapter function calls when a registered adapter is loaded in the current tools[] list. A concrete adapter function is named by its tool_id and accepts exactly the schema fields from <available_adapters>; do not wrap {"tool_id": "...", "params": {...}} inside that concrete function. Use legacy root wrappers locate/find/check/send only when the concrete adapter function is not loaded and only the root primitive is available. When the citizen's message names a district, neighborhood, landmark, or address, invoke the geocoding tool before any tool that takes an administrative code. Do not fill administrative region codes from memory; pass them only after a geocoding tool has produced them in this session. In the active concrete tool surface, that geocoding tool should be the registered locate adapter function itself. Use kakao_keyword_search({"query":"<citizen-place-text>"}) for POIs and named places, kakao_address_search({"query":"<citizen-address>"}) for structured road/jibun addresses, kakao_coord_to_region({"lat":<locate lat>,"lon":<locate lon>}) after coordinates when a region-mode adapter needs q0/q1, and JUSO/SGIS adapters only when their schema better matches the required identifier. Do not fill coordinates, KMA grids, administrative codes, or region names from memory; pass only values produced by a locate adapter in this session. When the citizen's request matches a registered adapter's purpose (accident statistics, emergency rooms, hospitals, weather observations, forecast data, welfare eligibility, authentication, submissions, etc.), invoke the appropriate concrete adapter to fetch or perform the authoritative action; do not answer factual public-service queries from parametric memory. For current/today non-aviation weather, call kma_current_observation with nx/ny from locate before final prose; call kma_forecast_fetch as a companion when the citizen also needs today's later forecast. Aviation exception: when the citizen names METAR, SPECI, AMOS, RVR, runway, airport aviation weather, or a concrete KMA APIHub aviation adapter from <available_adapters>, do not route to kma_current_observation and do not call locate unless the selected adapter schema explicitly requires coordinates. Use the aviation adapter from <available_adapters> directly, usually kma_apihub_url_air_metar_decoded({"org":"K","help":1}) for Gimhae/RKPK decoded METAR. For emergency-room search near a named place, first call kakao_keyword_search({"query":"<citizen-place-text>"}), then call kakao_coord_to_region({"lat":<locate lat>,"lon":<locate lon>}) if the NMC adapter needs q0/q1 region-mode parameters. For collapse, unconsciousness, cardiac-arrest, or AED-relevant wording such as 사람이 쓰러졌어, after emergency-room search also call nmc_aed_site_locate before final prose when that adapter is surfaced; if AED returns no data or an upstream error, report that result with 119 guidance instead of substituting ER data. Always use tools for location-based factual queries even when you recognize the place name. Never call a tool with an empty or whitespace-only argument value.
2
+
3
+ Treat ordinary airport flight-operation wording as aviation weather intent even when the citizen does not say METAR, AMOS, or 항공기상. Examples include 비행기, 항공편, 비행편, 이륙, 착륙, 결항, 지연, 운항, 뜰 만한가, flight, takeoff, landing, delay, or cancellation near an airport name. For those turns, prefer the KMA APIHub aviation adapter in <available_adapters> over locate plus kma_current_observation.
2
4
 
3
5
  Before each tool call, compare the citizen request with the selected adapter's input schema in <available_adapters>. Preserve every explicit constraint from the citizen request as a matching parameter when the schema exposes one: requested result count, radius or distance wording, date/time, institution type, category, specialty, keyword, administrative region, and other filter fields. Do not make a broad unfiltered call when the request is narrower and the adapter has an optional field for that narrowing. After a tool_result, verify that the returned collection still matches the citizen's stated constraints before writing final prose; if it does not, call the same selected adapter again with corrected schema-valid params instead of answering from the broad result.
@@ -38,8 +38,8 @@
38
38
 
39
39
  <tool_usage>
40
40
  <primitives>
41
- - `locate(tool_id, params)`등록된 locate 어댑터를 골라 위치 / 주소 / / 관공서 좌표 + 행정동 + POI 반환. 예: `locate(tool_id="kakao_keyword_search", params={"query":"동아대학교 승학캠퍼스"})`.
42
- - `find(tool_id, params)`외부 도메인 API 조회 도구 (기상청, HIRA, KOROAD 등). 백엔드가 사용자 발화 시점에 BM25 로 후보 어댑터를 사전 선별해 `<available_adapters>` 섹션에 inject 합니다 — LLM 은 그 목록에서 tool_id 골라 fetch 만 호출. `mode="search"` 는 backend internal 기능이므로 LLM 이 직접 호출 금지.
41
+ - **Concrete adapter first** tools[] 안에 concrete adapter function 있으면 function 이름은 `tool_id` 입니다. function adapter schema 필드만 받습니다. 예: `kakao_keyword_search({"query":"동아대학교 승학캠퍼스"})`, `kma_current_observation({"base_date":"YYYYMMDD","base_time":"HH00","nx":97,"ny":74})`. concrete adapter function 에 `{"tool_id": "...", "params": {...}}` 를 넣지 마십시오.
42
+ - **Legacy root wrappers** concrete adapter function 로드되지 않고 root primitive 있을 때만 `locate({"tool_id":"kakao_keyword_search","params":{"query":"동아대학교 승학캠퍼스"}})` 또는 `find({"tool_id":"kma_current_observation","params":{...}})` 형식을 사용합니다. `mode="search"` 는 backend internal 기능이므로 LLM 이 직접 호출 금지.
43
43
  - `check(tool_id, params)` — 인증 ceremony. `params = {scope_list, purpose_ko, purpose_en, session_id?}`. 반환 = `DelegationContext` (또는 any_id_sso 의 경우 `IdentityAssertion`).
44
44
  - `send(tool_id, params)` — OPAQUE-도메인 행정 모듈 호출. `params` 에 `delegation_context` (check 반환) + 어댑터별 payload. 접수번호 반환.
45
45
  **Public-data boundary**: 공개자료 `find` 조회가 성공했고 시민 발화에 인증/본인확인/동의/신청/제출/납부/신고 요구가 없으면 다음 turn 은 최종 답변입니다. 공개 의약품, 채용공고, 통계, 요금, 수질, 시설 목록 같은 read-only 결과를 "검증"하려고 `check` 를 추가 호출하지 마십시오.
@@ -77,14 +77,14 @@
77
77
  | 마이데이터 인증 / 거래내역 동의 | `mock_verify_mydata` | (해당 어댑터) | `mock_submit_module_public_mydata_action` |
78
78
  | 공동·금융 통합 (default) | `mock_verify_gongdong_injeungseo` | (선택) | (선택) |
79
79
  | 통합 SSO / Any-ID 로그인 | `mock_verify_module_any_id_sso` | (선택) | (호출 금지 — IdentityAssertion 만 반환) |
80
- **3-step chain**: (1) check(tool_id, params={scope_list, purpose_ko, purpose_en, session_id?}) → DelegationContext. (2) find(tool_id, params={delegation_context}) 선택. (3) send(tool_id, params={delegation_context, ...}) → 접수번호.
80
+ **3-step chain**: (1) check 계열 인증 adapter → DelegationContext. (2) 필요한 경우 concrete lookup adapter를 schema 필드로 직접 호출. (3) send 계열 제출 adapter → 접수번호.
81
81
  **Send payload contract (fail-closed)**: send 호출은 항상 최상위 `tool_id` 와 `params` 를 모두 포함해야 합니다. `send(params={...})` 만 호출하거나, `tool_id` 없이 도메인 필드를 최상위에 펼친 send 호출은 절대 금지입니다. send `params` 는 해당 어댑터의 Pydantic input_schema 와 정확히 일치해야 합니다. 시민 발화에 이미 있는 필수 payload 필드(예: `minwon_type`, `applicant_name`, `delivery_method`, `session_id`)는 첫 send 호출에 모두 포함하십시오. `delegation_context` 는 check 반환값 전체를 `delegation_context` 한 필드 아래에만 넣고, `token`, `citizen_did`, `purpose_ko`, `purpose_en`, `scope`, `mode`, `_mode` 같은 내부 필드를 send params 최상위로 펼치거나 복사하지 마십시오. send schema 에 `session_id` 가 있으면 직전 check `params` 와 send `params` 에 같은 `session_id` 값을 넣어야 합니다. 시민이 세션 ID 를 명시했다면 check `params` 에도 `session_id` 를 직접 포함하십시오. `params.session_context.session_id` 형태로 중첩하지 마십시오. send 결과가 `status="succeeded"` 이거나 "제출이 접수되었습니다" 로 반환되면 같은 요청을 다시 send 하지 말고, 즉시 final answer 를 작성하십시오.
82
82
  **Mock PII minimization defaults**: 홈택스 mock 흐름에서 시민에게 주민등록번호 앞 6자리, 총소득액, 실제 세무 식별자를 되묻지 마십시오. mock 조회의 `resident_id_prefix` 는 시민이 명시하지 않으면 synthetic fixture 값 `"000000"` 을 사용합니다. 연도가 없으면 직전 귀속연도(예: 2026년에 실행 중이면 2025)를 사용합니다. mock 종합소득세 send 의 `total_income_krw` 가 없으면 synthetic fixture 값 `42000000` 을 사용하되, final answer 에 실제 세무자료처럼 표현하지 마십시오.
83
83
  **Tool choice override**: 시민 발화가 `마이데이터`를 포함하면 check 도구는 항상 `mock_verify_mydata` 입니다. `mock_verify_module_modid` 는 홈택스/모바일ID family에만 사용하고 마이데이터 동의에는 사용하지 마십시오. 시민 발화가 `간편인증`을 포함하면 `mock_verify_ganpyeon_injeung` 을 사용하고, 정부24 민원/등본/발급 문맥이 아닌 한 `mock_verify_module_simple_auth` 를 사용하지 마십시오.
84
84
  **Identity/scope fixed values**: 모바일 신분증 본인확인 scope_list 는 정확히 `["check:mobile_id.identity"]` 입니다. `find:identity.info`, `find:identity.check` 같은 alias 를 만들지 마십시오. 간편인증 로그인 scope_list 는 정확히 `["check:ganpyeon.identity"]` 입니다. `mock_verify_module_any_id_sso`, `find:admin_service.permission_check`, `send:admin_service.permission_management` 로 대체하지 마십시오.
85
85
  **Worked example** — 시민: "종합소득세 신고해줘"
86
86
  1. `check(tool_id="mock_verify_module_modid", params={"scope_list": ["find:hometax.simplified", "send:hometax.tax-return"], "purpose_ko": "종합소득세 신고", "purpose_en": "Comprehensive income tax filing"})`
87
- 2. `find(tool_id="mock_lookup_module_hometax_simplified", params={"year": 2025, "resident_id_prefix": "000000"})`
87
+ 2. `mock_lookup_module_hometax_simplified({"year": 2025, "resident_id_prefix": "000000"})`
88
88
  3. `send(tool_id="mock_submit_module_hometax_taxreturn", params={"delegation_context": <ctx>, "tax_year": 2025, "income_type": "종합소득", "total_income_krw": 42000000, "session_id": "HOMETAX-TAXRETURN-SESSION-001"})` → `접수번호: hometax-YYYY-MM-DD-RX-XXXXX`
89
89
  **Worked example** — 시민: "마이데이터 동의 상태 확인하고 필요한 공공 마이데이터 제공 동의까지 진행해줘"
90
90
  1. `check(tool_id="mock_verify_mydata", params={"scope_list": ["send:public_mydata.action"], "purpose_ko": "공공 마이데이터 제공 동의", "purpose_en": "Public MyData consent action", "session_id": "MYDATA-ACTION-SESSION-001"})`
@@ -93,7 +93,7 @@
93
93
  1. `check(tool_id="mock_verify_module_simple_auth", params={"scope_list": ["send:gov24.minwon"], "purpose_ko": "주민등록등본 발급 민원 신청", "purpose_en": "Gov24 resident registration certificate civil petition", "session_id": "GOV24-MINWON-SESSION-001"})`
94
94
  2. `send(tool_id="mock_submit_module_gov24_minwon", params={"delegation_context": <ctx>, "minwon_type": "주민등록등본", "applicant_name": "홍길동", "delivery_method": "online", "session_id": "GOV24-MINWON-SESSION-001"})` → `접수번호: gov24-YYYY-MM-DD-MW-XXXXXXXX`
95
95
  **Worked example** — 시민: "한부모가족 아동양육비 지원을 신청해줘"
96
- 1. `find(tool_id="mohw_welfare_eligibility_search", params={"search_wrd": "한부모가족 아동양육비", "trgter_indvdl_array": "060", "onap_psblt_yn": "Y"})`
96
+ 1. `mohw_welfare_eligibility_search({"search_wrd": "한부모가족 아동양육비", "trgter_indvdl_array": "060", "onap_psblt_yn": "Y"})`
97
97
  2. `check(tool_id="mock_verify_mydata", params={"scope_list": ["send:mydata.welfare_application"], "purpose_ko": "한부모가족 아동양육비 지원 신청", "purpose_en": "Single-parent family child support application"})`
98
98
  3. `send(tool_id="mock_welfare_application_submit_v1", params={"applicant_id": "DI-...", "benefit_code": "WLF00001068", "application_type": "new", "household_size": 2, "delegation_context": <ctx>})` → `접수번호: MOCK-WA-...`
99
99
  **금지 패턴 (이미 위 규칙에서 명시한 것 외)**: 검색 결과 빈 후 "어댑터가 없습니다" 또는 "어댑터 ID 를 알려주세요" 답변 — 위 매핑 표가 답입니다. 시민에게 hometax.go.kr / gov.kr 직접 접속 안내 (chain 시도 전). 같은 find search 를 다른 query 로 재시도 — 첫 search 가 비었으면 즉시 매핑 표 사용. `mock_verify_module_any_id_sso` 뒤에 send chain — IdentityAssertion 만 반환합니다. 복지 급여 신청은 MyData send tier 이므로 `mock_verify_mydata`만 사용하고 Any-ID SSO를 사용하지 마십시오. 복지 신청 check scope_list 에 `find:mohw.welfare_eligibility_search` 또는 `send:mock.welfare_application_submit_v1` 를 넣지 말고 정확히 `["send:mydata.welfare_application"]` 만 사용하십시오.
@@ -121,6 +121,7 @@ Use available tools when the citizen's request requires live data lookup.
121
121
  3. **결과를 받으면 다음 turn 에서 다시 짧은 진행 문장 → 다음 도구 호출** 또는 **충분한 정보가 모였으면 최종 답변**.
122
122
  4. 충분한 정보가 모인 turn 에는 도구 호출 없이 답변 paragraphs 만 작성합니다. 첫 paragraph 가 핵심 결론, 다음 paragraph 가 부연입니다.
123
123
  이 흐름의 핵심: 도구 호출 전에는 시민이 이해할 수 있는 짧은 진행 문장을 쓰고, 최종 답변에는 내부 단계명이나 메타 라벨을 붙이지 않습니다.
124
+ **로컬 문서/파일 진행 문장 guard**: 시민이 로컬 경로, 다운로드 폴더, HWPX/HWP/DOCX/PDF/XLSX/PPTX 파일을 말하면 UMMAYA는 로컬 문서/작업공간 도구로 확인할 수 있습니다. 도구 호출 전에 "파일이 없다", "제공된 파일이 없다", "찾을 수 없다"처럼 존재 여부를 단정하지 말고, "문서 위치와 내용을 확인하겠습니다"처럼 확인 목적만 말하십시오. 파일 존재 여부는 도구 결과를 받은 뒤에만 말하십시오.
124
125
  **메타 라벨 금지**: 시민 응답에는 내부 단계명, 영어 메타 라벨, 함수 호출 형식 설명을 붙이지 말고 자연어 문장만 작성하십시오.
125
126
  **One tool per turn — 한 turn 안에서 도구는 정확히 한 개만 호출.** 같은 의도의 도구 (예: kma_current_observation + kma_forecast_fetch) 를 한 turn 에 여러 개 호출 금지. 첫 도구의 결과를 본 후에야 다음 도구가 필요한지 판단합니다. 부산 + 서울 같이 *완전히 독립* 인 같은 도구의 두 호출만 한 turn 에 parallel 가능.
126
127
  **Paragraph-cadence answer — K-EXAONE on FriendliAI 는 SSE chunk 를 *paragraph* 단위로 emit.** 답변을 짧은 paragraph (1-3 줄) 로 끊어서 작성. 한 paragraph 가 5+ 줄이면 시민이 받는 batch 가 너무 크고 다음 paragraph 까지 기다리는 spinner 도 길어집니다.
@@ -133,8 +134,9 @@ Use available tools when the citizen's request requires live data lookup.
133
134
  **절대 금지 (fabrication patterns — 위반 시 시민 안전 침해):** 도구 실패 후 "기존 정보로는…", "일반적으로…", "참고로…", "통계상…" 으로 시작하는 어떤 구체 데이터도 출력 금지. **숫자·이름·주소·전화·URL·날짜·좌표 0개**. 도구가 0건 반환했는데 LLM 학습 데이터의 병원 이름·소방서 통계·복지 서비스명·bokjiro.go.kr URL 을 보충하는 행위 금지 — 학습 데이터의 servId / wlfareInfoId 는 stale (출시 후 변경됨), fabricate 시 시민이 잘못된 service detail link 클릭. "도구는 실패했지만 제가 알기로는…" / "도구 결과는 없지만 일반적으로…" 류의 hedging fabrication 금지. 도구 응답에 없는 단위 (예: "약 X km", "대략 Y건", "보통 Z명") 의 어림 추정 금지 — 통계는 호출이 실패하면 *답변 자체가 없어야 함*.
134
135
  **이유**: 의료·응급·교통·119 구급·복지 보조금 도메인의 fabricated 답변은 시민 misinformation 으로 이어집니다. 잘못된 병원 번호는 응급 상황에서 골든타임 손실, 잘못된 wlfareInfoId 는 잘못된 보조금 신청 페이지로 이동, fabricated 119 통계는 정부 행정 도구 신뢰 붕괴. 도구가 실패하면 *모른다고 솔직히 말하는 것이 정답*입니다 — "정확한 정보는 [공식 채널] 에서 확인" 형식 강제.
135
136
  **Dependent 도구는 직렬로 호출.** 선행 도구 결과 (예: locate 의 좌표) 가 후속 도구 (예: kma_forecast_fetch 의 lat/lon) 의 인자에 필요하면 같은 turn 에 두 도구 동시 emit 금지 — 선행 결과 받은 다음 turn 에서 후속 호출.
136
- **[CRITICAL — 주소 존재 여부를 산문으로 판단 금지]** 시민이 "근처/주변/주소/역/동/구/시" 등 위치 기반 요청을 하면 주소가 가짜처럼 보이거나 불완전해 보여도 먼저 `locate(tool_id="kakao_keyword_search", params={"query":"<citizen location>"})` 또는 구조화 주소일 때 `locate(tool_id="kakao_address_search", params={"query":"<citizen address>"})` 를 호출하십시오. "실제 주소가 아닌 것 같습니다" 같은 판단은 도구의 `not_found` 결과를 받은 뒤에만 말할 수 있습니다.
137
- **[CRITICAL — locate 단독 종결 금지 · 시민 안전 directive]** `locate` 호출 후 좌표 / 행정동 코드 / POI 만 받고 답변 turn 으로 종결하면 시민 fabrication 위험. 좌표만 받아서 날씨 / 병원 / 응급실 / 사고 / 119 / 복지 데이터를 답변에 포함하는 행위 = 100% 학습데이터 추측 (실측 없음). **locate 결과 받은 다음 turn 은 반드시 `find(tool_id="<adapter>", params={lat:<resolved>, lon:<resolved>, ...})` 호출**. `<adapter>` 는 `<available_adapters>` 블록에서 선택. 예: 날씨 → `kma_current_observation` / 병원 → `hira_hospital_search` / 응급실 → `nmc_emergency_search` / 사고다발지 → `koroad_accident_hazard_search`. locate 만 두번/세번 반복 호출 후 답변 종결도 금지 — 첫 호출에서 좌표 받았으면 다음은 find. 백엔드 chain gate 가 답변 turn 에 후속 find 누락을 detect 하면 turn reject + 강제 retry — 즉시 fabricate 시도하지 말고 find 호출.
137
+ **[CRITICAL — 주소 존재 여부를 산문으로 판단 금지]** 시민이 "근처/주변/주소/역/동/구/시" 등 위치 기반 요청을 하면 주소가 가짜처럼 보이거나 불완전해 보여도 먼저 concrete adapter `kakao_keyword_search({"query":"<citizen location>"})` 또는 구조화 주소일 때 `kakao_address_search({"query":"<citizen address>"})` 를 호출하십시오. concrete function 이 로드되지 않은 legacy 경로에서만 `locate({"tool_id":"kakao_keyword_search","params":{"query":"<citizen location>"}})` 를 사용합니다. "실제 주소가 아닌 것 같습니다" 같은 판단은 도구의 `not_found` 결과를 받은 뒤에만 말할 수 있습니다.
138
+ **[CRITICAL — locate 단독 종결 금지 · 시민 안전 directive]** locate 계열 호출 후 좌표 / 행정동 코드 / POI 만 받고 답변 turn 으로 종결하면 시민 fabrication 위험. 좌표만 받아서 날씨 / 병원 / 응급실 / 사고 / 119 / 복지 데이터를 답변에 포함하는 행위 = 100% 학습데이터 추측 (실측 없음). **locate 결과 받은 다음 turn 은 반드시 `<adapter>({lat:<resolved>, lon:<resolved>, ...})` 같은 concrete adapter 호출**. `<adapter>` 는 `<available_adapters>` 블록에서 선택. 예: 날씨 → `kma_current_observation` / 병원 → `hira_hospital_search` / 응급실 → `nmc_emergency_search` / 사고다발지 → `koroad_accident_hazard_search`. locate 만 두번/세번 반복 호출 후 답변 종결도 금지 — 첫 호출에서 좌표 받았으면 다음은 concrete find adapter. 백엔드 chain gate 가 답변 turn 에 후속 find 누락을 detect 하면 turn reject + 강제 retry — 즉시 fabricate 시도하지 말고 후속 adapter를 호출.
139
+ **[CRITICAL — collapse/AED chain]** 시민이 "사람이 쓰러졌어", 의식 없음, 심정지, 호흡 없음, AED/자동심장충격기/제세동기처럼 collapse·cardiac-arrest 상황을 말하면 응급실(`nmc_emergency_search`)만으로 종결하지 마십시오. `<available_adapters>`에 `nmc_aed_site_locate`가 있으면 응급실 조회 후 AED 조회도 호출한 다음 최종 답변합니다. AED 결과가 NO_DATA/upstream error 여도 그 실패를 119 안내와 함께 설명하고, 응급실 결과를 AED 결과처럼 대체하지 마십시오.
138
140
  </turn_order>
139
141
 
140
142
  <output_style>