ummaya 0.2.4 → 0.2.6
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 +15 -2
- package/bin/ummaya +10 -1
- package/bun.lock +180 -244
- package/npm-shrinkwrap.json +760 -1760
- package/package.json +39 -22
- package/prompts/manifest.yaml +1 -1
- package/prompts/system_v1.md +1 -0
- package/pyproject.toml +27 -2
- package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
- package/src/ummaya/_canonical/__init__.py +2 -0
- package/src/ummaya/_canonical/baselines.yaml +113 -0
- package/src/ummaya/engine/engine.py +29 -132
- package/src/ummaya/evidence/__init__.py +21 -2
- 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 +88 -1
- 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 +81 -212
- package/src/ummaya/evidence/source_provenance.py +246 -0
- package/src/ummaya/evidence/source_provenance_redaction.py +176 -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 +5 -5
- package/src/ummaya/ipc/route_diagnostics.py +73 -0
- package/src/ummaya/ipc/stdio.py +1109 -477
- package/src/ummaya/llm/client.py +102 -3
- package/src/ummaya/llm/config.py +8 -3
- 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 +17 -1
- 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 +132 -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 +29 -0
- package/src/ummaya/tools/live_proxy.py +0 -3
- package/src/ummaya/tools/models.py +5 -1
- package/src/ummaya/tools/register_all.py +8 -0
- package/src/ummaya/tools/registry.py +10 -1
- 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 +34 -746
- package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
- package/tui/bun.lock +126 -305
- package/tui/package.json +35 -22
- package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
- package/tui/src/QueryEngine.ts +12 -8
- package/tui/src/bridge/inboundAttachments.ts +3 -3
- package/tui/src/cli/handlers/auth.ts +3 -12
- package/tui/src/cli/handlers/mcp.tsx +0 -1
- package/tui/src/cli/print.ts +8 -9
- package/tui/src/commands/insights.ts +1 -1
- package/tui/src/commands/install-github-app/types.ts +8 -30
- package/tui/src/commands/plugin/types.ts +6 -28
- package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
- package/tui/src/commands/rename/generateSessionName.ts +1 -1
- 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/ScrollKeybindingHandler.tsx +6 -6
- package/tui/src/components/Spinner/types.ts +6 -28
- 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/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 +3 -3
- package/tui/src/ipc/frames.generated.ts +12 -12
- package/tui/src/ipc/llmClient.ts +151 -27
- package/tui/src/ipc/schema/frame.schema.json +1 -1
- package/tui/src/keybindings/defaultBindings.ts +4 -0
- package/tui/src/main.tsx +32 -15
- 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 -2186
- package/tui/src/screens/REPL.tsx +40 -29
- 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 +65 -2
- 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 -418
- 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/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 +1207 -714
- 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 +25 -32
- package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
- 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 +1 -11
- 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 +27 -10
- 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 +2 -1
- 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/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/pendingCallRegistry.ts +1 -6
- package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -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 +55 -860
- 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/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/claudeDesktop.ts +4 -4
- 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/mcp/dateTimeParser.ts +1 -1
- package/tui/src/utils/messages.ts +18 -0
- package/tui/src/utils/migrateSessions.ts +3 -3
- package/tui/src/utils/model/model.ts +6 -6
- 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/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/permissionValidation.ts +14 -2
- package/tui/src/utils/shell/prefix.ts +1 -1
- package/tui/src/utils/sideQuery.ts +1 -1
- package/tui/src/utils/systemThemeWatcher.ts +13 -3
- package/tui/src/utils/teleport.tsx +1 -1
- package/uv.lock +426 -45
- package/tui/src/services/api/claude.ts +0 -3540
- package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
- package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
- package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
- package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
- package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
- package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
"""Public-form conformance validation for extracted document artifacts."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import hashlib
|
|
7
|
+
from decimal import Decimal
|
|
8
|
+
|
|
9
|
+
from ummaya.tools.documents.baselines import (
|
|
10
|
+
BaselineTableGeometry,
|
|
11
|
+
BaselineTextAnchor,
|
|
12
|
+
ConformanceBaseline,
|
|
13
|
+
)
|
|
14
|
+
from ummaya.tools.documents.models import (
|
|
15
|
+
BlockedReason,
|
|
16
|
+
DocumentExtraction,
|
|
17
|
+
DocumentToolResult,
|
|
18
|
+
PublicFormValidationReport,
|
|
19
|
+
ToolResultStatus,
|
|
20
|
+
ValidationDecision,
|
|
21
|
+
ValidationFinding,
|
|
22
|
+
ValidationReadiness,
|
|
23
|
+
)
|
|
24
|
+
from ummaya.tools.documents.scorecard import compute_public_form_metrics, table_shape
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def validate_public_form(
|
|
28
|
+
extraction: DocumentExtraction,
|
|
29
|
+
*,
|
|
30
|
+
baseline: ConformanceBaseline,
|
|
31
|
+
artifact_id: str,
|
|
32
|
+
correlation_id: str,
|
|
33
|
+
round_trip_passed: bool = True,
|
|
34
|
+
render_passed: bool = True,
|
|
35
|
+
security_passed: bool = True,
|
|
36
|
+
) -> DocumentToolResult:
|
|
37
|
+
"""Validate one extracted derivative against a public-form baseline."""
|
|
38
|
+
if not baseline.supports_conformance:
|
|
39
|
+
finding = _finding(
|
|
40
|
+
code="unsupported_for_conformance",
|
|
41
|
+
message=baseline.unsupported_reason or "Public-form conformance is not supported.",
|
|
42
|
+
anchor=f"template:{baseline.template_id}",
|
|
43
|
+
remediation_hint="Use a promoted editable format with conformance evidence.",
|
|
44
|
+
)
|
|
45
|
+
report = _report(
|
|
46
|
+
extraction,
|
|
47
|
+
baseline=baseline,
|
|
48
|
+
artifact_id=artifact_id,
|
|
49
|
+
findings=[finding],
|
|
50
|
+
decision=ValidationDecision.blocked,
|
|
51
|
+
readiness=ValidationReadiness.unsupported,
|
|
52
|
+
round_trip_passed=round_trip_passed,
|
|
53
|
+
render_passed=render_passed,
|
|
54
|
+
security_passed=security_passed,
|
|
55
|
+
)
|
|
56
|
+
return _result(
|
|
57
|
+
report,
|
|
58
|
+
status=ToolResultStatus.blocked,
|
|
59
|
+
blocked_reason=BlockedReason.unsupported_operation,
|
|
60
|
+
summary="Public-form validation blocked: conformance is unsupported.",
|
|
61
|
+
correlation_id=correlation_id,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
findings = _hard_rule_findings(extraction, baseline)
|
|
65
|
+
if not security_passed:
|
|
66
|
+
findings.append(
|
|
67
|
+
_finding(
|
|
68
|
+
code="security_check_failed",
|
|
69
|
+
message="Security validation failed before public-form readiness.",
|
|
70
|
+
anchor=f"artifact:{artifact_id}",
|
|
71
|
+
remediation_hint="Resolve document security findings before validation.",
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
if not round_trip_passed:
|
|
75
|
+
findings.append(
|
|
76
|
+
_finding(
|
|
77
|
+
code="round_trip_mismatch",
|
|
78
|
+
message="Round-trip extraction did not match intended document values.",
|
|
79
|
+
anchor=f"artifact:{artifact_id}",
|
|
80
|
+
remediation_hint="Re-read the derivative and repair mismatched values.",
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
if not render_passed:
|
|
84
|
+
findings.append(
|
|
85
|
+
_finding(
|
|
86
|
+
code="render_mismatch",
|
|
87
|
+
message="Rendered derivative evidence did not match the expected layout.",
|
|
88
|
+
anchor=f"artifact:{artifact_id}",
|
|
89
|
+
remediation_hint="Repair layout drift and regenerate render evidence.",
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
metrics = compute_public_form_metrics(extraction, baseline)
|
|
94
|
+
hard_failure = any(finding.severity == "hard_failure" for finding in findings)
|
|
95
|
+
decision, readiness = _decision(
|
|
96
|
+
aggregate_score=metrics.aggregate_score,
|
|
97
|
+
hard_failure=hard_failure,
|
|
98
|
+
round_trip_passed=round_trip_passed,
|
|
99
|
+
render_passed=render_passed,
|
|
100
|
+
security_passed=security_passed,
|
|
101
|
+
)
|
|
102
|
+
report = _report(
|
|
103
|
+
extraction,
|
|
104
|
+
baseline=baseline,
|
|
105
|
+
artifact_id=artifact_id,
|
|
106
|
+
findings=findings,
|
|
107
|
+
decision=decision,
|
|
108
|
+
readiness=readiness,
|
|
109
|
+
round_trip_passed=round_trip_passed,
|
|
110
|
+
render_passed=render_passed,
|
|
111
|
+
security_passed=security_passed,
|
|
112
|
+
)
|
|
113
|
+
if decision is ValidationDecision.pass_:
|
|
114
|
+
return _result(
|
|
115
|
+
report,
|
|
116
|
+
status=ToolResultStatus.ok,
|
|
117
|
+
blocked_reason=None,
|
|
118
|
+
summary="Public-form validation passed; artifact is ready for human review.",
|
|
119
|
+
correlation_id=correlation_id,
|
|
120
|
+
)
|
|
121
|
+
blocked_reason = (
|
|
122
|
+
BlockedReason.unsupported_operation
|
|
123
|
+
if readiness is ValidationReadiness.unsupported
|
|
124
|
+
else BlockedReason.validation_failed
|
|
125
|
+
)
|
|
126
|
+
return _result(
|
|
127
|
+
report,
|
|
128
|
+
status=ToolResultStatus.blocked,
|
|
129
|
+
blocked_reason=blocked_reason,
|
|
130
|
+
summary="Public-form validation failed; artifact is not ready.",
|
|
131
|
+
correlation_id=correlation_id,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _hard_rule_findings(
|
|
136
|
+
extraction: DocumentExtraction,
|
|
137
|
+
baseline: ConformanceBaseline,
|
|
138
|
+
) -> list[ValidationFinding]:
|
|
139
|
+
findings: list[ValidationFinding] = []
|
|
140
|
+
findings.extend(_required_field_findings(extraction, baseline))
|
|
141
|
+
findings.extend(
|
|
142
|
+
_required_text_findings(
|
|
143
|
+
extraction,
|
|
144
|
+
baseline.protected_text,
|
|
145
|
+
"protected_text_missing",
|
|
146
|
+
)
|
|
147
|
+
)
|
|
148
|
+
findings.extend(
|
|
149
|
+
_required_text_findings(
|
|
150
|
+
extraction,
|
|
151
|
+
baseline.required_labels,
|
|
152
|
+
"required_label_missing",
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
findings.extend(_table_geometry_findings(extraction, baseline.table_geometries))
|
|
156
|
+
findings.extend(
|
|
157
|
+
_required_text_findings(
|
|
158
|
+
extraction,
|
|
159
|
+
baseline.signature_regions,
|
|
160
|
+
"signature_or_seal_region_missing",
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
findings.extend(_metadata_findings(extraction, baseline))
|
|
164
|
+
return findings
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _required_field_findings(
|
|
168
|
+
extraction: DocumentExtraction,
|
|
169
|
+
baseline: ConformanceBaseline,
|
|
170
|
+
) -> list[ValidationFinding]:
|
|
171
|
+
by_field_id = {field.field_id: field for field in extraction.fields}
|
|
172
|
+
findings: list[ValidationFinding] = []
|
|
173
|
+
for required in baseline.required_fields:
|
|
174
|
+
observed = by_field_id.get(required.field_id)
|
|
175
|
+
if observed is None or observed.current_value in {None, ""}:
|
|
176
|
+
findings.append(
|
|
177
|
+
_finding(
|
|
178
|
+
code="required_field_missing",
|
|
179
|
+
message=f"Required field {required.label!r} is missing or empty.",
|
|
180
|
+
anchor=required.path,
|
|
181
|
+
remediation_hint=f"Fill the {required.label!r} field before export.",
|
|
182
|
+
)
|
|
183
|
+
)
|
|
184
|
+
return findings
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _required_text_findings(
|
|
188
|
+
extraction: DocumentExtraction,
|
|
189
|
+
expected: tuple[BaselineTextAnchor, ...],
|
|
190
|
+
code: str,
|
|
191
|
+
) -> list[ValidationFinding]:
|
|
192
|
+
observed_text = _combined_text(extraction)
|
|
193
|
+
findings: list[ValidationFinding] = []
|
|
194
|
+
for item in expected:
|
|
195
|
+
if item.text not in observed_text:
|
|
196
|
+
findings.append(
|
|
197
|
+
_finding(
|
|
198
|
+
code=code,
|
|
199
|
+
message=f"Required public-form text {item.text!r} is missing.",
|
|
200
|
+
anchor=item.anchor,
|
|
201
|
+
remediation_hint=f"Restore required text {item.text!r} at the baseline anchor.",
|
|
202
|
+
)
|
|
203
|
+
)
|
|
204
|
+
return findings
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _table_geometry_findings(
|
|
208
|
+
extraction: DocumentExtraction,
|
|
209
|
+
expected: tuple[BaselineTableGeometry, ...],
|
|
210
|
+
) -> list[ValidationFinding]:
|
|
211
|
+
tables_by_id = {table.block_id: table for table in extraction.tables}
|
|
212
|
+
findings: list[ValidationFinding] = []
|
|
213
|
+
for geometry in expected:
|
|
214
|
+
observed = tables_by_id.get(geometry.table_id)
|
|
215
|
+
observed_rows, observed_columns = table_shape(observed)
|
|
216
|
+
if observed_rows != geometry.rows or observed_columns != geometry.columns:
|
|
217
|
+
findings.append(
|
|
218
|
+
_finding(
|
|
219
|
+
code="table_geometry_mismatch",
|
|
220
|
+
message=(
|
|
221
|
+
f"Table {geometry.table_id!r} shape is "
|
|
222
|
+
f"{observed_rows}x{observed_columns}, expected "
|
|
223
|
+
f"{geometry.rows}x{geometry.columns}."
|
|
224
|
+
),
|
|
225
|
+
anchor=geometry.anchor,
|
|
226
|
+
remediation_hint="Restore the protected table row and column geometry.",
|
|
227
|
+
)
|
|
228
|
+
)
|
|
229
|
+
return findings
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _metadata_findings(
|
|
233
|
+
extraction: DocumentExtraction,
|
|
234
|
+
baseline: ConformanceBaseline,
|
|
235
|
+
) -> list[ValidationFinding]:
|
|
236
|
+
findings: list[ValidationFinding] = []
|
|
237
|
+
expected_metadata = dict(baseline.metadata_exact_matches)
|
|
238
|
+
if baseline.expected_page_count is not None:
|
|
239
|
+
expected_metadata["page_count"] = baseline.expected_page_count
|
|
240
|
+
for key, expected in expected_metadata.items():
|
|
241
|
+
observed = extraction.metadata.get(key)
|
|
242
|
+
if observed != expected:
|
|
243
|
+
findings.append(
|
|
244
|
+
_finding(
|
|
245
|
+
code="metadata_mismatch",
|
|
246
|
+
message=f"Metadata {key!r} is {observed!r}, expected {expected!r}.",
|
|
247
|
+
anchor=f"metadata:{key}",
|
|
248
|
+
remediation_hint=f"Restore metadata {key!r} to the baseline value.",
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
return findings
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def _report(
|
|
255
|
+
extraction: DocumentExtraction,
|
|
256
|
+
*,
|
|
257
|
+
baseline: ConformanceBaseline,
|
|
258
|
+
artifact_id: str,
|
|
259
|
+
findings: list[ValidationFinding],
|
|
260
|
+
decision: ValidationDecision,
|
|
261
|
+
readiness: ValidationReadiness,
|
|
262
|
+
round_trip_passed: bool,
|
|
263
|
+
render_passed: bool,
|
|
264
|
+
security_passed: bool,
|
|
265
|
+
) -> PublicFormValidationReport:
|
|
266
|
+
metrics = compute_public_form_metrics(extraction, baseline)
|
|
267
|
+
return PublicFormValidationReport(
|
|
268
|
+
report_id=f"validation-{artifact_id}-{baseline.template_id}",
|
|
269
|
+
artifact_id=artifact_id,
|
|
270
|
+
template_id=baseline.template_id,
|
|
271
|
+
schema_id=baseline.schema_id,
|
|
272
|
+
paragraph_block_f1=metrics.paragraph_block_f1,
|
|
273
|
+
table_cell_f1=metrics.table_cell_f1,
|
|
274
|
+
image_reference_f1=metrics.image_reference_f1,
|
|
275
|
+
metadata_exact_match=metrics.metadata_exact_match,
|
|
276
|
+
aggregate_score=metrics.aggregate_score,
|
|
277
|
+
round_trip_passed=round_trip_passed,
|
|
278
|
+
render_passed=render_passed,
|
|
279
|
+
security_passed=security_passed,
|
|
280
|
+
findings=findings,
|
|
281
|
+
decision=decision,
|
|
282
|
+
readiness=readiness,
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def _result(
|
|
287
|
+
report: PublicFormValidationReport,
|
|
288
|
+
*,
|
|
289
|
+
status: ToolResultStatus,
|
|
290
|
+
blocked_reason: BlockedReason | None,
|
|
291
|
+
summary: str,
|
|
292
|
+
correlation_id: str,
|
|
293
|
+
) -> DocumentToolResult:
|
|
294
|
+
return DocumentToolResult(
|
|
295
|
+
tool_id="document_validate_public_form",
|
|
296
|
+
correlation_id=correlation_id,
|
|
297
|
+
status=status,
|
|
298
|
+
artifact_refs=[report.artifact_id],
|
|
299
|
+
validation_report=report,
|
|
300
|
+
findings=list(report.findings),
|
|
301
|
+
text_summary=summary,
|
|
302
|
+
blocked_reason=blocked_reason,
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _decision(
|
|
307
|
+
*,
|
|
308
|
+
aggregate_score: Decimal,
|
|
309
|
+
hard_failure: bool,
|
|
310
|
+
round_trip_passed: bool,
|
|
311
|
+
render_passed: bool,
|
|
312
|
+
security_passed: bool,
|
|
313
|
+
) -> tuple[ValidationDecision, ValidationReadiness]:
|
|
314
|
+
if not security_passed:
|
|
315
|
+
return ValidationDecision.blocked, ValidationReadiness.blocked
|
|
316
|
+
if hard_failure or not round_trip_passed or not render_passed:
|
|
317
|
+
if not round_trip_passed or not render_passed:
|
|
318
|
+
return ValidationDecision.needs_manual_review, ValidationReadiness.not_ready
|
|
319
|
+
return ValidationDecision.fail, ValidationReadiness.not_ready
|
|
320
|
+
if aggregate_score < Decimal("0.85"):
|
|
321
|
+
return ValidationDecision.fail, ValidationReadiness.not_ready
|
|
322
|
+
return ValidationDecision.pass_, ValidationReadiness.ready_for_review
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def _combined_text(extraction: DocumentExtraction) -> str:
|
|
326
|
+
parts = [paragraph.text for paragraph in extraction.paragraphs]
|
|
327
|
+
parts.extend(cell.text for table in extraction.tables for cell in table.cells)
|
|
328
|
+
parts.extend(field.label for field in extraction.fields)
|
|
329
|
+
return "\n".join(parts)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _finding(
|
|
333
|
+
*,
|
|
334
|
+
code: str,
|
|
335
|
+
message: str,
|
|
336
|
+
anchor: str,
|
|
337
|
+
remediation_hint: str,
|
|
338
|
+
) -> ValidationFinding:
|
|
339
|
+
digest = hashlib.sha256(f"{code}\0{anchor}\0{message}".encode()).hexdigest()[:12]
|
|
340
|
+
return ValidationFinding(
|
|
341
|
+
finding_id=f"validation-{code}-{digest}",
|
|
342
|
+
severity="hard_failure",
|
|
343
|
+
code=code,
|
|
344
|
+
message=message,
|
|
345
|
+
anchor=anchor,
|
|
346
|
+
remediation_hint=remediation_hint,
|
|
347
|
+
)
|
|
@@ -47,6 +47,7 @@ logger = logging.getLogger(__name__)
|
|
|
47
47
|
_tracer = trace.get_tracer(__name__)
|
|
48
48
|
|
|
49
49
|
AdapterFn = Callable[[BaseModel], Awaitable[dict[str, Any]]]
|
|
50
|
+
SessionAwareAdapterFn = Callable[[BaseModel, object | None], Awaitable[dict[str, Any]]]
|
|
50
51
|
|
|
51
52
|
_LOOKUP_ENVELOPE_KINDS: frozenset[str] = frozenset(
|
|
52
53
|
{"record", "collection", "timeseries", "error", "search"}
|
|
@@ -195,6 +196,7 @@ class ToolExecutor:
|
|
|
195
196
|
"""
|
|
196
197
|
self._registry = registry
|
|
197
198
|
self._adapters: dict[str, AdapterFn] = {}
|
|
199
|
+
self._session_adapters: dict[str, SessionAwareAdapterFn] = {}
|
|
198
200
|
self._recovery_executor = recovery_executor
|
|
199
201
|
self._metrics: MetricsCollector | None = metrics
|
|
200
202
|
self._event_logger: ObservabilityEventLogger | None = event_logger
|
|
@@ -211,6 +213,31 @@ class ToolExecutor:
|
|
|
211
213
|
self._adapters[tool_id] = adapter
|
|
212
214
|
logger.debug("Registered adapter for tool: %s", tool_id)
|
|
213
215
|
|
|
216
|
+
def register_session_adapter(self, tool_id: str, adapter: SessionAwareAdapterFn) -> None:
|
|
217
|
+
"""Register an adapter that also receives the caller session identity."""
|
|
218
|
+
|
|
219
|
+
async def _without_session(inp: BaseModel) -> dict[str, Any]:
|
|
220
|
+
return await adapter(inp, None)
|
|
221
|
+
|
|
222
|
+
self._adapters[tool_id] = _without_session
|
|
223
|
+
self._session_adapters[tool_id] = adapter
|
|
224
|
+
logger.debug("Registered session-aware adapter for tool: %s", tool_id)
|
|
225
|
+
|
|
226
|
+
def _adapter_for_session(
|
|
227
|
+
self,
|
|
228
|
+
tool_id: str,
|
|
229
|
+
adapter: AdapterFn,
|
|
230
|
+
session_identity: object | None,
|
|
231
|
+
) -> AdapterFn:
|
|
232
|
+
session_adapter = self._session_adapters.get(tool_id)
|
|
233
|
+
if session_adapter is None:
|
|
234
|
+
return adapter
|
|
235
|
+
|
|
236
|
+
async def _with_session(inp: BaseModel) -> dict[str, Any]:
|
|
237
|
+
return await session_adapter(inp, session_identity)
|
|
238
|
+
|
|
239
|
+
return _with_session
|
|
240
|
+
|
|
214
241
|
async def invoke_raw( # noqa: C901
|
|
215
242
|
self,
|
|
216
243
|
tool_id: str,
|
|
@@ -269,6 +296,7 @@ class ToolExecutor:
|
|
|
269
296
|
elapsed_ms=_elapsed(),
|
|
270
297
|
retryable=False,
|
|
271
298
|
)
|
|
299
|
+
adapter = self._adapter_for_session(tool_id, adapter, session_identity)
|
|
272
300
|
|
|
273
301
|
try:
|
|
274
302
|
validated_input = tool.input_schema.model_validate(params)
|
|
@@ -458,6 +486,7 @@ class ToolExecutor:
|
|
|
458
486
|
elapsed_ms=_elapsed(),
|
|
459
487
|
retryable=False,
|
|
460
488
|
)
|
|
489
|
+
adapter = self._adapter_for_session(tool_id, adapter, session_identity)
|
|
461
490
|
|
|
462
491
|
# --- Input validation ---------------------------------------------------
|
|
463
492
|
try:
|
|
@@ -117,14 +117,11 @@ async def invoke_live_adapter_proxy(
|
|
|
117
117
|
)
|
|
118
118
|
|
|
119
119
|
timeout = _configured_timeout(settings.live_adapter_proxy_timeout_seconds)
|
|
120
|
-
token = os.environ.get("UMMAYA_LIVE_ADAPTER_PROXY_TOKEN", settings.live_adapter_proxy_token)
|
|
121
120
|
headers = {
|
|
122
121
|
"Accept": "application/json",
|
|
123
122
|
"Content-Type": "application/json",
|
|
124
123
|
"User-Agent": f"UMMAYA/{get_version()} live-adapter-client",
|
|
125
124
|
}
|
|
126
|
-
if token.strip():
|
|
127
|
-
headers["Authorization"] = f"Bearer {token.strip()}"
|
|
128
125
|
|
|
129
126
|
payload: dict[str, object] = {
|
|
130
127
|
"schema_version": "ummaya.live_adapter.v1",
|
|
@@ -31,6 +31,8 @@ _AUTH_TYPE_LEVEL_MAPPING: Final[dict[str, frozenset[str]]] = {
|
|
|
31
31
|
"oauth": frozenset({"AAL1", "AAL2", "AAL3"}),
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
MockFidelityGrade = Literal["OPENAPI", "OOS", "HARNESS_ONLY", "unknown", "not_applicable"]
|
|
35
|
+
|
|
34
36
|
# Spec 1634 (P3 Tool System Wiring) — closed ministry / institution enum.
|
|
35
37
|
# Typed replacement for the former free-form ``provider: str`` field. New
|
|
36
38
|
# institutions are added by enum extension (small dedicated PR, ADR not
|
|
@@ -215,8 +217,10 @@ class GovAPITool(BaseModel):
|
|
|
215
217
|
``mock`` = adapter returns recorded fixture or shape-compatible synthetic.
|
|
216
218
|
Distinct from ``AdapterRegistration.source_mode`` (mirror fidelity axis)."""
|
|
217
219
|
|
|
220
|
+
mock_fidelity_grade: MockFidelityGrade = "not_applicable"
|
|
221
|
+
|
|
218
222
|
# Spec 031 T032 dual-axis fields — None during pre-v1.2 compatibility window FR-028
|
|
219
|
-
primitive: Literal["find", "locate", "send", "check"] | None = None
|
|
223
|
+
primitive: Literal["find", "locate", "send", "check", "document"] | None = None
|
|
220
224
|
"""Active primitive surface this adapter binds to (Spec 031 AdapterPrimitive).
|
|
221
225
|
|
|
222
226
|
Set to the appropriate value during Spec 031 Phase 4 (T033).
|
|
@@ -164,6 +164,14 @@ def register_all_tools(registry: ToolRegistry, executor: ToolExecutor) -> Routin
|
|
|
164
164
|
reg_mock_hometax_simplified(registry, executor) # T028 — Hometax simplified data
|
|
165
165
|
reg_mock_gov24_cert(registry, executor) # T029 — Gov24 certificate lookup
|
|
166
166
|
|
|
167
|
+
# Spec #2802 — Public AX document harness. These local tools expose
|
|
168
|
+
# inspect/extract/form-schema/copy/fill/style/render/validate/save through
|
|
169
|
+
# the existing ToolRegistry and permission gate; no external agency channel
|
|
170
|
+
# is called at registration time.
|
|
171
|
+
from ummaya.tools.documents.registry import register_document_tools
|
|
172
|
+
|
|
173
|
+
register_document_tools(registry, executor)
|
|
174
|
+
|
|
167
175
|
# Epic ζ #2297 path B (live smoke 2026-04-30 follow-up) — bridge per-primitive
|
|
168
176
|
# registries (verify/submit) into the main ToolRegistry's BM25 corpus
|
|
169
177
|
# so `lookup(mode="search", query="…")` can surface verify/submit
|
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
7
|
from enum import StrEnum
|
|
8
|
-
from typing import Literal
|
|
8
|
+
from typing import TYPE_CHECKING, Literal
|
|
9
9
|
|
|
10
10
|
from pydantic import BaseModel, ConfigDict, Field, computed_field, model_validator
|
|
11
11
|
|
|
@@ -32,6 +32,9 @@ from ummaya.tools.search import search_tools
|
|
|
32
32
|
|
|
33
33
|
logger = logging.getLogger(__name__)
|
|
34
34
|
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from ummaya.tools.routing.cards import AdapterCard
|
|
37
|
+
|
|
35
38
|
|
|
36
39
|
# ---------------------------------------------------------------------------
|
|
37
40
|
# Spec 031 Phase 2 — active primitive registry metadata (T007–T009).
|
|
@@ -49,6 +52,7 @@ class AdapterPrimitive(StrEnum):
|
|
|
49
52
|
locate = "locate"
|
|
50
53
|
send = "send"
|
|
51
54
|
check = "check"
|
|
55
|
+
document = "document"
|
|
52
56
|
|
|
53
57
|
|
|
54
58
|
class AdapterSourceMode(StrEnum):
|
|
@@ -387,6 +391,11 @@ class ToolRegistry:
|
|
|
387
391
|
"""Return non-core, active tools."""
|
|
388
392
|
return [t for tid, t in self._tools.items() if not t.is_core and tid not in self._inactive]
|
|
389
393
|
|
|
394
|
+
def adapter_cards(self) -> list[AdapterCard]:
|
|
395
|
+
from ummaya.tools.routing.cards import build_adapter_cards
|
|
396
|
+
|
|
397
|
+
return list(build_adapter_cards(self.all_tools()))
|
|
398
|
+
|
|
390
399
|
def export_core_tools_openai(self) -> list[dict[str, object]]:
|
|
391
400
|
"""Export core tools as OpenAI function-calling definitions.
|
|
392
401
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
from ummaya.tools.routing.cards import (
|
|
4
|
+
AdapterCard,
|
|
5
|
+
AdapterCardError,
|
|
6
|
+
AdapterCardQualityViolation,
|
|
7
|
+
SchemaFieldSummary,
|
|
8
|
+
assert_adapter_card_quality,
|
|
9
|
+
build_adapter_card,
|
|
10
|
+
build_adapter_cards,
|
|
11
|
+
lint_adapter_card,
|
|
12
|
+
)
|
|
13
|
+
from ummaya.tools.routing.decision_service import RouteDecisionService
|
|
14
|
+
from ummaya.tools.routing.decision_types import (
|
|
15
|
+
FeasibilityStatus,
|
|
16
|
+
RouteCandidate,
|
|
17
|
+
RouteClarificationDecision,
|
|
18
|
+
RouteClarificationReason,
|
|
19
|
+
RouteDecision,
|
|
20
|
+
RouteStopReason,
|
|
21
|
+
SchemaProjectionLevel,
|
|
22
|
+
)
|
|
23
|
+
from ummaya.tools.routing.intent import (
|
|
24
|
+
ACTIVE_PRIMITIVES,
|
|
25
|
+
LEGACY_PRIMITIVE_ALIASES,
|
|
26
|
+
ToolSelectionIntent,
|
|
27
|
+
extract_tool_selection_intent,
|
|
28
|
+
)
|
|
29
|
+
from ummaya.tools.routing.projection import (
|
|
30
|
+
AvailableAdaptersProjection,
|
|
31
|
+
build_available_adapters_projection,
|
|
32
|
+
selected_concrete_adapter_tools,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"ACTIVE_PRIMITIVES",
|
|
37
|
+
"AdapterCard",
|
|
38
|
+
"AdapterCardError",
|
|
39
|
+
"AdapterCardQualityViolation",
|
|
40
|
+
"AvailableAdaptersProjection",
|
|
41
|
+
"FeasibilityStatus",
|
|
42
|
+
"LEGACY_PRIMITIVE_ALIASES",
|
|
43
|
+
"RouteCandidate",
|
|
44
|
+
"RouteClarificationDecision",
|
|
45
|
+
"RouteClarificationReason",
|
|
46
|
+
"RouteDecision",
|
|
47
|
+
"RouteStopReason",
|
|
48
|
+
"RouteDecisionService",
|
|
49
|
+
"SchemaFieldSummary",
|
|
50
|
+
"SchemaProjectionLevel",
|
|
51
|
+
"ToolSelectionIntent",
|
|
52
|
+
"assert_adapter_card_quality",
|
|
53
|
+
"build_adapter_card",
|
|
54
|
+
"build_adapter_cards",
|
|
55
|
+
"build_available_adapters_projection",
|
|
56
|
+
"extract_tool_selection_intent",
|
|
57
|
+
"lint_adapter_card",
|
|
58
|
+
"selected_concrete_adapter_tools",
|
|
59
|
+
]
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Iterable
|
|
6
|
+
|
|
7
|
+
from ummaya.tools.models import GovAPITool
|
|
8
|
+
from ummaya.tools.routing.metadata import (
|
|
9
|
+
capabilities_for_tool,
|
|
10
|
+
credential_requirements_for_tool,
|
|
11
|
+
domain_for_tool,
|
|
12
|
+
entity_types_for_tool,
|
|
13
|
+
examples_en_for_tool,
|
|
14
|
+
examples_ko_for_tool,
|
|
15
|
+
limitations_for_tool,
|
|
16
|
+
mock_fidelity_grade_for_tool,
|
|
17
|
+
prerequisite_tools_for_tool,
|
|
18
|
+
primitive_family,
|
|
19
|
+
routing_text,
|
|
20
|
+
safety_annotations_for_tool,
|
|
21
|
+
side_effect_level_for_tool,
|
|
22
|
+
source_mode_for_tool,
|
|
23
|
+
)
|
|
24
|
+
from ummaya.tools.routing.schema import model_json_schema, schema_summary, sha256
|
|
25
|
+
from ummaya.tools.routing.types import (
|
|
26
|
+
INTENT_VERBS,
|
|
27
|
+
LEGACY_ALIASES,
|
|
28
|
+
AdapterCard,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def build_adapter_cards(tools: Iterable[GovAPITool]) -> tuple[AdapterCard, ...]:
|
|
33
|
+
return tuple(build_adapter_card(tool) for tool in sorted(tools, key=lambda item: item.id))
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def build_adapter_card(tool: GovAPITool) -> AdapterCard:
|
|
37
|
+
primitive = primitive_family(tool.primitive)
|
|
38
|
+
input_schema = model_json_schema(tool.input_schema)
|
|
39
|
+
output_schema = model_json_schema(tool.output_schema)
|
|
40
|
+
input_summary = schema_summary(input_schema)
|
|
41
|
+
output_summary = schema_summary(output_schema)
|
|
42
|
+
required_slots = tuple(field.name for field in input_summary if field.required)
|
|
43
|
+
optional_slots = tuple(field.name for field in input_summary if not field.required)
|
|
44
|
+
source_mode = source_mode_for_tool(tool)
|
|
45
|
+
policy_authority_url = tool.policy.real_classification_url if tool.policy is not None else None
|
|
46
|
+
side_effect_level = side_effect_level_for_tool(tool, primitive)
|
|
47
|
+
credential_requirements = credential_requirements_for_tool(tool)
|
|
48
|
+
capabilities = capabilities_for_tool(tool, primitive)
|
|
49
|
+
entity_types = entity_types_for_tool(input_summary, tool.category)
|
|
50
|
+
prerequisite_tools = prerequisite_tools_for_tool(tool, primitive)
|
|
51
|
+
input_schema_hash = sha256(input_schema)
|
|
52
|
+
manifest_hash = sha256(
|
|
53
|
+
{
|
|
54
|
+
"tool_id": tool.id,
|
|
55
|
+
"primitive_family": primitive,
|
|
56
|
+
"agency": str(tool.ministry),
|
|
57
|
+
"source_mode": source_mode,
|
|
58
|
+
"policy_authority_url": policy_authority_url,
|
|
59
|
+
"input_schema_hash": input_schema_hash,
|
|
60
|
+
"output_schema_hash": sha256(output_schema),
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
examples_ko = examples_ko_for_tool(tool)
|
|
64
|
+
examples_en = examples_en_for_tool(tool, primitive)
|
|
65
|
+
negative_examples = (f"Do not use for requests outside primitive {primitive}.",)
|
|
66
|
+
limitations = limitations_for_tool(tool, source_mode, policy_authority_url)
|
|
67
|
+
safety_annotations = safety_annotations_for_tool(tool, side_effect_level)
|
|
68
|
+
|
|
69
|
+
return AdapterCard(
|
|
70
|
+
tool_id=tool.id,
|
|
71
|
+
primitive_family=primitive,
|
|
72
|
+
legacy_primitive_aliases=LEGACY_ALIASES[primitive],
|
|
73
|
+
domain=domain_for_tool(tool),
|
|
74
|
+
agency=str(tool.ministry),
|
|
75
|
+
source_mode=source_mode,
|
|
76
|
+
capabilities=capabilities,
|
|
77
|
+
intent_verbs=INTENT_VERBS[primitive],
|
|
78
|
+
entity_types=entity_types,
|
|
79
|
+
required_slots=required_slots,
|
|
80
|
+
optional_slots=optional_slots,
|
|
81
|
+
prerequisite_tools=prerequisite_tools,
|
|
82
|
+
input_schema_hash=input_schema_hash,
|
|
83
|
+
input_schema_summary=input_summary,
|
|
84
|
+
output_schema_summary=output_summary,
|
|
85
|
+
policy_authority_url=policy_authority_url,
|
|
86
|
+
safety_annotations=safety_annotations,
|
|
87
|
+
side_effect_level=side_effect_level,
|
|
88
|
+
credential_requirements=credential_requirements,
|
|
89
|
+
mock_fidelity_grade=mock_fidelity_grade_for_tool(tool),
|
|
90
|
+
examples_ko=examples_ko,
|
|
91
|
+
examples_en=examples_en,
|
|
92
|
+
negative_examples=negative_examples,
|
|
93
|
+
limitations=limitations,
|
|
94
|
+
manifest_hash=manifest_hash,
|
|
95
|
+
routing_text=routing_text(
|
|
96
|
+
tool_id=tool.id,
|
|
97
|
+
primitive=primitive,
|
|
98
|
+
agency=str(tool.ministry),
|
|
99
|
+
domain=domain_for_tool(tool),
|
|
100
|
+
capabilities=capabilities,
|
|
101
|
+
required_slots=required_slots,
|
|
102
|
+
examples_ko=examples_ko,
|
|
103
|
+
limitations=limitations,
|
|
104
|
+
),
|
|
105
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from ummaya.tools.routing.builder import build_adapter_card, build_adapter_cards
|
|
6
|
+
from ummaya.tools.routing.lint import assert_adapter_card_quality, lint_adapter_card
|
|
7
|
+
from ummaya.tools.routing.types import (
|
|
8
|
+
AdapterCard,
|
|
9
|
+
AdapterCardError,
|
|
10
|
+
AdapterCardQualityViolation,
|
|
11
|
+
PrimitiveFamily,
|
|
12
|
+
SchemaFieldSummary,
|
|
13
|
+
SideEffectLevel,
|
|
14
|
+
SourceMode,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"AdapterCard",
|
|
19
|
+
"AdapterCardError",
|
|
20
|
+
"AdapterCardQualityViolation",
|
|
21
|
+
"PrimitiveFamily",
|
|
22
|
+
"SchemaFieldSummary",
|
|
23
|
+
"SideEffectLevel",
|
|
24
|
+
"SourceMode",
|
|
25
|
+
"assert_adapter_card_quality",
|
|
26
|
+
"build_adapter_card",
|
|
27
|
+
"build_adapter_cards",
|
|
28
|
+
"lint_adapter_card",
|
|
29
|
+
]
|