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
|
@@ -14,6 +14,7 @@ import type { IPCBridge } from '../../ipc/bridge.js'
|
|
|
14
14
|
import type { ToolCallFrame, ToolResultFrame } from '../../ipc/frames.generated.js'
|
|
15
15
|
import { getUmmayaBridgeSessionId } from '../../ipc/bridgeSingleton.js'
|
|
16
16
|
import type { ToolUseContext, ToolResult } from '../../Tool.js'
|
|
17
|
+
import { argumentsForPrimitive } from './documentDispatchArguments.js'
|
|
17
18
|
import { PendingCallRegistry } from './pendingCallRegistry.js'
|
|
18
19
|
|
|
19
20
|
// ---------------------------------------------------------------------------
|
|
@@ -49,7 +50,7 @@ function _resolveTimeoutMs(override?: number): number {
|
|
|
49
50
|
// ---------------------------------------------------------------------------
|
|
50
51
|
|
|
51
52
|
export interface DispatchPrimitiveOpts {
|
|
52
|
-
primitive: 'find' | 'locate' | 'check' | 'send'
|
|
53
|
+
primitive: 'find' | 'locate' | 'check' | 'send' | 'document'
|
|
53
54
|
/** Concrete model-facing tool name. Defaults to the primitive for legacy root calls. */
|
|
54
55
|
toolName?: string
|
|
55
56
|
/** Forwarded verbatim into tool_call frame arguments (FR-009). */
|
|
@@ -78,7 +79,7 @@ export function _resetCheckpointState(): void {
|
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
function _maybeEmitCheckpoint(
|
|
81
|
-
primitive: 'find' | 'locate' | 'check' | 'send',
|
|
82
|
+
primitive: 'find' | 'locate' | 'check' | 'send' | 'document',
|
|
82
83
|
frame: ToolResultFrame,
|
|
83
84
|
): void {
|
|
84
85
|
if (process.env['UMMAYA_SMOKE_CHECKPOINTS'] !== 'true') return
|
|
@@ -146,8 +147,7 @@ export async function dispatchPrimitive<O = unknown>(
|
|
|
146
147
|
// it does not synthesize the follow-up assistant turn for this Tool.call().
|
|
147
148
|
// ------------------------------------------------------------------
|
|
148
149
|
|
|
149
|
-
const toolUseId =
|
|
150
|
-
(opts.context as Record<string, unknown>)['toolUseId'] as string | undefined
|
|
150
|
+
const toolUseId = opts.context.toolUseId
|
|
151
151
|
if (!toolUseId) {
|
|
152
152
|
span.setAttribute('ummaya.tui.primitive.error', 'missing_tool_use_id')
|
|
153
153
|
span.end()
|
|
@@ -198,7 +198,7 @@ export async function dispatchPrimitive<O = unknown>(
|
|
|
198
198
|
kind: 'tool_call',
|
|
199
199
|
call_id: toolUseId,
|
|
200
200
|
name: toolName,
|
|
201
|
-
arguments: opts
|
|
201
|
+
arguments: argumentsForPrimitive(opts),
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
const sent = opts.bridge.send(toolCallFrame)
|
|
@@ -281,7 +281,7 @@ export async function dispatchPrimitive<O = unknown>(
|
|
|
281
281
|
// Classification rules (all OR'd, evaluated against ``inner`` only):
|
|
282
282
|
// - ``inner.family === "mismatch_error"`` — VerifyMismatchError dump.
|
|
283
283
|
// - ``inner.kind === "error"`` — lookup / submit error sentinel.
|
|
284
|
-
// - ``inner.reason ∈ FATAL_REASONS`` — defense-in-depth:
|
|
284
|
+
// - ``inner.reason ∈ FATAL_REASONS`` — defense-in-depth: an adapter that
|
|
285
285
|
// emits a known-fatal reason code is classified as failure even if it
|
|
286
286
|
// forgot to set ``kind``/``family``.
|
|
287
287
|
const FATAL_REASONS = new Set([
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* UMMAYA — document-change → Claude Code diff-pipeline migration boundary.
|
|
4
|
+
*
|
|
5
|
+
* Deep-research-migration note (selected approach D):
|
|
6
|
+
* specs/2802-public-doc-harness/deep-research-migration-document-render.md
|
|
7
|
+
*
|
|
8
|
+
* Document work renders in the TUI the same way Claude Code renders a code
|
|
9
|
+
* edit: automatically, inline, per-mutation, via `renderToolResultMessage`.
|
|
10
|
+
* Rather than invent a renderer, this module routes structural field-level
|
|
11
|
+
* document changes INTO the already-ported CC diff pipeline by representing the
|
|
12
|
+
* changed form as `label: value` text and producing the `StructuredPatchHunk[]`
|
|
13
|
+
* shape that `StructuredDiffList` already consumes byte-identically. The
|
|
14
|
+
* "structural" choice (difftastic / json-diff / daff convergence) is that the
|
|
15
|
+
* text is built from semantic fields, not from raw document bytes.
|
|
16
|
+
*/
|
|
17
|
+
import type { StructuredPatchHunk } from 'diff'
|
|
18
|
+
import { getPatchFromContents } from '../../utils/diff.js'
|
|
19
|
+
import type {
|
|
20
|
+
DocumentChangePayload,
|
|
21
|
+
DocumentDiffPayload,
|
|
22
|
+
} from '../../components/primitive/types.js'
|
|
23
|
+
|
|
24
|
+
/** Default inline cap; beyond this the inline view shows a "+N more" affordance. */
|
|
25
|
+
export const DEFAULT_INLINE_CHANGE_CAP = 20
|
|
26
|
+
|
|
27
|
+
export interface DocumentPatchResult {
|
|
28
|
+
/** Hunks ready for `<StructuredDiffList hunks={...} />` (CC pipeline). */
|
|
29
|
+
hunks: StructuredPatchHunk[]
|
|
30
|
+
/** Synthetic file path = document name; drives CC language detection. */
|
|
31
|
+
filePath: string
|
|
32
|
+
/** Actual visible changes after no-op entries are removed. */
|
|
33
|
+
changeCount: number
|
|
34
|
+
/** Changes actually rendered into the patch (≤ cap). */
|
|
35
|
+
renderedChangeCount: number
|
|
36
|
+
/** True when changes were dropped from the inline view, or the backend
|
|
37
|
+
* already flagged inline truncation. */
|
|
38
|
+
truncated: boolean
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface DocumentChangeToPatchOptions {
|
|
42
|
+
documentName?: string
|
|
43
|
+
maxChanges?: number
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function documentChangeToPatch(
|
|
47
|
+
diff: DocumentDiffPayload,
|
|
48
|
+
options: DocumentChangeToPatchOptions = {},
|
|
49
|
+
): DocumentPatchResult {
|
|
50
|
+
const filePath = nonEmpty(options.documentName) ?? 'document'
|
|
51
|
+
const cap = Math.max(0, options.maxChanges ?? DEFAULT_INLINE_CHANGE_CAP)
|
|
52
|
+
const changes = documentVisibleChanges(diff)
|
|
53
|
+
const changeCount = changes.length
|
|
54
|
+
const rendered = changes.slice(0, cap)
|
|
55
|
+
const renderedChangeCount = rendered.length
|
|
56
|
+
const truncated =
|
|
57
|
+
changeCount > renderedChangeCount || diff.inline_truncated === true
|
|
58
|
+
|
|
59
|
+
if (renderedChangeCount === 0) {
|
|
60
|
+
return { hunks: [], filePath, changeCount, renderedChangeCount, truncated }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Trailing newline on both sides so the `diff` package does not emit a
|
|
64
|
+
// "" marker — that marker would also break the
|
|
65
|
+
// fallback renderer's remove/add adjacency pairing (and thus its word-level
|
|
66
|
+
// value highlighting).
|
|
67
|
+
const before = `${rendered.map((change) => fieldLine(change, 'before')).join('\n')}\n`
|
|
68
|
+
const after = `${rendered.map((change) => fieldLine(change, 'after')).join('\n')}\n`
|
|
69
|
+
const hunks = getPatchFromContents({
|
|
70
|
+
filePath,
|
|
71
|
+
oldContent: before,
|
|
72
|
+
newContent: after,
|
|
73
|
+
singleHunk: true,
|
|
74
|
+
})
|
|
75
|
+
return { hunks, filePath, changeCount, renderedChangeCount, truncated }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function fieldLine(change: DocumentChangePayload, side: 'before' | 'after'): string {
|
|
79
|
+
const fallbackLabel = humanizeDocumentTargetPath(change.target_path) || change.change_type
|
|
80
|
+
const label = nonEmpty(change.display_label) ?? fallbackLabel
|
|
81
|
+
const value = sanitizeValue(
|
|
82
|
+
side === 'before' ? change.before_value : change.after_value,
|
|
83
|
+
)
|
|
84
|
+
return `${label}: ${value}`
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function documentVisibleChanges(
|
|
88
|
+
diff: DocumentDiffPayload,
|
|
89
|
+
): DocumentChangePayload[] {
|
|
90
|
+
return diff.changes.filter(hasVisibleChange)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function hasVisibleChange(change: DocumentChangePayload): boolean {
|
|
94
|
+
return sanitizeValue(change.before_value) !== sanitizeValue(change.after_value)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Structural path is the location (difftastic philosophy). Strip the leading
|
|
99
|
+
* slash and render nested segments with a breadcrumb separator so
|
|
100
|
+
* `/hwpx/text[12]` reads as `hwpx › text[12]`. No pixel coordinates — the field
|
|
101
|
+
* path is honest and precise about where the change lives.
|
|
102
|
+
*/
|
|
103
|
+
export function humanizeDocumentTargetPath(path: string): string {
|
|
104
|
+
const trimmed = path.trim().replace(/^\/+/u, '')
|
|
105
|
+
if (trimmed === '') {
|
|
106
|
+
return ''
|
|
107
|
+
}
|
|
108
|
+
return trimmed.replace(/\/+/gu, ' › ')
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Collapse newlines so one field change stays one diff line. */
|
|
112
|
+
function sanitizeValue(value: string | null | undefined): string {
|
|
113
|
+
if (value === null || value === undefined) {
|
|
114
|
+
return ''
|
|
115
|
+
}
|
|
116
|
+
return value.replace(/\r?\n/gu, ' ')
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function nonEmpty(value: string | null | undefined): string | undefined {
|
|
120
|
+
if (value === null || value === undefined) {
|
|
121
|
+
return undefined
|
|
122
|
+
}
|
|
123
|
+
const trimmed = value.trim()
|
|
124
|
+
return trimmed === '' ? undefined : trimmed
|
|
125
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
const DOCUMENT_READ_ONLY_OPERATIONS = new Set(['inspect', 'extract', 'validate'])
|
|
4
|
+
|
|
5
|
+
type PrimitiveName = 'find' | 'locate' | 'check' | 'send' | 'document'
|
|
6
|
+
|
|
7
|
+
export interface PrimitiveArgumentsOpts {
|
|
8
|
+
readonly primitive: PrimitiveName
|
|
9
|
+
readonly args: Record<string, unknown>
|
|
10
|
+
readonly context: {
|
|
11
|
+
readonly messages?: readonly unknown[]
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function argumentsForPrimitive(
|
|
16
|
+
opts: PrimitiveArgumentsOpts,
|
|
17
|
+
): Record<string, unknown> {
|
|
18
|
+
if (opts.primitive !== 'document') return opts.args
|
|
19
|
+
if (isReadOnlyDocumentOperation(opts.args) && hasDocumentDispatchContract(opts.args)) {
|
|
20
|
+
return opts.args
|
|
21
|
+
}
|
|
22
|
+
const userQuery = latestUserTextFromContext(opts.context)
|
|
23
|
+
if (!userQuery) return opts.args
|
|
24
|
+
return {
|
|
25
|
+
...opts.args,
|
|
26
|
+
__ummaya_user_query: userQuery,
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isReadOnlyDocumentOperation(args: Record<string, unknown>): boolean {
|
|
31
|
+
const operation = typeof args.operation === 'string'
|
|
32
|
+
? args.operation.toLowerCase()
|
|
33
|
+
: 'fill'
|
|
34
|
+
return DOCUMENT_READ_ONLY_OPERATIONS.has(operation)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function hasDocumentDispatchContract(args: Record<string, unknown>): boolean {
|
|
38
|
+
const correlationId = args.correlation_id
|
|
39
|
+
const instruction = args.instruction
|
|
40
|
+
const document = recordFrom(args.document)
|
|
41
|
+
if (typeof correlationId !== 'string' || correlationId.trim() === '') return false
|
|
42
|
+
if (typeof instruction !== 'string' || instruction.trim() === '') return false
|
|
43
|
+
if (document === undefined) return false
|
|
44
|
+
const path = document.path
|
|
45
|
+
const artifactId = document.artifact_id
|
|
46
|
+
return (
|
|
47
|
+
(typeof path === 'string' && path.trim() !== '') ||
|
|
48
|
+
(typeof artifactId === 'string' && artifactId.trim() !== '')
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function latestUserTextFromContext(context: PrimitiveArgumentsOpts['context']): string | undefined {
|
|
53
|
+
const messages = context.messages ?? []
|
|
54
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
55
|
+
const message = recordFrom(messages[index])
|
|
56
|
+
if (message === undefined || message.type !== 'user') continue
|
|
57
|
+
const sdkMessage = recordFrom(message.message)
|
|
58
|
+
if (sdkMessage === undefined || sdkMessage.role !== 'user') continue
|
|
59
|
+
const content = sdkMessage.content
|
|
60
|
+
if (typeof content === 'string' && content.trim() !== '') {
|
|
61
|
+
return content
|
|
62
|
+
}
|
|
63
|
+
const text = textFromContentBlocks(content)
|
|
64
|
+
if (text !== undefined) return text
|
|
65
|
+
}
|
|
66
|
+
return undefined
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function textFromContentBlocks(content: unknown): string | undefined {
|
|
70
|
+
if (!Array.isArray(content)) return undefined
|
|
71
|
+
const text = content
|
|
72
|
+
.map(block => {
|
|
73
|
+
const item = recordFrom(block)
|
|
74
|
+
if (item?.type !== 'text') return ''
|
|
75
|
+
return typeof item.text === 'string' ? item.text : ''
|
|
76
|
+
})
|
|
77
|
+
.filter(Boolean)
|
|
78
|
+
.join('\n')
|
|
79
|
+
.trim()
|
|
80
|
+
return text === '' ? undefined : text
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function recordFrom(value: unknown): Record<string, unknown> | undefined {
|
|
84
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
85
|
+
? Object.fromEntries(Object.entries(value))
|
|
86
|
+
: undefined
|
|
87
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// UMMAYA-original — document primitive timeout policy.
|
|
3
|
+
|
|
4
|
+
const DEFAULT_DOCUMENT_TIMEOUT_MS = 120_000
|
|
5
|
+
|
|
6
|
+
export function resolveDocumentPrimitiveTimeoutMs(): number {
|
|
7
|
+
const env = process.env['UMMAYA_TUI_DOCUMENT_TIMEOUT_MS']
|
|
8
|
+
if (env) {
|
|
9
|
+
const parsed = Number.parseInt(env, 10)
|
|
10
|
+
if (Number.isFinite(parsed) && parsed > 0) return parsed
|
|
11
|
+
}
|
|
12
|
+
return DEFAULT_DOCUMENT_TIMEOUT_MS
|
|
13
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { PrimitiveDispatcher } from '../../components/primitive/index.js'
|
|
3
|
+
|
|
4
|
+
type DocumentRenderOptions = {
|
|
5
|
+
verbose?: boolean
|
|
6
|
+
isTranscriptMode?: boolean
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Auto-render a document tool result inline in the TUI — the same way Claude
|
|
11
|
+
* Code renders a code diff after an edit, with no "show viewer" query. Driven
|
|
12
|
+
* by `renderToolResultMessage`, invoked by the message loop for every resolved
|
|
13
|
+
* tool result. See deep-research-migration-document-render.md (approach D).
|
|
14
|
+
*/
|
|
15
|
+
export function renderDocumentToolResultIfPresent(
|
|
16
|
+
output: unknown,
|
|
17
|
+
options: DocumentRenderOptions = {},
|
|
18
|
+
): React.ReactNode | null {
|
|
19
|
+
const payload = extractDocumentToolResultPayload(output)
|
|
20
|
+
if (payload === null) {
|
|
21
|
+
return null
|
|
22
|
+
}
|
|
23
|
+
return React.createElement(PrimitiveDispatcher, {
|
|
24
|
+
payload,
|
|
25
|
+
expanded: options.verbose === true || options.isTranscriptMode === true,
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Retired raster-availability gate.
|
|
31
|
+
*
|
|
32
|
+
* Previously this converted a successful `document_render` into a failure when
|
|
33
|
+
* a page raster was unreadable, because review happened in an external browser
|
|
34
|
+
* viewer that needed the image. Under deep-research-migration approach D the
|
|
35
|
+
* user surface is the structural field-level diff (`StructuredDiffList`), which
|
|
36
|
+
* renders from `diff.changes` and never depends on a raster — so the TUI no
|
|
37
|
+
* longer fabricates a visual-render failure. Page rasters remain Evidence
|
|
38
|
+
* Fabric evidence only (joinable by `correlation_id`).
|
|
39
|
+
*
|
|
40
|
+
* Kept as an identity pass-through so the model-facing primitive tools
|
|
41
|
+
* (AdapterTool / LookupPrimitive / SubmitPrimitive) keep a stable call boundary;
|
|
42
|
+
* full call-site removal is a tracked follow-up.
|
|
43
|
+
*/
|
|
44
|
+
export function applyDocumentVisualRenderGateToOutput(output: unknown): unknown {
|
|
45
|
+
return output
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** The TUI never fabricates a render failure under approach D; backend status
|
|
49
|
+
* governs. Retained for call-boundary stability (see above). */
|
|
50
|
+
export function isDocumentVisualRenderFailedOutput(_output: unknown): boolean {
|
|
51
|
+
return false
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function extractDocumentToolResultPayload(
|
|
55
|
+
output: unknown,
|
|
56
|
+
): Record<string, unknown> | null {
|
|
57
|
+
const direct = asDocumentToolResultPayload(output)
|
|
58
|
+
if (direct !== null) {
|
|
59
|
+
return direct
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const wrapped = asRecord(output)
|
|
63
|
+
if (wrapped === null) {
|
|
64
|
+
return null
|
|
65
|
+
}
|
|
66
|
+
return asDocumentToolResultPayload(wrapped.result)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function asDocumentToolResultPayload(output: unknown): Record<string, unknown> | null {
|
|
70
|
+
const record = asRecord(output)
|
|
71
|
+
if (record === null) {
|
|
72
|
+
return null
|
|
73
|
+
}
|
|
74
|
+
return (
|
|
75
|
+
typeof record.tool_id === 'string' &&
|
|
76
|
+
(record.tool_id === 'document' || record.tool_id.startsWith('document_')) &&
|
|
77
|
+
typeof record.correlation_id === 'string' &&
|
|
78
|
+
typeof record.text_summary === 'string' &&
|
|
79
|
+
isDocumentStatus(record.status)
|
|
80
|
+
)
|
|
81
|
+
? record
|
|
82
|
+
: null
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function isDocumentStatus(status: unknown): boolean {
|
|
86
|
+
return (
|
|
87
|
+
status === 'ok' ||
|
|
88
|
+
status === 'blocked' ||
|
|
89
|
+
status === 'failed' ||
|
|
90
|
+
status === 'needs_input'
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function asRecord(value: unknown): Record<string, unknown> | null {
|
|
95
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
96
|
+
? value as Record<string, unknown>
|
|
97
|
+
: null
|
|
98
|
+
}
|
|
@@ -16,7 +16,7 @@ import type { ToolResultFrame } from '../../ipc/frames.generated.js'
|
|
|
16
16
|
|
|
17
17
|
export interface PendingCall {
|
|
18
18
|
callId: string
|
|
19
|
-
primitive: 'find' | 'locate' | 'check' | 'send'
|
|
19
|
+
primitive: 'find' | 'locate' | 'check' | 'send' | 'document'
|
|
20
20
|
resolve: (frame: ToolResultFrame) => void
|
|
21
21
|
reject: (err: Error) => void
|
|
22
22
|
timeoutHandle: ReturnType<typeof setTimeout>
|
|
@@ -45,11 +45,6 @@ export interface PendingCall {
|
|
|
45
45
|
*/
|
|
46
46
|
export class PendingCallRegistry {
|
|
47
47
|
private _pending = new Map<string, PendingCall>()
|
|
48
|
-
// UMMAYA hotfix #2519 — race-safe buffering for ToolResultFrame frames
|
|
49
|
-
// that arrive BEFORE the matching dispatchPrimitive call has registered
|
|
50
|
-
// (the backend's _dispatch_primitive runs as a parallel asyncio.Task and
|
|
51
|
-
// can complete in <1s for cached / mock adapters, often beating the
|
|
52
|
-
// SDK's tool_use block parse → Tool.call() invocation timeline).
|
|
53
48
|
private _buffered = new Map<string, ToolResultFrame>()
|
|
54
49
|
|
|
55
50
|
/**
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const DOCUMENT_TOOL_NAME = 'document'
|
|
2
|
+
export const DOCUMENT_RENDER_TOOL_NAME = 'document_render'
|
|
3
|
+
export type DocumentToolName =
|
|
4
|
+
| typeof DOCUMENT_TOOL_NAME
|
|
5
|
+
| typeof DOCUMENT_RENDER_TOOL_NAME
|
|
6
|
+
|
|
7
|
+
export const DOCUMENT_COMPLETION_PROMPT_MARKER = 'Document primitive result complete'
|
|
8
|
+
export const DOCUMENT_COMPLETION_PROMPT =
|
|
9
|
+
`${DOCUMENT_COMPLETION_PROMPT_MARKER}: the document tool_result for the latest citizen request is already visible in the TUI. Do not call another document, workspace, render, or tool-search tool in this turn. Answer in Korean only. Write the final Korean answer now from the actual tool_result only. Keep it to one or two short sentences: state whether the document was updated, blocked, failed, or needs explicit input; when the status is needs_input or the path is missing, ask the user to provide an exact existing file path or make an explicit selection; mention only changed field labels/values or required selection that are present in the visible diff; include the saved path only when the tool_result reports one. Do not invent units, parenthetical labels, workflow steps, style claims, or extra facts. Do not say an image, screenshot, viewport, render artifact, browser view, viewer, or visual artifact was generated. The inline TUI diff above is the user-visible proof.`
|
|
10
|
+
export const DOCUMENT_INTENT_RE =
|
|
11
|
+
/(문서|공문서|양식|서식|파일|작성|저장|렌더|미리보기|변경사항|\bdiff\b|\bcompact\b|\bdocument\b|\bfile\b|\bform\b|\brender\b|\bsave\b|\bwrite\b)/iu
|
|
12
|
+
export const DOCUMENT_WRITE_RE =
|
|
13
|
+
/(작성|수정|편집|채우|채워|입력|변경|저장|write|edit|fill|apply|save)/iu
|
|
14
|
+
export const DOCUMENT_READ_ONLY_RE =
|
|
15
|
+
/(읽기\s*전용|수정\s*없이|변경\s*없이|저장\s*없이|수정하지\s*마|저장하지\s*마|작성하지\s*마|쓰지\s*마|열람만|확인만|inspect|extract|read\s*only)/iu
|
|
16
|
+
export const DOCUMENT_DIFF_ONLY_FINAL_RE =
|
|
17
|
+
/(실제(?:로)?\s*바뀐\s*내용만|바뀐\s*내용만|변경된\s*부분만|변경사항만|actual\s+changed\s+content\s+only|only\s+changed)/iu
|
|
18
|
+
export const DOCUMENT_DIFF_AND_SAVE_ONLY_FINAL_RE =
|
|
19
|
+
/(실제(?:로)?\s*바뀐\s*내용\s*(?:과|및|랑|하고)\s*저장\s*(?:위치|경로)만|변경(?:된)?\s*(?:내용|부분|사항).{0,24}저장\s*(?:위치|경로)만|changed.{0,24}(?:save|saved).{0,24}(?:location|path).{0,24}only)/iu
|
|
20
|
+
const LOCAL_DOCUMENT_PATH_RE =
|
|
21
|
+
/(?:^|[\s"'(])((?:~|\/|\.{1,2}\/)[^\s"'<>]+?\.(?:hwpx|hwp|docx|pdf|xlsx|pptx))(?=$|[\s"'),.?!:;,。]|[가-힣])/iu
|
|
22
|
+
const DOCUMENT_INSPECT_STRUCTURE_RE =
|
|
23
|
+
/(구조|빈칸|문항|양식|필드|항목|inspect|extract)/iu
|
|
24
|
+
|
|
25
|
+
export type DocumentExpectedFormat =
|
|
26
|
+
| 'hwpx'
|
|
27
|
+
| 'hwp'
|
|
28
|
+
| 'docx'
|
|
29
|
+
| 'pdf'
|
|
30
|
+
| 'xlsx'
|
|
31
|
+
| 'pptx'
|
|
32
|
+
|
|
33
|
+
export function localDocumentPathFromText(userText: string): string | undefined {
|
|
34
|
+
return LOCAL_DOCUMENT_PATH_RE.exec(userText)?.[1]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function documentExpectedFormatFromPath(
|
|
38
|
+
path: string,
|
|
39
|
+
): DocumentExpectedFormat | undefined {
|
|
40
|
+
const ext = path.split('.').pop()?.toLowerCase()
|
|
41
|
+
switch (ext) {
|
|
42
|
+
case 'hwpx':
|
|
43
|
+
case 'hwp':
|
|
44
|
+
case 'docx':
|
|
45
|
+
case 'pdf':
|
|
46
|
+
case 'xlsx':
|
|
47
|
+
case 'pptx':
|
|
48
|
+
return ext
|
|
49
|
+
default:
|
|
50
|
+
return undefined
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function isExactLocalReadOnlyDocumentPrompt(userText: string): boolean {
|
|
55
|
+
return localDocumentPathFromText(userText) !== undefined &&
|
|
56
|
+
(DOCUMENT_READ_ONLY_RE.test(userText) ||
|
|
57
|
+
DOCUMENT_INSPECT_STRUCTURE_RE.test(userText))
|
|
58
|
+
}
|