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
|
@@ -12,6 +12,8 @@ depending on the source-tree layout:
|
|
|
12
12
|
* ``checklist_manifest.yaml`` — 50-row plugin validation checklist.
|
|
13
13
|
Loaded by :mod:`ummaya.plugins.checks.framework` and the
|
|
14
14
|
``ummaya-plugin-validate`` CLI.
|
|
15
|
+
* ``document-tools.schema.json`` — Public AX document harness tool
|
|
16
|
+
contract. Loaded by :mod:`ummaya.tools.documents.contracts`.
|
|
15
17
|
|
|
16
18
|
The mapping is in pyproject.toml under
|
|
17
19
|
``[tool.hatch.build.targets.wheel.force-include]``.
|
|
@@ -20,6 +20,8 @@ import json
|
|
|
20
20
|
import logging
|
|
21
21
|
from typing import TYPE_CHECKING
|
|
22
22
|
|
|
23
|
+
from ummaya.context.attachments import AttachmentCollector
|
|
24
|
+
from ummaya.context.budget import BudgetEstimator
|
|
23
25
|
from ummaya.context.compact_models import CompactionConfig, CompactionResult
|
|
24
26
|
from ummaya.context.models import (
|
|
25
27
|
AssembledContext,
|
|
@@ -57,6 +59,10 @@ class ContextBuilder:
|
|
|
57
59
|
self._registry = registry
|
|
58
60
|
self._compaction_config = compaction_config
|
|
59
61
|
self._assembler = SystemPromptAssembler()
|
|
62
|
+
self._attachment_collector = AttachmentCollector(config=self._config)
|
|
63
|
+
self._budget_estimator = BudgetEstimator()
|
|
64
|
+
self._core_tool_defs_cache_key: tuple[str, ...] | None = None
|
|
65
|
+
self._core_tool_defs_cache: list[dict[str, object]] = []
|
|
60
66
|
|
|
61
67
|
# Cached assembled ChatMessage (set on first build_system_message() call).
|
|
62
68
|
self._system_message: ChatMessage | None = None
|
|
@@ -106,11 +112,7 @@ class ContextBuilder:
|
|
|
106
112
|
``ContextLayer(role='user', layer_name='turn_attachment', content=…)``
|
|
107
113
|
or ``None`` when no attachment content exists.
|
|
108
114
|
"""
|
|
109
|
-
|
|
110
|
-
from ummaya.context.attachments import AttachmentCollector # noqa: PLC0415
|
|
111
|
-
|
|
112
|
-
collector = AttachmentCollector(config=self._config)
|
|
113
|
-
collected = collector.collect(state=state, api_health=api_health)
|
|
115
|
+
collected = self._attachment_collector.collect(state=state, api_health=api_health)
|
|
114
116
|
if collected is None:
|
|
115
117
|
return None
|
|
116
118
|
return ContextLayer(role="user", layer_name="turn_attachment", content=collected)
|
|
@@ -161,15 +163,12 @@ class ContextBuilder:
|
|
|
161
163
|
tool_definitions = self._build_tool_definitions(state)
|
|
162
164
|
|
|
163
165
|
# --- Budget (US4) ---
|
|
164
|
-
from ummaya.context.budget import BudgetEstimator # noqa: PLC0415
|
|
165
|
-
|
|
166
|
-
estimator = BudgetEstimator()
|
|
167
166
|
assembled_no_budget = AssembledContext(
|
|
168
167
|
system_layer=system_layer,
|
|
169
168
|
turn_attachment=turn_attachment,
|
|
170
169
|
tool_definitions=tool_definitions,
|
|
171
170
|
)
|
|
172
|
-
budget =
|
|
171
|
+
budget = self._budget_estimator.estimate(
|
|
173
172
|
context=assembled_no_budget,
|
|
174
173
|
hard_limit=hard_limit,
|
|
175
174
|
soft_limit=int(hard_limit * 0.80),
|
|
@@ -232,8 +231,15 @@ class ContextBuilder:
|
|
|
232
231
|
if self._registry is None:
|
|
233
232
|
return []
|
|
234
233
|
|
|
235
|
-
# Core prefix (deterministic, sorted by id — FR-004)
|
|
236
|
-
|
|
234
|
+
# Core prefix (deterministic, sorted by id — FR-004). Core tool
|
|
235
|
+
# schemas are stable across turns, so cache the expensive Pydantic JSON
|
|
236
|
+
# schema export and invalidate only when the active core id set changes.
|
|
237
|
+
core_tools = self._registry.core_tools()
|
|
238
|
+
core_cache_key = tuple(tool.id for tool in core_tools)
|
|
239
|
+
if core_cache_key != self._core_tool_defs_cache_key:
|
|
240
|
+
self._core_tool_defs_cache = [tool.to_openai_tool() for tool in core_tools]
|
|
241
|
+
self._core_tool_defs_cache_key = core_cache_key
|
|
242
|
+
core_defs = self._core_tool_defs_cache
|
|
237
243
|
|
|
238
244
|
# Situational suffix (dynamic, sorted by id — FR-004)
|
|
239
245
|
situational_defs: list[dict[str, object]] = []
|
|
@@ -8,7 +8,6 @@ the standalone ``query()`` async generator.
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
-
import json
|
|
12
11
|
import logging
|
|
13
12
|
from collections.abc import AsyncIterator
|
|
14
13
|
from typing import TYPE_CHECKING
|
|
@@ -20,59 +19,20 @@ from ummaya.engine.models import QueryContext, QueryState, SessionBudget
|
|
|
20
19
|
from ummaya.engine.query import query
|
|
21
20
|
from ummaya.llm.client import LLMClient
|
|
22
21
|
from ummaya.llm.models import ChatMessage
|
|
23
|
-
from ummaya.tools.errors import ToolNotFoundError
|
|
24
22
|
from ummaya.tools.executor import ToolExecutor
|
|
25
23
|
from ummaya.tools.registry import ToolRegistry
|
|
24
|
+
from ummaya.tools.routing import (
|
|
25
|
+
RouteDecisionService,
|
|
26
|
+
build_available_adapters_projection,
|
|
27
|
+
selected_concrete_adapter_tools,
|
|
28
|
+
)
|
|
26
29
|
|
|
27
30
|
if TYPE_CHECKING:
|
|
28
31
|
from ummaya.permissions.models import SessionContext
|
|
29
32
|
|
|
30
33
|
logger = logging.getLogger(__name__)
|
|
31
34
|
|
|
32
|
-
|
|
33
|
-
{
|
|
34
|
-
"adm_cd",
|
|
35
|
-
"admcd",
|
|
36
|
-
"admin_code",
|
|
37
|
-
"administrative_code",
|
|
38
|
-
"latitude",
|
|
39
|
-
"lat",
|
|
40
|
-
"longitude",
|
|
41
|
-
"lon",
|
|
42
|
-
"lng",
|
|
43
|
-
"nx",
|
|
44
|
-
"ny",
|
|
45
|
-
"region_cd",
|
|
46
|
-
"region_code",
|
|
47
|
-
}
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def _schema_requires_location_resolution(
|
|
52
|
-
input_schema_json: object,
|
|
53
|
-
required_params: object,
|
|
54
|
-
) -> bool:
|
|
55
|
-
"""Return True when an adapter schema needs prior locate output."""
|
|
56
|
-
|
|
57
|
-
return _contains_location_dependent_key(input_schema_json) or _contains_location_dependent_key(
|
|
58
|
-
required_params
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def _contains_location_dependent_key(value: object) -> bool:
|
|
63
|
-
"""Recursively detect coordinate/admin-code schema fields."""
|
|
64
|
-
|
|
65
|
-
if isinstance(value, dict):
|
|
66
|
-
for key, nested in value.items():
|
|
67
|
-
if str(key).lower() in _LOCATION_DEPENDENT_SCHEMA_KEYS:
|
|
68
|
-
return True
|
|
69
|
-
if _contains_location_dependent_key(nested):
|
|
70
|
-
return True
|
|
71
|
-
elif isinstance(value, list):
|
|
72
|
-
return any(_contains_location_dependent_key(item) for item in value)
|
|
73
|
-
elif isinstance(value, str):
|
|
74
|
-
return value.lower() in _LOCATION_DEPENDENT_SCHEMA_KEYS
|
|
75
|
-
return False
|
|
35
|
+
_INTERNAL_CONTEXT_TOOL_IDS = frozenset({"find", "locate", "check", "send", "search_tools"})
|
|
76
36
|
|
|
77
37
|
|
|
78
38
|
class QueryEngine:
|
|
@@ -279,82 +239,39 @@ class QueryEngine:
|
|
|
279
239
|
"""Build dynamic adapter context and per-turn concrete tool exposure."""
|
|
280
240
|
|
|
281
241
|
try:
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
candidates = search(
|
|
242
|
+
decision = RouteDecisionService(self._tool_registry).select_adapters(
|
|
285
243
|
user_message,
|
|
286
|
-
self._tool_registry.bm25_index,
|
|
287
|
-
self._tool_registry,
|
|
288
244
|
top_k=15,
|
|
245
|
+
max_selected=5,
|
|
289
246
|
)
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
selected_tool_ids: list[str] = []
|
|
296
|
-
primary_find_without_location = False
|
|
297
|
-
visible_count = 0
|
|
298
|
-
for candidate in candidates:
|
|
299
|
-
try:
|
|
300
|
-
tool = self._tool_registry.find(candidate.tool_id)
|
|
301
|
-
except ToolNotFoundError:
|
|
302
|
-
continue
|
|
303
|
-
if candidate.score <= 0:
|
|
304
|
-
continue
|
|
305
|
-
if tool.is_core or tool.ministry == "UMMAYA":
|
|
306
|
-
continue
|
|
307
|
-
primitive = candidate.primitive if isinstance(candidate.primitive, str) else None
|
|
308
|
-
requires_location = _schema_requires_location_resolution(
|
|
309
|
-
candidate.input_schema_json,
|
|
310
|
-
candidate.required_params,
|
|
311
|
-
)
|
|
312
|
-
primary_find_without_location = primary_find_without_location or (
|
|
313
|
-
visible_count == 0 and primitive == "find" and not requires_location
|
|
247
|
+
concrete_tools = selected_concrete_adapter_tools(
|
|
248
|
+
decision,
|
|
249
|
+
self._tool_registry,
|
|
250
|
+
exclude_tool_ids=_INTERNAL_CONTEXT_TOOL_IDS,
|
|
251
|
+
max_tools=5,
|
|
314
252
|
)
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
sort_keys=True,
|
|
253
|
+
tool_ids = tuple(tool.id for tool in concrete_tools)
|
|
254
|
+
if not tool_ids:
|
|
255
|
+
return None, ()
|
|
256
|
+
projection_level = (
|
|
257
|
+
decision.schema_projection_level if decision.selected_tools else "summary"
|
|
321
258
|
)
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
f" input_schema_json: {schema_json}",
|
|
330
|
-
f" call_hint: {candidate.tool_id}({{...}})",
|
|
331
|
-
f" policy_url: {candidate.real_classification_url or ''}",
|
|
332
|
-
]
|
|
259
|
+
projection = build_available_adapters_projection(
|
|
260
|
+
decision,
|
|
261
|
+
self._tool_registry,
|
|
262
|
+
query=user_message,
|
|
263
|
+
projection_level=projection_level,
|
|
264
|
+
max_visible=len(tool_ids),
|
|
265
|
+
visible_tool_ids=tool_ids,
|
|
333
266
|
)
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
267
|
+
except Exception: # noqa: BLE001
|
|
268
|
+
logger.exception("available_adapters auto-inject failed")
|
|
269
|
+
return None, ()
|
|
337
270
|
|
|
338
|
-
if
|
|
271
|
+
if projection.content is None:
|
|
339
272
|
return None, ()
|
|
340
273
|
|
|
341
|
-
|
|
342
|
-
[
|
|
343
|
-
"<available_adapters>",
|
|
344
|
-
"Use these adapter candidates for this citizen request. "
|
|
345
|
-
"Call the function named exactly as tool_id with that adapter's "
|
|
346
|
-
"schema arguments. Do not wrap adapter calls in root primitives "
|
|
347
|
-
"such as find({tool_id, params}), locate({tool_id, params}), "
|
|
348
|
-
"check({tool_id, params}), or send({tool_id, params}). "
|
|
349
|
-
"Do not call locate just because the citizen text contains a "
|
|
350
|
-
"city/province name; treat that as the dataset/filter term. "
|
|
351
|
-
"Call locate only when the selected adapter schema requires "
|
|
352
|
-
"coordinates, administrative codes, or a place-to-region conversion.",
|
|
353
|
-
*adapter_lines,
|
|
354
|
-
"</available_adapters>",
|
|
355
|
-
]
|
|
356
|
-
)
|
|
357
|
-
return ChatMessage(role="system", content=content), tuple(selected_tool_ids)
|
|
274
|
+
return ChatMessage(role="system", content=projection.content), tool_ids
|
|
358
275
|
|
|
359
276
|
def set_permission_session(self, session: SessionContext | None) -> None:
|
|
360
277
|
"""Update the permission-pipeline session used for subsequent turns.
|
|
@@ -424,6 +424,11 @@ async def _dispatch_root_primitive(
|
|
|
424
424
|
error=f"{primitive} cannot target itself.",
|
|
425
425
|
error_type="validation",
|
|
426
426
|
)
|
|
427
|
+
params = _normalize_root_primitive_adapter_params(
|
|
428
|
+
primitive=primitive,
|
|
429
|
+
target_tool_id=target_tool_id,
|
|
430
|
+
params=params,
|
|
431
|
+
)
|
|
427
432
|
|
|
428
433
|
request_id = tc.id or f"{primitive}-call"
|
|
429
434
|
if primitive == "find":
|
|
@@ -452,6 +457,21 @@ async def _dispatch_root_primitive(
|
|
|
452
457
|
return ToolResult(tool_id=primitive, success=True, data=data)
|
|
453
458
|
|
|
454
459
|
|
|
460
|
+
def _normalize_root_primitive_adapter_params(
|
|
461
|
+
*,
|
|
462
|
+
primitive: str,
|
|
463
|
+
target_tool_id: str,
|
|
464
|
+
params: dict[str, object],
|
|
465
|
+
) -> dict[str, object]:
|
|
466
|
+
"""Remove wrapper metadata accidentally duplicated inside adapter params."""
|
|
467
|
+
nested_tool_id = params.get("tool_id")
|
|
468
|
+
if nested_tool_id == target_tool_id:
|
|
469
|
+
return {key: value for key, value in params.items() if key != "tool_id"}
|
|
470
|
+
if target_tool_id == primitive and isinstance(nested_tool_id, str):
|
|
471
|
+
return {key: value for key, value in params.items() if key != "tool_id"}
|
|
472
|
+
return params
|
|
473
|
+
|
|
474
|
+
|
|
455
475
|
async def _dispatch_concrete_adapter(
|
|
456
476
|
tc: ToolCall,
|
|
457
477
|
primitive: str,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
"""Evidence Fabric v2 public API."""
|
|
3
|
+
|
|
4
|
+
from ummaya.evidence.dataset_contract import EvidenceContractError
|
|
5
|
+
from ummaya.evidence.models import (
|
|
6
|
+
EvidenceGate,
|
|
7
|
+
EvidenceStatus,
|
|
8
|
+
RunEvidence,
|
|
9
|
+
)
|
|
10
|
+
from ummaya.evidence.runner import run_dataset
|
|
11
|
+
from ummaya.evidence.source_provenance import (
|
|
12
|
+
SourceProvenanceDecision,
|
|
13
|
+
SourceProvenanceLedger,
|
|
14
|
+
SourceProvenanceRecord,
|
|
15
|
+
SourceRedactionMetadata,
|
|
16
|
+
build_source_provenance_record,
|
|
17
|
+
)
|
|
18
|
+
from ummaya.evidence.task_registry import (
|
|
19
|
+
EvidenceDatasetRef,
|
|
20
|
+
EvidenceTask,
|
|
21
|
+
EvidenceTaskRegistry,
|
|
22
|
+
TaskRegistryError,
|
|
23
|
+
load_task_registry,
|
|
24
|
+
)
|
|
25
|
+
from ummaya.evidence.tool_layer_models import ToolLayerEvidenceEvent
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
"EvidenceDatasetRef",
|
|
29
|
+
"EvidenceContractError",
|
|
30
|
+
"EvidenceGate",
|
|
31
|
+
"EvidenceStatus",
|
|
32
|
+
"EvidenceTask",
|
|
33
|
+
"EvidenceTaskRegistry",
|
|
34
|
+
"RunEvidence",
|
|
35
|
+
"SourceProvenanceDecision",
|
|
36
|
+
"SourceProvenanceLedger",
|
|
37
|
+
"SourceProvenanceRecord",
|
|
38
|
+
"SourceRedactionMetadata",
|
|
39
|
+
"TaskRegistryError",
|
|
40
|
+
"ToolLayerEvidenceEvent",
|
|
41
|
+
"build_source_provenance_record",
|
|
42
|
+
"load_task_registry",
|
|
43
|
+
"run_dataset",
|
|
44
|
+
]
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
"""Scenario dataset parsing for Evidence Fabric v2."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import assert_never
|
|
8
|
+
|
|
9
|
+
import yaml
|
|
10
|
+
from pydantic import BaseModel, ConfigDict, Field, ValidationError
|
|
11
|
+
|
|
12
|
+
from ummaya.evidence.json_types import JsonObject, JsonValue, parse_json_object
|
|
13
|
+
|
|
14
|
+
_REPO_ROOT = Path(__file__).resolve().parents[3]
|
|
15
|
+
DEFAULT_SCENARIO_PATH = _REPO_ROOT / "evidence/scenarios/national_ax_citizen_requests_v1.yaml"
|
|
16
|
+
DEFAULT_TASK_REGISTRY_PATH = _REPO_ROOT / "evidence/registry.yaml"
|
|
17
|
+
DEFAULT_DATASET_REF = "ummaya/national-ax-core@local"
|
|
18
|
+
BANNED_MODEL_VISIBLE_KEYS = frozenset(
|
|
19
|
+
{
|
|
20
|
+
"adapter_id",
|
|
21
|
+
"adapter_ids",
|
|
22
|
+
"adapter_family",
|
|
23
|
+
"expected_adapter_id",
|
|
24
|
+
"tool_id",
|
|
25
|
+
"tool_ids",
|
|
26
|
+
"expected_tool_id",
|
|
27
|
+
"expected_tool_ids",
|
|
28
|
+
"expected_adapter_family",
|
|
29
|
+
"expected_route_trace",
|
|
30
|
+
"route_trace",
|
|
31
|
+
"route_selection_assertion",
|
|
32
|
+
"route_selection_assertions",
|
|
33
|
+
"route_adapter_family",
|
|
34
|
+
"selected_adapter_family",
|
|
35
|
+
"selected_adapter_id",
|
|
36
|
+
"selected_tool",
|
|
37
|
+
"selected_tool_id",
|
|
38
|
+
"selected_tool_ids",
|
|
39
|
+
"selected_tools",
|
|
40
|
+
"fixture_refs",
|
|
41
|
+
"fixture_ref",
|
|
42
|
+
"current_adapter_id",
|
|
43
|
+
"assertion_events",
|
|
44
|
+
"assertion_kind",
|
|
45
|
+
"argument_feasibility",
|
|
46
|
+
"clarification_expected",
|
|
47
|
+
"clarification_reason",
|
|
48
|
+
"correlation_id",
|
|
49
|
+
"coverage_tags",
|
|
50
|
+
"evidence_events",
|
|
51
|
+
"expected_domain",
|
|
52
|
+
"expected_primitives",
|
|
53
|
+
"failure_recovery",
|
|
54
|
+
"manifest_hash",
|
|
55
|
+
"prompt_manifest_hash",
|
|
56
|
+
"query_hash",
|
|
57
|
+
"route_source",
|
|
58
|
+
"selected_domain",
|
|
59
|
+
"selected_primitives",
|
|
60
|
+
"status",
|
|
61
|
+
"stop_reason",
|
|
62
|
+
"tool_catalog_hash",
|
|
63
|
+
"trace_id",
|
|
64
|
+
"trace_kind",
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
REQUIRED_DOMAINS = frozenset(
|
|
68
|
+
{
|
|
69
|
+
"tax",
|
|
70
|
+
"civil_affairs",
|
|
71
|
+
"payments",
|
|
72
|
+
"utilities",
|
|
73
|
+
"identity",
|
|
74
|
+
"welfare",
|
|
75
|
+
"healthcare",
|
|
76
|
+
"housing",
|
|
77
|
+
"mobility",
|
|
78
|
+
"business",
|
|
79
|
+
"labor",
|
|
80
|
+
"education",
|
|
81
|
+
"safety",
|
|
82
|
+
"immigration",
|
|
83
|
+
"legal",
|
|
84
|
+
"personal_data",
|
|
85
|
+
"public_data",
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class EvidenceContractError(ValueError):
|
|
91
|
+
"""Raised when a scenario dataset violates the Evidence Fabric contract."""
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class ExpectedStep(BaseModel):
|
|
95
|
+
"""One expected public-service loop step in a scenario."""
|
|
96
|
+
|
|
97
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
98
|
+
|
|
99
|
+
primitive: str
|
|
100
|
+
purpose: str
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class PermissionRequirements(BaseModel):
|
|
104
|
+
"""Permission requirements attached to a citizen scenario."""
|
|
105
|
+
|
|
106
|
+
model_config = ConfigDict(frozen=True, extra="allow")
|
|
107
|
+
|
|
108
|
+
identity_assurance: str
|
|
109
|
+
user_confirmations: tuple[str, ...] = Field(default_factory=tuple)
|
|
110
|
+
sensitive_data: tuple[str, ...] = Field(default_factory=tuple)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class Scenario(BaseModel):
|
|
114
|
+
"""Minimum scenario shape needed by Evidence Fabric v2."""
|
|
115
|
+
|
|
116
|
+
model_config = ConfigDict(frozen=True, extra="allow")
|
|
117
|
+
|
|
118
|
+
id: str
|
|
119
|
+
priority: str = "P2"
|
|
120
|
+
lifecycle_domain: str
|
|
121
|
+
request_ko: str
|
|
122
|
+
request_en: str | None = None
|
|
123
|
+
agencies_or_infrastructure: tuple[str, ...] = Field(default_factory=tuple)
|
|
124
|
+
citizen_intent_verbs: tuple[str, ...] = Field(default_factory=tuple)
|
|
125
|
+
expected_ax_chain: tuple[ExpectedStep, ...]
|
|
126
|
+
permission_requirements: PermissionRequirements
|
|
127
|
+
expected_system_behavior: tuple[str, ...] = Field(default_factory=tuple)
|
|
128
|
+
evaluation_focus: tuple[str, ...] = Field(default_factory=tuple)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class ScenarioDataset(BaseModel):
|
|
132
|
+
"""Versioned citizen-demand scenario dataset."""
|
|
133
|
+
|
|
134
|
+
model_config = ConfigDict(frozen=True, extra="allow")
|
|
135
|
+
|
|
136
|
+
version: int
|
|
137
|
+
dataset_id: str
|
|
138
|
+
source_basis: str | None = None
|
|
139
|
+
target_system: str | None = None
|
|
140
|
+
allowed_primitives: tuple[str, ...] = Field(default_factory=tuple)
|
|
141
|
+
coverage_domains: tuple[str, ...]
|
|
142
|
+
scenarios: tuple[Scenario, ...]
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def parse_dataset(path: Path) -> ScenarioDataset:
|
|
146
|
+
"""Parse and validate a scenario dataset file."""
|
|
147
|
+
raw = _load_yaml_mapping(path)
|
|
148
|
+
banned = _find_banned_keys(raw)
|
|
149
|
+
if banned:
|
|
150
|
+
raise EvidenceContractError(
|
|
151
|
+
"model-visible scenario dataset contains banned implementation keys: "
|
|
152
|
+
+ ", ".join(banned)
|
|
153
|
+
)
|
|
154
|
+
try:
|
|
155
|
+
return ScenarioDataset.model_validate(raw)
|
|
156
|
+
except ValidationError as exc:
|
|
157
|
+
raise EvidenceContractError(str(exc)) from exc
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def resolve_repo_path(path: Path) -> Path:
|
|
161
|
+
"""Resolve a repository-relative path from the Evidence Fabric root."""
|
|
162
|
+
return path if path.is_absolute() else _REPO_ROOT / path
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _load_yaml_mapping(path: Path) -> JsonObject:
|
|
166
|
+
if not path.exists():
|
|
167
|
+
raise EvidenceContractError(f"scenario dataset not found: {path}")
|
|
168
|
+
loaded = yaml.safe_load(path.read_text(encoding="utf-8"))
|
|
169
|
+
try:
|
|
170
|
+
return parse_json_object(loaded)
|
|
171
|
+
except ValidationError as exc:
|
|
172
|
+
raise EvidenceContractError(f"scenario dataset must be a JSON mapping: {path}") from exc
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _find_banned_keys(value: JsonValue, path: str = "$") -> tuple[str, ...]:
|
|
176
|
+
match value:
|
|
177
|
+
case dict():
|
|
178
|
+
hits: list[str] = []
|
|
179
|
+
for key, nested in value.items():
|
|
180
|
+
nested_path = f"{path}.{key}"
|
|
181
|
+
if key in BANNED_MODEL_VISIBLE_KEYS:
|
|
182
|
+
hits.append(nested_path)
|
|
183
|
+
hits.extend(_find_banned_keys(nested, nested_path))
|
|
184
|
+
return tuple(hits)
|
|
185
|
+
case list():
|
|
186
|
+
hits = []
|
|
187
|
+
for index, nested in enumerate(value):
|
|
188
|
+
hits.extend(_find_banned_keys(nested, f"{path}[{index}]"))
|
|
189
|
+
return tuple(hits)
|
|
190
|
+
case str() | int() | float() | bool() | None:
|
|
191
|
+
return ()
|
|
192
|
+
case unreachable:
|
|
193
|
+
assert_never(unreachable)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Literal
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, ConfigDict
|
|
7
|
+
|
|
8
|
+
DocumentAuthoringScenarioClass = Literal[
|
|
9
|
+
"public_form_completion",
|
|
10
|
+
"narrative_authoring",
|
|
11
|
+
"unsupported_plausible_writing",
|
|
12
|
+
"protected_field",
|
|
13
|
+
"direct_hwp_path",
|
|
14
|
+
"render_comparison",
|
|
15
|
+
]
|
|
16
|
+
DocumentAuthoringStatus = Literal["ready_for_review", "needs_input", "blocked"]
|
|
17
|
+
DocumentHwpDirectWriteState = Literal["blocked", "promoted", "not_applicable"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DocumentAuthoringCase(BaseModel):
|
|
21
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
22
|
+
|
|
23
|
+
case_id: str
|
|
24
|
+
scenario_class: DocumentAuthoringScenarioClass
|
|
25
|
+
correlation_id: str
|
|
26
|
+
expected_status: DocumentAuthoringStatus
|
|
27
|
+
requires_socratic_loop: bool
|
|
28
|
+
requires_user_approval: bool
|
|
29
|
+
mutation_allowed: bool
|
|
30
|
+
render_comparison_required: bool
|
|
31
|
+
hwp_direct_write_state: DocumentHwpDirectWriteState = "not_applicable"
|
|
32
|
+
fixture_id: str | None = None
|
|
33
|
+
evidence_ref: str
|