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
|
@@ -1,266 +1,238 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
import { feature } from 'bun:bundle'
|
|
2
|
+
import * as React from 'react'
|
|
3
|
+
import {
|
|
4
|
+
getAllowedChannels,
|
|
5
|
+
getQuestionPreviewFormat,
|
|
6
|
+
} from 'src/bootstrap/state.js'
|
|
7
|
+
import { MessageResponse } from 'src/components/MessageResponse.js'
|
|
8
|
+
import { BLACK_CIRCLE } from 'src/constants/figures.js'
|
|
9
|
+
import { getModeColor } from 'src/utils/permissions/PermissionMode.js'
|
|
10
|
+
import { z } from 'zod/v4'
|
|
11
|
+
import { Box, Text } from '../../ink.js'
|
|
12
|
+
import { buildTool, type Tool, type ToolDef } from '../../Tool.js'
|
|
13
|
+
import { lazySchema } from '../../utils/lazySchema.js'
|
|
14
|
+
import { buildAgentSupportMetadata } from '../AgentTool/orchestrationSupport.js'
|
|
15
|
+
import {
|
|
16
|
+
ASK_USER_QUESTION_TOOL_CHIP_WIDTH,
|
|
17
|
+
ASK_USER_QUESTION_TOOL_NAME,
|
|
18
|
+
ASK_USER_QUESTION_TOOL_PROMPT,
|
|
19
|
+
DESCRIPTION,
|
|
20
|
+
PREVIEW_FEATURE_PROMPT,
|
|
21
|
+
} from './prompt.js'
|
|
22
|
+
|
|
23
|
+
const questionOptionSchema = lazySchema(() =>
|
|
24
|
+
z.object({
|
|
25
|
+
label: z.string().describe('The display text for this option that the user will see and select. Should be concise (1-5 words) and clearly describe the choice.'),
|
|
26
|
+
description: z.string().describe('Explanation of what this option means or what will happen if chosen. Useful for providing context about trade-offs or implications.'),
|
|
27
|
+
preview: z.string().optional().describe('Optional preview content rendered when this option is focused. Use for mockups, code snippets, or visual comparisons that help users compare options. See the tool description for the expected content format.'),
|
|
28
|
+
}),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
const questionSchema = lazySchema(() =>
|
|
32
|
+
z.object({
|
|
33
|
+
question: z.string().describe('The complete question to ask the user. Should be clear, specific, and end with a question mark.'),
|
|
34
|
+
header: z.string().describe(`Very short label displayed as a chip/tag (max ${ASK_USER_QUESTION_TOOL_CHIP_WIDTH} chars).`),
|
|
35
|
+
options: z.array(questionOptionSchema()).min(2).max(4).describe('The available choices for this question. Must have 2-4 options.'),
|
|
36
|
+
multiSelect: z.boolean().default(false).describe('Set to true to allow the user to select multiple options instead of just one.'),
|
|
37
|
+
}),
|
|
38
|
+
)
|
|
39
|
+
|
|
25
40
|
const annotationsSchema = lazySchema(() => {
|
|
26
41
|
const annotationSchema = z.object({
|
|
27
42
|
preview: z.string().optional().describe('The preview content of the selected option, if the question used previews.'),
|
|
28
|
-
notes: z.string().optional().describe('Free-text notes the user added to their selection.')
|
|
29
|
-
})
|
|
30
|
-
return z.record(z.string(), annotationSchema).optional()
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
label: string;
|
|
38
|
-
}[];
|
|
39
|
-
}[];
|
|
40
|
-
}) => {
|
|
41
|
-
const questions = data.questions.map(q => q.question);
|
|
42
|
-
if (questions.length !== new Set(questions).size) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
43
|
+
notes: z.string().optional().describe('Free-text notes the user added to their selection.'),
|
|
44
|
+
})
|
|
45
|
+
return z.record(z.string(), annotationSchema).optional()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const uniquenessRefine = {
|
|
49
|
+
check: (data: { questions: { question: string; options: { label: string }[] }[] }) => {
|
|
50
|
+
const questions = data.questions.map(q => q.question)
|
|
51
|
+
if (questions.length !== new Set(questions).size) return false
|
|
45
52
|
for (const question of data.questions) {
|
|
46
|
-
const labels = question.options.map(
|
|
47
|
-
if (labels.length !== new Set(labels).size)
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
53
|
+
const labels = question.options.map(option => option.label)
|
|
54
|
+
if (labels.length !== new Set(labels).size) return false
|
|
50
55
|
}
|
|
51
|
-
return true
|
|
56
|
+
return true
|
|
52
57
|
},
|
|
53
|
-
message:
|
|
54
|
-
|
|
58
|
+
message:
|
|
59
|
+
'Question texts must be unique, option labels must be unique within each question',
|
|
60
|
+
} as const
|
|
61
|
+
|
|
55
62
|
const commonFields = lazySchema(() => ({
|
|
56
|
-
answers: z.record(z.string(), z.string()).optional()
|
|
63
|
+
answers: z.record(z.string(), z.string()).optional(),
|
|
57
64
|
annotations: annotationsSchema(),
|
|
58
|
-
metadata: z.object({
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
65
|
+
metadata: z.object({ source: z.string().optional() }).optional(),
|
|
66
|
+
}))
|
|
67
|
+
|
|
68
|
+
const inputSchema = lazySchema(() =>
|
|
69
|
+
z
|
|
70
|
+
.strictObject({
|
|
71
|
+
questions: z.array(questionSchema()).min(1).max(4),
|
|
72
|
+
...commonFields(),
|
|
73
|
+
})
|
|
74
|
+
.refine(uniquenessRefine.check, { message: uniquenessRefine.message }),
|
|
75
|
+
)
|
|
76
|
+
type InputSchema = ReturnType<typeof inputSchema>
|
|
77
|
+
|
|
78
|
+
const outputSchema = lazySchema(() =>
|
|
79
|
+
z.object({
|
|
80
|
+
questions: z.array(questionSchema()),
|
|
81
|
+
answers: z.record(z.string(), z.string()),
|
|
82
|
+
annotations: annotationsSchema(),
|
|
83
|
+
evidenceJoinKey: z.string(),
|
|
84
|
+
parentToolUseId: z.string(),
|
|
85
|
+
resumeToken: z.string(),
|
|
86
|
+
permissionFlow: z.literal('coordinator_parent_round_trip'),
|
|
87
|
+
}),
|
|
88
|
+
)
|
|
89
|
+
type OutputSchema = ReturnType<typeof outputSchema>
|
|
75
90
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
export
|
|
79
|
-
export
|
|
80
|
-
export type
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
export const _sdkInputSchema = inputSchema
|
|
92
|
+
export const _sdkOutputSchema = outputSchema
|
|
93
|
+
export type Question = z.infer<ReturnType<typeof questionSchema>>
|
|
94
|
+
export type QuestionOption = z.infer<ReturnType<typeof questionOptionSchema>>
|
|
95
|
+
export type Output = z.infer<OutputSchema>
|
|
96
|
+
|
|
97
|
+
function AskUserQuestionResultMessage({
|
|
98
|
+
answers,
|
|
99
|
+
}: {
|
|
100
|
+
readonly answers: Output['answers']
|
|
101
|
+
}): React.ReactNode {
|
|
102
|
+
return (
|
|
103
|
+
<Box flexDirection="column" marginTop={1}>
|
|
104
|
+
<Box flexDirection="row">
|
|
105
|
+
<Text color={getModeColor('default')}>{BLACK_CIRCLE} </Text>
|
|
106
|
+
<Text>User answered UMMAYA's questions:</Text>
|
|
107
|
+
</Box>
|
|
108
|
+
<MessageResponse>
|
|
109
|
+
<Box flexDirection="column">
|
|
110
|
+
{Object.entries(answers).map(([questionText, answer]) => (
|
|
111
|
+
<Text key={questionText} color="inactive">
|
|
112
|
+
· {questionText} → {answer}
|
|
113
|
+
</Text>
|
|
114
|
+
))}
|
|
115
|
+
</Box>
|
|
116
|
+
</MessageResponse>
|
|
117
|
+
</Box>
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function validateHtmlPreview(preview: string | undefined): string | null {
|
|
122
|
+
if (preview === undefined) return null
|
|
123
|
+
if (/<\s*(html|body|!doctype)\b/iu.test(preview)) {
|
|
124
|
+
return 'preview must be an HTML fragment, not a full document (no <html>, <body>, or <!DOCTYPE>)'
|
|
94
125
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
t2 = <Box flexDirection="column" marginTop={1}>{t1}<MessageResponse><Box flexDirection="column">{Object.entries(answers).map(_temp)}</Box></MessageResponse></Box>;
|
|
98
|
-
$[1] = answers;
|
|
99
|
-
$[2] = t2;
|
|
100
|
-
} else {
|
|
101
|
-
t2 = $[2];
|
|
126
|
+
if (/<\s*(script|style)\b/iu.test(preview)) {
|
|
127
|
+
return 'preview must not contain <script> or <style> tags. Use inline styles via the style attribute if needed.'
|
|
102
128
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return <Text key={questionText} color="inactive">· {questionText} → {answer}</Text>;
|
|
129
|
+
if (!/<[a-z][^>]*>/iu.test(preview)) {
|
|
130
|
+
return 'preview must contain HTML (previewFormat is set to "html"). Wrap content in a tag like <div> or <pre>.'
|
|
131
|
+
}
|
|
132
|
+
return null
|
|
108
133
|
}
|
|
134
|
+
|
|
109
135
|
export const AskUserQuestionTool: Tool<InputSchema, Output> = buildTool({
|
|
110
136
|
name: ASK_USER_QUESTION_TOOL_NAME,
|
|
111
137
|
searchHint: 'prompt the user with a multiple-choice question',
|
|
112
138
|
maxResultSizeChars: 100_000,
|
|
113
139
|
shouldDefer: true,
|
|
114
140
|
async description() {
|
|
115
|
-
return DESCRIPTION
|
|
141
|
+
return DESCRIPTION
|
|
116
142
|
},
|
|
117
143
|
async prompt() {
|
|
118
|
-
const format = getQuestionPreviewFormat()
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return ASK_USER_QUESTION_TOOL_PROMPT;
|
|
123
|
-
}
|
|
124
|
-
return ASK_USER_QUESTION_TOOL_PROMPT + PREVIEW_FEATURE_PROMPT[format];
|
|
144
|
+
const format = getQuestionPreviewFormat()
|
|
145
|
+
return format === undefined
|
|
146
|
+
? ASK_USER_QUESTION_TOOL_PROMPT
|
|
147
|
+
: ASK_USER_QUESTION_TOOL_PROMPT + PREVIEW_FEATURE_PROMPT[format]
|
|
125
148
|
},
|
|
126
149
|
get inputSchema(): InputSchema {
|
|
127
|
-
return inputSchema()
|
|
150
|
+
return inputSchema()
|
|
128
151
|
},
|
|
129
152
|
get outputSchema(): OutputSchema {
|
|
130
|
-
return outputSchema()
|
|
153
|
+
return outputSchema()
|
|
131
154
|
},
|
|
132
155
|
userFacingName() {
|
|
133
|
-
return ''
|
|
156
|
+
return ''
|
|
134
157
|
},
|
|
135
158
|
isEnabled() {
|
|
136
|
-
// When --channels is active the user is likely on Telegram/Discord, not
|
|
137
|
-
// watching the TUI. The multiple-choice dialog would hang with nobody at
|
|
138
|
-
// the keyboard. Channel permission relay already skips
|
|
139
|
-
// requiresUserInteraction() tools (interactiveHandler.ts) so there's
|
|
140
|
-
// no alternate approval path.
|
|
141
159
|
if ((feature('KAIROS') || feature('KAIROS_CHANNELS')) && getAllowedChannels().length > 0) {
|
|
142
|
-
return false
|
|
160
|
+
return false
|
|
143
161
|
}
|
|
144
|
-
return true
|
|
162
|
+
return true
|
|
145
163
|
},
|
|
146
164
|
isConcurrencySafe() {
|
|
147
|
-
return true
|
|
165
|
+
return true
|
|
148
166
|
},
|
|
149
167
|
isReadOnly() {
|
|
150
|
-
return true
|
|
168
|
+
return true
|
|
151
169
|
},
|
|
152
170
|
toAutoClassifierInput(input) {
|
|
153
|
-
return input.questions.map(
|
|
171
|
+
return input.questions.map(question => question.question).join(' | ')
|
|
154
172
|
},
|
|
155
173
|
requiresUserInteraction() {
|
|
156
|
-
return true
|
|
157
|
-
},
|
|
158
|
-
async validateInput({
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
for (const q of questions) {
|
|
167
|
-
for (const opt of q.options) {
|
|
168
|
-
const err = validateHtmlPreview(opt.preview);
|
|
169
|
-
if (err) {
|
|
174
|
+
return true
|
|
175
|
+
},
|
|
176
|
+
async validateInput({ questions }) {
|
|
177
|
+
if (getQuestionPreviewFormat() !== 'html') return { result: true }
|
|
178
|
+
for (const question of questions) {
|
|
179
|
+
for (const option of question.options) {
|
|
180
|
+
const error = validateHtmlPreview(option.preview)
|
|
181
|
+
if (error) {
|
|
170
182
|
return {
|
|
171
183
|
result: false,
|
|
172
|
-
message: `Option "${
|
|
173
|
-
errorCode: 1
|
|
174
|
-
}
|
|
184
|
+
message: `Option "${option.label}" in question "${question.question}": ${error}`,
|
|
185
|
+
errorCode: 1,
|
|
186
|
+
}
|
|
175
187
|
}
|
|
176
188
|
}
|
|
177
189
|
}
|
|
178
|
-
return {
|
|
179
|
-
result: true
|
|
180
|
-
};
|
|
190
|
+
return { result: true }
|
|
181
191
|
},
|
|
182
192
|
async checkPermissions(input) {
|
|
183
|
-
return {
|
|
184
|
-
behavior: 'ask' as const,
|
|
185
|
-
message: 'Answer questions?',
|
|
186
|
-
updatedInput: input
|
|
187
|
-
};
|
|
193
|
+
return { behavior: 'ask', message: 'Answer questions?', updatedInput: input }
|
|
188
194
|
},
|
|
189
195
|
renderToolUseMessage() {
|
|
190
|
-
return null
|
|
196
|
+
return null
|
|
191
197
|
},
|
|
192
198
|
renderToolUseProgressMessage() {
|
|
193
|
-
return null
|
|
199
|
+
return null
|
|
194
200
|
},
|
|
195
|
-
renderToolResultMessage({
|
|
196
|
-
answers
|
|
197
|
-
}, _toolUseID) {
|
|
198
|
-
return <AskUserQuestionResultMessage answers={answers} />;
|
|
201
|
+
renderToolResultMessage({ answers }) {
|
|
202
|
+
return <AskUserQuestionResultMessage answers={answers} />
|
|
199
203
|
},
|
|
200
204
|
renderToolUseRejectedMessage() {
|
|
201
|
-
return
|
|
205
|
+
return (
|
|
206
|
+
<Box flexDirection="row" marginTop={1}>
|
|
202
207
|
<Text color={getModeColor('default')}>{BLACK_CIRCLE} </Text>
|
|
203
208
|
<Text>User declined to answer questions</Text>
|
|
204
|
-
</Box
|
|
209
|
+
</Box>
|
|
210
|
+
)
|
|
205
211
|
},
|
|
206
212
|
renderToolUseErrorMessage() {
|
|
207
|
-
return null
|
|
213
|
+
return null
|
|
208
214
|
},
|
|
209
|
-
async call({
|
|
210
|
-
questions,
|
|
211
|
-
answers = {},
|
|
212
|
-
annotations
|
|
213
|
-
}, _context) {
|
|
215
|
+
async call({ questions, answers = {}, annotations }, context) {
|
|
214
216
|
return {
|
|
215
217
|
data: {
|
|
216
218
|
questions,
|
|
217
219
|
answers,
|
|
218
|
-
...(annotations && {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
220
|
+
...(annotations && { annotations }),
|
|
221
|
+
...buildAgentSupportMetadata({
|
|
222
|
+
taskId: ASK_USER_QUESTION_TOOL_NAME,
|
|
223
|
+
parentToolUseId: context.toolUseId,
|
|
224
|
+
}),
|
|
225
|
+
},
|
|
226
|
+
}
|
|
223
227
|
},
|
|
224
|
-
mapToolResultToToolResultBlockParam({
|
|
225
|
-
answers
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const answersText = Object.entries(answers).map(([questionText, answer]) => {
|
|
229
|
-
const annotation = annotations?.[questionText];
|
|
230
|
-
const parts = [`"${questionText}"="${answer}"`];
|
|
231
|
-
if (annotation?.preview) {
|
|
232
|
-
parts.push(`selected preview:\n${annotation.preview}`);
|
|
233
|
-
}
|
|
234
|
-
if (annotation?.notes) {
|
|
235
|
-
parts.push(`user notes: ${annotation.notes}`);
|
|
236
|
-
}
|
|
237
|
-
return parts.join(' ');
|
|
238
|
-
}).join(', ');
|
|
228
|
+
mapToolResultToToolResultBlockParam(result, toolUseID) {
|
|
229
|
+
const answersText = Object.entries(result.answers)
|
|
230
|
+
.map(([questionText, answer]) => `"${questionText}"="${answer}"`)
|
|
231
|
+
.join(', ')
|
|
239
232
|
return {
|
|
240
233
|
type: 'tool_result',
|
|
241
|
-
content: `User has answered your questions: ${answersText}. You can now continue with the user's answers in mind
|
|
242
|
-
tool_use_id: toolUseID
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
} satisfies ToolDef<InputSchema, Output>)
|
|
246
|
-
|
|
247
|
-
// Lightweight HTML fragment check. Not a parser — HTML5 parsers are
|
|
248
|
-
// error-recovering by spec and accept anything. We're checking model intent
|
|
249
|
-
// (did it emit HTML?) and catching the specific things we told it not to do.
|
|
250
|
-
function validateHtmlPreview(preview: string | undefined): string | null {
|
|
251
|
-
if (preview === undefined) return null;
|
|
252
|
-
if (/<\s*(html|body|!doctype)\b/i.test(preview)) {
|
|
253
|
-
return 'preview must be an HTML fragment, not a full document (no <html>, <body>, or <!DOCTYPE>)';
|
|
254
|
-
}
|
|
255
|
-
// SDK consumers typically set this via innerHTML — disallow executable/style
|
|
256
|
-
// tags so a preview can't run code or restyle the host page. Inline event
|
|
257
|
-
// handlers (onclick etc.) are still possible; consumers should sanitize.
|
|
258
|
-
if (/<\s*(script|style)\b/i.test(preview)) {
|
|
259
|
-
return 'preview must not contain <script> or <style> tags. Use inline styles via the style attribute if needed.';
|
|
260
|
-
}
|
|
261
|
-
if (!/<[a-z][^>]*>/i.test(preview)) {
|
|
262
|
-
return 'preview must contain HTML (previewFormat is set to "html"). Wrap content in a tag like <div> or <pre>.';
|
|
263
|
-
}
|
|
264
|
-
return null;
|
|
265
|
-
}
|
|
266
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJnZXRBbGxvd2VkQ2hhbm5lbHMiLCJnZXRRdWVzdGlvblByZXZpZXdGb3JtYXQiLCJNZXNzYWdlUmVzcG9uc2UiLCJCTEFDS19DSVJDTEUiLCJnZXRNb2RlQ29sb3IiLCJ6IiwiQm94IiwiVGV4dCIsIlRvb2wiLCJidWlsZFRvb2wiLCJUb29sRGVmIiwibGF6eVNjaGVtYSIsIkFTS19VU0VSX1FVRVNUSU9OX1RPT0xfQ0hJUF9XSURUSCIsIkFTS19VU0VSX1FVRVNUSU9OX1RPT0xfTkFNRSIsIkFTS19VU0VSX1FVRVNUSU9OX1RPT0xfUFJPTVBUIiwiREVTQ1JJUFRJT04iLCJQUkVWSUVXX0ZFQVRVUkVfUFJPTVBUIiwicXVlc3Rpb25PcHRpb25TY2hlbWEiLCJvYmplY3QiLCJsYWJlbCIsInN0cmluZyIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJwcmV2aWV3Iiwib3B0aW9uYWwiLCJxdWVzdGlvblNjaGVtYSIsInF1ZXN0aW9uIiwiaGVhZGVyIiwib3B0aW9ucyIsImFycmF5IiwibWluIiwibWF4IiwibXVsdGlTZWxlY3QiLCJib29sZWFuIiwiZGVmYXVsdCIsImFubm90YXRpb25zU2NoZW1hIiwiYW5ub3RhdGlvblNjaGVtYSIsIm5vdGVzIiwicmVjb3JkIiwiVU5JUVVFTkVTU19SRUZJTkUiLCJjaGVjayIsImRhdGEiLCJxdWVzdGlvbnMiLCJtYXAiLCJxIiwibGVuZ3RoIiwiU2V0Iiwic2l6ZSIsImxhYmVscyIsIm9wdCIsIm1lc3NhZ2UiLCJjb25zdCIsImNvbW1vbkZpZWxkcyIsImFuc3dlcnMiLCJhbm5vdGF0aW9ucyIsIm1ldGFkYXRhIiwic291cmNlIiwiaW5wdXRTY2hlbWEiLCJzdHJpY3RPYmplY3QiLCJyZWZpbmUiLCJJbnB1dFNjaGVtYSIsIlJldHVyblR5cGUiLCJvdXRwdXRTY2hlbWEiLCJPdXRwdXRTY2hlbWEiLCJfc2RrSW5wdXRTY2hlbWEiLCJfc2RrT3V0cHV0U2NoZW1hIiwiUXVlc3Rpb24iLCJpbmZlciIsIlF1ZXN0aW9uT3B0aW9uIiwiT3V0cHV0IiwiQXNrVXNlclF1ZXN0aW9uUmVzdWx0TWVzc2FnZSIsInQwIiwiJCIsIl9jIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJ0MiIsIk9iamVjdCIsImVudHJpZXMiLCJfdGVtcCIsInF1ZXN0aW9uVGV4dCIsImFuc3dlciIsIkFza1VzZXJRdWVzdGlvblRvb2wiLCJuYW1lIiwic2VhcmNoSGludCIsIm1heFJlc3VsdFNpemVDaGFycyIsInNob3VsZERlZmVyIiwicHJvbXB0IiwiZm9ybWF0IiwidW5kZWZpbmVkIiwidXNlckZhY2luZ05hbWUiLCJpc0VuYWJsZWQiLCJpc0NvbmN1cnJlbmN5U2FmZSIsImlzUmVhZE9ubHkiLCJ0b0F1dG9DbGFzc2lmaWVySW5wdXQiLCJpbnB1dCIsImpvaW4iLCJyZXF1aXJlc1VzZXJJbnRlcmFjdGlvbiIsInZhbGlkYXRlSW5wdXQiLCJyZXN1bHQiLCJlcnIiLCJ2YWxpZGF0ZUh0bWxQcmV2aWV3IiwiZXJyb3JDb2RlIiwiY2hlY2tQZXJtaXNzaW9ucyIsImJlaGF2aW9yIiwidXBkYXRlZElucHV0IiwicmVuZGVyVG9vbFVzZU1lc3NhZ2UiLCJyZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlIiwicmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UiLCJfdG9vbFVzZUlEIiwicmVuZGVyVG9vbFVzZVJlamVjdGVkTWVzc2FnZSIsInJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UiLCJjYWxsIiwiX2NvbnRleHQiLCJtYXBUb29sUmVzdWx0VG9Ub29sUmVzdWx0QmxvY2tQYXJhbSIsInRvb2xVc2VJRCIsImFuc3dlcnNUZXh0IiwiYW5ub3RhdGlvbiIsInBhcnRzIiwicHVzaCIsInR5cGUiLCJjb250ZW50IiwidG9vbF91c2VfaWQiLCJ0ZXN0Il0sInNvdXJjZXMiOlsiQXNrVXNlclF1ZXN0aW9uVG9vbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmVhdHVyZSB9IGZyb20gJ2J1bjpidW5kbGUnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIGdldEFsbG93ZWRDaGFubmVscyxcbiAgZ2V0UXVlc3Rpb25QcmV2aWV3Rm9ybWF0LFxufSBmcm9tICdzcmMvYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHsgTWVzc2FnZVJlc3BvbnNlIH0gZnJvbSAnc3JjL2NvbXBvbmVudHMvTWVzc2FnZVJlc3BvbnNlLmpzJ1xuaW1wb3J0IHsgQkxBQ0tfQ0lSQ0xFIH0gZnJvbSAnc3JjL2NvbnN0YW50cy9maWd1cmVzLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kZUNvbG9yIH0gZnJvbSAnc3JjL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25Nb2RlLmpzJ1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZC92NCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQgeyBidWlsZFRvb2wsIHR5cGUgVG9vbERlZiB9IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQgeyBsYXp5U2NoZW1hIH0gZnJvbSAnLi4vLi4vdXRpbHMvbGF6eVNjaGVtYS5qcydcbmltcG9ydCB7XG4gIEFTS19VU0VSX1FVRVNUSU9OX1RPT0xfQ0hJUF9XSURUSCxcbiAgQVNLX1VTRVJfUVVFU1RJT05fVE9PTF9OQU1FLFxuICBBU0tfVVNFUl9RVUVTVElPTl9UT09MX1BST01QVCxcbiAgREVTQ1JJUFRJT04sXG4gIFBSRVZJRVdfRkVBVFVSRV9QUk9NUFQsXG59IGZyb20gJy4vcHJvbXB0LmpzJ1xuXG5jb25zdCBxdWVzdGlvbk9wdGlvblNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGxhYmVsOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RoZSBkaXNwbGF5IHRleHQgZm9yIHRoaXMgb3B0aW9uIHRoYXQgdGhlIHVzZXIgd2lsbCBzZWUgYW5kIHNlbGVjdC4gU2hvdWxkIGJlIGNvbmNpc2UgKDEtNSB3b3JkcykgYW5kIGNsZWFybHkgZGVzY3JpYmUgdGhlIGNob2ljZS4nLFxuICAgICAgKSxcbiAgICBkZXNjcmlwdGlvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdFeHBsYW5hdGlvbiBvZiB3aGF0IHRoaXMgb3B0aW9uIG1lYW5zIG9yIHdoYXQgd2lsbCBoYXBwZW4gaWYgY2hvc2VuLiBVc2VmdWwgZm9yIHByb3ZpZGluZyBjb250ZXh0IGFib3V0IHRyYWRlLW9mZnMgb3IgaW1wbGljYXRpb25zLicsXG4gICAgICApLFxuICAgIHByZXZpZXc6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ09wdGlvbmFsIHByZXZpZXcgY29udGVudCByZW5kZXJlZCB3aGVuIHRoaXMgb3B0aW9uIGlzIGZvY3VzZWQuIFVzZSBmb3IgbW9ja3VwcywgY29kZSBzbmlwcGV0cywgb3IgdmlzdWFsIGNvbXBhcmlzb25zIHRoYXQgaGVscCB1c2VycyBjb21wYXJlIG9wdGlvbnMuIFNlZSB0aGUgdG9vbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGV4cGVjdGVkIGNvbnRlbnQgZm9ybWF0LicsXG4gICAgICApLFxuICB9KSxcbilcblxuY29uc3QgcXVlc3Rpb25TY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+XG4gIHoub2JqZWN0KHtcbiAgICBxdWVzdGlvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdUaGUgY29tcGxldGUgcXVlc3Rpb24gdG8gYXNrIHRoZSB1c2VyLiBTaG91bGQgYmUgY2xlYXIsIHNwZWNpZmljLCBhbmQgZW5kIHdpdGggYSBxdWVzdGlvbiBtYXJrLiBFeGFtcGxlOiBcIldoaWNoIGxpYnJhcnkgc2hvdWxkIHdlIHVzZSBmb3IgZGF0ZSBmb3JtYXR0aW5nP1wiIElmIG11bHRpU2VsZWN0IGlzIHRydWUsIHBocmFzZSBpdCBhY2NvcmRpbmdseSwgZS5nLiBcIldoaWNoIGZlYXR1cmVzIGRvIHlvdSB3YW50IHRvIGVuYWJsZT9cIicsXG4gICAgICApLFxuICAgIGhlYWRlcjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIGBWZXJ5IHNob3J0IGxhYmVsIGRpc3BsYXllZCBhcyBhIGNoaXAvdGFnIChtYXggJHtBU0tfVVNFUl9RVUVTVElPTl9UT09MX0NISVBfV0lEVEh9IGNoYXJzKS4gRXhhbXBsZXM6IFwiQXV0aCBtZXRob2RcIiwgXCJMaWJyYXJ5XCIsIFwiQXBwcm9hY2hcIi5gLFxuICAgICAgKSxcbiAgICBvcHRpb25zOiB6XG4gICAgICAuYXJyYXkocXVlc3Rpb25PcHRpb25TY2hlbWEoKSlcbiAgICAgIC5taW4oMilcbiAgICAgIC5tYXgoNClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgYFRoZSBhdmFpbGFibGUgY2hvaWNlcyBmb3IgdGhpcyBxdWVzdGlvbi4gTXVzdCBoYXZlIDItNCBvcHRpb25zLiBFYWNoIG9wdGlvbiBzaG91bGQgYmUgYSBkaXN0aW5jdCwgbXV0dWFsbHkgZXhjbHVzaXZlIGNob2ljZSAodW5sZXNzIG11bHRpU2VsZWN0IGlzIGVuYWJsZWQpLiBUaGVyZSBzaG91bGQgYmUgbm8gJ090aGVyJyBvcHRpb24sIHRoYXQgd2lsbCBiZSBwcm92aWRlZCBhdXRvbWF0aWNhbGx5LmAsXG4gICAgICApLFxuICAgIG11bHRpU2VsZWN0OiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1NldCB0byB0cnVlIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBvcHRpb25zIGluc3RlYWQgb2YganVzdCBvbmUuIFVzZSB3aGVuIGNob2ljZXMgYXJlIG5vdCBtdXR1YWxseSBleGNsdXNpdmUuJyxcbiAgICAgICksXG4gIH0pLFxuKVxuXG5jb25zdCBhbm5vdGF0aW9uc1NjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT4ge1xuICBjb25zdCBhbm5vdGF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHByZXZpZXc6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RoZSBwcmV2aWV3IGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiwgaWYgdGhlIHF1ZXN0aW9uIHVzZWQgcHJldmlld3MuJyxcbiAgICAgICksXG4gICAgbm90ZXM6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZSgnRnJlZS10ZXh0IG5vdGVzIHRoZSB1c2VyIGFkZGVkIHRvIHRoZWlyIHNlbGVjdGlvbi4nKSxcbiAgfSlcblxuICByZXR1cm4gelxuICAgIC5yZWNvcmQoei5zdHJpbmcoKSwgYW5ub3RhdGlvblNjaGVtYSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgICdPcHRpb25hbCBwZXItcXVlc3Rpb24gYW5ub3RhdGlvbnMgZnJvbSB0aGUgdXNlciAoZS5nLiwgbm90ZXMgb24gcHJldmlldyBzZWxlY3Rpb25zKS4gS2V5ZWQgYnkgcXVlc3Rpb24gdGV4dC4nLFxuICAgIClcbn0pXG5cbmNvbnN0IFVOSVFVRU5FU1NfUkVGSU5FID0ge1xuICBjaGVjazogKGRhdGE6IHtcbiAgICBxdWVzdGlvbnM6IHsgcXVlc3Rpb246IHN0cmluZzsgb3B0aW9uczogeyBsYWJlbDogc3RyaW5nIH1bXSB9W11cbiAgfSkgPT4ge1xuICAgIGNvbnN0IHF1ZXN0aW9ucyA9IGRhdGEucXVlc3Rpb25zLm1hcChxID0+IHEucXVlc3Rpb24pXG4gICAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggIT09IG5ldyBTZXQocXVlc3Rpb25zKS5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBkYXRhLnF1ZXN0aW9ucykge1xuICAgICAgY29uc3QgbGFiZWxzID0gcXVlc3Rpb24ub3B0aW9ucy5tYXAob3B0ID0+IG9wdC5sYWJlbClcbiAgICAgIGlmIChsYWJlbHMubGVuZ3RoICE9PSBuZXcgU2V0KGxhYmVscykuc2l6ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfSxcbiAgbWVzc2FnZTpcbiAgICAnUXVlc3Rpb24gdGV4dHMgbXVzdCBiZSB1bmlxdWUsIG9wdGlvbiBsYWJlbHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGVhY2ggcXVlc3Rpb24nLFxufSBhcyBjb25zdFxuXG5jb25zdCBjb21tb25GaWVsZHMgPSBsYXp5U2NoZW1hKCgpID0+ICh7XG4gIGFuc3dlcnM6IHpcbiAgICAucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoJ1VzZXIgYW5zd2VycyBjb2xsZWN0ZWQgYnkgdGhlIHBlcm1pc3Npb24gY29tcG9uZW50JyksXG4gIGFubm90YXRpb25zOiBhbm5vdGF0aW9uc1NjaGVtYSgpLFxuICBtZXRhZGF0YTogelxuICAgIC5vYmplY3Qoe1xuICAgICAgc291cmNlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ09wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVzdGlvbiAoZS5nLiwgXCJyZW1lbWJlclwiIGZvciAvcmVtZW1iZXIgY29tbWFuZCkuIFVzZWQgZm9yIGFuYWx5dGljcyB0cmFja2luZy4nLFxuICAgICAgICApLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICAnT3B0aW9uYWwgbWV0YWRhdGEgZm9yIHRyYWNraW5nIGFuZCBhbmFseXRpY3MgcHVycG9zZXMuIE5vdCBkaXNwbGF5ZWQgdG8gdXNlci4nLFxuICAgICksXG59KSlcblxuY29uc3QgaW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+XG4gIHpcbiAgICAuc3RyaWN0T2JqZWN0KHtcbiAgICAgIHF1ZXN0aW9uczogelxuICAgICAgICAuYXJyYXkocXVlc3Rpb25TY2hlbWEoKSlcbiAgICAgICAgLm1pbigxKVxuICAgICAgICAubWF4KDQpXG4gICAgICAgIC5kZXNjcmliZSgnUXVlc3Rpb25zIHRvIGFzayB0aGUgdXNlciAoMS00IHF1ZXN0aW9ucyknKSxcbiAgICAgIC4uLmNvbW1vbkZpZWxkcygpLFxuICAgIH0pXG4gICAgLnJlZmluZShVTklRVUVORVNTX1JFRklORS5jaGVjaywge1xuICAgICAgbWVzc2FnZTogVU5JUVVFTkVTU19SRUZJTkUubWVzc2FnZSxcbiAgICB9KSxcbilcbnR5cGUgSW5wdXRTY2hlbWEgPSBSZXR1cm5UeXBlPHR5cGVvZiBpbnB1dFNjaGVtYT5cblxuY29uc3Qgb3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYSgoKSA9PlxuICB6Lm9iamVjdCh7XG4gICAgcXVlc3Rpb25zOiB6XG4gICAgICAuYXJyYXkocXVlc3Rpb25TY2hlbWEoKSlcbiAgICAgIC5kZXNjcmliZSgnVGhlIHF1ZXN0aW9ucyB0aGF0IHdlcmUgYXNrZWQnKSxcbiAgICBhbnN3ZXJzOiB6XG4gICAgICAucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdUaGUgYW5zd2VycyBwcm92aWRlZCBieSB0aGUgdXNlciAocXVlc3Rpb24gdGV4dCAtPiBhbnN3ZXIgc3RyaW5nOyBtdWx0aS1zZWxlY3QgYW5zd2VycyBhcmUgY29tbWEtc2VwYXJhdGVkKScsXG4gICAgICApLFxuICAgIGFubm90YXRpb25zOiBhbm5vdGF0aW9uc1NjaGVtYSgpLFxuICB9KSxcbilcbnR5cGUgT3V0cHV0U2NoZW1hID0gUmV0dXJuVHlwZTx0eXBlb2Ygb3V0cHV0U2NoZW1hPlxuXG4vLyBTREsgc2NoZW1hcyBhcmUgaWRlbnRpY2FsIHRvIGludGVybmFsIHNjaGVtYXMgbm93IHRoYXQgYHByZXZpZXdgIGFuZFxuLy8gYGFubm90YXRpb25zYCBhcmUgcHVibGljIChjb25maWd1cmFibGUgdmlhIGB0b29sQ29uZmlnLmFza1VzZXJRdWVzdGlvbmApLlxuZXhwb3J0IGNvbnN0IF9zZGtJbnB1dFNjaGVtYSA9IGlucHV0U2NoZW1hXG5leHBvcnQgY29uc3QgX3Nka091dHB1dFNjaGVtYSA9IG91dHB1dFNjaGVtYVxuXG5leHBvcnQgdHlwZSBRdWVzdGlvbiA9IHouaW5mZXI8UmV0dXJuVHlwZTx0eXBlb2YgcXVlc3Rpb25TY2hlbWE+PlxuZXhwb3J0IHR5cGUgUXVlc3Rpb25PcHRpb24gPSB6LmluZmVyPFJldHVyblR5cGU8dHlwZW9mIHF1ZXN0aW9uT3B0aW9uU2NoZW1hPj5cbmV4cG9ydCB0eXBlIE91dHB1dCA9IHouaW5mZXI8T3V0cHV0U2NoZW1hPlxuXG5mdW5jdGlvbiBBc2tVc2VyUXVlc3Rpb25SZXN1bHRNZXNzYWdlKHtcbiAgYW5zd2Vycyxcbn06IHtcbiAgYW5zd2VyczogT3V0cHV0WydhbnN3ZXJzJ11cbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpblRvcD17MX0+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJyb3dcIj5cbiAgICAgICAgPFRleHQgY29sb3I9e2dldE1vZGVDb2xvcignZGVmYXVsdCcpfT57QkxBQ0tfQ0lSQ0xFfSZuYnNwOzwvVGV4dD5cbiAgICAgICAgPFRleHQ+VXNlciBhbnN3ZXJlZCBDbGF1ZGUmYXBvcztzIHF1ZXN0aW9uczo8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICAgIDxNZXNzYWdlUmVzcG9uc2U+XG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgIHtPYmplY3QuZW50cmllcyhhbnN3ZXJzKS5tYXAoKFtxdWVzdGlvblRleHQsIGFuc3dlcl0pID0+IChcbiAgICAgICAgICAgIDxUZXh0IGtleT17cXVlc3Rpb25UZXh0fSBjb2xvcj1cImluYWN0aXZlXCI+XG4gICAgICAgICAgICAgIMK3IHtxdWVzdGlvblRleHR9IOKGkiB7YW5zd2VyfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0JveD5cbiAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgIDwvQm94PlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBBc2tVc2VyUXVlc3Rpb25Ub29sOiBUb29sPElucHV0U2NoZW1hLCBPdXRwdXQ+ID0gYnVpbGRUb29sKHtcbiAgbmFtZTogQVNLX1VTRVJfUVVFU1RJT05fVE9PTF9OQU1FLFxuICBzZWFyY2hIaW50OiAncHJvbXB0IHRoZSB1c2VyIHdpdGggYSBtdWx0aXBsZS1jaG9pY2UgcXVlc3Rpb24nLFxuICBtYXhSZXN1bHRTaXplQ2hhcnM6IDEwMF8wMDAsXG4gIHNob3VsZERlZmVyOiB0cnVlLFxuICBhc3luYyBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gREVTQ1JJUFRJT05cbiAgfSxcbiAgYXN5bmMgcHJvbXB0KCkge1xuICAgIGNvbnN0IGZvcm1hdCA9IGdldFF1ZXN0aW9uUHJldmlld0Zvcm1hdCgpXG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTREsgY29uc3VtZXIgdGhhdCBoYXNuJ3Qgb3B0ZWQgaW50byBhIHByZXZpZXcgZm9ybWF0IOKAlCBvbWl0IHByZXZpZXdcbiAgICAgIC8vIGd1aWRhbmNlICh0aGV5IG1heSBub3QgcmVuZGVyIHRoZSBmaWVsZCBhdCBhbGwpLlxuICAgICAgcmV0dXJuIEFTS19VU0VSX1FVRVNUSU9OX1RPT0xfUFJPTVBUXG4gICAgfVxuICAgIHJldHVybiBBU0tfVVNFUl9RVUVTVElPTl9UT09MX1BST01QVCArIFBSRVZJRVdfRkVBVFVSRV9QUk9NUFRbZm9ybWF0XVxuICB9LFxuICBnZXQgaW5wdXRTY2hlbWEoKTogSW5wdXRTY2hlbWEge1xuICAgIHJldHVybiBpbnB1dFNjaGVtYSgpXG4gIH0sXG4gIGdldCBvdXRwdXRTY2hlbWEoKTogT3V0cHV0U2NoZW1hIHtcbiAgICByZXR1cm4gb3V0cHV0U2NoZW1hKClcbiAgfSxcbiAgdXNlckZhY2luZ05hbWUoKSB7XG4gICAgcmV0dXJuICcnXG4gIH0sXG4gIGlzRW5hYmxlZCgpIHtcbiAgICAvLyBXaGVuIC0tY2hhbm5lbHMgaXMgYWN0aXZlIHRoZSB1c2VyIGlzIGxpa2VseSBvbiBUZWxlZ3JhbS9EaXNjb3JkLCBub3RcbiAgICAvLyB3YXRjaGluZyB0aGUgVFVJLiBUaGUgbXVsdGlwbGUtY2hvaWNlIGRpYWxvZyB3b3VsZCBoYW5nIHdpdGggbm9ib2R5IGF0XG4gICAgLy8gdGhlIGtleWJvYXJkLiBDaGFubmVsIHBlcm1pc3Npb24gcmVsYXkgYWxyZWFkeSBza2lwc1xuICAgIC8vIHJlcXVpcmVzVXNlckludGVyYWN0aW9uKCkgdG9vbHMgKGludGVyYWN0aXZlSGFuZGxlci50cykgc28gdGhlcmUnc1xuICAgIC8vIG5vIGFsdGVybmF0ZSBhcHByb3ZhbCBwYXRoLlxuICAgIGlmIChcbiAgICAgIChmZWF0dXJlKCdLQUlST1MnKSB8fCBmZWF0dXJlKCdLQUlST1NfQ0hBTk5FTFMnKSkgJiZcbiAgICAgIGdldEFsbG93ZWRDaGFubmVscygpLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9LFxuICBpc0NvbmN1cnJlbmN5U2FmZSgpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9LFxuICBpc1JlYWRPbmx5KCkge1xuICAgIHJldHVybiB0cnVlXG4gIH0sXG4gIHRvQXV0b0NsYXNzaWZpZXJJbnB1dChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC5xdWVzdGlvbnMubWFwKHEgPT4gcS5xdWVzdGlvbikuam9pbignIHwgJylcbiAgfSxcbiAgcmVxdWlyZXNVc2VySW50ZXJhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfSxcbiAgYXN5bmMgdmFsaWRhdGVJbnB1dCh7IHF1ZXN0aW9ucyB9KSB7XG4gICAgaWYgKGdldFF1ZXN0aW9uUHJldmlld0Zvcm1hdCgpICE9PSAnaHRtbCcpIHtcbiAgICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcSBvZiBxdWVzdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0IG9mIHEub3B0aW9ucykge1xuICAgICAgICBjb25zdCBlcnIgPSB2YWxpZGF0ZUh0bWxQcmV2aWV3KG9wdC5wcmV2aWV3KVxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgT3B0aW9uIFwiJHtvcHQubGFiZWx9XCIgaW4gcXVlc3Rpb24gXCIke3EucXVlc3Rpb259XCI6ICR7ZXJyfWAsXG4gICAgICAgICAgICBlcnJvckNvZGU6IDEsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9XG4gIH0sXG4gIGFzeW5jIGNoZWNrUGVybWlzc2lvbnMoaW5wdXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmVoYXZpb3I6ICdhc2snIGFzIGNvbnN0LFxuICAgICAgbWVzc2FnZTogJ0Fuc3dlciBxdWVzdGlvbnM/JyxcbiAgICAgIHVwZGF0ZWRJbnB1dDogaW5wdXQsXG4gICAgfVxuICB9LFxuICByZW5kZXJUb29sVXNlTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9LFxuICByZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlKCkge1xuICAgIHJldHVybiBudWxsXG4gIH0sXG4gIHJlbmRlclRvb2xSZXN1bHRNZXNzYWdlKHsgYW5zd2VycyB9LCBfdG9vbFVzZUlEKSB7XG4gICAgcmV0dXJuIDxBc2tVc2VyUXVlc3Rpb25SZXN1bHRNZXNzYWdlIGFuc3dlcnM9e2Fuc3dlcnN9IC8+XG4gIH0sXG4gIHJlbmRlclRvb2xVc2VSZWplY3RlZE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiIG1hcmdpblRvcD17MX0+XG4gICAgICAgIDxUZXh0IGNvbG9yPXtnZXRNb2RlQ29sb3IoJ2RlZmF1bHQnKX0+e0JMQUNLX0NJUkNMRX0mbmJzcDs8L1RleHQ+XG4gICAgICAgIDxUZXh0PlVzZXIgZGVjbGluZWQgdG8gYW5zd2VyIHF1ZXN0aW9uczwvVGV4dD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfSxcbiAgcmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9LFxuICBhc3luYyBjYWxsKHsgcXVlc3Rpb25zLCBhbnN3ZXJzID0ge30sIGFubm90YXRpb25zIH0sIF9jb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHsgcXVlc3Rpb25zLCBhbnN3ZXJzLCAuLi4oYW5ub3RhdGlvbnMgJiYgeyBhbm5vdGF0aW9ucyB9KSB9LFxuICAgIH1cbiAgfSxcbiAgbWFwVG9vbFJlc3VsdFRvVG9vbFJlc3VsdEJsb2NrUGFyYW0oeyBhbnN3ZXJzLCBhbm5vdGF0aW9ucyB9LCB0b29sVXNlSUQpIHtcbiAgICBjb25zdCBhbnN3ZXJzVGV4dCA9IE9iamVjdC5lbnRyaWVzKGFuc3dlcnMpXG4gICAgICAubWFwKChbcXVlc3Rpb25UZXh0LCBhbnN3ZXJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb24gPSBhbm5vdGF0aW9ucz8uW3F1ZXN0aW9uVGV4dF1cbiAgICAgICAgY29uc3QgcGFydHMgPSBbYFwiJHtxdWVzdGlvblRleHR9XCI9XCIke2Fuc3dlcn1cImBdXG4gICAgICAgIGlmIChhbm5vdGF0aW9uPy5wcmV2aWV3KSB7XG4gICAgICAgICAgcGFydHMucHVzaChgc2VsZWN0ZWQgcHJldmlldzpcXG4ke2Fubm90YXRpb24ucHJldmlld31gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uPy5ub3Rlcykge1xuICAgICAgICAgIHBhcnRzLnB1c2goYHVzZXIgbm90ZXM6ICR7YW5ub3RhdGlvbi5ub3Rlc31gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJylcbiAgICAgIH0pXG4gICAgICAuam9pbignLCAnKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICd0b29sX3Jlc3VsdCcsXG4gICAgICBjb250ZW50OiBgVXNlciBoYXMgYW5zd2VyZWQgeW91ciBxdWVzdGlvbnM6ICR7YW5zd2Vyc1RleHR9LiBZb3UgY2FuIG5vdyBjb250aW51ZSB3aXRoIHRoZSB1c2VyJ3MgYW5zd2VycyBpbiBtaW5kLmAsXG4gICAgICB0b29sX3VzZV9pZDogdG9vbFVzZUlELFxuICAgIH1cbiAgfSxcbn0gc2F0aXNmaWVzIFRvb2xEZWY8SW5wdXRTY2hlbWEsIE91dHB1dD4pXG5cbi8vIExpZ2h0d2VpZ2h0IEhUTUwgZnJhZ21lbnQgY2hlY2suIE5vdCBhIHBhcnNlciDigJQgSFRNTDUgcGFyc2VycyBhcmVcbi8vIGVycm9yLXJlY292ZXJpbmcgYnkgc3BlYyBhbmQgYWNjZXB0IGFueXRoaW5nLiBXZSdyZSBjaGVja2luZyBtb2RlbCBpbnRlbnRcbi8vIChkaWQgaXQgZW1pdCBIVE1MPykgYW5kIGNhdGNoaW5nIHRoZSBzcGVjaWZpYyB0aGluZ3Mgd2UgdG9sZCBpdCBub3QgdG8gZG8uXG5mdW5jdGlvbiB2YWxpZGF0ZUh0bWxQcmV2aWV3KHByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAocHJldmlldyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuICBpZiAoLzxcXHMqKGh0bWx8Ym9keXwhZG9jdHlwZSlcXGIvaS50ZXN0KHByZXZpZXcpKSB7XG4gICAgcmV0dXJuICdwcmV2aWV3IG11c3QgYmUgYW4gSFRNTCBmcmFnbWVudCwgbm90IGEgZnVsbCBkb2N1bWVudCAobm8gPGh0bWw+LCA8Ym9keT4sIG9yIDwhRE9DVFlQRT4pJ1xuICB9XG4gIC8vIFNESyBjb25zdW1lcnMgdHlwaWNhbGx5IHNldCB0aGlzIHZpYSBpbm5lckhUTUwg4oCUIGRpc2FsbG93IGV4ZWN1dGFibGUvc3R5bGVcbiAgLy8gdGFncyBzbyBhIHByZXZpZXcgY2FuJ3QgcnVuIGNvZGUgb3IgcmVzdHlsZSB0aGUgaG9zdCBwYWdlLiBJbmxpbmUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgKG9uY2xpY2sgZXRjLikgYXJlIHN0aWxsIHBvc3NpYmxlOyBjb25zdW1lcnMgc2hvdWxkIHNhbml0aXplLlxuICBpZiAoLzxcXHMqKHNjcmlwdHxzdHlsZSlcXGIvaS50ZXN0KHByZXZpZXcpKSB7XG4gICAgcmV0dXJuICdwcmV2aWV3IG11c3Qgbm90IGNvbnRhaW4gPHNjcmlwdD4gb3IgPHN0eWxlPiB0YWdzLiBVc2UgaW5saW5lIHN0eWxlcyB2aWEgdGhlIHN0eWxlIGF0dHJpYnV0ZSBpZiBuZWVkZWQuJ1xuICB9XG4gIGlmICghLzxbYS16XVtePl0qPi9pLnRlc3QocHJldmlldykpIHtcbiAgICByZXR1cm4gJ3ByZXZpZXcgbXVzdCBjb250YWluIEhUTUwgKHByZXZpZXdGb3JtYXQgaXMgc2V0IHRvIFwiaHRtbFwiKS4gV3JhcCBjb250ZW50IGluIGEgdGFnIGxpa2UgPGRpdj4gb3IgPHByZT4uJ1xuICB9XG4gIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFTQSxPQUFPLFFBQVEsWUFBWTtBQUNwQyxPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQ0VDLGtCQUFrQixFQUNsQkMsd0JBQXdCLFFBQ25CLHdCQUF3QjtBQUMvQixTQUFTQyxlQUFlLFFBQVEsbUNBQW1DO0FBQ25FLFNBQVNDLFlBQVksUUFBUSwwQkFBMEI7QUFDdkQsU0FBU0MsWUFBWSxRQUFRLHlDQUF5QztBQUN0RSxTQUFTQyxDQUFDLFFBQVEsUUFBUTtBQUMxQixTQUFTQyxHQUFHLEVBQUVDLElBQUksUUFBUSxjQUFjO0FB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QUd2QyxNQUFNLENBQUNDLE9BQU8sQ0FBQzFCLE9BQU8sQ0FBQyxDQUN4Q1YsR0FBRyxDQUFDLENBQUMsQ0FBQ3NDLFlBQVksRUFBRUMsTUFBTSxDQUFDLEtBQUs7TUFDL0IsTUFBTW9DLFVBQVUsR0FBR2hFLFdBQVcsR0FBRzJCLFlBQVksQ0FBQztNQUM5QyxNQUFNc0MsS0FBSyxHQUFHLENBQUMsSUFBSXRDLFlBQVksTUFBTUMsTUFBTSxHQUFHLENBQUM7TUFDL0MsSUFBSW9DLFVBQVUsRUFBRS9GLE9BQU8sRUFBRTtRQUN2QmdHLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLHNCQUFzQkYsVUFBVSxDQUFDL0YsT0FBTyxFQUFFLENBQUM7TUFDeEQ7TUFDQSxJQUFJK0YsVUFBVSxFQUFFakYsS0FBSyxFQUFFO1FBQ3JCa0YsS0FBSyxDQUFDQyxJQUFJLENBQUMsZUFBZUYsVUFBVSxDQUFDakYsS0FBSyxFQUFFLENBQUM7TUFDL0M7TUFDQSxPQUFPa0YsS0FBSyxDQUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FDREEsSUFBSSxDQUFDLElBQUksQ0FBQztJQUViLE9BQU87TUFDTHdCLElBQUksRUFBRSxhQUFhO01BQ25CQyxPQUFPLEVBQUUscUNBQXFDTCxXQUFXLHlEQUF5RDtNQUNsSE0sV0FBVyxFQUFFUDtJQUNmLENBQUM7RUFDSDtBQUNGLENBQUMsV0FBVzFHLE9BQU8sQ0FBQ2tELFdBQVcsRUFBRVMsTUFBTSxDQUFDLENBQUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLFNBQVNpQyxtQkFBbUJBLENBQUMvRSxPQUFPLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7RUFDdkUsSUFBSUEsT0FBTyxLQUFLbUUsU0FBUyxFQUFFLE9BQU8sSUFBSTtFQUN0QyxJQUFJLDZCQUE2QixDQUFDa0MsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDL0MsT0FBTywwRkFBMEY7RUFDbkc7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJLHVCQUF1QixDQUFDcUcsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDekMsT0FBTyx5R0FBeUc7RUFDbEg7RUFDQSxJQUFJLENBQUMsZUFBZSxDQUFDcUcsSUFBSSxDQUFDckcsT0FBTyxDQUFDLEVBQUU7SUFDbEMsT0FBTyx3R0FBd0c7RUFDakg7RUFDQSxPQUFPLElBQUk7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
|
|
234
|
+
content: `User has answered your questions: ${answersText}. You can now continue with the user's answers in mind.\n\nevidence_join_key: ${result.evidenceJoinKey}\nparent_tool_use_id: ${result.parentToolUseId}\nresume_token: ${result.resumeToken}\npermission_flow: ${result.permissionFlow}`,
|
|
235
|
+
tool_use_id: toolUseID,
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
} satisfies ToolDef<InputSchema, Output>)
|