ummaya 0.2.4 → 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 +15 -2
- package/bin/ummaya +10 -1
- package/npm-shrinkwrap.json +253 -2
- package/package.json +5 -1
- package/prompts/manifest.yaml +1 -1
- package/prompts/system_v1.md +1 -0
- package/pyproject.toml +26 -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/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 +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 +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/package.json +1 -1
- 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/print.ts +7 -7
- 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 +29 -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 -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/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 +400 -14
- 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,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UMMAYA — document harness result renderer.
|
|
3
|
+
*
|
|
4
|
+
* Renders document mutations through the Claude Code edit-result shape:
|
|
5
|
+
* a concise change summary followed immediately by the structured diff body.
|
|
6
|
+
* There is deliberately no rounded card frame, browser/graphics viewer, tool-id
|
|
7
|
+
* header, artifact summary, or revdiff status rail in the compact success path.
|
|
8
|
+
*/
|
|
9
|
+
import React, { useContext } from 'react'
|
|
10
|
+
import { Box, Text } from '../../ink.js'
|
|
11
|
+
import { TerminalSizeContext } from '../../ink/components/TerminalSizeContext.js'
|
|
12
|
+
import { truncateToWidth } from '../../utils/format.js'
|
|
13
|
+
import { useTheme } from '@/theme/provider'
|
|
14
|
+
import { MessageResponse } from '../MessageResponse.js'
|
|
15
|
+
import { StructuredDiffFallback } from '../StructuredDiff/Fallback.js'
|
|
16
|
+
import { DocumentSocraticReviewBlock } from './DocumentSocraticReviewBlock.js'
|
|
17
|
+
import {
|
|
18
|
+
documentChangeToPatch,
|
|
19
|
+
documentVisibleChanges,
|
|
20
|
+
} from '../../tools/_shared/documentChangeToPatch.js'
|
|
21
|
+
import { extractDocumentSocraticReview } from './documentSocraticReview.js'
|
|
22
|
+
import type {
|
|
23
|
+
DocumentDiffPayload,
|
|
24
|
+
DocumentToolResultPayload,
|
|
25
|
+
DocumentToolStatus,
|
|
26
|
+
} from './types'
|
|
27
|
+
|
|
28
|
+
export interface DocumentToolResultCardProps {
|
|
29
|
+
payload: DocumentToolResultPayload
|
|
30
|
+
expanded?: boolean
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Compact inline view caps the change list; Ctrl+O / verbose expands to all. */
|
|
34
|
+
const COMPACT_CHANGE_CAP = 6
|
|
35
|
+
const EXPANDED_CHANGE_CAP = 256
|
|
36
|
+
|
|
37
|
+
export function DocumentToolResultCard({
|
|
38
|
+
payload,
|
|
39
|
+
expanded = false,
|
|
40
|
+
}: DocumentToolResultCardProps): React.JSX.Element {
|
|
41
|
+
const theme = useTheme()
|
|
42
|
+
const terminalSize = useContext(TerminalSizeContext)
|
|
43
|
+
const surfaceWidth = Math.max(24, terminalSize?.columns ?? 100)
|
|
44
|
+
|
|
45
|
+
const diff = payload.diff ?? undefined
|
|
46
|
+
const statusColor = colorForStatus(payload.status, theme)
|
|
47
|
+
const statusLabel = labelForStatus(payload.status)
|
|
48
|
+
const promotionGate = payload.promotion_gate_result ?? undefined
|
|
49
|
+
const promotionChecklistCount = promotionGate?.promotion_checklist?.length ?? 0
|
|
50
|
+
const visibleChanges = diff === undefined ? [] : documentVisibleChanges(diff)
|
|
51
|
+
const changeCap = expanded ? EXPANDED_CHANGE_CAP : COMPACT_CHANGE_CAP
|
|
52
|
+
const reviewDocumentName =
|
|
53
|
+
diff === undefined ? payload.tool_id : documentNameFor(payload, diff)
|
|
54
|
+
const savedExportPaths = savedExportPathsFor(payload)
|
|
55
|
+
const socraticReview = extractDocumentSocraticReview(payload)
|
|
56
|
+
|
|
57
|
+
const patch =
|
|
58
|
+
diff !== undefined && visibleChanges.length > 0
|
|
59
|
+
? documentChangeToPatch(diff, {
|
|
60
|
+
documentName: reviewDocumentName,
|
|
61
|
+
maxChanges: changeCap,
|
|
62
|
+
})
|
|
63
|
+
: undefined
|
|
64
|
+
const omittedChangeCount = patch === undefined ? 0 : patch.changeCount - patch.renderedChangeCount
|
|
65
|
+
const diffWidth = Math.max(20, surfaceWidth - 12)
|
|
66
|
+
|
|
67
|
+
if (payload.status === 'ok' && patch !== undefined && patch.hunks.length > 0) {
|
|
68
|
+
return (
|
|
69
|
+
<MessageResponse>
|
|
70
|
+
<Box flexDirection="column" width={surfaceWidth}>
|
|
71
|
+
<Text>{changedFieldsSummary(patch.changeCount)}</Text>
|
|
72
|
+
{patch.hunks.map((hunk, index) => (
|
|
73
|
+
<React.Fragment key={`${hunk.oldStart}-${hunk.newStart}-${index}`}>
|
|
74
|
+
{index > 0 && <Text dimColor>...</Text>}
|
|
75
|
+
<StructuredDiffFallback
|
|
76
|
+
patch={hunk}
|
|
77
|
+
dim={false}
|
|
78
|
+
width={diffWidth}
|
|
79
|
+
/>
|
|
80
|
+
</React.Fragment>
|
|
81
|
+
))}
|
|
82
|
+
{patch.truncated && omittedChangeCount > 0 && (
|
|
83
|
+
<Text color={theme.inactive}>
|
|
84
|
+
{truncateToWidth(
|
|
85
|
+
`… +${omittedChangeCount} more ${omittedChangeCount === 1 ? 'change' : 'changes'} · Ctrl+O to expand`,
|
|
86
|
+
surfaceWidth,
|
|
87
|
+
)}
|
|
88
|
+
</Text>
|
|
89
|
+
)}
|
|
90
|
+
{savedExportPaths.map((localPath) => (
|
|
91
|
+
<Text key={localPath} color={theme.success}>
|
|
92
|
+
{truncateToWidth(`Saved: ${localPath}`, surfaceWidth)}
|
|
93
|
+
</Text>
|
|
94
|
+
))}
|
|
95
|
+
<DocumentSocraticReviewBlock review={socraticReview} width={surfaceWidth} />
|
|
96
|
+
</Box>
|
|
97
|
+
</MessageResponse>
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<Box flexDirection="column" width={surfaceWidth}>
|
|
103
|
+
<Box flexDirection="row" gap={1} width={surfaceWidth}>
|
|
104
|
+
<Text bold color={statusColor}>{statusLabel}</Text>
|
|
105
|
+
</Box>
|
|
106
|
+
<Text color={theme.text} wrap="wrap">
|
|
107
|
+
{truncateToWidth(summaryForDisplay(payload, expanded), surfaceWidth)}
|
|
108
|
+
</Text>
|
|
109
|
+
{payload.blocked_reason !== undefined && payload.blocked_reason !== null && (
|
|
110
|
+
<Text color={theme.warning}>{`Reason: ${payload.blocked_reason}`}</Text>
|
|
111
|
+
)}
|
|
112
|
+
<DocumentSocraticReviewBlock review={socraticReview} width={surfaceWidth} />
|
|
113
|
+
{promotionGate !== undefined && (
|
|
114
|
+
<Box flexDirection="column" marginTop={1}>
|
|
115
|
+
<Text color={theme.warning} wrap="wrap">
|
|
116
|
+
{truncateToWidth(
|
|
117
|
+
`Gate: ${promotionGate.capability ?? 'capability'} ${promotionGate.promotion_state ?? 'unknown'}`,
|
|
118
|
+
surfaceWidth,
|
|
119
|
+
)}
|
|
120
|
+
</Text>
|
|
121
|
+
{(promotionGate.hard_gate_failures ?? []).length > 0 && (
|
|
122
|
+
<Text color={theme.warning} wrap="wrap">
|
|
123
|
+
{truncateToWidth(
|
|
124
|
+
`Hard gates: ${(promotionGate.hard_gate_failures ?? []).join(', ')}`,
|
|
125
|
+
surfaceWidth,
|
|
126
|
+
)}
|
|
127
|
+
</Text>
|
|
128
|
+
)}
|
|
129
|
+
{promotionChecklistCount > 0 && (
|
|
130
|
+
<Text color={theme.inactive} wrap="wrap">
|
|
131
|
+
{truncateToWidth(
|
|
132
|
+
`Checklist: ${promotionChecklistCount} render promotion evidence item(s) required`,
|
|
133
|
+
surfaceWidth,
|
|
134
|
+
)}
|
|
135
|
+
</Text>
|
|
136
|
+
)}
|
|
137
|
+
</Box>
|
|
138
|
+
)}
|
|
139
|
+
{expanded && diff !== undefined && (diff.diff_id !== undefined || diff.derivative_artifact_id !== undefined) && (
|
|
140
|
+
<Text color={theme.inactive} wrap="wrap">
|
|
141
|
+
{truncateToWidth(
|
|
142
|
+
`Evidence: ${diff.diff_id ?? 'untracked'} · ${diff.source_artifact_id} -> ${diff.derivative_artifact_id}`,
|
|
143
|
+
surfaceWidth,
|
|
144
|
+
)}
|
|
145
|
+
</Text>
|
|
146
|
+
)}
|
|
147
|
+
{savedExportPaths.map((localPath) => (
|
|
148
|
+
<Text key={localPath} color={theme.success}>
|
|
149
|
+
{truncateToWidth(`Saved: ${localPath}`, surfaceWidth)}
|
|
150
|
+
</Text>
|
|
151
|
+
))}
|
|
152
|
+
</Box>
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function changedFieldsSummary(changeCount: number): string {
|
|
157
|
+
return `Changed ${changeCount} ${changeCount === 1 ? 'field' : 'fields'}`
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function summaryForDisplay(
|
|
161
|
+
payload: DocumentToolResultPayload,
|
|
162
|
+
expanded: boolean,
|
|
163
|
+
): string {
|
|
164
|
+
if (expanded) {
|
|
165
|
+
return payload.text_summary
|
|
166
|
+
}
|
|
167
|
+
const [firstLine] = payload.text_summary.split(/\r?\n/u)
|
|
168
|
+
const candidateCount = payload.text_summary
|
|
169
|
+
.split(/\r?\n/u)
|
|
170
|
+
.filter(line => line.trim().startsWith('- ')).length
|
|
171
|
+
if (candidateCount > 0) {
|
|
172
|
+
return `${firstLine} ${candidateCount} matching candidate${candidateCount === 1 ? '' : 's'} available · Ctrl+O to expand.`
|
|
173
|
+
}
|
|
174
|
+
return firstLine ?? payload.text_summary
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function savedExportPathsFor(payload: DocumentToolResultPayload): string[] {
|
|
178
|
+
return (payload.saved_exports ?? [])
|
|
179
|
+
.map(savedExport => savedExport.local_path?.trim())
|
|
180
|
+
.filter((localPath): localPath is string => localPath !== undefined && localPath.length > 0)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Synthetic file name for the diff. Only used by CC's language detection; for
|
|
185
|
+
* documents it falls back to plain-text rendering, which is what we want for
|
|
186
|
+
* `label: value` field lines. Prefer a real filename sniffed from the summary.
|
|
187
|
+
*/
|
|
188
|
+
function documentNameFor(
|
|
189
|
+
payload: DocumentToolResultPayload,
|
|
190
|
+
diff: DocumentDiffPayload,
|
|
191
|
+
): string {
|
|
192
|
+
const sniffed = /([^\s/\\]+\.(?:hwpx|hwp|docx|pdf|xlsx|pptx))/iu.exec(
|
|
193
|
+
payload.text_summary,
|
|
194
|
+
)?.[1]
|
|
195
|
+
return sniffed ?? diff.derivative_artifact_id ?? payload.tool_id
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function labelForStatus(status: DocumentToolStatus): string {
|
|
199
|
+
switch (status) {
|
|
200
|
+
case 'ok':
|
|
201
|
+
return 'Document OK'
|
|
202
|
+
case 'blocked':
|
|
203
|
+
return 'Document blocked'
|
|
204
|
+
case 'failed':
|
|
205
|
+
return 'Document failed'
|
|
206
|
+
case 'needs_input':
|
|
207
|
+
return 'Document needs input'
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function colorForStatus(
|
|
212
|
+
status: DocumentToolStatus,
|
|
213
|
+
theme: ReturnType<typeof useTheme>,
|
|
214
|
+
): string {
|
|
215
|
+
switch (status) {
|
|
216
|
+
case 'ok':
|
|
217
|
+
return theme.success
|
|
218
|
+
case 'blocked':
|
|
219
|
+
case 'needs_input':
|
|
220
|
+
return theme.warning
|
|
221
|
+
case 'failed':
|
|
222
|
+
return theme.error
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
const REVIEW_STATUSES = ['pass', 'failed', 'blocked'] as const
|
|
4
|
+
const INTERNAL_TOKEN_PATTERN =
|
|
5
|
+
/\b(?:document_[A-Za-z0-9_]+|[A-Za-z0-9_-]*fixture[A-Za-z0-9_-]*)\b/gu
|
|
6
|
+
|
|
7
|
+
export type RenderComparisonStatus = (typeof REVIEW_STATUSES)[number]
|
|
8
|
+
|
|
9
|
+
export type DocumentSocraticRenderComparison = {
|
|
10
|
+
readonly status: RenderComparisonStatus
|
|
11
|
+
readonly changedRegionCount: number
|
|
12
|
+
readonly detail?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type DocumentSocraticReviewState = {
|
|
16
|
+
readonly missingQuestions: readonly string[]
|
|
17
|
+
readonly collectedAnswers: readonly string[]
|
|
18
|
+
readonly draftPreview?: string
|
|
19
|
+
readonly approvalLabel?: string
|
|
20
|
+
readonly renderComparison?: DocumentSocraticRenderComparison
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type ParsedQuestion = {
|
|
24
|
+
readonly questionId?: string
|
|
25
|
+
readonly prompt: string
|
|
26
|
+
readonly required: boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type ParsedAnswer = {
|
|
30
|
+
readonly questionId?: string
|
|
31
|
+
readonly summary: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function extractDocumentSocraticReview(
|
|
35
|
+
payload: unknown,
|
|
36
|
+
): DocumentSocraticReviewState | null {
|
|
37
|
+
const payloadRecord = asRecord(payload)
|
|
38
|
+
if (payloadRecord === null) {
|
|
39
|
+
return null
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const authoring = asRecord(payloadRecord.authoring)
|
|
43
|
+
const renderComparison = parseRenderComparison(payloadRecord.render_comparison)
|
|
44
|
+
if (authoring === null && renderComparison === undefined) {
|
|
45
|
+
return null
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const questions = parseQuestions(authoring?.questions)
|
|
49
|
+
const answers = parseAnswers(authoring?.answers)
|
|
50
|
+
const missingQuestions = missingRequiredQuestions(questions, answers)
|
|
51
|
+
const collectedAnswers = collectedAnswerSummaries(answers, authoring)
|
|
52
|
+
const draftPreview = parseDraftPreview(authoring?.draft)
|
|
53
|
+
const approvalLabel = parseApprovalLabel(authoring)
|
|
54
|
+
|
|
55
|
+
const review = {
|
|
56
|
+
missingQuestions,
|
|
57
|
+
collectedAnswers,
|
|
58
|
+
...(draftPreview !== undefined ? { draftPreview } : {}),
|
|
59
|
+
...(approvalLabel !== undefined ? { approvalLabel } : {}),
|
|
60
|
+
...(renderComparison !== undefined ? { renderComparison } : {}),
|
|
61
|
+
} satisfies DocumentSocraticReviewState
|
|
62
|
+
|
|
63
|
+
return hasReviewContent(review) ? review : null
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function parseQuestions(value: unknown): readonly ParsedQuestion[] {
|
|
67
|
+
return recordsFrom(value)
|
|
68
|
+
.map((record): ParsedQuestion | null => {
|
|
69
|
+
const prompt = cleanDisplayText(readString(record.prompt))
|
|
70
|
+
if (prompt === undefined) {
|
|
71
|
+
return null
|
|
72
|
+
}
|
|
73
|
+
const questionId = readString(record.question_id)
|
|
74
|
+
const required = record.required === true
|
|
75
|
+
return {
|
|
76
|
+
...(questionId !== undefined ? { questionId } : {}),
|
|
77
|
+
prompt,
|
|
78
|
+
required,
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
.filter((question): question is ParsedQuestion => question !== null)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function parseAnswers(value: unknown): readonly ParsedAnswer[] {
|
|
85
|
+
return recordsFrom(value)
|
|
86
|
+
.map((record): ParsedAnswer | null => {
|
|
87
|
+
const summary = cleanDisplayText(readString(record.response_summary))
|
|
88
|
+
if (summary === undefined) {
|
|
89
|
+
return null
|
|
90
|
+
}
|
|
91
|
+
const questionId = readString(record.question_id)
|
|
92
|
+
return {
|
|
93
|
+
...(questionId !== undefined ? { questionId } : {}),
|
|
94
|
+
summary,
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
.filter((answer): answer is ParsedAnswer => answer !== null)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function missingRequiredQuestions(
|
|
101
|
+
questions: readonly ParsedQuestion[],
|
|
102
|
+
answers: readonly ParsedAnswer[],
|
|
103
|
+
): readonly string[] {
|
|
104
|
+
const answeredIds = new Set(
|
|
105
|
+
answers
|
|
106
|
+
.map(answer => answer.questionId)
|
|
107
|
+
.filter((questionId): questionId is string => questionId !== undefined),
|
|
108
|
+
)
|
|
109
|
+
return questions
|
|
110
|
+
.filter(question => question.required)
|
|
111
|
+
.filter(question => question.questionId === undefined || !answeredIds.has(question.questionId))
|
|
112
|
+
.map(question => question.prompt)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function collectedAnswerSummaries(
|
|
116
|
+
answers: readonly ParsedAnswer[],
|
|
117
|
+
authoring: Readonly<Record<string, unknown>> | null,
|
|
118
|
+
): readonly string[] {
|
|
119
|
+
if (answers.length > 0) {
|
|
120
|
+
return answers.map(answer => answer.summary)
|
|
121
|
+
}
|
|
122
|
+
return recordsFrom(authoring?.evidence_items)
|
|
123
|
+
.map(record => cleanDisplayText(readString(record.summary)))
|
|
124
|
+
.filter((summary): summary is string => summary !== undefined)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function parseDraftPreview(value: unknown): string | undefined {
|
|
128
|
+
const draft = asRecord(value)
|
|
129
|
+
return draft === null ? undefined : cleanDisplayText(readString(draft.draft_text))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function parseApprovalLabel(
|
|
133
|
+
authoring: Readonly<Record<string, unknown>> | null,
|
|
134
|
+
): string | undefined {
|
|
135
|
+
if (authoring === null) {
|
|
136
|
+
return undefined
|
|
137
|
+
}
|
|
138
|
+
const approval = asRecord(authoring.approval)
|
|
139
|
+
const decision = approval === null ? undefined : readString(approval.decision)
|
|
140
|
+
if (decision !== undefined) {
|
|
141
|
+
return approvalDecisionLabel(decision)
|
|
142
|
+
}
|
|
143
|
+
if (parseDraftPreview(authoring.draft) !== undefined) {
|
|
144
|
+
return 'awaiting approval'
|
|
145
|
+
}
|
|
146
|
+
const state = readString(authoring.state)
|
|
147
|
+
return state === 'needs_input' || state === 'blocked_missing_evidence' ? 'not ready' : undefined
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function approvalDecisionLabel(decision: string): string {
|
|
151
|
+
switch (decision) {
|
|
152
|
+
case 'approved':
|
|
153
|
+
return 'approved'
|
|
154
|
+
case 'edited':
|
|
155
|
+
return 'approved with edits'
|
|
156
|
+
case 'leave_blank':
|
|
157
|
+
return 'leave blank'
|
|
158
|
+
case 'cancel':
|
|
159
|
+
return 'cancelled'
|
|
160
|
+
default:
|
|
161
|
+
return 'unknown'
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function parseRenderComparison(value: unknown): DocumentSocraticRenderComparison | undefined {
|
|
166
|
+
const record = asRecord(value)
|
|
167
|
+
if (record === null) {
|
|
168
|
+
return undefined
|
|
169
|
+
}
|
|
170
|
+
const rawStatus = readString(record.status) ?? readString(record.threshold_status)
|
|
171
|
+
if (rawStatus === undefined || !isRenderComparisonStatus(rawStatus)) {
|
|
172
|
+
return undefined
|
|
173
|
+
}
|
|
174
|
+
const changedRegionCount = recordsFrom(record.changed_regions).length
|
|
175
|
+
const detail = cleanDisplayText(readString(record.failure_reason))
|
|
176
|
+
return {
|
|
177
|
+
status: rawStatus,
|
|
178
|
+
changedRegionCount,
|
|
179
|
+
...(detail !== undefined ? { detail } : {}),
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function hasReviewContent(review: DocumentSocraticReviewState): boolean {
|
|
184
|
+
return (
|
|
185
|
+
review.missingQuestions.length > 0 ||
|
|
186
|
+
review.collectedAnswers.length > 0 ||
|
|
187
|
+
review.draftPreview !== undefined ||
|
|
188
|
+
review.approvalLabel !== undefined ||
|
|
189
|
+
review.renderComparison !== undefined
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function isRenderComparisonStatus(value: string): value is RenderComparisonStatus {
|
|
194
|
+
return REVIEW_STATUSES.some(status => status === value)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function recordsFrom(value: unknown): readonly Readonly<Record<string, unknown>>[] {
|
|
198
|
+
return Array.isArray(value) ? value.filter(isRecord) : []
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function asRecord(value: unknown): Readonly<Record<string, unknown>> | null {
|
|
202
|
+
return isRecord(value) ? value : null
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function isRecord(value: unknown): value is Readonly<Record<string, unknown>> {
|
|
206
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function readString(value: unknown): string | undefined {
|
|
210
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function cleanDisplayText(value: string | undefined): string | undefined {
|
|
214
|
+
return value?.replace(INTERNAL_TOKEN_PATTERN, 'internal step')
|
|
215
|
+
}
|
|
@@ -36,6 +36,7 @@ import { SubmitReceipt } from './SubmitReceipt'
|
|
|
36
36
|
import { SubmitErrorBanner } from './SubmitErrorBanner'
|
|
37
37
|
import { AuthContextCard } from './AuthContextCard'
|
|
38
38
|
import { AuthWarningBanner } from './AuthWarningBanner'
|
|
39
|
+
import { DocumentToolResultCard } from './DocumentToolResultCard'
|
|
39
40
|
import { UnrecognizedPayload } from './UnrecognizedPayload'
|
|
40
41
|
|
|
41
42
|
import type {
|
|
@@ -44,6 +45,8 @@ import type {
|
|
|
44
45
|
ResolveLocationPayload,
|
|
45
46
|
SubmitPayload,
|
|
46
47
|
VerifyPayload,
|
|
48
|
+
DocumentToolResultPayload,
|
|
49
|
+
DocumentToolStatus,
|
|
47
50
|
} from './types'
|
|
48
51
|
|
|
49
52
|
// ---------------------------------------------------------------------------
|
|
@@ -131,11 +134,19 @@ export interface PrimitiveDispatcherProps {
|
|
|
131
134
|
* Accepts any object; unknown shapes fall through to <UnrecognizedPayload>.
|
|
132
135
|
*/
|
|
133
136
|
payload: PrimitivePayload | Record<string, unknown>
|
|
137
|
+
expanded?: boolean
|
|
134
138
|
}
|
|
135
139
|
|
|
136
|
-
export function PrimitiveDispatcher({
|
|
140
|
+
export function PrimitiveDispatcher({
|
|
141
|
+
payload,
|
|
142
|
+
expanded = false,
|
|
143
|
+
}: PrimitiveDispatcherProps): React.JSX.Element {
|
|
137
144
|
const _theme = useTheme() // ensure ThemeProvider is present in the tree
|
|
138
145
|
|
|
146
|
+
if (isDocumentToolResultPayload(payload)) {
|
|
147
|
+
return <DocumentToolResultCard payload={payload} expanded={expanded} />
|
|
148
|
+
}
|
|
149
|
+
|
|
139
150
|
const kind = (payload as { kind?: string }).kind
|
|
140
151
|
|
|
141
152
|
switch (kind) {
|
|
@@ -176,5 +187,36 @@ export { SubmitReceipt } from './SubmitReceipt'
|
|
|
176
187
|
export { SubmitErrorBanner } from './SubmitErrorBanner'
|
|
177
188
|
export { AuthContextCard } from './AuthContextCard'
|
|
178
189
|
export { AuthWarningBanner } from './AuthWarningBanner'
|
|
190
|
+
export { DocumentToolResultCard } from './DocumentToolResultCard'
|
|
179
191
|
export { UnrecognizedPayload } from './UnrecognizedPayload'
|
|
180
192
|
export type * from './types'
|
|
193
|
+
|
|
194
|
+
function isDocumentToolResultPayload(
|
|
195
|
+
payload: PrimitivePayload | Record<string, unknown>,
|
|
196
|
+
): payload is DocumentToolResultPayload {
|
|
197
|
+
if (!isRecord(payload)) {
|
|
198
|
+
return false
|
|
199
|
+
}
|
|
200
|
+
const toolId = payload.tool_id
|
|
201
|
+
const status = payload.status
|
|
202
|
+
return (
|
|
203
|
+
typeof toolId === 'string' &&
|
|
204
|
+
(toolId === 'document' || toolId.startsWith('document_')) &&
|
|
205
|
+
isDocumentToolStatus(status) &&
|
|
206
|
+
typeof payload.correlation_id === 'string' &&
|
|
207
|
+
typeof payload.text_summary === 'string'
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function isDocumentToolStatus(status: unknown): status is DocumentToolStatus {
|
|
212
|
+
return (
|
|
213
|
+
status === 'ok' ||
|
|
214
|
+
status === 'blocked' ||
|
|
215
|
+
status === 'failed' ||
|
|
216
|
+
status === 'needs_input'
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
221
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
222
|
+
}
|
|
@@ -205,6 +205,143 @@ export interface VerifyFailPayload {
|
|
|
205
205
|
|
|
206
206
|
export type VerifyPayload = VerifySuccessPayload | VerifyFailPayload
|
|
207
207
|
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// Public document harness mode
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
|
|
212
|
+
export type DocumentToolStatus = 'ok' | 'blocked' | 'failed' | 'needs_input'
|
|
213
|
+
export type DocumentWorkflowStepStatus =
|
|
214
|
+
| 'pending'
|
|
215
|
+
| 'completed'
|
|
216
|
+
| 'current'
|
|
217
|
+
| 'blocked'
|
|
218
|
+
| 'failed'
|
|
219
|
+
| 'skipped'
|
|
220
|
+
|
|
221
|
+
export interface DocumentChangePayload {
|
|
222
|
+
change_id: string
|
|
223
|
+
operation_id: string
|
|
224
|
+
change_type: 'field' | 'table_cell' | 'text' | 'style' | 'metadata' | 'copy'
|
|
225
|
+
target_path: string
|
|
226
|
+
display_label?: string | null
|
|
227
|
+
before_value?: string | null
|
|
228
|
+
after_value?: string | null
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export interface DocumentDiffPayload {
|
|
232
|
+
diff_id?: string
|
|
233
|
+
diff_sha256?: string
|
|
234
|
+
resource_ref?: string
|
|
235
|
+
source_artifact_id: string
|
|
236
|
+
derivative_artifact_id: string
|
|
237
|
+
changes: DocumentChangePayload[]
|
|
238
|
+
render_artifacts?: DocumentRenderArtifactPayload[]
|
|
239
|
+
baseline_render_artifacts?: DocumentRenderArtifactPayload[]
|
|
240
|
+
changed_viewports?: DocumentChangedViewportPayload[]
|
|
241
|
+
viewport_cameras?: DocumentViewportCameraPayload[]
|
|
242
|
+
inline_truncated?: boolean
|
|
243
|
+
omitted_change_count?: number
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export interface DocumentClipRectPayload {
|
|
247
|
+
x: number | string
|
|
248
|
+
y: number | string
|
|
249
|
+
width: number | string
|
|
250
|
+
height: number | string
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export interface DocumentChangedViewportPayload {
|
|
254
|
+
viewport_id: string
|
|
255
|
+
change_ids: string[]
|
|
256
|
+
page_number: number
|
|
257
|
+
source_render_artifact_id: string
|
|
258
|
+
clip_rect: DocumentClipRectPayload
|
|
259
|
+
padding_x?: number | string
|
|
260
|
+
padding_y?: number | string
|
|
261
|
+
svg_artifact_ref?: string | null
|
|
262
|
+
svg_artifact_path?: string | null
|
|
263
|
+
png_artifact_ref?: string | null
|
|
264
|
+
png_artifact_path?: string | null
|
|
265
|
+
before_svg_artifact_ref?: string | null
|
|
266
|
+
before_svg_artifact_path?: string | null
|
|
267
|
+
before_png_artifact_ref?: string | null
|
|
268
|
+
before_png_artifact_path?: string | null
|
|
269
|
+
after_svg_artifact_ref?: string | null
|
|
270
|
+
after_svg_artifact_path?: string | null
|
|
271
|
+
after_png_artifact_ref?: string | null
|
|
272
|
+
after_png_artifact_path?: string | null
|
|
273
|
+
text_fallback?: string[]
|
|
274
|
+
anchor_strategy?: string
|
|
275
|
+
confidence?: number | string
|
|
276
|
+
warnings?: string[]
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export interface DocumentViewportCameraPayload {
|
|
280
|
+
source_render_artifact_id: string
|
|
281
|
+
baseline_render_artifact_id: string
|
|
282
|
+
page_index: number
|
|
283
|
+
viewport_rect: DocumentClipRectPayload
|
|
284
|
+
zoom: number | string
|
|
285
|
+
change_ids: string[]
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export interface DocumentRenderArtifactPayload {
|
|
289
|
+
render_artifact_id: string
|
|
290
|
+
source_artifact_id?: string
|
|
291
|
+
render_sha256?: string
|
|
292
|
+
render_path?: string
|
|
293
|
+
render_mime_type?: string | null
|
|
294
|
+
raster_artifact_ref?: string | null
|
|
295
|
+
raster_artifact_path?: string | null
|
|
296
|
+
raster_mime_type?: string | null
|
|
297
|
+
page_number?: number
|
|
298
|
+
engine_id?: string
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export interface DocumentPromotionGatePayload {
|
|
302
|
+
capability?: string
|
|
303
|
+
promotion_state?: string
|
|
304
|
+
hard_gate_failures?: string[]
|
|
305
|
+
promotion_checklist?: Array<{
|
|
306
|
+
check_id: string
|
|
307
|
+
capability?: string
|
|
308
|
+
status?: string
|
|
309
|
+
evidence_required?: string
|
|
310
|
+
detail?: string | null
|
|
311
|
+
}>
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export interface DocumentWorkflowStepPayload {
|
|
315
|
+
step_id: string
|
|
316
|
+
label: string
|
|
317
|
+
status: DocumentWorkflowStepStatus
|
|
318
|
+
artifact_id?: string | null
|
|
319
|
+
artifact_sha256?: string | null
|
|
320
|
+
detail?: string | null
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export interface DocumentSavedExportPayload {
|
|
324
|
+
export_id?: string | null
|
|
325
|
+
artifact_id?: string | null
|
|
326
|
+
local_path?: string | null
|
|
327
|
+
sha256?: string | null
|
|
328
|
+
mime_type?: string | null
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export interface DocumentToolResultPayload {
|
|
332
|
+
tool_id: string
|
|
333
|
+
correlation_id: string
|
|
334
|
+
status: DocumentToolStatus
|
|
335
|
+
artifact_refs?: string[]
|
|
336
|
+
text_summary: string
|
|
337
|
+
blocked_reason?: string | null
|
|
338
|
+
diff?: DocumentDiffPayload | null
|
|
339
|
+
render_artifacts?: DocumentRenderArtifactPayload[]
|
|
340
|
+
promotion_gate_result?: DocumentPromotionGatePayload | null
|
|
341
|
+
workflow_steps?: DocumentWorkflowStepPayload[]
|
|
342
|
+
saved_exports?: DocumentSavedExportPayload[]
|
|
343
|
+
}
|
|
344
|
+
|
|
208
345
|
// ---------------------------------------------------------------------------
|
|
209
346
|
// Unrecognized payload (FR-033)
|
|
210
347
|
// ---------------------------------------------------------------------------
|
|
@@ -1,32 +1,10 @@
|
|
|
1
1
|
// [P0 reconstructed · rebuild-stubs.ts · symbol-complete stub]
|
|
2
2
|
// Aggregated from every consumer import across src/.
|
|
3
|
-
|
|
3
|
+
import { createStub } from '../../stubs/any-stub'
|
|
4
4
|
|
|
5
|
-
const
|
|
6
|
-
const __stub: any = new Proxy(function () {} as any, {
|
|
7
|
-
get(_t, p) {
|
|
8
|
-
if (p === Symbol.toPrimitive) return () => ""
|
|
9
|
-
if (p === Symbol.iterator) return function* () {}
|
|
10
|
-
if (p === Symbol.asyncIterator) return async function* () {}
|
|
11
|
-
if (p === Symbol.toStringTag) return "Stub"
|
|
12
|
-
if (p === Symbol.for("nodejs.util.inspect.custom")) return () => "<Stub>"
|
|
13
|
-
if (p === "inspect") return () => "<Stub>"
|
|
14
|
-
if (p === "then") return undefined
|
|
15
|
-
if (p === "toString") return () => ""
|
|
16
|
-
if (p === "valueOf") return () => undefined
|
|
17
|
-
if (p === "toJSON") return () => null
|
|
18
|
-
if (p === "length") return 0
|
|
19
|
-
if (p === "name") return "Stub"
|
|
20
|
-
if (p === "message") return ""
|
|
21
|
-
if (p === "stack") return ""
|
|
22
|
-
if (p === "constructor") return Object
|
|
23
|
-
return __stub
|
|
24
|
-
},
|
|
25
|
-
apply() { return __stub },
|
|
26
|
-
construct() { return __stub },
|
|
27
|
-
});
|
|
5
|
+
const __stub = createStub()
|
|
28
6
|
|
|
29
|
-
export type Option =
|
|
30
|
-
export const Option
|
|
7
|
+
export type Option = unknown;
|
|
8
|
+
export const Option = __stub;
|
|
31
9
|
|
|
32
10
|
export default __stub;
|