ummaya 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -3
- package/bin/ummaya +10 -1
- package/npm-shrinkwrap.json +253 -2
- package/package.json +5 -1
- package/prompts/manifest.yaml +2 -2
- package/prompts/session_guidance_v1.md +3 -1
- package/prompts/system_v1.md +9 -7
- package/pyproject.toml +26 -7
- package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
- package/src/ummaya/_canonical/__init__.py +2 -0
- package/src/ummaya/context/builder.py +17 -11
- package/src/ummaya/engine/engine.py +30 -113
- package/src/ummaya/engine/query.py +20 -0
- package/src/ummaya/evidence/__init__.py +44 -0
- package/src/ummaya/evidence/__main__.py +7 -0
- package/src/ummaya/evidence/dataset_contract.py +193 -0
- package/src/ummaya/evidence/document_authoring_cases.py +33 -0
- package/src/ummaya/evidence/document_harness.py +313 -0
- package/src/ummaya/evidence/document_viewer_ux.py +391 -0
- package/src/ummaya/evidence/gates.py +70 -0
- package/src/ummaya/evidence/json_types.py +20 -0
- package/src/ummaya/evidence/models.py +145 -0
- package/src/ummaya/evidence/output_payload.py +89 -0
- package/src/ummaya/evidence/payload_documents.py +233 -0
- package/src/ummaya/evidence/route_contracts.py +224 -0
- package/src/ummaya/evidence/route_helpers.py +150 -0
- package/src/ummaya/evidence/runner.py +177 -0
- package/src/ummaya/evidence/source_provenance.py +246 -0
- package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
- package/src/ummaya/evidence/task_registry.py +264 -0
- package/src/ummaya/evidence/tool_layer.py +39 -0
- package/src/ummaya/evidence/tool_layer_models.py +151 -0
- package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
- package/src/ummaya/ipc/document_intent_normalization.py +185 -0
- package/src/ummaya/ipc/frame_schema.py +52 -5
- package/src/ummaya/ipc/route_diagnostics.py +73 -0
- package/src/ummaya/ipc/stdio.py +2282 -417
- package/src/ummaya/llm/client.py +234 -59
- package/src/ummaya/llm/config.py +8 -3
- package/src/ummaya/llm/reasoning.py +84 -0
- package/src/ummaya/primitives/__init__.py +6 -2
- package/src/ummaya/primitives/delegation.py +1 -1
- package/src/ummaya/primitives/document.py +28 -0
- package/src/ummaya/settings.py +0 -3
- package/src/ummaya/tools/discovery_bridge.py +34 -2
- package/src/ummaya/tools/documents/__init__.py +297 -0
- package/src/ummaya/tools/documents/adapter_registry.py +487 -0
- package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
- package/src/ummaya/tools/documents/artifact_store.py +454 -0
- package/src/ummaya/tools/documents/authoring.py +283 -0
- package/src/ummaya/tools/documents/baselines.py +114 -0
- package/src/ummaya/tools/documents/capability.py +331 -0
- package/src/ummaya/tools/documents/contracts.py +112 -0
- package/src/ummaya/tools/documents/conversion.py +521 -0
- package/src/ummaya/tools/documents/diff.py +275 -0
- package/src/ummaya/tools/documents/engines.py +163 -0
- package/src/ummaya/tools/documents/evaluation.py +291 -0
- package/src/ummaya/tools/documents/explicit_values.py +108 -0
- package/src/ummaya/tools/documents/fixtures.py +174 -0
- package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
- package/src/ummaya/tools/documents/formats/__init__.py +2 -0
- package/src/ummaya/tools/documents/formats/archive.py +528 -0
- package/src/ummaya/tools/documents/formats/base.py +41 -0
- package/src/ummaya/tools/documents/formats/code_file.py +211 -0
- package/src/ummaya/tools/documents/formats/data_file.py +272 -0
- package/src/ummaya/tools/documents/formats/hwp.py +284 -0
- package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
- package/src/ummaya/tools/documents/formats/odf.py +435 -0
- package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
- package/src/ummaya/tools/documents/formats/passive.py +766 -0
- package/src/ummaya/tools/documents/formats/pdf.py +702 -0
- package/src/ummaya/tools/documents/formats/text_web.py +268 -0
- package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
- package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
- package/src/ummaya/tools/documents/inspection.py +289 -0
- package/src/ummaya/tools/documents/intake.py +1079 -0
- package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
- package/src/ummaya/tools/documents/models.py +1598 -0
- package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
- package/src/ummaya/tools/documents/orchestrator.py +96 -0
- package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
- package/src/ummaya/tools/documents/patch.py +170 -0
- package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
- package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
- package/src/ummaya/tools/documents/permissions.py +110 -0
- package/src/ummaya/tools/documents/planner.py +616 -0
- package/src/ummaya/tools/documents/registry.py +2733 -0
- package/src/ummaya/tools/documents/render.py +978 -0
- package/src/ummaya/tools/documents/render_comparison.py +113 -0
- package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
- package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
- package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
- package/src/ummaya/tools/documents/reread.py +157 -0
- package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
- package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
- package/src/ummaya/tools/documents/scorecard.py +184 -0
- package/src/ummaya/tools/documents/socratic_planner.py +193 -0
- package/src/ummaya/tools/documents/style.py +48 -0
- package/src/ummaya/tools/documents/tool_defs.py +523 -0
- package/src/ummaya/tools/documents/validate.py +347 -0
- package/src/ummaya/tools/executor.py +61 -12
- package/src/ummaya/tools/geocoding/kakao_client.py +1 -2
- package/src/ummaya/tools/kma/apihub_catalog.py +984 -1
- package/src/ummaya/tools/kma/apihub_structured_adapter.py +86 -6
- package/src/ummaya/tools/kma/apihub_url_adapter.py +593 -0
- package/src/ummaya/tools/kma/apihub_url_catalog.py +296 -0
- package/src/ummaya/tools/live_proxy.py +0 -3
- package/src/ummaya/tools/location_adapters.py +8 -6
- package/src/ummaya/tools/manifest_metadata.py +16 -3
- package/src/ummaya/tools/models.py +5 -1
- package/src/ummaya/tools/mvp_surface.py +2 -2
- package/src/ummaya/tools/nmc/emergency_search.py +8 -6
- package/src/ummaya/tools/register_all.py +17 -0
- package/src/ummaya/tools/registry.py +10 -1
- package/src/ummaya/tools/resolve_location.py +4 -4
- package/src/ummaya/tools/routing/__init__.py +59 -0
- package/src/ummaya/tools/routing/builder.py +105 -0
- package/src/ummaya/tools/routing/cards.py +29 -0
- package/src/ummaya/tools/routing/decision_service.py +534 -0
- package/src/ummaya/tools/routing/decision_types.py +74 -0
- package/src/ummaya/tools/routing/feasibility.py +122 -0
- package/src/ummaya/tools/routing/intent.py +17 -0
- package/src/ummaya/tools/routing/intent_extractor.py +207 -0
- package/src/ummaya/tools/routing/intent_patterns.py +160 -0
- package/src/ummaya/tools/routing/intent_public_data.py +150 -0
- package/src/ummaya/tools/routing/intent_types.py +48 -0
- package/src/ummaya/tools/routing/lint.py +78 -0
- package/src/ummaya/tools/routing/metadata.py +174 -0
- package/src/ummaya/tools/routing/projection.py +340 -0
- package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
- package/src/ummaya/tools/routing/schema.py +81 -0
- package/src/ummaya/tools/routing/types.py +96 -0
- package/src/ummaya/tools/routing_index.py +2 -2
- package/src/ummaya/tools/search.py +40 -106
- package/src/ummaya/tools/verified_data_go_kr/_manifest.py +115 -25
- package/src/ummaya/tools/verified_data_go_kr/airkorea_air_quality.py +109 -4
- package/src/ummaya/tools/verified_data_go_kr/nmc_aed_site.py +108 -2
- package/src/ummaya/tools/verified_data_go_kr/pps_bid_public_info.py +174 -9
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_arrival.py +66 -3
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_location.py +12 -2
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_route.py +8 -2
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_route_station.py +114 -0
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_station.py +14 -3
- package/src/ummaya/tools/verify_canonical_map.py +21 -0
- package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
- package/tui/package.json +1 -2
- package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
- package/tui/src/QueryEngine.ts +12 -4
- package/tui/src/bridge/inboundAttachments.ts +3 -3
- package/tui/src/cli/handlers/auth.ts +4 -13
- package/tui/src/cli/handlers/mcp.tsx +3 -3
- package/tui/src/cli/print.ts +69 -18
- package/tui/src/cli/update.ts +13 -13
- package/tui/src/commands/copy/index.ts +1 -1
- package/tui/src/commands/cost/cost.ts +2 -2
- package/tui/src/commands/init-verifiers.ts +5 -5
- package/tui/src/commands/init.ts +30 -30
- package/tui/src/commands/insights.ts +44 -44
- package/tui/src/commands/install-github-app/install-github-app.tsx +2 -2
- package/tui/src/commands/install-github-app/setupGitHubActions.ts +3 -3
- package/tui/src/commands/install-github-app/types.ts +8 -30
- package/tui/src/commands/install.tsx +5 -5
- package/tui/src/commands/mcp/addCommand.ts +5 -5
- package/tui/src/commands/mcp/xaaIdpCommand.ts +2 -2
- package/tui/src/commands/plugin/ManageMarketplaces.tsx +2 -2
- package/tui/src/commands/plugin/types.ts +6 -28
- package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
- package/tui/src/commands/reasoning/index.ts +13 -0
- package/tui/src/commands/reasoning/reasoning.tsx +177 -0
- package/tui/src/commands/rename/generateSessionName.ts +1 -1
- package/tui/src/commands/thinkback/thinkback.tsx +3 -3
- package/tui/src/commands.ts +2 -0
- package/tui/src/components/Feedback.tsx +1 -1
- package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
- package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
- package/tui/src/components/Messages.tsx +2 -1
- package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
- package/tui/src/components/Spinner/types.ts +6 -28
- package/tui/src/components/Spinner.tsx +2 -2
- package/tui/src/components/agents/generateAgent.ts +1 -1
- package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
- package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
- package/tui/src/components/design-system/LoadingState.tsx +2 -2
- package/tui/src/components/mcp/types.ts +16 -38
- package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
- package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
- package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
- package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
- package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
- package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
- package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
- package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
- package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
- package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
- package/tui/src/components/primitive/index.tsx +43 -1
- package/tui/src/components/primitive/types.ts +137 -0
- package/tui/src/components/ui/option.ts +4 -26
- package/tui/src/constants/common.ts +0 -2
- package/tui/src/constants/prompts.ts +4 -3
- package/tui/src/constants/querySource.ts +4 -26
- package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
- package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
- package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
- package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
- package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
- package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
- package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
- package/tui/src/hooks/useApiKeyVerification.ts +1 -1
- package/tui/src/hooks/useVirtualScroll.ts +1 -1
- package/tui/src/ink/ink.tsx +33 -14
- package/tui/src/ink/reconciler.ts +2 -3
- package/tui/src/ink/render-to-screen.ts +30 -10
- package/tui/src/ipc/bridge.ts +62 -15
- package/tui/src/ipc/bridgeSingleton.ts +5 -1
- package/tui/src/ipc/codec.ts +29 -3
- package/tui/src/ipc/frames.generated.ts +407 -312
- package/tui/src/ipc/llmClient.ts +279 -76
- package/tui/src/ipc/llmTypes.ts +16 -1
- package/tui/src/ipc/schema/frame.schema.json +1 -3475
- package/tui/src/keybindings/defaultBindings.ts +4 -0
- package/tui/src/main.tsx +32 -11
- package/tui/src/native-ts/file-index/index.ts +33 -3
- package/tui/src/observability/surface.ts +2 -2
- package/tui/src/probes/toolRegistryProbe.tsx +3 -1
- package/tui/src/projectOnboardingState.ts +7 -6
- package/tui/src/query/chatMessageTypes.ts +18 -0
- package/tui/src/query/chatMessagesBuilder.ts +1 -1
- package/tui/src/query/deps.ts +1 -1
- package/tui/src/query/messageGuards.ts +106 -0
- package/tui/src/query/publicDataTerminalRepair.ts +384 -0
- package/tui/src/query/run.ts +1075 -0
- package/tui/src/query/supportBoundary.ts +168 -0
- package/tui/src/query/toolResultErrors.ts +103 -0
- package/tui/src/query/toolRunner.ts +687 -0
- package/tui/src/query/unavailableToolRepair.ts +118 -0
- package/tui/src/query.ts +9 -1721
- package/tui/src/screens/REPL.tsx +42 -31
- package/tui/src/services/api/adapterManifest.ts +4 -0
- package/tui/src/services/api/backendChat/events.ts +117 -0
- package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
- package/tui/src/services/api/backendChat/frame.ts +9 -0
- package/tui/src/services/api/backendChat/streaming.ts +430 -0
- package/tui/src/services/api/backendChat/types.ts +62 -0
- package/tui/src/services/api/backendChat.ts +1 -0
- package/tui/src/services/api/client.ts +98 -14
- package/tui/src/services/api/errorUtils.ts +5 -5
- package/tui/src/services/api/errors.ts +1 -1
- package/tui/src/services/api/logging.ts +1 -1
- package/tui/src/services/api/ummaya/evidence.ts +194 -0
- package/tui/src/services/api/ummaya/messages.ts +255 -0
- package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
- package/tui/src/services/api/ummaya/provider.ts +200 -0
- package/tui/src/services/api/ummaya/reasoning.ts +24 -0
- package/tui/src/services/api/ummaya/request.ts +200 -0
- package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
- package/tui/src/services/api/ummaya/streaming.ts +365 -0
- package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
- package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
- package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
- package/tui/src/services/api/ummaya/types.ts +110 -0
- package/tui/src/services/api/ummaya/usage.ts +30 -0
- package/tui/src/services/api/ummaya.ts +26 -364
- package/tui/src/services/api/withRetry.ts +1 -1
- package/tui/src/services/awaySummary.ts +2 -2
- package/tui/src/services/claudeAiLimits.ts +1 -1
- package/tui/src/services/compact/autoCompact.ts +1 -1
- package/tui/src/services/compact/compact.ts +1 -1
- package/tui/src/services/lsp/types.ts +8 -30
- package/tui/src/services/tips/types.ts +6 -28
- package/tui/src/services/tokenEstimation.ts +1 -1
- package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
- package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
- package/tui/src/services/tools/toolExecution.ts +94 -1
- package/tui/src/skills/bundled/stuck.ts +12 -12
- package/tui/src/state/AppStateStore.ts +7 -0
- package/tui/src/store/pendingPermissionSlot.ts +1 -1
- package/tui/src/store/session-store.ts +10 -36
- package/tui/src/stubs/any-stub.ts +15 -10
- package/tui/src/stubs/color-diff-napi.ts +37 -23
- package/tui/src/stubs/globals.d.ts +3 -3
- package/tui/src/stubs/macro-preload.ts +23 -12
- package/tui/src/tools/AdapterTool/AdapterTool.ts +1239 -163
- package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
- package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
- package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
- package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
- package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
- package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
- package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
- package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
- package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
- package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
- package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
- package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
- package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
- package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
- package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
- package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
- package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
- package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
- package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
- package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
- package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
- package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
- package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
- package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
- package/tui/src/tools/AgentTool/permissions.ts +39 -0
- package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
- package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
- package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
- package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
- package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
- package/tui/src/tools/AgentTool/runAgent.ts +1 -1
- package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
- package/tui/src/tools/AgentTool/schemas.ts +196 -0
- package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
- package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
- package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
- package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
- package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
- package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
- package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
- package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
- package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
- package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
- package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
- package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
- package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
- package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
- package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
- package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
- package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
- package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
- package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
- package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
- package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
- package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
- package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
- package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
- package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
- package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
- package/tui/src/tools/BashTool/call.ts +202 -0
- package/tui/src/tools/BashTool/callLoader.ts +35 -0
- package/tui/src/tools/BashTool/commandClassification.ts +151 -0
- package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
- package/tui/src/tools/BashTool/cwdReset.ts +33 -0
- package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
- package/tui/src/tools/BashTool/modeValidation.ts +13 -1
- package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
- package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
- package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
- package/tui/src/tools/BashTool/resultLoader.ts +29 -0
- package/tui/src/tools/BashTool/resultMapping.ts +83 -0
- package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
- package/tui/src/tools/BashTool/schemas.ts +65 -0
- package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
- package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
- package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
- package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
- package/tui/src/tools/BashTool/uiLoader.ts +37 -0
- package/tui/src/tools/BriefTool/upload.ts +1 -1
- package/tui/src/tools/CalculatorTool/parser.ts +2 -2
- package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
- package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
- package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
- package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
- package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
- package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
- package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
- package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
- package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
- package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
- package/tui/src/tools/FileEditTool/call.ts +228 -0
- package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
- package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
- package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
- package/tui/src/tools/FileWriteTool/call.ts +223 -0
- package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
- package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
- package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +48 -29
- package/tui/src/tools/LookupPrimitive/prompt.ts +6 -7
- package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
- package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
- package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
- package/tui/src/tools/NotebookEditTool/call.ts +254 -0
- package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
- package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
- package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
- package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
- package/tui/src/tools/PowerShellTool/call.ts +179 -0
- package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
- package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
- package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
- package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
- package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
- package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
- package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
- package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
- package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
- package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
- package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
- package/tui/src/tools/PowerShellTool/validation.ts +39 -0
- package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
- package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +30 -19
- package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
- package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
- package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +51 -18
- package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
- package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
- package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
- package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
- package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
- package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
- package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
- package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
- package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
- package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
- package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
- package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
- package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
- package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
- package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
- package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
- package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
- package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
- package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
- package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
- package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
- package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
- package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
- package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
- package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
- package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +27 -10
- package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
- package/tui/src/tools/WebFetchTool/call.ts +227 -0
- package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
- package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
- package/tui/src/tools/WebFetchTool/types.ts +23 -0
- package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
- package/tui/src/tools/WebFetchTool/utils.ts +1 -1
- package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
- package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
- package/tui/src/tools/WebSearchTool/call.ts +33 -0
- package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
- package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
- package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
- package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
- package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
- package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
- package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
- package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
- package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
- package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
- package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
- package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
- package/tui/src/tools/_shared/citizenUserText.ts +49 -0
- package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
- package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
- package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
- package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
- package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
- package/tui/src/tools/_shared/locationInputRepair.ts +112 -0
- package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
- package/tui/src/tools/_shared/rootPrimitiveInput.ts +68 -0
- package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
- package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
- package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
- package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
- package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
- package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
- package/tui/src/tools/_shared/toolChoiceRepair.ts +61 -0
- package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
- package/tui/src/tools.ts +39 -190
- package/tui/src/types/fileSuggestion.ts +4 -26
- package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
- package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
- package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
- package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
- package/tui/src/types/message.ts +80 -102
- package/tui/src/types/messageQueueTypes.ts +6 -28
- package/tui/src/types/notebook.ts +16 -38
- package/tui/src/types/statusLine.ts +4 -26
- package/tui/src/types/tools.ts +24 -46
- package/tui/src/types/utils.ts +6 -28
- package/tui/src/upstreamproxy/relay.ts +7 -3
- package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
- package/tui/src/utils/assistantMessageFactories.ts +9 -3
- package/tui/src/utils/attachments.ts +1 -1
- package/tui/src/utils/auth.ts +129 -139
- package/tui/src/utils/bash/ast.ts +23 -23
- package/tui/src/utils/bash/bashParser.ts +5 -5
- package/tui/src/utils/billing.ts +1 -1
- package/tui/src/utils/collapseReadSearch.ts +3 -3
- package/tui/src/utils/cronTasks.ts +1 -1
- package/tui/src/utils/execFileNoThrow.ts +1 -1
- package/tui/src/utils/filePersistence/types.ts +16 -38
- package/tui/src/utils/forkedAgent.ts +1 -1
- package/tui/src/utils/gracefulShutdown.ts +4 -4
- package/tui/src/utils/heapDumpService.ts +12 -8
- package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
- package/tui/src/utils/hooks/execPromptHook.ts +1 -1
- package/tui/src/utils/hooks/skillImprovement.ts +1 -1
- package/tui/src/utils/kExaoneReasoning.ts +138 -0
- package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
- package/tui/src/utils/messages.ts +19 -0
- package/tui/src/utils/migrateSessions.ts +3 -3
- package/tui/src/utils/model/model.ts +6 -6
- package/tui/src/utils/multiToolLayout.ts +13 -0
- package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
- package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
- package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
- package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
- package/tui/src/utils/plugins/pluginLoader.ts +8 -8
- package/tui/src/utils/processUserInput/processSlashCommand.tsx +2 -2
- package/tui/src/utils/processUserInput/processUserInput.ts +26 -0
- package/tui/src/utils/protectedNamespace.ts +5 -3
- package/tui/src/utils/rawJsonToolCall.ts +242 -0
- package/tui/src/utils/ripgrep.ts +16 -7
- package/tui/src/utils/sessionTitle.ts +1 -1
- package/tui/src/utils/settings/applySettingsChange.ts +4 -0
- package/tui/src/utils/settings/permissionValidation.ts +14 -2
- package/tui/src/utils/settings/types.ts +9 -3
- package/tui/src/utils/shell/prefix.ts +1 -1
- package/tui/src/utils/sideQuery.ts +1 -1
- package/tui/src/utils/stats.ts +1 -1
- package/tui/src/utils/systemThemeWatcher.ts +13 -3
- package/tui/src/utils/teleport.tsx +1 -1
- package/uv.lock +394 -22
- package/assets/copilot-gate-logo.svg +0 -58
- package/assets/govon-logo.svg +0 -40
- package/src/ummaya/eval/__init__.py +0 -5
- package/src/ummaya/eval/retrieval.py +0 -713
- package/tui/src/services/api/claude.ts +0 -3510
- package/tui/src/utils/messageStream.ts +0 -186
|
@@ -36,7 +36,7 @@ export type ConnectionErrorDetails = {
|
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
38
|
* Extracts connection error details from the error cause chain.
|
|
39
|
-
* The
|
|
39
|
+
* The legacy SDK wraps underlying errors in the `cause` property.
|
|
40
40
|
* This function walks the cause chain to find the root error code/message.
|
|
41
41
|
*/
|
|
42
42
|
export function extractConnectionErrorDetails(
|
|
@@ -96,7 +96,7 @@ export function getSSLErrorHint(error: unknown): string | null {
|
|
|
96
96
|
if (!details?.isSSLError) {
|
|
97
97
|
return null
|
|
98
98
|
}
|
|
99
|
-
return `SSL certificate error (${details.code}). If you are behind a corporate proxy or TLS-intercepting firewall, set NODE_EXTRA_CA_CERTS to your CA bundle path, or ask IT to allowlist
|
|
99
|
+
return `SSL certificate error (${details.code}). If you are behind a corporate proxy or TLS-intercepting firewall, set NODE_EXTRA_CA_CERTS to your CA bundle path, or ask IT to allowlist the configured UMMAYA provider endpoint. Run /doctor for details.`
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
/**
|
|
@@ -136,7 +136,7 @@ export function sanitizeAPIError(apiError: APIError): string {
|
|
|
136
136
|
* The actual message lives at different nesting levels depending on the provider:
|
|
137
137
|
*
|
|
138
138
|
* - Bedrock/proxy: `{ error: { message: "..." } }`
|
|
139
|
-
* -
|
|
139
|
+
* - Provider API: `{ error: { error: { message: "..." } } }`
|
|
140
140
|
* (the outer `.error` is the response body, the inner `.error` is the API error)
|
|
141
141
|
*
|
|
142
142
|
* See also: `getErrorMessage` in `logging.ts` which handles the same shapes.
|
|
@@ -163,7 +163,7 @@ function hasNestedError(value: unknown): value is NestedAPIError {
|
|
|
163
163
|
* a top-level `.message`.
|
|
164
164
|
*
|
|
165
165
|
* Checks two nesting levels (deeper first for specificity):
|
|
166
|
-
* 1. `error.error.error.message` —
|
|
166
|
+
* 1. `error.error.error.message` — provider API shape
|
|
167
167
|
* 2. `error.error.message` — Bedrock shape
|
|
168
168
|
*/
|
|
169
169
|
function extractNestedErrorMessage(error: APIError): string | null {
|
|
@@ -176,7 +176,7 @@ function extractNestedErrorMessage(error: APIError): string | null {
|
|
|
176
176
|
const narrowed: NestedAPIError = error
|
|
177
177
|
const nested = narrowed.error
|
|
178
178
|
|
|
179
|
-
//
|
|
179
|
+
// Provider API shape: { error: { error: { message } } }
|
|
180
180
|
const deepMsg = nested?.error?.message
|
|
181
181
|
if (typeof deepMsg === 'string' && deepMsg.length > 0) {
|
|
182
182
|
const sanitized = sanitizeMessageHTML(deepMsg)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// SWAP/anti-anthropic-1p(2521): minimal stub for the byte-copied
|
|
3
|
-
// services/api/
|
|
3
|
+
// services/api/ummaya.ts which references CC's Anthropic-API error envelopes.
|
|
4
4
|
// UMMAYA surfaces errors via the IPC ErrorFrame (Spec 032) and never reaches
|
|
5
5
|
// these helpers. Stubs preserve the import shape only.
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// SWAP/anti-anthropic-1p(2521): minimal stub for the byte-copied
|
|
3
|
-
// services/api/
|
|
3
|
+
// services/api/ummaya.ts which references CC's Anthropic-API request/response
|
|
4
4
|
// telemetry. UMMAYA uses OTEL spans (Spec 021) and audit ledger (Spec 024)
|
|
5
5
|
// instead. Stubs preserve the import shape; functions are no-ops because the
|
|
6
6
|
// byte-copy has zero callers in UMMAYA.
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto'
|
|
2
|
+
import { appendFileSync, mkdirSync } from 'node:fs'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
import { getSessionId } from '../../../bootstrap/state.js'
|
|
5
|
+
import {
|
|
6
|
+
appendRouteDiagnostic,
|
|
7
|
+
hashRouteDiagnosticText,
|
|
8
|
+
} from '../../../tools/AdapterTool/routeDiagnostics.js'
|
|
9
|
+
import { getUmmayaUserTierRoot } from '../../../utils/ummayaPaths.js'
|
|
10
|
+
import { logForDebugging } from '../../../utils/debug.js'
|
|
11
|
+
import { latestUserText } from './messages.js'
|
|
12
|
+
import type { QueryModelParams } from './types.js'
|
|
13
|
+
|
|
14
|
+
export type ProviderTurnEvidenceContext = {
|
|
15
|
+
readonly session_id: string
|
|
16
|
+
readonly correlation_id: string
|
|
17
|
+
readonly frame_hash: string
|
|
18
|
+
readonly query_hash: string
|
|
19
|
+
readonly query_source: string
|
|
20
|
+
readonly model: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type ProviderTurnEvidenceEvent = 'provider_turn_start' | 'provider_turn_complete'
|
|
24
|
+
|
|
25
|
+
type ProviderTurnEvidenceRecord = ProviderTurnEvidenceContext & {
|
|
26
|
+
readonly schema_version: 'ummaya.tui.turn_evidence.v1'
|
|
27
|
+
readonly ts: string
|
|
28
|
+
readonly event: ProviderTurnEvidenceEvent
|
|
29
|
+
readonly source: 'provider_direct'
|
|
30
|
+
readonly sanitized: true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function createProviderTurnEvidenceContext(
|
|
34
|
+
params: QueryModelParams,
|
|
35
|
+
): ProviderTurnEvidenceContext {
|
|
36
|
+
const sessionId = getSessionId()
|
|
37
|
+
const correlationId = randomUUID()
|
|
38
|
+
const queryHash = hashRouteDiagnosticText(latestUserText(params.messages))
|
|
39
|
+
const querySource = params.options.querySource
|
|
40
|
+
const model = params.options.model
|
|
41
|
+
return {
|
|
42
|
+
session_id: sessionId,
|
|
43
|
+
correlation_id: correlationId,
|
|
44
|
+
frame_hash: hashFrame({
|
|
45
|
+
sessionId,
|
|
46
|
+
correlationId,
|
|
47
|
+
queryHash,
|
|
48
|
+
querySource,
|
|
49
|
+
model,
|
|
50
|
+
}),
|
|
51
|
+
query_hash: queryHash,
|
|
52
|
+
query_source: querySource,
|
|
53
|
+
model,
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function appendProviderTurnEvidence(
|
|
58
|
+
event: ProviderTurnEvidenceEvent,
|
|
59
|
+
context: ProviderTurnEvidenceContext,
|
|
60
|
+
): void {
|
|
61
|
+
appendRouteDiagnostic(event, {
|
|
62
|
+
session_id: context.session_id,
|
|
63
|
+
correlation_id: context.correlation_id,
|
|
64
|
+
frame_hash: context.frame_hash,
|
|
65
|
+
query_hash: context.query_hash,
|
|
66
|
+
query_source: context.query_source,
|
|
67
|
+
model: context.model,
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
const memdirFile = evidenceFilePath(context.session_id)
|
|
71
|
+
if (memdirFile === null) return
|
|
72
|
+
const record: ProviderTurnEvidenceRecord = {
|
|
73
|
+
schema_version: 'ummaya.tui.turn_evidence.v1',
|
|
74
|
+
ts: new Date().toISOString(),
|
|
75
|
+
event,
|
|
76
|
+
source: 'provider_direct',
|
|
77
|
+
sanitized: true,
|
|
78
|
+
...context,
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
mkdirSync(join(getUmmayaUserTierRoot(), 'evidence', 'tui-turns'), {
|
|
82
|
+
recursive: true,
|
|
83
|
+
})
|
|
84
|
+
appendFileSync(memdirFile, `${JSON.stringify(record)}\n`, {
|
|
85
|
+
encoding: 'utf8',
|
|
86
|
+
mode: 0o600,
|
|
87
|
+
})
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (error instanceof Error) {
|
|
90
|
+
logForDebugging(`provider turn evidence write failed: ${error.message}`)
|
|
91
|
+
return
|
|
92
|
+
}
|
|
93
|
+
throw error
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function appendProviderOutputEvidence(
|
|
98
|
+
event: unknown,
|
|
99
|
+
context: ProviderTurnEvidenceContext,
|
|
100
|
+
): void {
|
|
101
|
+
const summary = providerOutputSummary(event)
|
|
102
|
+
appendRouteDiagnostic('provider_output', {
|
|
103
|
+
session_id: context.session_id,
|
|
104
|
+
correlation_id: context.correlation_id,
|
|
105
|
+
frame_hash: context.frame_hash,
|
|
106
|
+
query_hash: context.query_hash,
|
|
107
|
+
query_source: context.query_source,
|
|
108
|
+
model: context.model,
|
|
109
|
+
output_type: summary.outputType,
|
|
110
|
+
stream_event_type: summary.streamEventType,
|
|
111
|
+
assistant_text_chars: summary.assistantTextChars,
|
|
112
|
+
assistant_tool_use_count: summary.assistantToolUseCount,
|
|
113
|
+
assistant_content_block_count: summary.assistantContentBlockCount,
|
|
114
|
+
is_api_error_message: summary.isApiErrorMessage,
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function evidenceFilePath(sessionId: string): string | null {
|
|
119
|
+
if (!process.env.UMMAYA_MEMDIR_USER) return null
|
|
120
|
+
return join(getUmmayaUserTierRoot(), 'evidence', 'tui-turns', `${sessionId}.jsonl`)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function providerOutputSummary(event: unknown): {
|
|
124
|
+
readonly outputType: string
|
|
125
|
+
readonly streamEventType: string | null
|
|
126
|
+
readonly assistantTextChars: number
|
|
127
|
+
readonly assistantToolUseCount: number
|
|
128
|
+
readonly assistantContentBlockCount: number
|
|
129
|
+
readonly isApiErrorMessage: boolean
|
|
130
|
+
} {
|
|
131
|
+
if (!isRecord(event)) {
|
|
132
|
+
return emptyProviderOutputSummary('unknown')
|
|
133
|
+
}
|
|
134
|
+
const type = typeof event.type === 'string' ? event.type : 'unknown'
|
|
135
|
+
if (type === 'stream_event') {
|
|
136
|
+
const streamEvent = isRecord(event.event) ? event.event : {}
|
|
137
|
+
return {
|
|
138
|
+
...emptyProviderOutputSummary(type),
|
|
139
|
+
streamEventType:
|
|
140
|
+
typeof streamEvent.type === 'string' ? streamEvent.type : null,
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (type !== 'assistant') {
|
|
144
|
+
return emptyProviderOutputSummary(type)
|
|
145
|
+
}
|
|
146
|
+
const message = isRecord(event.message) ? event.message : {}
|
|
147
|
+
const content = Array.isArray(message.content) ? message.content : []
|
|
148
|
+
let assistantTextChars = 0
|
|
149
|
+
let assistantToolUseCount = 0
|
|
150
|
+
for (const block of content) {
|
|
151
|
+
if (!isRecord(block)) continue
|
|
152
|
+
if (block.type === 'text' && typeof block.text === 'string') {
|
|
153
|
+
assistantTextChars += block.text.length
|
|
154
|
+
}
|
|
155
|
+
if (block.type === 'tool_use') {
|
|
156
|
+
assistantToolUseCount += 1
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
outputType: type,
|
|
161
|
+
streamEventType: null,
|
|
162
|
+
assistantTextChars,
|
|
163
|
+
assistantToolUseCount,
|
|
164
|
+
assistantContentBlockCount: content.length,
|
|
165
|
+
isApiErrorMessage: event.isApiErrorMessage === true,
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function emptyProviderOutputSummary(outputType: string) {
|
|
170
|
+
return {
|
|
171
|
+
outputType,
|
|
172
|
+
streamEventType: null,
|
|
173
|
+
assistantTextChars: 0,
|
|
174
|
+
assistantToolUseCount: 0,
|
|
175
|
+
assistantContentBlockCount: 0,
|
|
176
|
+
isApiErrorMessage: false,
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
181
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function hashFrame(payload: {
|
|
185
|
+
readonly sessionId: string
|
|
186
|
+
readonly correlationId: string
|
|
187
|
+
readonly queryHash: string
|
|
188
|
+
readonly querySource: string
|
|
189
|
+
readonly model: string
|
|
190
|
+
}): string {
|
|
191
|
+
return createHash('sha256')
|
|
192
|
+
.update(JSON.stringify(payload), 'utf8')
|
|
193
|
+
.digest('hex')
|
|
194
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import type { Message } from '../../../types/message.js'
|
|
2
|
+
import type { SystemPrompt } from '../../../utils/systemPromptType.js'
|
|
3
|
+
import type { OpenAIMessage, OpenAIToolCall } from './types.js'
|
|
4
|
+
|
|
5
|
+
type CacheControl = {
|
|
6
|
+
readonly type: 'ephemeral'
|
|
7
|
+
readonly scope?: 'global' | 'org'
|
|
8
|
+
readonly ttl?: '5m' | '1h'
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
12
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function textFromContent(content: unknown): string {
|
|
16
|
+
if (typeof content === 'string') return content
|
|
17
|
+
if (!Array.isArray(content)) return ''
|
|
18
|
+
return content
|
|
19
|
+
.filter(isRecord)
|
|
20
|
+
.filter(block => block.type === 'text' && typeof block.text === 'string')
|
|
21
|
+
.map(block => String(block.text))
|
|
22
|
+
.join('')
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type ToolUseBlock = {
|
|
26
|
+
readonly type: 'tool_use'
|
|
27
|
+
readonly id: string
|
|
28
|
+
readonly name: string
|
|
29
|
+
readonly input?: unknown
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type ToolResultBlock = {
|
|
33
|
+
readonly type: 'tool_result'
|
|
34
|
+
readonly tool_use_id: string
|
|
35
|
+
readonly content?: unknown
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function asToolUseBlock(value: unknown): ToolUseBlock | undefined {
|
|
39
|
+
if (!isRecord(value)) return undefined
|
|
40
|
+
if (value.type !== 'tool_use') return undefined
|
|
41
|
+
if (typeof value.id !== 'string' || value.id.length === 0) return undefined
|
|
42
|
+
if (typeof value.name !== 'string' || value.name.length === 0) return undefined
|
|
43
|
+
return {
|
|
44
|
+
type: 'tool_use',
|
|
45
|
+
id: value.id,
|
|
46
|
+
name: value.name,
|
|
47
|
+
input: value.input,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function asToolResultBlock(value: unknown): ToolResultBlock | undefined {
|
|
52
|
+
if (!isRecord(value)) return undefined
|
|
53
|
+
if (value.type !== 'tool_result') return undefined
|
|
54
|
+
if (typeof value.tool_use_id !== 'string' || value.tool_use_id.length === 0) {
|
|
55
|
+
return undefined
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
type: 'tool_result',
|
|
59
|
+
tool_use_id: value.tool_use_id,
|
|
60
|
+
content: value.content,
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function serializeToolUseInput(input: unknown): string {
|
|
65
|
+
if (typeof input === 'string') return input
|
|
66
|
+
if (input === undefined || input === null) return '{}'
|
|
67
|
+
try {
|
|
68
|
+
return JSON.stringify(input)
|
|
69
|
+
} catch {
|
|
70
|
+
return '{}'
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function serializeToolResultContent(content: unknown): string {
|
|
75
|
+
if (typeof content === 'string') return content
|
|
76
|
+
if (content === undefined || content === null) return ''
|
|
77
|
+
try {
|
|
78
|
+
return JSON.stringify(content)
|
|
79
|
+
} catch {
|
|
80
|
+
return String(content)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function findToolNameForResult(
|
|
85
|
+
toolUseId: string,
|
|
86
|
+
emittedMessages: readonly OpenAIMessage[],
|
|
87
|
+
): string | undefined {
|
|
88
|
+
for (let index = emittedMessages.length - 1; index >= 0; index -= 1) {
|
|
89
|
+
const message = emittedMessages[index]
|
|
90
|
+
if (message?.role !== 'assistant') continue
|
|
91
|
+
for (const toolCall of message.tool_calls ?? []) {
|
|
92
|
+
if (toolCall.id === toolUseId) return toolCall.function.name
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function collectToolResultIds(messages: readonly Message[]): ReadonlySet<string> {
|
|
99
|
+
const toolResultIds = new Set<string>()
|
|
100
|
+
for (const message of messages) {
|
|
101
|
+
if (message.type !== 'user') continue
|
|
102
|
+
const content = message.message.content
|
|
103
|
+
if (!Array.isArray(content)) continue
|
|
104
|
+
for (const block of content) {
|
|
105
|
+
const toolResult = asToolResultBlock(block)
|
|
106
|
+
if (toolResult !== undefined) toolResultIds.add(toolResult.tool_use_id)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return toolResultIds
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function transcriptMessageToOpenAIMessages(
|
|
113
|
+
message: Message,
|
|
114
|
+
emittedMessages: readonly OpenAIMessage[],
|
|
115
|
+
matchedToolResultIds: ReadonlySet<string>,
|
|
116
|
+
): readonly OpenAIMessage[] {
|
|
117
|
+
if (message.type !== 'user' && message.type !== 'assistant') return []
|
|
118
|
+
const content = message.message.content
|
|
119
|
+
if (typeof content === 'string') {
|
|
120
|
+
return content.length > 0 ? [{ role: message.type, content }] : []
|
|
121
|
+
}
|
|
122
|
+
if (!Array.isArray(content)) return []
|
|
123
|
+
|
|
124
|
+
if (message.type === 'user') {
|
|
125
|
+
const out: OpenAIMessage[] = []
|
|
126
|
+
const textContent = textFromContent(content)
|
|
127
|
+
for (const block of content) {
|
|
128
|
+
const toolResult = asToolResultBlock(block)
|
|
129
|
+
if (toolResult === undefined) continue
|
|
130
|
+
const toolName = findToolNameForResult(toolResult.tool_use_id, emittedMessages)
|
|
131
|
+
if (toolName === undefined) continue
|
|
132
|
+
out.push({
|
|
133
|
+
role: 'tool',
|
|
134
|
+
name: toolName,
|
|
135
|
+
tool_call_id: toolResult.tool_use_id,
|
|
136
|
+
content: serializeToolResultContent(toolResult.content),
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
if (textContent.length > 0) {
|
|
140
|
+
out.push({ role: 'user', content: textContent })
|
|
141
|
+
}
|
|
142
|
+
return out
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const toolCalls: OpenAIToolCall[] = []
|
|
146
|
+
for (const block of content) {
|
|
147
|
+
const toolUse = asToolUseBlock(block)
|
|
148
|
+
if (toolUse === undefined) continue
|
|
149
|
+
if (!matchedToolResultIds.has(toolUse.id)) continue
|
|
150
|
+
toolCalls.push({
|
|
151
|
+
id: toolUse.id,
|
|
152
|
+
type: 'function',
|
|
153
|
+
function: {
|
|
154
|
+
name: toolUse.name,
|
|
155
|
+
arguments: serializeToolUseInput(toolUse.input),
|
|
156
|
+
},
|
|
157
|
+
})
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const textContent = textFromContent(content)
|
|
161
|
+
if (toolCalls.length > 0) {
|
|
162
|
+
return [{ role: 'assistant', content: textContent, tool_calls: toolCalls }]
|
|
163
|
+
}
|
|
164
|
+
return textContent.length > 0 ? [{ role: 'assistant', content: textContent }] : []
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function systemPromptText(systemPrompt: SystemPrompt): string {
|
|
168
|
+
return Array.from(systemPrompt).join('\n')
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function latestUserText(messages: readonly Message[]): string {
|
|
172
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
173
|
+
const message = messages[index]
|
|
174
|
+
if (message?.type === 'user' && message.isMeta !== true) {
|
|
175
|
+
const text = textFromContent(message.message.content).trim()
|
|
176
|
+
if (text.length > 0) return text
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return ''
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function transcriptToOpenAIMessages(
|
|
183
|
+
messages: readonly Message[],
|
|
184
|
+
systemPrompt: SystemPrompt,
|
|
185
|
+
extraSystemInstruction?: string,
|
|
186
|
+
): readonly OpenAIMessage[] {
|
|
187
|
+
const out: OpenAIMessage[] = [
|
|
188
|
+
{
|
|
189
|
+
role: 'system',
|
|
190
|
+
content: [systemPromptText(systemPrompt), extraSystemInstruction]
|
|
191
|
+
.filter(Boolean)
|
|
192
|
+
.join('\n\n'),
|
|
193
|
+
},
|
|
194
|
+
]
|
|
195
|
+
const matchedToolResultIds = collectToolResultIds(messages)
|
|
196
|
+
for (const message of messages) {
|
|
197
|
+
out.push(...transcriptMessageToOpenAIMessages(message, out, matchedToolResultIds))
|
|
198
|
+
}
|
|
199
|
+
return out
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function getPromptCachingEnabled(_model: string): boolean {
|
|
203
|
+
return false
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function getCacheControl(
|
|
207
|
+
_params: { readonly scope?: 'global' | 'org'; readonly querySource?: string } = {},
|
|
208
|
+
): CacheControl {
|
|
209
|
+
return { type: 'ephemeral' }
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function userMessageToMessageParam(
|
|
213
|
+
message: Message,
|
|
214
|
+
_addCache = false,
|
|
215
|
+
_enablePromptCaching = false,
|
|
216
|
+
_querySource?: string,
|
|
217
|
+
): OpenAIMessage {
|
|
218
|
+
return { role: 'user', content: textFromContent(message.message.content) }
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function assistantMessageToMessageParam(
|
|
222
|
+
message: Message,
|
|
223
|
+
_addCache = false,
|
|
224
|
+
_enablePromptCaching = false,
|
|
225
|
+
_querySource?: string,
|
|
226
|
+
): OpenAIMessage {
|
|
227
|
+
return { role: 'assistant', content: textFromContent(message.message.content) }
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export function stripExcessMediaItems<T>(
|
|
231
|
+
messages: readonly T[],
|
|
232
|
+
_limit: number,
|
|
233
|
+
): readonly T[] {
|
|
234
|
+
return messages
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export function addCacheBreakpoints<T>(
|
|
238
|
+
messages: readonly T[],
|
|
239
|
+
_enablePromptCaching: boolean,
|
|
240
|
+
_querySource?: string,
|
|
241
|
+
_useCachedMC = false,
|
|
242
|
+
_newCacheEdits?: unknown,
|
|
243
|
+
_pinnedEdits?: unknown,
|
|
244
|
+
_skipCacheWrite = false,
|
|
245
|
+
): readonly T[] {
|
|
246
|
+
return messages
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function buildSystemPromptBlocks(
|
|
250
|
+
systemPrompt: SystemPrompt,
|
|
251
|
+
_enablePromptCaching: boolean,
|
|
252
|
+
_options?: unknown,
|
|
253
|
+
): readonly { readonly text: string }[] {
|
|
254
|
+
return [{ text: systemPromptText(systemPrompt) }]
|
|
255
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createAssistantMessage } from '../../../utils/messages.js'
|
|
2
|
+
import { createUserMessage } from '../../../utils/userMessageFactories.js'
|
|
3
|
+
import { asSystemPrompt } from '../../../utils/systemPromptType.js'
|
|
4
|
+
import { EMPTY_USAGE } from './types.js'
|
|
5
|
+
import type { QueryModelParams } from './types.js'
|
|
6
|
+
|
|
7
|
+
export const MAX_NON_STREAMING_TOKENS = 64_000
|
|
8
|
+
|
|
9
|
+
export function adjustParamsForNonStreaming<T>(
|
|
10
|
+
params: T,
|
|
11
|
+
_maxTokensCap: number,
|
|
12
|
+
): T {
|
|
13
|
+
return params
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function* executeNonStreamingRequest(
|
|
17
|
+
_clientOptions: unknown,
|
|
18
|
+
_retryOptions: unknown,
|
|
19
|
+
_paramsFromContext: unknown,
|
|
20
|
+
_onAttempt?: unknown,
|
|
21
|
+
_captureRequest?: unknown,
|
|
22
|
+
): AsyncGenerator<unknown> {
|
|
23
|
+
yield createAssistantMessage({ content: '' })
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function queryModelWithoutStreaming(
|
|
27
|
+
params: QueryModelParams,
|
|
28
|
+
): Promise<unknown> {
|
|
29
|
+
const events: unknown[] = []
|
|
30
|
+
const { queryModelWithStreaming } = await import('./provider.js')
|
|
31
|
+
for await (const event of queryModelWithStreaming(params)) {
|
|
32
|
+
events.push(event)
|
|
33
|
+
}
|
|
34
|
+
return events.find(
|
|
35
|
+
event =>
|
|
36
|
+
typeof event === 'object' &&
|
|
37
|
+
event !== null &&
|
|
38
|
+
'type' in event &&
|
|
39
|
+
event.type === 'assistant',
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function queryHaiku(params: {
|
|
44
|
+
readonly systemPrompt?: ReturnType<typeof asSystemPrompt>
|
|
45
|
+
readonly userPrompt: string
|
|
46
|
+
readonly outputFormat?: unknown
|
|
47
|
+
readonly signal?: AbortSignal
|
|
48
|
+
readonly options: QueryModelParams['options']
|
|
49
|
+
}): Promise<unknown> {
|
|
50
|
+
return queryModelWithoutStreaming({
|
|
51
|
+
messages: [createUserMessage({ content: params.userPrompt })],
|
|
52
|
+
systemPrompt: params.systemPrompt ?? asSystemPrompt([]),
|
|
53
|
+
thinkingConfig: { type: 'disabled' },
|
|
54
|
+
tools: [],
|
|
55
|
+
signal: params.signal ?? new AbortController().signal,
|
|
56
|
+
options: params.options,
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function queryWithModel(params: Parameters<typeof queryHaiku>[0]): Promise<unknown> {
|
|
61
|
+
return queryHaiku(params)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function getMaxOutputTokensForModel(_model: string): number {
|
|
65
|
+
return EMPTY_USAGE.output_tokens + MAX_NON_STREAMING_TOKENS
|
|
66
|
+
}
|