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