@xelauvas/xela-cli 0.1.0
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 +200 -0
- package/bin/xela +100 -0
- package/package.json +88 -0
- package/src/QueryEngine.ts +1295 -0
- package/src/Task.ts +125 -0
- package/src/Tool.ts +792 -0
- package/src/_shims/_generated_stubs/_universal_stub.mjs +168 -0
- package/src/_shims/_generated_stubs/text_stub.mjs +1 -0
- package/src/_shims/bun_bundle.js +9 -0
- package/src/_shims/cjs_stub.cjs +23 -0
- package/src/_shims/empty_stub.js +33 -0
- package/src/_shims/loader.js +352 -0
- package/src/_shims/openai_adapter.ts +486 -0
- package/src/_shims/react_compiler_runtime.js +17 -0
- package/src/_shims/register.js +148 -0
- package/src/assistant/sessionHistory.ts +87 -0
- package/src/bootstrap/state.ts +1759 -0
- package/src/bridge/bridgeApi.ts +539 -0
- package/src/bridge/bridgeConfig.ts +48 -0
- package/src/bridge/bridgeDebug.ts +135 -0
- package/src/bridge/bridgeEnabled.ts +202 -0
- package/src/bridge/bridgeMain.ts +2999 -0
- package/src/bridge/bridgeMessaging.ts +461 -0
- package/src/bridge/bridgePermissionCallbacks.ts +43 -0
- package/src/bridge/bridgePointer.ts +210 -0
- package/src/bridge/bridgeStatusUtil.ts +163 -0
- package/src/bridge/bridgeUI.ts +530 -0
- package/src/bridge/capacityWake.ts +56 -0
- package/src/bridge/codeSessionApi.ts +168 -0
- package/src/bridge/createSession.ts +384 -0
- package/src/bridge/debugUtils.ts +141 -0
- package/src/bridge/envLessBridgeConfig.ts +165 -0
- package/src/bridge/flushGate.ts +71 -0
- package/src/bridge/inboundAttachments.ts +175 -0
- package/src/bridge/inboundMessages.ts +80 -0
- package/src/bridge/initReplBridge.ts +569 -0
- package/src/bridge/jwtUtils.ts +256 -0
- package/src/bridge/pollConfig.ts +110 -0
- package/src/bridge/pollConfigDefaults.ts +82 -0
- package/src/bridge/remoteBridgeCore.ts +1008 -0
- package/src/bridge/replBridge.ts +2406 -0
- package/src/bridge/replBridgeHandle.ts +36 -0
- package/src/bridge/replBridgeTransport.ts +370 -0
- package/src/bridge/sessionIdCompat.ts +57 -0
- package/src/bridge/sessionRunner.ts +550 -0
- package/src/bridge/trustedDevice.ts +210 -0
- package/src/bridge/types.ts +262 -0
- package/src/bridge/workSecret.ts +127 -0
- package/src/buddy/CompanionSprite.tsx +371 -0
- package/src/buddy/companion.ts +133 -0
- package/src/buddy/prompt.ts +36 -0
- package/src/buddy/sprites.ts +514 -0
- package/src/buddy/types.ts +148 -0
- package/src/buddy/useBuddyNotification.tsx +98 -0
- package/src/cli/exit.ts +31 -0
- package/src/cli/handlers/agents.ts +70 -0
- package/src/cli/handlers/auth.ts +330 -0
- package/src/cli/handlers/autoMode.ts +170 -0
- package/src/cli/handlers/mcp.tsx +362 -0
- package/src/cli/handlers/plugins.ts +878 -0
- package/src/cli/handlers/util.tsx +110 -0
- package/src/cli/ndjsonSafeStringify.ts +32 -0
- package/src/cli/print.ts +5594 -0
- package/src/cli/remoteIO.ts +255 -0
- package/src/cli/structuredIO.ts +859 -0
- package/src/cli/transports/HybridTransport.ts +282 -0
- package/src/cli/transports/SSETransport.ts +711 -0
- package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
- package/src/cli/transports/WebSocketTransport.ts +800 -0
- package/src/cli/transports/WorkerStateUploader.ts +131 -0
- package/src/cli/transports/ccrClient.ts +998 -0
- package/src/cli/transports/transportUtils.ts +45 -0
- package/src/cli/update.ts +422 -0
- package/src/commands/add-dir/add-dir.tsx +126 -0
- package/src/commands/add-dir/index.ts +11 -0
- package/src/commands/add-dir/validation.ts +110 -0
- package/src/commands/advisor.ts +109 -0
- package/src/commands/agents/agents.tsx +12 -0
- package/src/commands/agents/index.ts +10 -0
- package/src/commands/ant-trace/index.js +1 -0
- package/src/commands/autofix-pr/index.js +1 -0
- package/src/commands/backfill-sessions/index.js +1 -0
- package/src/commands/branch/branch.ts +296 -0
- package/src/commands/branch/index.ts +14 -0
- package/src/commands/break-cache/index.js +1 -0
- package/src/commands/bridge/bridge.tsx +509 -0
- package/src/commands/bridge/index.ts +26 -0
- package/src/commands/bridge-kick.ts +200 -0
- package/src/commands/brief.ts +130 -0
- package/src/commands/btw/btw.tsx +243 -0
- package/src/commands/btw/index.ts +13 -0
- package/src/commands/bughunter/index.js +1 -0
- package/src/commands/chrome/chrome.tsx +285 -0
- package/src/commands/chrome/index.ts +13 -0
- package/src/commands/clear/caches.ts +144 -0
- package/src/commands/clear/clear.ts +7 -0
- package/src/commands/clear/conversation.ts +251 -0
- package/src/commands/clear/index.ts +19 -0
- package/src/commands/color/color.ts +93 -0
- package/src/commands/color/index.ts +16 -0
- package/src/commands/commit-push-pr.ts +158 -0
- package/src/commands/commit.ts +92 -0
- package/src/commands/compact/compact.ts +287 -0
- package/src/commands/compact/index.ts +15 -0
- package/src/commands/config/config.tsx +7 -0
- package/src/commands/config/index.ts +11 -0
- package/src/commands/context/context-noninteractive.ts +325 -0
- package/src/commands/context/context.tsx +64 -0
- package/src/commands/context/index.ts +24 -0
- package/src/commands/copy/copy.tsx +371 -0
- package/src/commands/copy/index.ts +15 -0
- package/src/commands/cost/cost.ts +24 -0
- package/src/commands/cost/index.ts +23 -0
- package/src/commands/createMovedToPluginCommand.ts +65 -0
- package/src/commands/ctx_viz/index.js +1 -0
- package/src/commands/debug-tool-call/index.js +1 -0
- package/src/commands/desktop/desktop.tsx +9 -0
- package/src/commands/desktop/index.ts +26 -0
- package/src/commands/diff/diff.tsx +9 -0
- package/src/commands/diff/index.ts +8 -0
- package/src/commands/doctor/doctor.tsx +7 -0
- package/src/commands/doctor/index.ts +12 -0
- package/src/commands/effort/effort.tsx +183 -0
- package/src/commands/effort/index.ts +13 -0
- package/src/commands/env/index.js +1 -0
- package/src/commands/exit/exit.tsx +33 -0
- package/src/commands/exit/index.ts +12 -0
- package/src/commands/export/export.tsx +91 -0
- package/src/commands/export/index.ts +11 -0
- package/src/commands/extra-usage/extra-usage-core.ts +118 -0
- package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
- package/src/commands/extra-usage/extra-usage.tsx +17 -0
- package/src/commands/extra-usage/index.ts +31 -0
- package/src/commands/fast/fast.tsx +269 -0
- package/src/commands/fast/index.ts +26 -0
- package/src/commands/feedback/feedback.tsx +25 -0
- package/src/commands/feedback/index.ts +26 -0
- package/src/commands/files/files.ts +19 -0
- package/src/commands/files/index.ts +12 -0
- package/src/commands/good-claude/index.js +1 -0
- package/src/commands/heapdump/heapdump.ts +17 -0
- package/src/commands/heapdump/index.ts +12 -0
- package/src/commands/help/help.tsx +11 -0
- package/src/commands/help/index.ts +10 -0
- package/src/commands/hooks/hooks.tsx +13 -0
- package/src/commands/hooks/index.ts +11 -0
- package/src/commands/ide/ide.tsx +646 -0
- package/src/commands/ide/index.ts +11 -0
- package/src/commands/init-verifiers.ts +262 -0
- package/src/commands/init.ts +256 -0
- package/src/commands/insights.ts +3200 -0
- package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
- package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
- package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
- package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
- package/src/commands/install-github-app/CreatingStep.tsx +65 -0
- package/src/commands/install-github-app/ErrorStep.tsx +85 -0
- package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
- package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
- package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
- package/src/commands/install-github-app/SuccessStep.tsx +96 -0
- package/src/commands/install-github-app/WarningsStep.tsx +73 -0
- package/src/commands/install-github-app/index.ts +13 -0
- package/src/commands/install-github-app/install-github-app.tsx +587 -0
- package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
- package/src/commands/install-slack-app/index.ts +12 -0
- package/src/commands/install-slack-app/install-slack-app.ts +30 -0
- package/src/commands/install.tsx +300 -0
- package/src/commands/issue/index.js +1 -0
- package/src/commands/keybindings/index.ts +13 -0
- package/src/commands/keybindings/keybindings.ts +53 -0
- package/src/commands/login/index.ts +14 -0
- package/src/commands/login/login.tsx +104 -0
- package/src/commands/logout/index.ts +10 -0
- package/src/commands/logout/logout.tsx +82 -0
- package/src/commands/mcp/addCommand.ts +280 -0
- package/src/commands/mcp/index.ts +12 -0
- package/src/commands/mcp/mcp.tsx +85 -0
- package/src/commands/mcp/xaaIdpCommand.ts +266 -0
- package/src/commands/memory/index.ts +10 -0
- package/src/commands/memory/memory.tsx +90 -0
- package/src/commands/mobile/index.ts +11 -0
- package/src/commands/mobile/mobile.tsx +274 -0
- package/src/commands/mock-limits/index.js +1 -0
- package/src/commands/model/index.ts +16 -0
- package/src/commands/model/model.tsx +297 -0
- package/src/commands/oauth-refresh/index.js +1 -0
- package/src/commands/onboarding/index.js +1 -0
- package/src/commands/output-style/index.ts +11 -0
- package/src/commands/output-style/output-style.tsx +7 -0
- package/src/commands/passes/index.ts +22 -0
- package/src/commands/passes/passes.tsx +24 -0
- package/src/commands/perf-issue/index.js +1 -0
- package/src/commands/permissions/index.ts +11 -0
- package/src/commands/permissions/permissions.tsx +10 -0
- package/src/commands/plan/index.ts +11 -0
- package/src/commands/plan/plan.tsx +122 -0
- package/src/commands/plugin/AddMarketplace.tsx +162 -0
- package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
- package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
- package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
- package/src/commands/plugin/ManagePlugins.tsx +2215 -0
- package/src/commands/plugin/PluginErrors.tsx +124 -0
- package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
- package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
- package/src/commands/plugin/PluginSettings.tsx +1072 -0
- package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
- package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
- package/src/commands/plugin/ValidatePlugin.tsx +98 -0
- package/src/commands/plugin/index.tsx +11 -0
- package/src/commands/plugin/parseArgs.ts +103 -0
- package/src/commands/plugin/plugin.tsx +7 -0
- package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
- package/src/commands/plugin/usePagination.ts +171 -0
- package/src/commands/pr_comments/index.ts +50 -0
- package/src/commands/privacy-settings/index.ts +14 -0
- package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
- package/src/commands/rate-limit-options/index.ts +19 -0
- package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
- package/src/commands/release-notes/index.ts +11 -0
- package/src/commands/release-notes/release-notes.ts +50 -0
- package/src/commands/reload-plugins/index.ts +18 -0
- package/src/commands/reload-plugins/reload-plugins.ts +61 -0
- package/src/commands/remote-env/index.ts +15 -0
- package/src/commands/remote-env/remote-env.tsx +7 -0
- package/src/commands/remote-setup/api.ts +182 -0
- package/src/commands/remote-setup/index.ts +20 -0
- package/src/commands/remote-setup/remote-setup.tsx +187 -0
- package/src/commands/rename/generateSessionName.ts +67 -0
- package/src/commands/rename/index.ts +12 -0
- package/src/commands/rename/rename.ts +87 -0
- package/src/commands/reset-limits/index.js +4 -0
- package/src/commands/resume/index.ts +12 -0
- package/src/commands/resume/resume.tsx +275 -0
- package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
- package/src/commands/review/reviewRemote.ts +316 -0
- package/src/commands/review/ultrareviewCommand.tsx +58 -0
- package/src/commands/review/ultrareviewEnabled.ts +14 -0
- package/src/commands/review.ts +57 -0
- package/src/commands/rewind/index.ts +13 -0
- package/src/commands/rewind/rewind.ts +13 -0
- package/src/commands/sandbox-toggle/index.ts +50 -0
- package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
- package/src/commands/security-review.ts +243 -0
- package/src/commands/session/index.ts +16 -0
- package/src/commands/session/session.tsx +140 -0
- package/src/commands/share/index.js +1 -0
- package/src/commands/skills/index.ts +10 -0
- package/src/commands/skills/skills.tsx +8 -0
- package/src/commands/stats/index.ts +10 -0
- package/src/commands/stats/stats.tsx +7 -0
- package/src/commands/status/index.ts +12 -0
- package/src/commands/status/status.tsx +8 -0
- package/src/commands/statusline.tsx +24 -0
- package/src/commands/stickers/index.ts +11 -0
- package/src/commands/stickers/stickers.ts +16 -0
- package/src/commands/summary/index.js +1 -0
- package/src/commands/tag/index.ts +12 -0
- package/src/commands/tag/tag.tsx +215 -0
- package/src/commands/tasks/index.ts +11 -0
- package/src/commands/tasks/tasks.tsx +8 -0
- package/src/commands/teleport/index.js +1 -0
- package/src/commands/terminalSetup/index.ts +23 -0
- package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
- package/src/commands/theme/index.ts +10 -0
- package/src/commands/theme/theme.tsx +57 -0
- package/src/commands/thinkback/index.ts +13 -0
- package/src/commands/thinkback/thinkback.tsx +554 -0
- package/src/commands/thinkback-play/index.ts +17 -0
- package/src/commands/thinkback-play/thinkback-play.ts +43 -0
- package/src/commands/ultraplan.tsx +471 -0
- package/src/commands/upgrade/index.ts +16 -0
- package/src/commands/upgrade/upgrade.tsx +38 -0
- package/src/commands/usage/index.ts +9 -0
- package/src/commands/usage/usage.tsx +7 -0
- package/src/commands/version.ts +22 -0
- package/src/commands/vim/index.ts +11 -0
- package/src/commands/vim/vim.ts +38 -0
- package/src/commands/voice/index.ts +20 -0
- package/src/commands/voice/voice.ts +150 -0
- package/src/commands.ts +754 -0
- package/src/components/AgentProgressLine.tsx +136 -0
- package/src/components/App.tsx +56 -0
- package/src/components/ApproveApiKey.tsx +123 -0
- package/src/components/AutoModeOptInDialog.tsx +142 -0
- package/src/components/AutoUpdater.tsx +198 -0
- package/src/components/AutoUpdaterWrapper.tsx +91 -0
- package/src/components/AwsAuthStatusBox.tsx +82 -0
- package/src/components/BaseTextInput.tsx +136 -0
- package/src/components/BashModeProgress.tsx +56 -0
- package/src/components/BridgeDialog.tsx +401 -0
- package/src/components/BypassPermissionsModeDialog.tsx +87 -0
- package/src/components/ChannelDowngradeDialog.tsx +102 -0
- package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
- package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
- package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
- package/src/components/ClickableImageRef.tsx +73 -0
- package/src/components/CompactSummary.tsx +118 -0
- package/src/components/ConfigurableShortcutHint.tsx +57 -0
- package/src/components/ConsoleOAuthFlow.tsx +631 -0
- package/src/components/ContextSuggestions.tsx +47 -0
- package/src/components/ContextVisualization.tsx +489 -0
- package/src/components/CoordinatorAgentStatus.tsx +273 -0
- package/src/components/CostThresholdDialog.tsx +50 -0
- package/src/components/CtrlOToExpand.tsx +51 -0
- package/src/components/CustomSelect/SelectMulti.tsx +213 -0
- package/src/components/CustomSelect/index.ts +3 -0
- package/src/components/CustomSelect/option-map.ts +50 -0
- package/src/components/CustomSelect/select-input-option.tsx +488 -0
- package/src/components/CustomSelect/select-option.tsx +68 -0
- package/src/components/CustomSelect/select.tsx +690 -0
- package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
- package/src/components/CustomSelect/use-select-input.ts +287 -0
- package/src/components/CustomSelect/use-select-navigation.ts +653 -0
- package/src/components/CustomSelect/use-select-state.ts +157 -0
- package/src/components/DesktopHandoff.tsx +193 -0
- package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
- package/src/components/DevBar.tsx +49 -0
- package/src/components/DevChannelsDialog.tsx +105 -0
- package/src/components/DiagnosticsDisplay.tsx +95 -0
- package/src/components/EffortCallout.tsx +265 -0
- package/src/components/EffortIndicator.ts +42 -0
- package/src/components/ExitFlow.tsx +48 -0
- package/src/components/ExportDialog.tsx +128 -0
- package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
- package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
- package/src/components/FastIcon.tsx +46 -0
- package/src/components/Feedback.tsx +592 -0
- package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
- package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
- package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
- package/src/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
- package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
- package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
- package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
- package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
- package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
- package/src/components/FileEditToolDiff.tsx +181 -0
- package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
- package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
- package/src/components/FilePathLink.tsx +43 -0
- package/src/components/FullscreenLayout.tsx +637 -0
- package/src/components/GlobalSearchDialog.tsx +343 -0
- package/src/components/HelpV2/Commands.tsx +82 -0
- package/src/components/HelpV2/General.tsx +23 -0
- package/src/components/HelpV2/HelpV2.tsx +184 -0
- package/src/components/HighlightedCode/Fallback.tsx +193 -0
- package/src/components/HighlightedCode.tsx +190 -0
- package/src/components/HistorySearchDialog.tsx +118 -0
- package/src/components/IdeAutoConnectDialog.tsx +154 -0
- package/src/components/IdeOnboardingDialog.tsx +167 -0
- package/src/components/IdeStatusIndicator.tsx +58 -0
- package/src/components/IdleReturnDialog.tsx +118 -0
- package/src/components/InterruptedByUser.tsx +15 -0
- package/src/components/InvalidConfigDialog.tsx +156 -0
- package/src/components/InvalidSettingsDialog.tsx +89 -0
- package/src/components/KeybindingWarnings.tsx +55 -0
- package/src/components/LanguagePicker.tsx +86 -0
- package/src/components/LogSelector.tsx +1575 -0
- package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
- package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
- package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
- package/src/components/LogoV2/Clawd.tsx +240 -0
- package/src/components/LogoV2/CondensedLogo.tsx +161 -0
- package/src/components/LogoV2/EmergencyTip.tsx +58 -0
- package/src/components/LogoV2/Feed.tsx +112 -0
- package/src/components/LogoV2/FeedColumn.tsx +59 -0
- package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
- package/src/components/LogoV2/LogoV2.tsx +543 -0
- package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
- package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
- package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
- package/src/components/LogoV2/WelcomeV2.tsx +433 -0
- package/src/components/LogoV2/feedConfigs.tsx +92 -0
- package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
- package/src/components/MCPServerApprovalDialog.tsx +115 -0
- package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
- package/src/components/MCPServerDialogCopy.tsx +15 -0
- package/src/components/MCPServerMultiselectDialog.tsx +133 -0
- package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
- package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
- package/src/components/Markdown.tsx +236 -0
- package/src/components/MarkdownTable.tsx +322 -0
- package/src/components/MemoryUsageIndicator.tsx +37 -0
- package/src/components/Message.tsx +627 -0
- package/src/components/MessageModel.tsx +43 -0
- package/src/components/MessageResponse.tsx +78 -0
- package/src/components/MessageRow.tsx +383 -0
- package/src/components/MessageSelector.tsx +831 -0
- package/src/components/MessageTimestamp.tsx +63 -0
- package/src/components/Messages.tsx +834 -0
- package/src/components/ModelPicker.tsx +448 -0
- package/src/components/NativeAutoUpdater.tsx +193 -0
- package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
- package/src/components/OffscreenFreeze.tsx +44 -0
- package/src/components/Onboarding.tsx +244 -0
- package/src/components/OutputStylePicker.tsx +112 -0
- package/src/components/PackageManagerAutoUpdater.tsx +104 -0
- package/src/components/Passes/Passes.tsx +184 -0
- package/src/components/PrBadge.tsx +97 -0
- package/src/components/PressEnterToContinue.tsx +15 -0
- package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
- package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
- package/src/components/PromptInput/Notifications.tsx +332 -0
- package/src/components/PromptInput/PromptInput.tsx +2339 -0
- package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
- package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
- package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
- package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
- package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
- package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
- package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
- package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
- package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
- package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
- package/src/components/PromptInput/inputModes.ts +33 -0
- package/src/components/PromptInput/inputPaste.ts +90 -0
- package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
- package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
- package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
- package/src/components/PromptInput/useSwarmBanner.ts +155 -0
- package/src/components/PromptInput/utils.ts +60 -0
- package/src/components/QuickOpenDialog.tsx +244 -0
- package/src/components/RemoteCallout.tsx +76 -0
- package/src/components/RemoteEnvironmentDialog.tsx +340 -0
- package/src/components/ResumeTask.tsx +268 -0
- package/src/components/SandboxViolationExpandedView.tsx +99 -0
- package/src/components/ScrollKeybindingHandler.tsx +1012 -0
- package/src/components/SearchBox.tsx +72 -0
- package/src/components/SentryErrorBoundary.ts +28 -0
- package/src/components/SessionBackgroundHint.tsx +108 -0
- package/src/components/SessionPreview.tsx +194 -0
- package/src/components/Settings/Config.tsx +1822 -0
- package/src/components/Settings/Settings.tsx +137 -0
- package/src/components/Settings/Status.tsx +241 -0
- package/src/components/Settings/Usage.tsx +377 -0
- package/src/components/ShowInIDEPrompt.tsx +170 -0
- package/src/components/SkillImprovementSurvey.tsx +152 -0
- package/src/components/Spinner/FlashingChar.tsx +61 -0
- package/src/components/Spinner/GlimmerMessage.tsx +328 -0
- package/src/components/Spinner/ShimmerChar.tsx +36 -0
- package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
- package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
- package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
- package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
- package/src/components/Spinner/index.ts +10 -0
- package/src/components/Spinner/teammateSelectHint.ts +1 -0
- package/src/components/Spinner/useShimmerAnimation.ts +31 -0
- package/src/components/Spinner/useStalledAnimation.ts +75 -0
- package/src/components/Spinner/utils.ts +84 -0
- package/src/components/Spinner.tsx +562 -0
- package/src/components/Stats.tsx +1228 -0
- package/src/components/StatusLine.tsx +324 -0
- package/src/components/StatusNotices.tsx +55 -0
- package/src/components/StructuredDiff/Fallback.tsx +487 -0
- package/src/components/StructuredDiff/colorDiff.ts +37 -0
- package/src/components/StructuredDiff.tsx +190 -0
- package/src/components/StructuredDiffList.tsx +30 -0
- package/src/components/TagTabs.tsx +139 -0
- package/src/components/TaskListV2.tsx +378 -0
- package/src/components/TeammateViewHeader.tsx +82 -0
- package/src/components/TeleportError.tsx +189 -0
- package/src/components/TeleportProgress.tsx +140 -0
- package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
- package/src/components/TeleportResumeWrapper.tsx +167 -0
- package/src/components/TeleportStash.tsx +116 -0
- package/src/components/TextInput.tsx +124 -0
- package/src/components/ThemePicker.tsx +333 -0
- package/src/components/ThinkingToggle.tsx +153 -0
- package/src/components/TokenWarning.tsx +179 -0
- package/src/components/ToolUseLoader.tsx +42 -0
- package/src/components/TrustDialog/TrustDialog.tsx +290 -0
- package/src/components/TrustDialog/utils.ts +245 -0
- package/src/components/ValidationErrorsList.tsx +148 -0
- package/src/components/VimTextInput.tsx +140 -0
- package/src/components/VirtualMessageList.tsx +1082 -0
- package/src/components/WorkflowMultiselectDialog.tsx +128 -0
- package/src/components/WorktreeExitDialog.tsx +231 -0
- package/src/components/agents/AgentDetail.tsx +220 -0
- package/src/components/agents/AgentEditor.tsx +178 -0
- package/src/components/agents/AgentNavigationFooter.tsx +26 -0
- package/src/components/agents/AgentsList.tsx +440 -0
- package/src/components/agents/AgentsMenu.tsx +800 -0
- package/src/components/agents/ColorPicker.tsx +112 -0
- package/src/components/agents/ModelSelector.tsx +68 -0
- package/src/components/agents/ToolSelector.tsx +562 -0
- package/src/components/agents/agentFileUtils.ts +272 -0
- package/src/components/agents/generateAgent.ts +197 -0
- package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
- package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
- package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
- package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
- package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
- package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
- package/src/components/agents/types.ts +27 -0
- package/src/components/agents/utils.ts +18 -0
- package/src/components/agents/validateAgent.ts +109 -0
- package/src/components/design-system/Byline.tsx +77 -0
- package/src/components/design-system/Dialog.tsx +138 -0
- package/src/components/design-system/Divider.tsx +149 -0
- package/src/components/design-system/FuzzyPicker.tsx +312 -0
- package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
- package/src/components/design-system/ListItem.tsx +244 -0
- package/src/components/design-system/LoadingState.tsx +94 -0
- package/src/components/design-system/Pane.tsx +77 -0
- package/src/components/design-system/ProgressBar.tsx +86 -0
- package/src/components/design-system/Ratchet.tsx +80 -0
- package/src/components/design-system/StatusIcon.tsx +95 -0
- package/src/components/design-system/Tabs.tsx +340 -0
- package/src/components/design-system/ThemeProvider.tsx +174 -0
- package/src/components/design-system/ThemedBox.tsx +156 -0
- package/src/components/design-system/ThemedText.tsx +124 -0
- package/src/components/design-system/color.ts +30 -0
- package/src/components/diff/DiffDetailView.tsx +281 -0
- package/src/components/diff/DiffDialog.tsx +383 -0
- package/src/components/diff/DiffFileList.tsx +292 -0
- package/src/components/grove/Grove.tsx +463 -0
- package/src/components/hooks/HooksConfigMenu.tsx +578 -0
- package/src/components/hooks/PromptDialog.tsx +90 -0
- package/src/components/hooks/SelectEventMode.tsx +127 -0
- package/src/components/hooks/SelectHookMode.tsx +112 -0
- package/src/components/hooks/SelectMatcherMode.tsx +144 -0
- package/src/components/hooks/ViewHookMode.tsx +199 -0
- package/src/components/mcp/CapabilitiesSection.tsx +61 -0
- package/src/components/mcp/ElicitationDialog.tsx +1169 -0
- package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
- package/src/components/mcp/MCPListPanel.tsx +504 -0
- package/src/components/mcp/MCPReconnect.tsx +167 -0
- package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
- package/src/components/mcp/MCPSettings.tsx +398 -0
- package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
- package/src/components/mcp/MCPToolDetailView.tsx +212 -0
- package/src/components/mcp/MCPToolListView.tsx +141 -0
- package/src/components/mcp/McpParsingWarnings.tsx +213 -0
- package/src/components/mcp/index.ts +9 -0
- package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
- package/src/components/memory/MemoryFileSelector.tsx +438 -0
- package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
- package/src/components/messageActions.tsx +450 -0
- package/src/components/messages/AdvisorMessage.tsx +158 -0
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
- package/src/components/messages/AssistantTextMessage.tsx +270 -0
- package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
- package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
- package/src/components/messages/AttachmentMessage.tsx +536 -0
- package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
- package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
- package/src/components/messages/GroupedToolUseContent.tsx +58 -0
- package/src/components/messages/HighlightedThinkingText.tsx +162 -0
- package/src/components/messages/HookProgressMessage.tsx +116 -0
- package/src/components/messages/PlanApprovalMessage.tsx +222 -0
- package/src/components/messages/RateLimitMessage.tsx +161 -0
- package/src/components/messages/ShutdownMessage.tsx +132 -0
- package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
- package/src/components/messages/SystemTextMessage.tsx +827 -0
- package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
- package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
- package/src/components/messages/UserBashInputMessage.tsx +58 -0
- package/src/components/messages/UserBashOutputMessage.tsx +54 -0
- package/src/components/messages/UserChannelMessage.tsx +137 -0
- package/src/components/messages/UserCommandMessage.tsx +108 -0
- package/src/components/messages/UserImageMessage.tsx +59 -0
- package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
- package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
- package/src/components/messages/UserPlanMessage.tsx +42 -0
- package/src/components/messages/UserPromptMessage.tsx +80 -0
- package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
- package/src/components/messages/UserTeammateMessage.tsx +206 -0
- package/src/components/messages/UserTextMessage.tsx +275 -0
- package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
- package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
- package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
- package/src/components/messages/nullRenderingAttachments.ts +70 -0
- package/src/components/messages/teamMemCollapsed.tsx +140 -0
- package/src/components/messages/teamMemSaved.ts +19 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
- package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
- package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
- package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
- package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
- package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
- package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
- package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
- package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
- package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
- package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
- package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
- package/src/components/permissions/PermissionDialog.tsx +72 -0
- package/src/components/permissions/PermissionExplanation.tsx +272 -0
- package/src/components/permissions/PermissionPrompt.tsx +336 -0
- package/src/components/permissions/PermissionRequest.tsx +217 -0
- package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
- package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
- package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
- package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
- package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
- package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
- package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
- package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
- package/src/components/permissions/WorkerBadge.tsx +49 -0
- package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
- package/src/components/permissions/hooks.ts +209 -0
- package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
- package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
- package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
- package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
- package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
- package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
- package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
- package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
- package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
- package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
- package/src/components/permissions/utils.ts +25 -0
- package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
- package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
- package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
- package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
- package/src/components/sandbox/SandboxSettings.tsx +296 -0
- package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
- package/src/components/shell/OutputLine.tsx +118 -0
- package/src/components/shell/ShellProgressMessage.tsx +150 -0
- package/src/components/shell/ShellTimeDisplay.tsx +74 -0
- package/src/components/skills/SkillsMenu.tsx +237 -0
- package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
- package/src/components/tasks/BackgroundTask.tsx +345 -0
- package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
- package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
- package/src/components/tasks/DreamDetailDialog.tsx +251 -0
- package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
- package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
- package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
- package/src/components/tasks/ShellDetailDialog.tsx +404 -0
- package/src/components/tasks/ShellProgress.tsx +87 -0
- package/src/components/tasks/renderToolActivity.tsx +33 -0
- package/src/components/tasks/taskStatusUtils.tsx +107 -0
- package/src/components/teams/TeamStatus.tsx +80 -0
- package/src/components/teams/TeamsDialog.tsx +715 -0
- package/src/components/ui/OrderedList.tsx +71 -0
- package/src/components/ui/OrderedListItem.tsx +45 -0
- package/src/components/ui/TreeSelect.tsx +397 -0
- package/src/components/wizard/WizardDialogLayout.tsx +65 -0
- package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
- package/src/components/wizard/WizardProvider.tsx +213 -0
- package/src/components/wizard/index.ts +9 -0
- package/src/components/wizard/useWizard.ts +13 -0
- package/src/constants/apiLimits.ts +94 -0
- package/src/constants/betas.ts +52 -0
- package/src/constants/common.ts +33 -0
- package/src/constants/cyberRiskInstruction.ts +24 -0
- package/src/constants/errorIds.ts +15 -0
- package/src/constants/figures.ts +45 -0
- package/src/constants/files.ts +156 -0
- package/src/constants/github-app.ts +144 -0
- package/src/constants/keys.ts +11 -0
- package/src/constants/messages.ts +1 -0
- package/src/constants/oauth.ts +234 -0
- package/src/constants/outputStyles.ts +216 -0
- package/src/constants/product.ts +76 -0
- package/src/constants/prompts.ts +914 -0
- package/src/constants/spinnerVerbs.ts +204 -0
- package/src/constants/system.ts +95 -0
- package/src/constants/systemPromptSections.ts +68 -0
- package/src/constants/toolLimits.ts +56 -0
- package/src/constants/tools.ts +112 -0
- package/src/constants/turnCompletionVerbs.ts +12 -0
- package/src/constants/xml.ts +86 -0
- package/src/context/QueuedMessageContext.tsx +63 -0
- package/src/context/fpsMetrics.tsx +30 -0
- package/src/context/mailbox.tsx +38 -0
- package/src/context/modalContext.tsx +58 -0
- package/src/context/notifications.tsx +240 -0
- package/src/context/overlayContext.tsx +151 -0
- package/src/context/promptOverlayContext.tsx +125 -0
- package/src/context/stats.tsx +220 -0
- package/src/context/voice.tsx +88 -0
- package/src/context.ts +189 -0
- package/src/coordinator/coordinatorMode.ts +369 -0
- package/src/cost-tracker.ts +323 -0
- package/src/costHook.ts +22 -0
- package/src/dialogLaunchers.tsx +133 -0
- package/src/entrypoints/agentSdkTypes.ts +443 -0
- package/src/entrypoints/cli.tsx +303 -0
- package/src/entrypoints/init.ts +340 -0
- package/src/entrypoints/mcp.ts +196 -0
- package/src/entrypoints/sandboxTypes.ts +156 -0
- package/src/entrypoints/sdk/controlSchemas.ts +663 -0
- package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
- package/src/entrypoints/sdk/coreTypes.ts +62 -0
- package/src/history.ts +464 -0
- package/src/hooks/fileSuggestions.ts +811 -0
- package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
- package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
- package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
- package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
- package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
- package/src/hooks/notifs/useInstallMessages.tsx +26 -0
- package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
- package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
- package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
- package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
- package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
- package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
- package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
- package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
- package/src/hooks/notifs/useStartupNotification.ts +41 -0
- package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
- package/src/hooks/renderPlaceholder.ts +51 -0
- package/src/hooks/toolPermission/PermissionContext.ts +388 -0
- package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
- package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
- package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
- package/src/hooks/toolPermission/permissionLogging.ts +238 -0
- package/src/hooks/unifiedSuggestions.ts +202 -0
- package/src/hooks/useAfterFirstRender.ts +17 -0
- package/src/hooks/useApiKeyVerification.ts +84 -0
- package/src/hooks/useArrowKeyHistory.tsx +229 -0
- package/src/hooks/useAssistantHistory.ts +250 -0
- package/src/hooks/useAwaySummary.ts +125 -0
- package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
- package/src/hooks/useBlink.ts +34 -0
- package/src/hooks/useCanUseTool.tsx +204 -0
- package/src/hooks/useCancelRequest.ts +276 -0
- package/src/hooks/useChromeExtensionNotification.tsx +50 -0
- package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
- package/src/hooks/useClipboardImageHint.ts +77 -0
- package/src/hooks/useCommandKeybindings.tsx +108 -0
- package/src/hooks/useCommandQueue.ts +15 -0
- package/src/hooks/useCopyOnSelect.ts +98 -0
- package/src/hooks/useDeferredHookMessages.ts +46 -0
- package/src/hooks/useDiffData.ts +110 -0
- package/src/hooks/useDiffInIDE.ts +379 -0
- package/src/hooks/useDirectConnect.ts +229 -0
- package/src/hooks/useDoublePress.ts +62 -0
- package/src/hooks/useDynamicConfig.ts +22 -0
- package/src/hooks/useElapsedTime.ts +37 -0
- package/src/hooks/useExitOnCtrlCD.ts +95 -0
- package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
- package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
- package/src/hooks/useGlobalKeybindings.tsx +249 -0
- package/src/hooks/useHistorySearch.ts +303 -0
- package/src/hooks/useIDEIntegration.tsx +70 -0
- package/src/hooks/useIdeAtMentioned.ts +76 -0
- package/src/hooks/useIdeConnectionStatus.ts +33 -0
- package/src/hooks/useIdeLogging.ts +41 -0
- package/src/hooks/useIdeSelection.ts +150 -0
- package/src/hooks/useInboxPoller.ts +969 -0
- package/src/hooks/useInputBuffer.ts +132 -0
- package/src/hooks/useIssueFlagBanner.ts +133 -0
- package/src/hooks/useLogMessages.ts +119 -0
- package/src/hooks/useLspPluginRecommendation.tsx +194 -0
- package/src/hooks/useMailboxBridge.ts +21 -0
- package/src/hooks/useMainLoopModel.ts +34 -0
- package/src/hooks/useManagePlugins.ts +304 -0
- package/src/hooks/useMemoryUsage.ts +39 -0
- package/src/hooks/useMergedClients.ts +23 -0
- package/src/hooks/useMergedCommands.ts +15 -0
- package/src/hooks/useMergedTools.ts +44 -0
- package/src/hooks/useMinDisplayTime.ts +35 -0
- package/src/hooks/useNotifyAfterTimeout.ts +65 -0
- package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
- package/src/hooks/usePasteHandler.ts +285 -0
- package/src/hooks/usePluginRecommendationBase.tsx +105 -0
- package/src/hooks/usePrStatus.ts +106 -0
- package/src/hooks/usePromptSuggestion.ts +177 -0
- package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
- package/src/hooks/useQueueProcessor.ts +68 -0
- package/src/hooks/useRemoteSession.ts +605 -0
- package/src/hooks/useReplBridge.tsx +723 -0
- package/src/hooks/useSSHSession.ts +241 -0
- package/src/hooks/useScheduledTasks.ts +139 -0
- package/src/hooks/useSearchInput.ts +364 -0
- package/src/hooks/useSessionBackgrounding.ts +158 -0
- package/src/hooks/useSettings.ts +17 -0
- package/src/hooks/useSettingsChange.ts +25 -0
- package/src/hooks/useSkillImprovementSurvey.ts +105 -0
- package/src/hooks/useSkillsChange.ts +62 -0
- package/src/hooks/useSwarmInitialization.ts +81 -0
- package/src/hooks/useSwarmPermissionPoller.ts +330 -0
- package/src/hooks/useTaskListWatcher.ts +221 -0
- package/src/hooks/useTasksV2.ts +250 -0
- package/src/hooks/useTeammateViewAutoExit.ts +63 -0
- package/src/hooks/useTeleportResume.tsx +85 -0
- package/src/hooks/useTerminalSize.ts +15 -0
- package/src/hooks/useTextInput.ts +529 -0
- package/src/hooks/useTimeout.ts +14 -0
- package/src/hooks/useTurnDiffs.ts +213 -0
- package/src/hooks/useTypeahead.tsx +1385 -0
- package/src/hooks/useUpdateNotification.ts +34 -0
- package/src/hooks/useVimInput.ts +316 -0
- package/src/hooks/useVirtualScroll.ts +721 -0
- package/src/hooks/useVoice.ts +1144 -0
- package/src/hooks/useVoiceEnabled.ts +25 -0
- package/src/hooks/useVoiceIntegration.tsx +677 -0
- package/src/ink/Ansi.tsx +292 -0
- package/src/ink/bidi.ts +139 -0
- package/src/ink/clearTerminal.ts +74 -0
- package/src/ink/colorize.ts +231 -0
- package/src/ink/components/AlternateScreen.tsx +80 -0
- package/src/ink/components/App.tsx +659 -0
- package/src/ink/components/AppContext.ts +21 -0
- package/src/ink/components/Box.tsx +214 -0
- package/src/ink/components/Button.tsx +192 -0
- package/src/ink/components/ClockContext.tsx +112 -0
- package/src/ink/components/CursorDeclarationContext.ts +32 -0
- package/src/ink/components/ErrorOverview.tsx +109 -0
- package/src/ink/components/Link.tsx +42 -0
- package/src/ink/components/Newline.tsx +39 -0
- package/src/ink/components/NoSelect.tsx +68 -0
- package/src/ink/components/RawAnsi.tsx +57 -0
- package/src/ink/components/ScrollBox.tsx +237 -0
- package/src/ink/components/Spacer.tsx +20 -0
- package/src/ink/components/StdinContext.ts +49 -0
- package/src/ink/components/TerminalFocusContext.tsx +52 -0
- package/src/ink/components/TerminalSizeContext.tsx +7 -0
- package/src/ink/components/Text.tsx +254 -0
- package/src/ink/constants.ts +2 -0
- package/src/ink/dom.ts +484 -0
- package/src/ink/events/click-event.ts +38 -0
- package/src/ink/events/dispatcher.ts +233 -0
- package/src/ink/events/emitter.ts +39 -0
- package/src/ink/events/event-handlers.ts +73 -0
- package/src/ink/events/event.ts +11 -0
- package/src/ink/events/focus-event.ts +21 -0
- package/src/ink/events/input-event.ts +205 -0
- package/src/ink/events/keyboard-event.ts +51 -0
- package/src/ink/events/terminal-event.ts +107 -0
- package/src/ink/events/terminal-focus-event.ts +19 -0
- package/src/ink/focus.ts +181 -0
- package/src/ink/frame.ts +124 -0
- package/src/ink/get-max-width.ts +27 -0
- package/src/ink/hit-test.ts +130 -0
- package/src/ink/hooks/use-animation-frame.ts +57 -0
- package/src/ink/hooks/use-app.ts +8 -0
- package/src/ink/hooks/use-declared-cursor.ts +73 -0
- package/src/ink/hooks/use-input.ts +92 -0
- package/src/ink/hooks/use-interval.ts +67 -0
- package/src/ink/hooks/use-search-highlight.ts +53 -0
- package/src/ink/hooks/use-selection.ts +104 -0
- package/src/ink/hooks/use-stdin.ts +8 -0
- package/src/ink/hooks/use-tab-status.ts +72 -0
- package/src/ink/hooks/use-terminal-focus.ts +16 -0
- package/src/ink/hooks/use-terminal-title.ts +31 -0
- package/src/ink/hooks/use-terminal-viewport.ts +96 -0
- package/src/ink/ink.tsx +1728 -0
- package/src/ink/instances.ts +10 -0
- package/src/ink/layout/engine.ts +6 -0
- package/src/ink/layout/geometry.ts +97 -0
- package/src/ink/layout/node.ts +152 -0
- package/src/ink/layout/yoga.ts +308 -0
- package/src/ink/line-width-cache.ts +24 -0
- package/src/ink/log-update.ts +773 -0
- package/src/ink/measure-element.ts +23 -0
- package/src/ink/measure-text.ts +47 -0
- package/src/ink/node-cache.ts +54 -0
- package/src/ink/optimizer.ts +93 -0
- package/src/ink/output.ts +797 -0
- package/src/ink/parse-keypress.ts +801 -0
- package/src/ink/reconciler.ts +512 -0
- package/src/ink/render-border.ts +231 -0
- package/src/ink/render-node-to-output.ts +1462 -0
- package/src/ink/render-to-screen.ts +231 -0
- package/src/ink/renderer.ts +178 -0
- package/src/ink/root.ts +184 -0
- package/src/ink/screen.ts +1486 -0
- package/src/ink/searchHighlight.ts +93 -0
- package/src/ink/selection.ts +917 -0
- package/src/ink/squash-text-nodes.ts +92 -0
- package/src/ink/stringWidth.ts +222 -0
- package/src/ink/styles.ts +771 -0
- package/src/ink/supports-hyperlinks.ts +57 -0
- package/src/ink/tabstops.ts +46 -0
- package/src/ink/terminal-focus-state.ts +47 -0
- package/src/ink/terminal-querier.ts +212 -0
- package/src/ink/terminal.ts +248 -0
- package/src/ink/termio/ansi.ts +75 -0
- package/src/ink/termio/csi.ts +319 -0
- package/src/ink/termio/dec.ts +60 -0
- package/src/ink/termio/esc.ts +67 -0
- package/src/ink/termio/osc.ts +493 -0
- package/src/ink/termio/parser.ts +394 -0
- package/src/ink/termio/sgr.ts +308 -0
- package/src/ink/termio/tokenize.ts +319 -0
- package/src/ink/termio/types.ts +236 -0
- package/src/ink/termio.ts +42 -0
- package/src/ink/useTerminalNotification.ts +126 -0
- package/src/ink/warn.ts +9 -0
- package/src/ink/widest-line.ts +19 -0
- package/src/ink/wrap-text.ts +74 -0
- package/src/ink/wrapAnsi.ts +20 -0
- package/src/ink.ts +85 -0
- package/src/interactiveHelpers.tsx +367 -0
- package/src/keybindings/KeybindingContext.tsx +243 -0
- package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
- package/src/keybindings/defaultBindings.ts +340 -0
- package/src/keybindings/loadUserBindings.ts +472 -0
- package/src/keybindings/match.ts +120 -0
- package/src/keybindings/parser.ts +203 -0
- package/src/keybindings/reservedShortcuts.ts +127 -0
- package/src/keybindings/resolver.ts +244 -0
- package/src/keybindings/schema.ts +236 -0
- package/src/keybindings/shortcutFormat.ts +63 -0
- package/src/keybindings/template.ts +52 -0
- package/src/keybindings/useKeybinding.ts +196 -0
- package/src/keybindings/useShortcutDisplay.ts +59 -0
- package/src/keybindings/validate.ts +498 -0
- package/src/main.tsx +4684 -0
- package/src/memdir/findRelevantMemories.ts +141 -0
- package/src/memdir/memdir.ts +507 -0
- package/src/memdir/memoryAge.ts +53 -0
- package/src/memdir/memoryScan.ts +94 -0
- package/src/memdir/memoryTypes.ts +271 -0
- package/src/memdir/paths.ts +278 -0
- package/src/memdir/teamMemPaths.ts +292 -0
- package/src/memdir/teamMemPrompts.ts +100 -0
- package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
- package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
- package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
- package/src/migrations/migrateFennecToOpus.ts +45 -0
- package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
- package/src/migrations/migrateOpusToOpus1m.ts +43 -0
- package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
- package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
- package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
- package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
- package/src/migrations/resetProToOpusDefault.ts +51 -0
- package/src/moreright/useMoreRight.tsx +26 -0
- package/src/native-ts/color-diff/index.ts +999 -0
- package/src/native-ts/file-index/index.ts +370 -0
- package/src/native-ts/yoga-layout/enums.ts +134 -0
- package/src/native-ts/yoga-layout/index.ts +2578 -0
- package/src/outputStyles/loadOutputStylesDir.ts +98 -0
- package/src/plugins/builtinPlugins.ts +159 -0
- package/src/plugins/bundled/index.ts +23 -0
- package/src/projectOnboardingState.ts +83 -0
- package/src/query/config.ts +46 -0
- package/src/query/deps.ts +40 -0
- package/src/query/stopHooks.ts +473 -0
- package/src/query/tokenBudget.ts +93 -0
- package/src/query.ts +1729 -0
- package/src/remote/RemoteSessionManager.ts +343 -0
- package/src/remote/SessionsWebSocket.ts +404 -0
- package/src/remote/remotePermissionBridge.ts +78 -0
- package/src/remote/sdkMessageAdapter.ts +302 -0
- package/src/replLauncher.tsx +23 -0
- package/src/schemas/hooks.ts +222 -0
- package/src/screens/Doctor.tsx +575 -0
- package/src/screens/REPL.tsx +5006 -0
- package/src/screens/ResumeConversation.tsx +399 -0
- package/src/server/createDirectConnectSession.ts +88 -0
- package/src/server/directConnectManager.ts +213 -0
- package/src/server/types.ts +57 -0
- package/src/services/AgentSummary/agentSummary.ts +179 -0
- package/src/services/MagicDocs/magicDocs.ts +254 -0
- package/src/services/MagicDocs/prompts.ts +127 -0
- package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
- package/src/services/PromptSuggestion/speculation.ts +991 -0
- package/src/services/SessionMemory/prompts.ts +324 -0
- package/src/services/SessionMemory/sessionMemory.ts +495 -0
- package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
- package/src/services/analytics/config.ts +38 -0
- package/src/services/analytics/datadog.ts +307 -0
- package/src/services/analytics/firstPartyEventLogger.ts +449 -0
- package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
- package/src/services/analytics/growthbook.ts +1157 -0
- package/src/services/analytics/index.ts +173 -0
- package/src/services/analytics/metadata.ts +973 -0
- package/src/services/analytics/sink.ts +114 -0
- package/src/services/analytics/sinkKillswitch.ts +25 -0
- package/src/services/api/adminRequests.ts +119 -0
- package/src/services/api/bootstrap.ts +142 -0
- package/src/services/api/claude.ts +3433 -0
- package/src/services/api/client.ts +395 -0
- package/src/services/api/dumpPrompts.ts +226 -0
- package/src/services/api/emptyUsage.ts +22 -0
- package/src/services/api/errorUtils.ts +260 -0
- package/src/services/api/errors.ts +1207 -0
- package/src/services/api/filesApi.ts +748 -0
- package/src/services/api/firstTokenDate.ts +60 -0
- package/src/services/api/grove.ts +357 -0
- package/src/services/api/logging.ts +788 -0
- package/src/services/api/metricsOptOut.ts +159 -0
- package/src/services/api/overageCreditGrant.ts +137 -0
- package/src/services/api/promptCacheBreakDetection.ts +727 -0
- package/src/services/api/referral.ts +281 -0
- package/src/services/api/sessionIngress.ts +514 -0
- package/src/services/api/ultrareviewQuota.ts +38 -0
- package/src/services/api/usage.ts +63 -0
- package/src/services/api/withRetry.ts +826 -0
- package/src/services/autoDream/autoDream.ts +324 -0
- package/src/services/autoDream/config.ts +21 -0
- package/src/services/autoDream/consolidationLock.ts +140 -0
- package/src/services/autoDream/consolidationPrompt.ts +65 -0
- package/src/services/awaySummary.ts +74 -0
- package/src/services/claudeAiLimits.ts +515 -0
- package/src/services/claudeAiLimitsHook.ts +23 -0
- package/src/services/compact/apiMicrocompact.ts +153 -0
- package/src/services/compact/autoCompact.ts +351 -0
- package/src/services/compact/compact.ts +1705 -0
- package/src/services/compact/compactWarningHook.ts +16 -0
- package/src/services/compact/compactWarningState.ts +18 -0
- package/src/services/compact/grouping.ts +63 -0
- package/src/services/compact/microCompact.ts +530 -0
- package/src/services/compact/postCompactCleanup.ts +77 -0
- package/src/services/compact/prompt.ts +374 -0
- package/src/services/compact/sessionMemoryCompact.ts +630 -0
- package/src/services/compact/timeBasedMCConfig.ts +43 -0
- package/src/services/diagnosticTracking.ts +397 -0
- package/src/services/extractMemories/extractMemories.ts +615 -0
- package/src/services/extractMemories/prompts.ts +154 -0
- package/src/services/internalLogging.ts +90 -0
- package/src/services/lsp/LSPClient.ts +447 -0
- package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
- package/src/services/lsp/LSPServerInstance.ts +511 -0
- package/src/services/lsp/LSPServerManager.ts +420 -0
- package/src/services/lsp/config.ts +79 -0
- package/src/services/lsp/manager.ts +289 -0
- package/src/services/lsp/passiveFeedback.ts +328 -0
- package/src/services/mcp/InProcessTransport.ts +63 -0
- package/src/services/mcp/MCPConnectionManager.tsx +73 -0
- package/src/services/mcp/SdkControlTransport.ts +136 -0
- package/src/services/mcp/auth.ts +2465 -0
- package/src/services/mcp/channelAllowlist.ts +76 -0
- package/src/services/mcp/channelNotification.ts +316 -0
- package/src/services/mcp/channelPermissions.ts +240 -0
- package/src/services/mcp/claudeai.ts +164 -0
- package/src/services/mcp/client.ts +3348 -0
- package/src/services/mcp/config.ts +1578 -0
- package/src/services/mcp/elicitationHandler.ts +313 -0
- package/src/services/mcp/envExpansion.ts +38 -0
- package/src/services/mcp/headersHelper.ts +138 -0
- package/src/services/mcp/mcpStringUtils.ts +106 -0
- package/src/services/mcp/normalization.ts +23 -0
- package/src/services/mcp/oauthPort.ts +78 -0
- package/src/services/mcp/officialRegistry.ts +72 -0
- package/src/services/mcp/types.ts +258 -0
- package/src/services/mcp/useManageMCPConnections.ts +1141 -0
- package/src/services/mcp/utils.ts +575 -0
- package/src/services/mcp/vscodeSdkMcp.ts +112 -0
- package/src/services/mcp/xaa.ts +511 -0
- package/src/services/mcp/xaaIdpLogin.ts +487 -0
- package/src/services/mcpServerApproval.tsx +41 -0
- package/src/services/mockRateLimits.ts +882 -0
- package/src/services/notifier.ts +156 -0
- package/src/services/oauth/auth-code-listener.ts +211 -0
- package/src/services/oauth/client.ts +566 -0
- package/src/services/oauth/crypto.ts +23 -0
- package/src/services/oauth/getOauthProfile.ts +53 -0
- package/src/services/oauth/index.ts +198 -0
- package/src/services/plugins/PluginInstallationManager.ts +184 -0
- package/src/services/plugins/pluginCliCommands.ts +344 -0
- package/src/services/plugins/pluginOperations.ts +1088 -0
- package/src/services/policyLimits/index.ts +664 -0
- package/src/services/policyLimits/types.ts +27 -0
- package/src/services/preventSleep.ts +165 -0
- package/src/services/rateLimitMessages.ts +344 -0
- package/src/services/rateLimitMocking.ts +144 -0
- package/src/services/remoteManagedSettings/index.ts +639 -0
- package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
- package/src/services/remoteManagedSettings/syncCache.ts +112 -0
- package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
- package/src/services/remoteManagedSettings/types.ts +31 -0
- package/src/services/settingsSync/index.ts +581 -0
- package/src/services/settingsSync/types.ts +67 -0
- package/src/services/teamMemorySync/index.ts +1256 -0
- package/src/services/teamMemorySync/secretScanner.ts +324 -0
- package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
- package/src/services/teamMemorySync/types.ts +156 -0
- package/src/services/teamMemorySync/watcher.ts +387 -0
- package/src/services/tips/tipHistory.ts +17 -0
- package/src/services/tips/tipRegistry.ts +686 -0
- package/src/services/tips/tipScheduler.ts +58 -0
- package/src/services/tokenEstimation.ts +495 -0
- package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
- package/src/services/tools/StreamingToolExecutor.ts +530 -0
- package/src/services/tools/toolExecution.ts +1745 -0
- package/src/services/tools/toolHooks.ts +650 -0
- package/src/services/tools/toolOrchestration.ts +188 -0
- package/src/services/vcr.ts +406 -0
- package/src/services/voice.ts +525 -0
- package/src/services/voiceKeyterms.ts +106 -0
- package/src/services/voiceStreamSTT.ts +544 -0
- package/src/setup.ts +477 -0
- package/src/skills/bundled/batch.ts +124 -0
- package/src/skills/bundled/claudeApi.ts +196 -0
- package/src/skills/bundled/claudeApiContent.ts +75 -0
- package/src/skills/bundled/claudeInChrome.ts +34 -0
- package/src/skills/bundled/debug.ts +103 -0
- package/src/skills/bundled/index.ts +79 -0
- package/src/skills/bundled/keybindings.ts +339 -0
- package/src/skills/bundled/loop.ts +92 -0
- package/src/skills/bundled/loremIpsum.ts +282 -0
- package/src/skills/bundled/remember.ts +82 -0
- package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
- package/src/skills/bundled/simplify.ts +69 -0
- package/src/skills/bundled/skillify.ts +197 -0
- package/src/skills/bundled/stuck.ts +79 -0
- package/src/skills/bundled/updateConfig.ts +475 -0
- package/src/skills/bundled/verify.ts +30 -0
- package/src/skills/bundled/verifyContent.ts +13 -0
- package/src/skills/bundledSkills.ts +220 -0
- package/src/skills/loadSkillsDir.ts +1086 -0
- package/src/skills/mcpSkillBuilders.ts +44 -0
- package/src/state/AppState.tsx +200 -0
- package/src/state/AppStateStore.ts +569 -0
- package/src/state/onChangeAppState.ts +171 -0
- package/src/state/selectors.ts +76 -0
- package/src/state/store.ts +34 -0
- package/src/state/teammateViewHelpers.ts +141 -0
- package/src/tasks/DreamTask/DreamTask.ts +157 -0
- package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
- package/src/tasks/InProcessTeammateTask/types.ts +121 -0
- package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
- package/src/tasks/LocalMainSessionTask.ts +479 -0
- package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
- package/src/tasks/LocalShellTask/guards.ts +41 -0
- package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
- package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
- package/src/tasks/pillLabel.ts +82 -0
- package/src/tasks/stopTask.ts +100 -0
- package/src/tasks/types.ts +46 -0
- package/src/tasks.ts +39 -0
- package/src/tools/AgentTool/AgentTool.tsx +1398 -0
- package/src/tools/AgentTool/UI.tsx +872 -0
- package/src/tools/AgentTool/agentColorManager.ts +66 -0
- package/src/tools/AgentTool/agentDisplay.ts +104 -0
- package/src/tools/AgentTool/agentMemory.ts +177 -0
- package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
- package/src/tools/AgentTool/agentToolUtils.ts +686 -0
- package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
- package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
- package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
- package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
- package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
- package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
- package/src/tools/AgentTool/builtInAgents.ts +72 -0
- package/src/tools/AgentTool/constants.ts +12 -0
- package/src/tools/AgentTool/forkSubagent.ts +210 -0
- package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
- package/src/tools/AgentTool/prompt.ts +287 -0
- package/src/tools/AgentTool/resumeAgent.ts +265 -0
- package/src/tools/AgentTool/runAgent.ts +973 -0
- package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
- package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
- package/src/tools/BashTool/BashTool.tsx +1144 -0
- package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
- package/src/tools/BashTool/UI.tsx +185 -0
- package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
- package/src/tools/BashTool/bashPermissions.ts +2621 -0
- package/src/tools/BashTool/bashSecurity.ts +2592 -0
- package/src/tools/BashTool/commandSemantics.ts +140 -0
- package/src/tools/BashTool/commentLabel.ts +13 -0
- package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
- package/src/tools/BashTool/modeValidation.ts +115 -0
- package/src/tools/BashTool/pathValidation.ts +1303 -0
- package/src/tools/BashTool/prompt.ts +369 -0
- package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
- package/src/tools/BashTool/sedEditParser.ts +322 -0
- package/src/tools/BashTool/sedValidation.ts +684 -0
- package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
- package/src/tools/BashTool/toolName.ts +2 -0
- package/src/tools/BashTool/utils.ts +223 -0
- package/src/tools/BriefTool/BriefTool.ts +204 -0
- package/src/tools/BriefTool/UI.tsx +101 -0
- package/src/tools/BriefTool/attachments.ts +110 -0
- package/src/tools/BriefTool/prompt.ts +22 -0
- package/src/tools/BriefTool/upload.ts +174 -0
- package/src/tools/ConfigTool/ConfigTool.ts +467 -0
- package/src/tools/ConfigTool/UI.tsx +38 -0
- package/src/tools/ConfigTool/constants.ts +1 -0
- package/src/tools/ConfigTool/prompt.ts +93 -0
- package/src/tools/ConfigTool/supportedSettings.ts +211 -0
- package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
- package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
- package/src/tools/EnterPlanModeTool/constants.ts +1 -0
- package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
- package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
- package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
- package/src/tools/EnterWorktreeTool/constants.ts +1 -0
- package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
- package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
- package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
- package/src/tools/ExitPlanModeTool/constants.ts +2 -0
- package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
- package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
- package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
- package/src/tools/ExitWorktreeTool/constants.ts +1 -0
- package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
- package/src/tools/FileEditTool/FileEditTool.ts +625 -0
- package/src/tools/FileEditTool/UI.tsx +289 -0
- package/src/tools/FileEditTool/constants.ts +11 -0
- package/src/tools/FileEditTool/prompt.ts +28 -0
- package/src/tools/FileEditTool/types.ts +85 -0
- package/src/tools/FileEditTool/utils.ts +775 -0
- package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
- package/src/tools/FileReadTool/UI.tsx +185 -0
- package/src/tools/FileReadTool/imageProcessor.ts +94 -0
- package/src/tools/FileReadTool/limits.ts +92 -0
- package/src/tools/FileReadTool/prompt.ts +49 -0
- package/src/tools/FileWriteTool/FileWriteTool.ts +434 -0
- package/src/tools/FileWriteTool/UI.tsx +405 -0
- package/src/tools/FileWriteTool/prompt.ts +18 -0
- package/src/tools/GlobTool/GlobTool.ts +198 -0
- package/src/tools/GlobTool/UI.tsx +63 -0
- package/src/tools/GlobTool/prompt.ts +7 -0
- package/src/tools/GrepTool/GrepTool.ts +577 -0
- package/src/tools/GrepTool/UI.tsx +201 -0
- package/src/tools/GrepTool/prompt.ts +18 -0
- package/src/tools/LSPTool/LSPTool.ts +860 -0
- package/src/tools/LSPTool/UI.tsx +228 -0
- package/src/tools/LSPTool/formatters.ts +592 -0
- package/src/tools/LSPTool/prompt.ts +21 -0
- package/src/tools/LSPTool/schemas.ts +215 -0
- package/src/tools/LSPTool/symbolContext.ts +90 -0
- package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
- package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
- package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
- package/src/tools/MCPTool/MCPTool.ts +77 -0
- package/src/tools/MCPTool/UI.tsx +403 -0
- package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
- package/src/tools/MCPTool/prompt.ts +3 -0
- package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
- package/src/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
- package/src/tools/NotebookEditTool/UI.tsx +93 -0
- package/src/tools/NotebookEditTool/constants.ts +2 -0
- package/src/tools/NotebookEditTool/prompt.ts +3 -0
- package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
- package/src/tools/PowerShellTool/UI.tsx +131 -0
- package/src/tools/PowerShellTool/clmTypes.ts +211 -0
- package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
- package/src/tools/PowerShellTool/commonParameters.ts +30 -0
- package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
- package/src/tools/PowerShellTool/gitSafety.ts +176 -0
- package/src/tools/PowerShellTool/modeValidation.ts +404 -0
- package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
- package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
- package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
- package/src/tools/PowerShellTool/prompt.ts +145 -0
- package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
- package/src/tools/PowerShellTool/toolName.ts +2 -0
- package/src/tools/REPLTool/constants.ts +46 -0
- package/src/tools/REPLTool/primitiveTools.ts +39 -0
- package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
- package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
- package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
- package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
- package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
- package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
- package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
- package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
- package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
- package/src/tools/ScheduleCronTool/UI.tsx +60 -0
- package/src/tools/ScheduleCronTool/prompt.ts +135 -0
- package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
- package/src/tools/SendMessageTool/UI.tsx +31 -0
- package/src/tools/SendMessageTool/constants.ts +1 -0
- package/src/tools/SendMessageTool/prompt.ts +49 -0
- package/src/tools/SkillTool/SkillTool.ts +1108 -0
- package/src/tools/SkillTool/UI.tsx +128 -0
- package/src/tools/SkillTool/constants.ts +1 -0
- package/src/tools/SkillTool/prompt.ts +241 -0
- package/src/tools/SleepTool/prompt.ts +17 -0
- package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
- package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
- package/src/tools/TaskCreateTool/constants.ts +1 -0
- package/src/tools/TaskCreateTool/prompt.ts +56 -0
- package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
- package/src/tools/TaskGetTool/constants.ts +1 -0
- package/src/tools/TaskGetTool/prompt.ts +24 -0
- package/src/tools/TaskListTool/TaskListTool.ts +116 -0
- package/src/tools/TaskListTool/constants.ts +1 -0
- package/src/tools/TaskListTool/prompt.ts +49 -0
- package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
- package/src/tools/TaskOutputTool/constants.ts +1 -0
- package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
- package/src/tools/TaskStopTool/UI.tsx +41 -0
- package/src/tools/TaskStopTool/prompt.ts +8 -0
- package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
- package/src/tools/TaskUpdateTool/constants.ts +1 -0
- package/src/tools/TaskUpdateTool/prompt.ts +77 -0
- package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
- package/src/tools/TeamCreateTool/UI.tsx +6 -0
- package/src/tools/TeamCreateTool/constants.ts +1 -0
- package/src/tools/TeamCreateTool/prompt.ts +113 -0
- package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
- package/src/tools/TeamDeleteTool/UI.tsx +20 -0
- package/src/tools/TeamDeleteTool/constants.ts +1 -0
- package/src/tools/TeamDeleteTool/prompt.ts +16 -0
- package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
- package/src/tools/TodoWriteTool/constants.ts +1 -0
- package/src/tools/TodoWriteTool/prompt.ts +184 -0
- package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
- package/src/tools/ToolSearchTool/constants.ts +1 -0
- package/src/tools/ToolSearchTool/prompt.ts +121 -0
- package/src/tools/TungstenTool/TungstenTool.js +2 -0
- package/src/tools/TungstenTool/TungstenTool.ts +1 -0
- package/src/tools/WebFetchTool/UI.tsx +72 -0
- package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
- package/src/tools/WebFetchTool/preapproved.ts +166 -0
- package/src/tools/WebFetchTool/prompt.ts +46 -0
- package/src/tools/WebFetchTool/utils.ts +530 -0
- package/src/tools/WebSearchTool/UI.tsx +101 -0
- package/src/tools/WebSearchTool/WebSearchTool.ts +435 -0
- package/src/tools/WebSearchTool/prompt.ts +34 -0
- package/src/tools/shared/gitOperationTracking.ts +277 -0
- package/src/tools/shared/spawnMultiAgent.ts +1093 -0
- package/src/tools/testing/TestingPermissionTool.tsx +74 -0
- package/src/tools/utils.ts +40 -0
- package/src/tools.ts +389 -0
- package/src/types/command.ts +216 -0
- package/src/types/connectorText.js +5 -0
- package/src/types/connectorText.ts +1 -0
- package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
- package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
- package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
- package/src/types/generated/google/protobuf/timestamp.ts +187 -0
- package/src/types/hooks.ts +290 -0
- package/src/types/ids.ts +44 -0
- package/src/types/logs.ts +330 -0
- package/src/types/permissions.ts +441 -0
- package/src/types/plugin.ts +363 -0
- package/src/types/textInputTypes.ts +387 -0
- package/src/upstreamproxy/relay.ts +455 -0
- package/src/upstreamproxy/upstreamproxy.ts +285 -0
- package/src/utils/CircularBuffer.ts +84 -0
- package/src/utils/Cursor.ts +1530 -0
- package/src/utils/QueryGuard.ts +121 -0
- package/src/utils/Shell.ts +474 -0
- package/src/utils/ShellCommand.ts +465 -0
- package/src/utils/abortController.ts +99 -0
- package/src/utils/activityManager.ts +164 -0
- package/src/utils/advisor.ts +145 -0
- package/src/utils/agentContext.ts +178 -0
- package/src/utils/agentId.ts +99 -0
- package/src/utils/agentSwarmsEnabled.ts +44 -0
- package/src/utils/agenticSessionSearch.ts +307 -0
- package/src/utils/analyzeContext.ts +1382 -0
- package/src/utils/ansiToPng.ts +334 -0
- package/src/utils/ansiToSvg.ts +272 -0
- package/src/utils/api.ts +718 -0
- package/src/utils/apiPreconnect.ts +72 -0
- package/src/utils/appleTerminalBackup.ts +124 -0
- package/src/utils/argumentSubstitution.ts +145 -0
- package/src/utils/array.ts +13 -0
- package/src/utils/asciicast.ts +239 -0
- package/src/utils/attachments.ts +3997 -0
- package/src/utils/attribution.ts +393 -0
- package/src/utils/auth.ts +2007 -0
- package/src/utils/authFileDescriptor.ts +196 -0
- package/src/utils/authPortable.ts +19 -0
- package/src/utils/autoModeDenials.ts +26 -0
- package/src/utils/autoRunIssue.tsx +122 -0
- package/src/utils/autoUpdater.ts +562 -0
- package/src/utils/aws.ts +74 -0
- package/src/utils/awsAuthStatusManager.ts +81 -0
- package/src/utils/background/remote/preconditions.ts +235 -0
- package/src/utils/background/remote/remoteSession.ts +98 -0
- package/src/utils/backgroundHousekeeping.ts +94 -0
- package/src/utils/bash/ParsedCommand.ts +318 -0
- package/src/utils/bash/ShellSnapshot.ts +582 -0
- package/src/utils/bash/ast.ts +2679 -0
- package/src/utils/bash/bashParser.ts +4436 -0
- package/src/utils/bash/bashPipeCommand.ts +294 -0
- package/src/utils/bash/commands.ts +1339 -0
- package/src/utils/bash/heredoc.ts +733 -0
- package/src/utils/bash/parser.ts +230 -0
- package/src/utils/bash/prefix.ts +204 -0
- package/src/utils/bash/registry.ts +53 -0
- package/src/utils/bash/shellCompletion.ts +259 -0
- package/src/utils/bash/shellPrefix.ts +28 -0
- package/src/utils/bash/shellQuote.ts +304 -0
- package/src/utils/bash/shellQuoting.ts +128 -0
- package/src/utils/bash/specs/alias.ts +14 -0
- package/src/utils/bash/specs/index.ts +18 -0
- package/src/utils/bash/specs/nohup.ts +13 -0
- package/src/utils/bash/specs/pyright.ts +91 -0
- package/src/utils/bash/specs/sleep.ts +13 -0
- package/src/utils/bash/specs/srun.ts +31 -0
- package/src/utils/bash/specs/time.ts +13 -0
- package/src/utils/bash/specs/timeout.ts +20 -0
- package/src/utils/bash/treeSitterAnalysis.ts +506 -0
- package/src/utils/betas.ts +438 -0
- package/src/utils/billing.ts +78 -0
- package/src/utils/binaryCheck.ts +53 -0
- package/src/utils/browser.ts +68 -0
- package/src/utils/bufferedWriter.ts +100 -0
- package/src/utils/bundledMode.ts +22 -0
- package/src/utils/caCerts.ts +115 -0
- package/src/utils/caCertsConfig.ts +88 -0
- package/src/utils/cachePaths.ts +38 -0
- package/src/utils/classifierApprovals.ts +88 -0
- package/src/utils/classifierApprovalsHook.ts +17 -0
- package/src/utils/claudeCodeHints.ts +193 -0
- package/src/utils/claudeDesktop.ts +152 -0
- package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
- package/src/utils/claudeInChrome/common.ts +540 -0
- package/src/utils/claudeInChrome/mcpServer.ts +293 -0
- package/src/utils/claudeInChrome/prompt.ts +83 -0
- package/src/utils/claudeInChrome/setup.ts +400 -0
- package/src/utils/claudeInChrome/setupPortable.ts +233 -0
- package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
- package/src/utils/claudemd.ts +1479 -0
- package/src/utils/cleanup.ts +602 -0
- package/src/utils/cleanupRegistry.ts +25 -0
- package/src/utils/cliArgs.ts +60 -0
- package/src/utils/cliHighlight.ts +54 -0
- package/src/utils/codeIndexing.ts +206 -0
- package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
- package/src/utils/collapseHookSummaries.ts +59 -0
- package/src/utils/collapseReadSearch.ts +1109 -0
- package/src/utils/collapseTeammateShutdowns.ts +55 -0
- package/src/utils/combinedAbortSignal.ts +47 -0
- package/src/utils/commandLifecycle.ts +21 -0
- package/src/utils/commitAttribution.ts +961 -0
- package/src/utils/completionCache.ts +166 -0
- package/src/utils/computerUse/appNames.ts +196 -0
- package/src/utils/computerUse/cleanup.ts +86 -0
- package/src/utils/computerUse/common.ts +61 -0
- package/src/utils/computerUse/computerUseLock.ts +215 -0
- package/src/utils/computerUse/drainRunLoop.ts +79 -0
- package/src/utils/computerUse/escHotkey.ts +54 -0
- package/src/utils/computerUse/executor.ts +658 -0
- package/src/utils/computerUse/gates.ts +72 -0
- package/src/utils/computerUse/hostAdapter.ts +69 -0
- package/src/utils/computerUse/inputLoader.ts +30 -0
- package/src/utils/computerUse/mcpServer.ts +106 -0
- package/src/utils/computerUse/setup.ts +53 -0
- package/src/utils/computerUse/swiftLoader.ts +23 -0
- package/src/utils/computerUse/toolRendering.tsx +125 -0
- package/src/utils/computerUse/wrapper.tsx +336 -0
- package/src/utils/concurrentSessions.ts +204 -0
- package/src/utils/config.ts +1817 -0
- package/src/utils/configConstants.ts +21 -0
- package/src/utils/contentArray.ts +51 -0
- package/src/utils/context.ts +221 -0
- package/src/utils/contextAnalysis.ts +272 -0
- package/src/utils/contextSuggestions.ts +235 -0
- package/src/utils/controlMessageCompat.ts +32 -0
- package/src/utils/conversationRecovery.ts +597 -0
- package/src/utils/cron.ts +308 -0
- package/src/utils/cronJitterConfig.ts +75 -0
- package/src/utils/cronScheduler.ts +565 -0
- package/src/utils/cronTasks.ts +458 -0
- package/src/utils/cronTasksLock.ts +195 -0
- package/src/utils/crossProjectResume.ts +75 -0
- package/src/utils/crypto.ts +13 -0
- package/src/utils/cwd.ts +32 -0
- package/src/utils/debug.ts +268 -0
- package/src/utils/debugFilter.ts +157 -0
- package/src/utils/deepLink/banner.ts +123 -0
- package/src/utils/deepLink/parseDeepLink.ts +170 -0
- package/src/utils/deepLink/protocolHandler.ts +136 -0
- package/src/utils/deepLink/registerProtocol.ts +348 -0
- package/src/utils/deepLink/terminalLauncher.ts +557 -0
- package/src/utils/deepLink/terminalPreference.ts +54 -0
- package/src/utils/desktopDeepLink.ts +236 -0
- package/src/utils/detectRepository.ts +178 -0
- package/src/utils/diagLogs.ts +94 -0
- package/src/utils/diff.ts +177 -0
- package/src/utils/directMemberMessage.ts +69 -0
- package/src/utils/displayTags.ts +51 -0
- package/src/utils/doctorContextWarnings.ts +265 -0
- package/src/utils/doctorDiagnostic.ts +625 -0
- package/src/utils/dxt/helpers.ts +88 -0
- package/src/utils/dxt/zip.ts +226 -0
- package/src/utils/earlyInput.ts +191 -0
- package/src/utils/editor.ts +183 -0
- package/src/utils/effort.ts +329 -0
- package/src/utils/embeddedTools.ts +29 -0
- package/src/utils/env.ts +347 -0
- package/src/utils/envDynamic.ts +151 -0
- package/src/utils/envUtils.ts +183 -0
- package/src/utils/envValidation.ts +38 -0
- package/src/utils/errorLogSink.ts +235 -0
- package/src/utils/errors.ts +238 -0
- package/src/utils/exampleCommands.ts +184 -0
- package/src/utils/execFileNoThrow.ts +150 -0
- package/src/utils/execFileNoThrowPortable.ts +89 -0
- package/src/utils/execSyncWrapper.ts +38 -0
- package/src/utils/exportRenderer.tsx +98 -0
- package/src/utils/extraUsage.ts +23 -0
- package/src/utils/fastMode.ts +532 -0
- package/src/utils/file.ts +584 -0
- package/src/utils/fileHistory.ts +1115 -0
- package/src/utils/fileOperationAnalytics.ts +71 -0
- package/src/utils/filePersistence/filePersistence.ts +287 -0
- package/src/utils/filePersistence/outputsScanner.ts +126 -0
- package/src/utils/fileRead.ts +102 -0
- package/src/utils/fileReadCache.ts +96 -0
- package/src/utils/fileStateCache.ts +142 -0
- package/src/utils/findExecutable.ts +17 -0
- package/src/utils/fingerprint.ts +76 -0
- package/src/utils/forkedAgent.ts +689 -0
- package/src/utils/format.ts +308 -0
- package/src/utils/formatBriefTimestamp.ts +81 -0
- package/src/utils/fpsTracker.ts +47 -0
- package/src/utils/frontmatterParser.ts +370 -0
- package/src/utils/fsOperations.ts +770 -0
- package/src/utils/fullscreen.ts +202 -0
- package/src/utils/generatedFiles.ts +136 -0
- package/src/utils/generators.ts +88 -0
- package/src/utils/genericProcessUtils.ts +184 -0
- package/src/utils/getWorktreePaths.ts +70 -0
- package/src/utils/getWorktreePathsPortable.ts +27 -0
- package/src/utils/ghPrStatus.ts +106 -0
- package/src/utils/git/gitConfigParser.ts +277 -0
- package/src/utils/git/gitFilesystem.ts +699 -0
- package/src/utils/git/gitignore.ts +99 -0
- package/src/utils/git.ts +926 -0
- package/src/utils/gitDiff.ts +532 -0
- package/src/utils/gitSettings.ts +18 -0
- package/src/utils/github/ghAuthStatus.ts +29 -0
- package/src/utils/githubRepoPathMapping.ts +162 -0
- package/src/utils/glob.ts +130 -0
- package/src/utils/gracefulShutdown.ts +529 -0
- package/src/utils/groupToolUses.ts +182 -0
- package/src/utils/handlePromptSubmit.ts +610 -0
- package/src/utils/hash.ts +46 -0
- package/src/utils/headlessProfiler.ts +178 -0
- package/src/utils/heapDumpService.ts +303 -0
- package/src/utils/heatmap.ts +198 -0
- package/src/utils/highlightMatch.tsx +28 -0
- package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
- package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
- package/src/utils/hooks/execAgentHook.ts +339 -0
- package/src/utils/hooks/execHttpHook.ts +242 -0
- package/src/utils/hooks/execPromptHook.ts +211 -0
- package/src/utils/hooks/fileChangedWatcher.ts +191 -0
- package/src/utils/hooks/hookEvents.ts +192 -0
- package/src/utils/hooks/hookHelpers.ts +83 -0
- package/src/utils/hooks/hooksConfigManager.ts +400 -0
- package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
- package/src/utils/hooks/hooksSettings.ts +271 -0
- package/src/utils/hooks/postSamplingHooks.ts +70 -0
- package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
- package/src/utils/hooks/registerSkillHooks.ts +64 -0
- package/src/utils/hooks/sessionHooks.ts +447 -0
- package/src/utils/hooks/skillImprovement.ts +267 -0
- package/src/utils/hooks/ssrfGuard.ts +294 -0
- package/src/utils/hooks.ts +5022 -0
- package/src/utils/horizontalScroll.ts +137 -0
- package/src/utils/http.ts +136 -0
- package/src/utils/hyperlink.ts +39 -0
- package/src/utils/iTermBackup.ts +73 -0
- package/src/utils/ide.ts +1494 -0
- package/src/utils/idePathConversion.ts +90 -0
- package/src/utils/idleTimeout.ts +53 -0
- package/src/utils/imagePaste.ts +416 -0
- package/src/utils/imageResizer.ts +880 -0
- package/src/utils/imageStore.ts +167 -0
- package/src/utils/imageValidation.ts +104 -0
- package/src/utils/immediateCommand.ts +15 -0
- package/src/utils/inProcessTeammateHelpers.ts +102 -0
- package/src/utils/ink.ts +26 -0
- package/src/utils/intl.ts +94 -0
- package/src/utils/jetbrains.ts +191 -0
- package/src/utils/json.ts +277 -0
- package/src/utils/jsonRead.ts +16 -0
- package/src/utils/keyboardShortcuts.ts +14 -0
- package/src/utils/lazySchema.ts +8 -0
- package/src/utils/listSessionsImpl.ts +454 -0
- package/src/utils/localInstaller.ts +162 -0
- package/src/utils/lockfile.ts +43 -0
- package/src/utils/log.ts +362 -0
- package/src/utils/logoV2Utils.ts +350 -0
- package/src/utils/mailbox.ts +73 -0
- package/src/utils/managedEnv.ts +199 -0
- package/src/utils/managedEnvConstants.ts +191 -0
- package/src/utils/markdown.ts +381 -0
- package/src/utils/markdownConfigLoader.ts +600 -0
- package/src/utils/mcp/dateTimeParser.ts +121 -0
- package/src/utils/mcp/elicitationValidation.ts +336 -0
- package/src/utils/mcpInstructionsDelta.ts +130 -0
- package/src/utils/mcpOutputStorage.ts +189 -0
- package/src/utils/mcpValidation.ts +208 -0
- package/src/utils/mcpWebSocketTransport.ts +200 -0
- package/src/utils/memoize.ts +269 -0
- package/src/utils/memory/types.ts +12 -0
- package/src/utils/memory/versions.ts +8 -0
- package/src/utils/memoryFileDetection.ts +289 -0
- package/src/utils/messagePredicates.ts +8 -0
- package/src/utils/messageQueueManager.ts +547 -0
- package/src/utils/messages/mappers.ts +290 -0
- package/src/utils/messages/systemInit.ts +96 -0
- package/src/utils/messages.ts +5512 -0
- package/src/utils/model/agent.ts +157 -0
- package/src/utils/model/aliases.ts +25 -0
- package/src/utils/model/antModels.ts +64 -0
- package/src/utils/model/bedrock.ts +265 -0
- package/src/utils/model/check1mAccess.ts +72 -0
- package/src/utils/model/configs.ts +118 -0
- package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
- package/src/utils/model/deprecation.ts +101 -0
- package/src/utils/model/model.ts +634 -0
- package/src/utils/model/modelAllowlist.ts +170 -0
- package/src/utils/model/modelCapabilities.ts +118 -0
- package/src/utils/model/modelOptions.ts +540 -0
- package/src/utils/model/modelStrings.ts +166 -0
- package/src/utils/model/modelSupportOverrides.ts +50 -0
- package/src/utils/model/providers.ts +46 -0
- package/src/utils/model/validateModel.ts +159 -0
- package/src/utils/modelCost.ts +235 -0
- package/src/utils/modifiers.ts +36 -0
- package/src/utils/mtls.ts +179 -0
- package/src/utils/nativeInstaller/download.ts +523 -0
- package/src/utils/nativeInstaller/index.ts +18 -0
- package/src/utils/nativeInstaller/installer.ts +1708 -0
- package/src/utils/nativeInstaller/packageManagers.ts +336 -0
- package/src/utils/nativeInstaller/pidLock.ts +433 -0
- package/src/utils/notebook.ts +224 -0
- package/src/utils/objectGroupBy.ts +18 -0
- package/src/utils/pasteStore.ts +104 -0
- package/src/utils/path.ts +155 -0
- package/src/utils/pdf.ts +300 -0
- package/src/utils/pdfUtils.ts +70 -0
- package/src/utils/peerAddress.ts +21 -0
- package/src/utils/permissions/PermissionMode.ts +141 -0
- package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
- package/src/utils/permissions/PermissionResult.ts +35 -0
- package/src/utils/permissions/PermissionRule.ts +40 -0
- package/src/utils/permissions/PermissionUpdate.ts +389 -0
- package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
- package/src/utils/permissions/autoModeState.ts +39 -0
- package/src/utils/permissions/bashClassifier.ts +61 -0
- package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
- package/src/utils/permissions/classifierDecision.ts +98 -0
- package/src/utils/permissions/classifierShared.ts +39 -0
- package/src/utils/permissions/dangerousPatterns.ts +80 -0
- package/src/utils/permissions/denialTracking.ts +45 -0
- package/src/utils/permissions/filesystem.ts +1777 -0
- package/src/utils/permissions/getNextPermissionMode.ts +101 -0
- package/src/utils/permissions/pathValidation.ts +485 -0
- package/src/utils/permissions/permissionExplainer.ts +250 -0
- package/src/utils/permissions/permissionRuleParser.ts +198 -0
- package/src/utils/permissions/permissionSetup.ts +1532 -0
- package/src/utils/permissions/permissions.ts +1486 -0
- package/src/utils/permissions/permissionsLoader.ts +296 -0
- package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
- package/src/utils/permissions/shellRuleMatching.ts +228 -0
- package/src/utils/permissions/yoloClassifier.ts +1495 -0
- package/src/utils/planModeV2.ts +95 -0
- package/src/utils/plans.ts +397 -0
- package/src/utils/platform.ts +150 -0
- package/src/utils/plugins/addDirPluginSettings.ts +71 -0
- package/src/utils/plugins/cacheUtils.ts +196 -0
- package/src/utils/plugins/dependencyResolver.ts +305 -0
- package/src/utils/plugins/fetchTelemetry.ts +135 -0
- package/src/utils/plugins/gitAvailability.ts +69 -0
- package/src/utils/plugins/headlessPluginInstall.ts +174 -0
- package/src/utils/plugins/hintRecommendation.ts +164 -0
- package/src/utils/plugins/installCounts.ts +292 -0
- package/src/utils/plugins/installedPluginsManager.ts +1268 -0
- package/src/utils/plugins/loadPluginAgents.ts +348 -0
- package/src/utils/plugins/loadPluginCommands.ts +946 -0
- package/src/utils/plugins/loadPluginHooks.ts +287 -0
- package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
- package/src/utils/plugins/lspPluginIntegration.ts +387 -0
- package/src/utils/plugins/lspRecommendation.ts +374 -0
- package/src/utils/plugins/managedPlugins.ts +27 -0
- package/src/utils/plugins/marketplaceHelpers.ts +592 -0
- package/src/utils/plugins/marketplaceManager.ts +2643 -0
- package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
- package/src/utils/plugins/mcpbHandler.ts +968 -0
- package/src/utils/plugins/officialMarketplace.ts +25 -0
- package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
- package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
- package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
- package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
- package/src/utils/plugins/performStartupChecks.tsx +70 -0
- package/src/utils/plugins/pluginAutoupdate.ts +284 -0
- package/src/utils/plugins/pluginBlocklist.ts +127 -0
- package/src/utils/plugins/pluginDirectories.ts +178 -0
- package/src/utils/plugins/pluginFlagging.ts +208 -0
- package/src/utils/plugins/pluginIdentifier.ts +123 -0
- package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
- package/src/utils/plugins/pluginLoader.ts +3302 -0
- package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
- package/src/utils/plugins/pluginPolicy.ts +20 -0
- package/src/utils/plugins/pluginStartupCheck.ts +341 -0
- package/src/utils/plugins/pluginVersioning.ts +157 -0
- package/src/utils/plugins/reconciler.ts +265 -0
- package/src/utils/plugins/refresh.ts +215 -0
- package/src/utils/plugins/schemas.ts +1681 -0
- package/src/utils/plugins/validatePlugin.ts +903 -0
- package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
- package/src/utils/plugins/zipCache.ts +406 -0
- package/src/utils/plugins/zipCacheAdapters.ts +164 -0
- package/src/utils/powershell/dangerousCmdlets.ts +185 -0
- package/src/utils/powershell/parser.ts +1804 -0
- package/src/utils/powershell/staticPrefix.ts +316 -0
- package/src/utils/preflightChecks.tsx +151 -0
- package/src/utils/privacyLevel.ts +55 -0
- package/src/utils/process.ts +68 -0
- package/src/utils/processUserInput/processBashCommand.tsx +140 -0
- package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
- package/src/utils/processUserInput/processTextPrompt.ts +100 -0
- package/src/utils/processUserInput/processUserInput.ts +605 -0
- package/src/utils/profilerBase.ts +46 -0
- package/src/utils/promptCategory.ts +49 -0
- package/src/utils/promptEditor.ts +188 -0
- package/src/utils/promptShellExecution.ts +183 -0
- package/src/utils/proxy.ts +426 -0
- package/src/utils/queryContext.ts +179 -0
- package/src/utils/queryHelpers.ts +552 -0
- package/src/utils/queryProfiler.ts +301 -0
- package/src/utils/queueProcessor.ts +95 -0
- package/src/utils/readEditContext.ts +227 -0
- package/src/utils/readFileInRange.ts +383 -0
- package/src/utils/releaseNotes.ts +360 -0
- package/src/utils/renderOptions.ts +77 -0
- package/src/utils/ripgrep.ts +679 -0
- package/src/utils/sandbox/sandbox-adapter.ts +985 -0
- package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
- package/src/utils/sanitization.ts +91 -0
- package/src/utils/screenshotClipboard.ts +121 -0
- package/src/utils/sdkEventQueue.ts +134 -0
- package/src/utils/secureStorage/fallbackStorage.ts +70 -0
- package/src/utils/secureStorage/index.ts +17 -0
- package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
- package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
- package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
- package/src/utils/secureStorage/plainTextStorage.ts +84 -0
- package/src/utils/semanticBoolean.ts +29 -0
- package/src/utils/semanticNumber.ts +36 -0
- package/src/utils/semver.ts +59 -0
- package/src/utils/sequential.ts +56 -0
- package/src/utils/sessionActivity.ts +133 -0
- package/src/utils/sessionEnvVars.ts +22 -0
- package/src/utils/sessionEnvironment.ts +166 -0
- package/src/utils/sessionFileAccessHooks.ts +250 -0
- package/src/utils/sessionIngressAuth.ts +140 -0
- package/src/utils/sessionRestore.ts +551 -0
- package/src/utils/sessionStart.ts +232 -0
- package/src/utils/sessionState.ts +150 -0
- package/src/utils/sessionStorage.ts +5105 -0
- package/src/utils/sessionStoragePortable.ts +793 -0
- package/src/utils/sessionTitle.ts +129 -0
- package/src/utils/sessionUrl.ts +64 -0
- package/src/utils/set.ts +53 -0
- package/src/utils/settings/allErrors.ts +32 -0
- package/src/utils/settings/applySettingsChange.ts +92 -0
- package/src/utils/settings/changeDetector.ts +488 -0
- package/src/utils/settings/constants.ts +202 -0
- package/src/utils/settings/internalWrites.ts +37 -0
- package/src/utils/settings/managedPath.ts +34 -0
- package/src/utils/settings/mdm/constants.ts +81 -0
- package/src/utils/settings/mdm/rawRead.ts +130 -0
- package/src/utils/settings/mdm/settings.ts +316 -0
- package/src/utils/settings/permissionValidation.ts +262 -0
- package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
- package/src/utils/settings/schemaOutput.ts +8 -0
- package/src/utils/settings/settings.ts +1015 -0
- package/src/utils/settings/settingsCache.ts +80 -0
- package/src/utils/settings/toolValidationConfig.ts +103 -0
- package/src/utils/settings/types.ts +1148 -0
- package/src/utils/settings/validateEditTool.ts +45 -0
- package/src/utils/settings/validation.ts +265 -0
- package/src/utils/settings/validationTips.ts +164 -0
- package/src/utils/shell/bashProvider.ts +255 -0
- package/src/utils/shell/outputLimits.ts +14 -0
- package/src/utils/shell/powershellDetection.ts +107 -0
- package/src/utils/shell/powershellProvider.ts +123 -0
- package/src/utils/shell/prefix.ts +367 -0
- package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
- package/src/utils/shell/resolveDefaultShell.ts +14 -0
- package/src/utils/shell/shellProvider.ts +33 -0
- package/src/utils/shell/shellToolUtils.ts +22 -0
- package/src/utils/shell/specPrefix.ts +241 -0
- package/src/utils/shellConfig.ts +167 -0
- package/src/utils/sideQuery.ts +222 -0
- package/src/utils/sideQuestion.ts +155 -0
- package/src/utils/signal.ts +43 -0
- package/src/utils/sinks.ts +16 -0
- package/src/utils/skills/skillChangeDetector.ts +311 -0
- package/src/utils/slashCommandParsing.ts +60 -0
- package/src/utils/sleep.ts +84 -0
- package/src/utils/sliceAnsi.ts +91 -0
- package/src/utils/slowOperations.ts +286 -0
- package/src/utils/standaloneAgent.ts +23 -0
- package/src/utils/startupProfiler.ts +194 -0
- package/src/utils/staticRender.tsx +116 -0
- package/src/utils/stats.ts +1061 -0
- package/src/utils/statsCache.ts +434 -0
- package/src/utils/status.tsx +362 -0
- package/src/utils/statusNoticeDefinitions.tsx +198 -0
- package/src/utils/statusNoticeHelpers.ts +20 -0
- package/src/utils/stream.ts +76 -0
- package/src/utils/streamJsonStdoutGuard.ts +123 -0
- package/src/utils/streamlinedTransform.ts +201 -0
- package/src/utils/stringUtils.ts +235 -0
- package/src/utils/subprocessEnv.ts +99 -0
- package/src/utils/suggestions/commandSuggestions.ts +567 -0
- package/src/utils/suggestions/directoryCompletion.ts +263 -0
- package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
- package/src/utils/suggestions/skillUsageTracking.ts +55 -0
- package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
- package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
- package/src/utils/swarm/backends/ITermBackend.ts +370 -0
- package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
- package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
- package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
- package/src/utils/swarm/backends/detection.ts +128 -0
- package/src/utils/swarm/backends/it2Setup.ts +245 -0
- package/src/utils/swarm/backends/registry.ts +464 -0
- package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
- package/src/utils/swarm/backends/types.ts +311 -0
- package/src/utils/swarm/constants.ts +33 -0
- package/src/utils/swarm/inProcessRunner.ts +1552 -0
- package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
- package/src/utils/swarm/permissionSync.ts +928 -0
- package/src/utils/swarm/reconnection.ts +119 -0
- package/src/utils/swarm/spawnInProcess.ts +328 -0
- package/src/utils/swarm/spawnUtils.ts +146 -0
- package/src/utils/swarm/teamHelpers.ts +683 -0
- package/src/utils/swarm/teammateInit.ts +129 -0
- package/src/utils/swarm/teammateLayoutManager.ts +107 -0
- package/src/utils/swarm/teammateModel.ts +10 -0
- package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
- package/src/utils/systemDirectories.ts +74 -0
- package/src/utils/systemPrompt.ts +123 -0
- package/src/utils/systemPromptType.ts +14 -0
- package/src/utils/systemTheme.ts +119 -0
- package/src/utils/taggedId.ts +54 -0
- package/src/utils/task/TaskOutput.ts +390 -0
- package/src/utils/task/diskOutput.ts +451 -0
- package/src/utils/task/framework.ts +308 -0
- package/src/utils/task/outputFormatting.ts +38 -0
- package/src/utils/task/sdkProgress.ts +36 -0
- package/src/utils/tasks.ts +862 -0
- package/src/utils/teamDiscovery.ts +81 -0
- package/src/utils/teamMemoryOps.ts +88 -0
- package/src/utils/teammate.ts +292 -0
- package/src/utils/teammateContext.ts +96 -0
- package/src/utils/teammateMailbox.ts +1183 -0
- package/src/utils/telemetry/betaSessionTracing.ts +491 -0
- package/src/utils/telemetry/bigqueryExporter.ts +252 -0
- package/src/utils/telemetry/events.ts +75 -0
- package/src/utils/telemetry/instrumentation.ts +825 -0
- package/src/utils/telemetry/logger.ts +26 -0
- package/src/utils/telemetry/perfettoTracing.ts +1120 -0
- package/src/utils/telemetry/pluginTelemetry.ts +289 -0
- package/src/utils/telemetry/sessionTracing.ts +927 -0
- package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
- package/src/utils/telemetryAttributes.ts +71 -0
- package/src/utils/teleport/api.ts +466 -0
- package/src/utils/teleport/environmentSelection.ts +77 -0
- package/src/utils/teleport/environments.ts +120 -0
- package/src/utils/teleport/gitBundle.ts +292 -0
- package/src/utils/teleport.tsx +1226 -0
- package/src/utils/tempfile.ts +31 -0
- package/src/utils/terminal.ts +131 -0
- package/src/utils/terminalPanel.ts +191 -0
- package/src/utils/textHighlighting.ts +166 -0
- package/src/utils/theme.ts +639 -0
- package/src/utils/thinking.ts +162 -0
- package/src/utils/timeouts.ts +39 -0
- package/src/utils/tmuxSocket.ts +427 -0
- package/src/utils/todo/types.ts +18 -0
- package/src/utils/tokenBudget.ts +73 -0
- package/src/utils/tokens.ts +261 -0
- package/src/utils/toolErrors.ts +132 -0
- package/src/utils/toolPool.ts +79 -0
- package/src/utils/toolResultStorage.ts +1040 -0
- package/src/utils/toolSchemaCache.ts +26 -0
- package/src/utils/toolSearch.ts +756 -0
- package/src/utils/transcriptSearch.ts +202 -0
- package/src/utils/treeify.ts +170 -0
- package/src/utils/truncate.ts +179 -0
- package/src/utils/ultraplan/ccrSession.ts +349 -0
- package/src/utils/ultraplan/keyword.ts +127 -0
- package/src/utils/ultraplan/prompt.txt +1 -0
- package/src/utils/unaryLogging.ts +39 -0
- package/src/utils/undercover.ts +89 -0
- package/src/utils/user.ts +194 -0
- package/src/utils/userAgent.ts +10 -0
- package/src/utils/userPromptKeywords.ts +27 -0
- package/src/utils/uuid.ts +27 -0
- package/src/utils/warningHandler.ts +121 -0
- package/src/utils/which.ts +82 -0
- package/src/utils/windowsPaths.ts +173 -0
- package/src/utils/withResolvers.ts +13 -0
- package/src/utils/words.ts +800 -0
- package/src/utils/workloadContext.ts +57 -0
- package/src/utils/worktree.ts +1519 -0
- package/src/utils/worktreeModeEnabled.ts +11 -0
- package/src/utils/xdg.ts +65 -0
- package/src/utils/xml.ts +16 -0
- package/src/utils/yaml.ts +15 -0
- package/src/utils/zodToJsonSchema.ts +23 -0
- package/src/vim/motions.ts +82 -0
- package/src/vim/operators.ts +556 -0
- package/src/vim/textObjects.ts +186 -0
- package/src/vim/transitions.ts +490 -0
- package/src/vim/types.ts +199 -0
- package/src/voice/voiceModeEnabled.ts +54 -0
- package/start.js +1 -0
|
@@ -0,0 +1,1001 @@
|
|
|
1
|
+
import { feature } from 'bun:bundle';
|
|
2
|
+
import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs';
|
|
3
|
+
import { copyFile, stat as fsStat, truncate as fsTruncate, link } from 'fs/promises';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import type { CanUseToolFn } from 'src/hooks/useCanUseTool.js';
|
|
6
|
+
import type { AppState } from 'src/state/AppState.js';
|
|
7
|
+
import { z } from 'zod/v4';
|
|
8
|
+
import { getKairosActive } from '../../bootstrap/state.js';
|
|
9
|
+
import { TOOL_SUMMARY_MAX_LENGTH } from '../../constants/toolLimits.js';
|
|
10
|
+
import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from '../../services/analytics/index.js';
|
|
11
|
+
import type { SetToolJSXFn, Tool, ToolCallProgress, ValidationResult } from '../../Tool.js';
|
|
12
|
+
import { buildTool, type ToolDef } from '../../Tool.js';
|
|
13
|
+
import { backgroundExistingForegroundTask, markTaskNotified, registerForeground, spawnShellTask, unregisterForeground } from '../../tasks/LocalShellTask/LocalShellTask.js';
|
|
14
|
+
import type { AgentId } from '../../types/ids.js';
|
|
15
|
+
import type { AssistantMessage } from '../../types/message.js';
|
|
16
|
+
import { extractClaudeCodeHints } from '../../utils/claudeCodeHints.js';
|
|
17
|
+
import { isEnvTruthy } from '../../utils/envUtils.js';
|
|
18
|
+
import { errorMessage as getErrorMessage, ShellError } from '../../utils/errors.js';
|
|
19
|
+
import { truncate } from '../../utils/format.js';
|
|
20
|
+
import { lazySchema } from '../../utils/lazySchema.js';
|
|
21
|
+
import { logError } from '../../utils/log.js';
|
|
22
|
+
import type { PermissionResult } from '../../utils/permissions/PermissionResult.js';
|
|
23
|
+
import { getPlatform } from '../../utils/platform.js';
|
|
24
|
+
import { maybeRecordPluginHint } from '../../utils/plugins/hintRecommendation.js';
|
|
25
|
+
import { exec } from '../../utils/Shell.js';
|
|
26
|
+
import type { ExecResult } from '../../utils/ShellCommand.js';
|
|
27
|
+
import { SandboxManager } from '../../utils/sandbox/sandbox-adapter.js';
|
|
28
|
+
import { semanticBoolean } from '../../utils/semanticBoolean.js';
|
|
29
|
+
import { semanticNumber } from '../../utils/semanticNumber.js';
|
|
30
|
+
import { getCachedPowerShellPath } from '../../utils/shell/powershellDetection.js';
|
|
31
|
+
import { EndTruncatingAccumulator } from '../../utils/stringUtils.js';
|
|
32
|
+
import { getTaskOutputPath } from '../../utils/task/diskOutput.js';
|
|
33
|
+
import { TaskOutput } from '../../utils/task/TaskOutput.js';
|
|
34
|
+
import { isOutputLineTruncated } from '../../utils/terminal.js';
|
|
35
|
+
import { buildLargeToolResultMessage, ensureToolResultsDir, generatePreview, getToolResultPath, PREVIEW_SIZE_BYTES } from '../../utils/toolResultStorage.js';
|
|
36
|
+
import { shouldUseSandbox } from '../BashTool/shouldUseSandbox.js';
|
|
37
|
+
import { BackgroundHint } from '../BashTool/UI.js';
|
|
38
|
+
import { buildImageToolResult, isImageOutput, resetCwdIfOutsideProject, resizeShellImageOutput, stdErrAppendShellResetMessage, stripEmptyLines } from '../BashTool/utils.js';
|
|
39
|
+
import { trackGitOperations } from '../shared/gitOperationTracking.js';
|
|
40
|
+
import { interpretCommandResult } from './commandSemantics.js';
|
|
41
|
+
import { powershellToolHasPermission } from './powershellPermissions.js';
|
|
42
|
+
import { getDefaultTimeoutMs, getMaxTimeoutMs, getPrompt } from './prompt.js';
|
|
43
|
+
import { hasSyncSecurityConcerns, isReadOnlyCommand, resolveToCanonical } from './readOnlyValidation.js';
|
|
44
|
+
import { POWERSHELL_TOOL_NAME } from './toolName.js';
|
|
45
|
+
import { renderToolResultMessage, renderToolUseErrorMessage, renderToolUseMessage, renderToolUseProgressMessage, renderToolUseQueuedMessage } from './UI.js';
|
|
46
|
+
|
|
47
|
+
// Never use os.EOL for terminal output — \r\n on Windows breaks Ink rendering
|
|
48
|
+
const EOL = '\n';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* PowerShell search commands (grep equivalents) for collapsible display.
|
|
52
|
+
* Stored as canonical (lowercase) cmdlet names.
|
|
53
|
+
*/
|
|
54
|
+
const PS_SEARCH_COMMANDS = new Set(['select-string',
|
|
55
|
+
// grep equivalent
|
|
56
|
+
'get-childitem',
|
|
57
|
+
// find equivalent (with -Recurse)
|
|
58
|
+
'findstr',
|
|
59
|
+
// native Windows search
|
|
60
|
+
'where.exe' // native Windows which
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* PowerShell read/view commands for collapsible display.
|
|
65
|
+
* Stored as canonical (lowercase) cmdlet names.
|
|
66
|
+
*/
|
|
67
|
+
const PS_READ_COMMANDS = new Set(['get-content',
|
|
68
|
+
// cat equivalent
|
|
69
|
+
'get-item',
|
|
70
|
+
// file info
|
|
71
|
+
'test-path',
|
|
72
|
+
// test -e equivalent
|
|
73
|
+
'resolve-path',
|
|
74
|
+
// realpath equivalent
|
|
75
|
+
'get-process',
|
|
76
|
+
// ps equivalent
|
|
77
|
+
'get-service',
|
|
78
|
+
// system info
|
|
79
|
+
'get-childitem',
|
|
80
|
+
// ls/dir equivalent (also search when recursive)
|
|
81
|
+
'get-location',
|
|
82
|
+
// pwd equivalent
|
|
83
|
+
'get-filehash',
|
|
84
|
+
// checksum
|
|
85
|
+
'get-acl',
|
|
86
|
+
// permissions info
|
|
87
|
+
'format-hex' // hexdump equivalent
|
|
88
|
+
]);
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* PowerShell semantic-neutral commands that don't change the search/read nature.
|
|
92
|
+
*/
|
|
93
|
+
const PS_SEMANTIC_NEUTRAL_COMMANDS = new Set(['write-output',
|
|
94
|
+
// echo equivalent
|
|
95
|
+
'write-host']);
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Checks if a PowerShell command is a search or read operation.
|
|
99
|
+
* Used to determine if the command should be collapsed in the UI.
|
|
100
|
+
*/
|
|
101
|
+
function isSearchOrReadPowerShellCommand(command: string): {
|
|
102
|
+
isSearch: boolean;
|
|
103
|
+
isRead: boolean;
|
|
104
|
+
} {
|
|
105
|
+
const trimmed = command.trim();
|
|
106
|
+
if (!trimmed) {
|
|
107
|
+
return {
|
|
108
|
+
isSearch: false,
|
|
109
|
+
isRead: false
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Simple split on statement separators and pipe operators
|
|
114
|
+
// This is a sync function so we use a lightweight approach
|
|
115
|
+
const parts = trimmed.split(/\s*[;|]\s*/).filter(Boolean);
|
|
116
|
+
if (parts.length === 0) {
|
|
117
|
+
return {
|
|
118
|
+
isSearch: false,
|
|
119
|
+
isRead: false
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
let hasSearch = false;
|
|
123
|
+
let hasRead = false;
|
|
124
|
+
let hasNonNeutralCommand = false;
|
|
125
|
+
for (const part of parts) {
|
|
126
|
+
const baseCommand = part.trim().split(/\s+/)[0];
|
|
127
|
+
if (!baseCommand) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const canonical = resolveToCanonical(baseCommand);
|
|
131
|
+
if (PS_SEMANTIC_NEUTRAL_COMMANDS.has(canonical)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
hasNonNeutralCommand = true;
|
|
135
|
+
const isPartSearch = PS_SEARCH_COMMANDS.has(canonical);
|
|
136
|
+
const isPartRead = PS_READ_COMMANDS.has(canonical);
|
|
137
|
+
if (!isPartSearch && !isPartRead) {
|
|
138
|
+
return {
|
|
139
|
+
isSearch: false,
|
|
140
|
+
isRead: false
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (isPartSearch) hasSearch = true;
|
|
144
|
+
if (isPartRead) hasRead = true;
|
|
145
|
+
}
|
|
146
|
+
if (!hasNonNeutralCommand) {
|
|
147
|
+
return {
|
|
148
|
+
isSearch: false,
|
|
149
|
+
isRead: false
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
isSearch: hasSearch,
|
|
154
|
+
isRead: hasRead
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Progress display constants
|
|
159
|
+
const PROGRESS_THRESHOLD_MS = 2000;
|
|
160
|
+
const PROGRESS_INTERVAL_MS = 1000;
|
|
161
|
+
// In assistant mode, blocking commands auto-background after this many ms in the main agent
|
|
162
|
+
const ASSISTANT_BLOCKING_BUDGET_MS = 15_000;
|
|
163
|
+
|
|
164
|
+
// Commands that should not be auto-backgrounded (canonical lowercase).
|
|
165
|
+
// 'sleep' is a PS built-in alias for Start-Sleep but not in COMMON_ALIASES,
|
|
166
|
+
// so list both forms.
|
|
167
|
+
const DISALLOWED_AUTO_BACKGROUND_COMMANDS = ['start-sleep',
|
|
168
|
+
// Start-Sleep should run in foreground unless explicitly backgrounded
|
|
169
|
+
'sleep'];
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Checks if a command is allowed to be automatically backgrounded
|
|
173
|
+
* @param command The command to check
|
|
174
|
+
* @returns false for commands that should not be auto-backgrounded (like Start-Sleep)
|
|
175
|
+
*/
|
|
176
|
+
function isAutobackgroundingAllowed(command: string): boolean {
|
|
177
|
+
const firstWord = command.trim().split(/\s+/)[0];
|
|
178
|
+
if (!firstWord) return true;
|
|
179
|
+
const canonical = resolveToCanonical(firstWord);
|
|
180
|
+
return !DISALLOWED_AUTO_BACKGROUND_COMMANDS.includes(canonical);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* PS-flavored port of BashTool's detectBlockedSleepPattern.
|
|
185
|
+
* Catches `Start-Sleep N`, `Start-Sleep -Seconds N`, `sleep N` (built-in alias)
|
|
186
|
+
* as the first statement. Does NOT block `Start-Sleep -Milliseconds` (sub-second
|
|
187
|
+
* pacing is fine) or float seconds (legit rate limiting).
|
|
188
|
+
*/
|
|
189
|
+
export function detectBlockedSleepPattern(command: string): string | null {
|
|
190
|
+
// First statement only — split on PS statement separators: `;`, `|`,
|
|
191
|
+
// `&`/`&&`/`||` (pwsh 7+), and newline (PS's primary separator). This is
|
|
192
|
+
// intentionally shallow — sleep inside script blocks, subshells, or later
|
|
193
|
+
// pipeline stages is fine. Matches BashTool's splitCommandWithOperators
|
|
194
|
+
// intent (src/utils/bash/commands.ts) without a full PS parser.
|
|
195
|
+
const first = command.trim().split(/[;|&\r\n]/)[0]?.trim() ?? '';
|
|
196
|
+
// Match: Start-Sleep N, Start-Sleep -Seconds N, Start-Sleep -s N, sleep N
|
|
197
|
+
// (case-insensitive; -Seconds can be abbreviated to -s per PS convention)
|
|
198
|
+
const m = /^(?:start-sleep|sleep)(?:\s+-s(?:econds)?)?\s+(\d+)\s*$/i.exec(first);
|
|
199
|
+
if (!m) return null;
|
|
200
|
+
const secs = parseInt(m[1]!, 10);
|
|
201
|
+
if (secs < 2) return null; // sub-2s sleeps are fine (rate limiting, pacing)
|
|
202
|
+
|
|
203
|
+
const rest = command.trim().slice(first.length).replace(/^[\s;|&]+/, '');
|
|
204
|
+
return rest ? `Start-Sleep ${secs} followed by: ${rest}` : `standalone Start-Sleep ${secs}`;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* On Windows native, sandbox is unavailable (bwrap/sandbox-exec are
|
|
209
|
+
* POSIX-only). If enterprise policy has sandbox.enabled AND forbids
|
|
210
|
+
* unsandboxed commands, PowerShell cannot comply — refuse execution
|
|
211
|
+
* rather than silently bypass the policy. On Linux/macOS/WSL2, pwsh
|
|
212
|
+
* runs as a native binary under the sandbox same as bash, so this
|
|
213
|
+
* gate does not apply.
|
|
214
|
+
*
|
|
215
|
+
* Checked in BOTH validateInput (clean tool-runner error) and call()
|
|
216
|
+
* (covers direct callers like promptShellExecution.ts that skip
|
|
217
|
+
* validateInput). The call() guard is the load-bearing one.
|
|
218
|
+
*/
|
|
219
|
+
const WINDOWS_SANDBOX_POLICY_REFUSAL = 'Enterprise policy requires sandboxing, but sandboxing is not available on native Windows. Shell command execution is blocked on this platform by policy.';
|
|
220
|
+
function isWindowsSandboxPolicyViolation(): boolean {
|
|
221
|
+
return getPlatform() === 'windows' && SandboxManager.isSandboxEnabledInSettings() && !SandboxManager.areUnsandboxedCommandsAllowed();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Check if background tasks are disabled at module load time
|
|
225
|
+
const isBackgroundTasksDisabled =
|
|
226
|
+
// eslint-disable-next-line custom-rules/no-process-env-top-level -- Intentional: schema must be defined at module load
|
|
227
|
+
isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_BACKGROUND_TASKS);
|
|
228
|
+
const fullInputSchema = lazySchema(() => z.strictObject({
|
|
229
|
+
command: z.string().describe('The PowerShell command to execute'),
|
|
230
|
+
timeout: semanticNumber(z.number().optional()).describe(`Optional timeout in milliseconds (max ${getMaxTimeoutMs()})`),
|
|
231
|
+
description: z.string().optional().describe('Clear, concise description of what this command does in active voice.'),
|
|
232
|
+
run_in_background: semanticBoolean(z.boolean().optional()).describe(`Set to true to run this command in the background. Use Read to read the output later.`),
|
|
233
|
+
dangerouslyDisableSandbox: semanticBoolean(z.boolean().optional()).describe('Set this to true to dangerously override sandbox mode and run commands without sandboxing.')
|
|
234
|
+
}));
|
|
235
|
+
|
|
236
|
+
// Conditionally remove run_in_background from schema when background tasks are disabled
|
|
237
|
+
const inputSchema = lazySchema(() => isBackgroundTasksDisabled ? fullInputSchema().omit({
|
|
238
|
+
run_in_background: true
|
|
239
|
+
}) : fullInputSchema());
|
|
240
|
+
type InputSchema = ReturnType<typeof inputSchema>;
|
|
241
|
+
|
|
242
|
+
// Use fullInputSchema for the type to always include run_in_background
|
|
243
|
+
// (even when it's omitted from the schema, the code needs to handle it)
|
|
244
|
+
export type PowerShellToolInput = z.infer<ReturnType<typeof fullInputSchema>>;
|
|
245
|
+
const outputSchema = lazySchema(() => z.object({
|
|
246
|
+
stdout: z.string().describe('The standard output of the command'),
|
|
247
|
+
stderr: z.string().describe('The standard error output of the command'),
|
|
248
|
+
interrupted: z.boolean().describe('Whether the command was interrupted'),
|
|
249
|
+
returnCodeInterpretation: z.string().optional().describe('Semantic interpretation for non-error exit codes with special meaning'),
|
|
250
|
+
isImage: z.boolean().optional().describe('Flag to indicate if stdout contains image data'),
|
|
251
|
+
persistedOutputPath: z.string().optional().describe('Path to persisted full output when too large for inline'),
|
|
252
|
+
persistedOutputSize: z.number().optional().describe('Total output size in bytes when persisted'),
|
|
253
|
+
backgroundTaskId: z.string().optional().describe('ID of the background task if command is running in background'),
|
|
254
|
+
backgroundedByUser: z.boolean().optional().describe('True if the user manually backgrounded the command with Ctrl+B'),
|
|
255
|
+
assistantAutoBackgrounded: z.boolean().optional().describe('True if the command was auto-backgrounded by the assistant-mode blocking budget')
|
|
256
|
+
}));
|
|
257
|
+
type OutputSchema = ReturnType<typeof outputSchema>;
|
|
258
|
+
export type Out = z.infer<OutputSchema>;
|
|
259
|
+
import type { PowerShellProgress } from '../../types/tools.js';
|
|
260
|
+
export type { PowerShellProgress } from '../../types/tools.js';
|
|
261
|
+
const COMMON_BACKGROUND_COMMANDS = ['npm', 'yarn', 'pnpm', 'node', 'python', 'python3', 'go', 'cargo', 'make', 'docker', 'terraform', 'webpack', 'vite', 'jest', 'pytest', 'curl', 'Invoke-WebRequest', 'build', 'test', 'serve', 'watch', 'dev'] as const;
|
|
262
|
+
function getCommandTypeForLogging(command: string): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS {
|
|
263
|
+
const trimmed = command.trim();
|
|
264
|
+
const firstWord = trimmed.split(/\s+/)[0] || '';
|
|
265
|
+
for (const cmd of COMMON_BACKGROUND_COMMANDS) {
|
|
266
|
+
if (firstWord.toLowerCase() === cmd.toLowerCase()) {
|
|
267
|
+
return cmd as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return 'other' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS;
|
|
271
|
+
}
|
|
272
|
+
export const PowerShellTool = buildTool({
|
|
273
|
+
name: POWERSHELL_TOOL_NAME,
|
|
274
|
+
searchHint: 'execute Windows PowerShell commands',
|
|
275
|
+
maxResultSizeChars: 30_000,
|
|
276
|
+
strict: true,
|
|
277
|
+
async description({
|
|
278
|
+
description
|
|
279
|
+
}: Partial<PowerShellToolInput>): Promise<string> {
|
|
280
|
+
return description || 'Run PowerShell command';
|
|
281
|
+
},
|
|
282
|
+
async prompt(): Promise<string> {
|
|
283
|
+
return getPrompt();
|
|
284
|
+
},
|
|
285
|
+
isConcurrencySafe(input: PowerShellToolInput): boolean {
|
|
286
|
+
return this.isReadOnly?.(input) ?? false;
|
|
287
|
+
},
|
|
288
|
+
isSearchOrReadCommand(input: Partial<PowerShellToolInput>): {
|
|
289
|
+
isSearch: boolean;
|
|
290
|
+
isRead: boolean;
|
|
291
|
+
} {
|
|
292
|
+
if (!input.command) {
|
|
293
|
+
return {
|
|
294
|
+
isSearch: false,
|
|
295
|
+
isRead: false
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
return isSearchOrReadPowerShellCommand(input.command);
|
|
299
|
+
},
|
|
300
|
+
isReadOnly(input: PowerShellToolInput): boolean {
|
|
301
|
+
// Check sync security heuristics before declaring read-only.
|
|
302
|
+
// The full AST parse is async and unavailable here, so we use
|
|
303
|
+
// regex-based detection of subexpressions, splatting, member
|
|
304
|
+
// invocations, and assignments — matching BashTool's pattern of
|
|
305
|
+
// checking security concerns before cmdlet allowlist evaluation.
|
|
306
|
+
if (hasSyncSecurityConcerns(input.command)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
// NOTE: This calls isReadOnlyCommand without the parsed AST. Without the
|
|
310
|
+
// AST, isReadOnlyCommand cannot split pipelines/statements and will return
|
|
311
|
+
// false for anything but the simplest single-token commands. This is a
|
|
312
|
+
// known limitation of the sync Tool.isReadOnly() interface — the real
|
|
313
|
+
// read-only auto-allow happens async in powershellToolHasPermission (step
|
|
314
|
+
// 4.5) where the parsed AST is available.
|
|
315
|
+
return isReadOnlyCommand(input.command);
|
|
316
|
+
},
|
|
317
|
+
toAutoClassifierInput(input) {
|
|
318
|
+
return input.command;
|
|
319
|
+
},
|
|
320
|
+
get inputSchema(): InputSchema {
|
|
321
|
+
return inputSchema();
|
|
322
|
+
},
|
|
323
|
+
get outputSchema(): OutputSchema {
|
|
324
|
+
return outputSchema();
|
|
325
|
+
},
|
|
326
|
+
userFacingName(): string {
|
|
327
|
+
return 'PowerShell';
|
|
328
|
+
},
|
|
329
|
+
getToolUseSummary(input: Partial<PowerShellToolInput> | undefined): string | null {
|
|
330
|
+
if (!input?.command) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
const {
|
|
334
|
+
command,
|
|
335
|
+
description
|
|
336
|
+
} = input;
|
|
337
|
+
if (description) {
|
|
338
|
+
return description;
|
|
339
|
+
}
|
|
340
|
+
return truncate(command, TOOL_SUMMARY_MAX_LENGTH);
|
|
341
|
+
},
|
|
342
|
+
getActivityDescription(input: Partial<PowerShellToolInput> | undefined): string {
|
|
343
|
+
if (!input?.command) {
|
|
344
|
+
return 'Running command';
|
|
345
|
+
}
|
|
346
|
+
const desc = input.description ?? truncate(input.command, TOOL_SUMMARY_MAX_LENGTH);
|
|
347
|
+
return `Running ${desc}`;
|
|
348
|
+
},
|
|
349
|
+
isEnabled(): boolean {
|
|
350
|
+
return true;
|
|
351
|
+
},
|
|
352
|
+
async validateInput(input: PowerShellToolInput): Promise<ValidationResult> {
|
|
353
|
+
// Defense-in-depth: also guarded in call() for direct callers.
|
|
354
|
+
if (isWindowsSandboxPolicyViolation()) {
|
|
355
|
+
return {
|
|
356
|
+
result: false,
|
|
357
|
+
message: WINDOWS_SANDBOX_POLICY_REFUSAL,
|
|
358
|
+
errorCode: 11
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
if (feature('MONITOR_TOOL') && !isBackgroundTasksDisabled && !input.run_in_background) {
|
|
362
|
+
const sleepPattern = detectBlockedSleepPattern(input.command);
|
|
363
|
+
if (sleepPattern !== null) {
|
|
364
|
+
return {
|
|
365
|
+
result: false,
|
|
366
|
+
message: `Blocked: ${sleepPattern}. Run blocking commands in the background with run_in_background: true — you'll get a completion notification when done. For streaming events (watching logs, polling APIs), use the Monitor tool. If you genuinely need a delay (rate limiting, deliberate pacing), keep it under 2 seconds.`,
|
|
367
|
+
errorCode: 10
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
result: true
|
|
373
|
+
};
|
|
374
|
+
},
|
|
375
|
+
async checkPermissions(input: PowerShellToolInput, context: Parameters<Tool['checkPermissions']>[1]): Promise<PermissionResult> {
|
|
376
|
+
return await powershellToolHasPermission(input, context);
|
|
377
|
+
},
|
|
378
|
+
renderToolUseMessage,
|
|
379
|
+
renderToolUseProgressMessage,
|
|
380
|
+
renderToolUseQueuedMessage,
|
|
381
|
+
renderToolResultMessage,
|
|
382
|
+
renderToolUseErrorMessage,
|
|
383
|
+
mapToolResultToToolResultBlockParam({
|
|
384
|
+
interrupted,
|
|
385
|
+
stdout,
|
|
386
|
+
stderr,
|
|
387
|
+
isImage,
|
|
388
|
+
persistedOutputPath,
|
|
389
|
+
persistedOutputSize,
|
|
390
|
+
backgroundTaskId,
|
|
391
|
+
backgroundedByUser,
|
|
392
|
+
assistantAutoBackgrounded
|
|
393
|
+
}: Out, toolUseID: string): ToolResultBlockParam {
|
|
394
|
+
// For image data, format as image content block for Claude
|
|
395
|
+
if (isImage) {
|
|
396
|
+
const block = buildImageToolResult(stdout, toolUseID);
|
|
397
|
+
if (block) return block;
|
|
398
|
+
}
|
|
399
|
+
let processedStdout = stdout;
|
|
400
|
+
if (persistedOutputPath) {
|
|
401
|
+
const trimmed = stdout ? stdout.replace(/^(\s*\n)+/, '').trimEnd() : '';
|
|
402
|
+
const preview = generatePreview(trimmed, PREVIEW_SIZE_BYTES);
|
|
403
|
+
processedStdout = buildLargeToolResultMessage({
|
|
404
|
+
filepath: persistedOutputPath,
|
|
405
|
+
originalSize: persistedOutputSize ?? 0,
|
|
406
|
+
isJson: false,
|
|
407
|
+
preview: preview.preview,
|
|
408
|
+
hasMore: preview.hasMore
|
|
409
|
+
});
|
|
410
|
+
} else if (stdout) {
|
|
411
|
+
processedStdout = stdout.replace(/^(\s*\n)+/, '');
|
|
412
|
+
processedStdout = processedStdout.trimEnd();
|
|
413
|
+
}
|
|
414
|
+
let errorMessage = stderr.trim();
|
|
415
|
+
if (interrupted) {
|
|
416
|
+
if (stderr) errorMessage += EOL;
|
|
417
|
+
errorMessage += '<error>Command was aborted before completion</error>';
|
|
418
|
+
}
|
|
419
|
+
let backgroundInfo = '';
|
|
420
|
+
if (backgroundTaskId) {
|
|
421
|
+
const outputPath = getTaskOutputPath(backgroundTaskId);
|
|
422
|
+
if (assistantAutoBackgrounded) {
|
|
423
|
+
backgroundInfo = `Command exceeded the assistant-mode blocking budget (${ASSISTANT_BLOCKING_BUDGET_MS / 1000}s) and was moved to the background with ID: ${backgroundTaskId}. It is still running — you will be notified when it completes. Output is being written to: ${outputPath}. In assistant mode, delegate long-running work to a subagent or use run_in_background to keep this conversation responsive.`;
|
|
424
|
+
} else if (backgroundedByUser) {
|
|
425
|
+
backgroundInfo = `Command was manually backgrounded by user with ID: ${backgroundTaskId}. Output is being written to: ${outputPath}`;
|
|
426
|
+
} else {
|
|
427
|
+
backgroundInfo = `Command running in background with ID: ${backgroundTaskId}. Output is being written to: ${outputPath}`;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
tool_use_id: toolUseID,
|
|
432
|
+
type: 'tool_result' as const,
|
|
433
|
+
content: [processedStdout, errorMessage, backgroundInfo].filter(Boolean).join('\n'),
|
|
434
|
+
is_error: interrupted
|
|
435
|
+
};
|
|
436
|
+
},
|
|
437
|
+
async call(input: PowerShellToolInput, toolUseContext: Parameters<Tool['call']>[1], _canUseTool?: CanUseToolFn, _parentMessage?: AssistantMessage, onProgress?: ToolCallProgress<PowerShellProgress>): Promise<{
|
|
438
|
+
data: Out;
|
|
439
|
+
}> {
|
|
440
|
+
// Load-bearing guard: promptShellExecution.ts and processBashCommand.tsx
|
|
441
|
+
// call PowerShellTool.call() directly, bypassing validateInput. This is
|
|
442
|
+
// the check that covers ALL callers. See isWindowsSandboxPolicyViolation
|
|
443
|
+
// comment for the policy rationale.
|
|
444
|
+
if (isWindowsSandboxPolicyViolation()) {
|
|
445
|
+
throw new Error(WINDOWS_SANDBOX_POLICY_REFUSAL);
|
|
446
|
+
}
|
|
447
|
+
const {
|
|
448
|
+
abortController,
|
|
449
|
+
setAppState,
|
|
450
|
+
setToolJSX
|
|
451
|
+
} = toolUseContext;
|
|
452
|
+
const isMainThread = !toolUseContext.agentId;
|
|
453
|
+
let progressCounter = 0;
|
|
454
|
+
try {
|
|
455
|
+
const commandGenerator = runPowerShellCommand({
|
|
456
|
+
input,
|
|
457
|
+
abortController,
|
|
458
|
+
// Use the always-shared task channel so async agents' background
|
|
459
|
+
// shell tasks are actually registered (and killable on agent exit).
|
|
460
|
+
setAppState: toolUseContext.setAppStateForTasks ?? setAppState,
|
|
461
|
+
setToolJSX,
|
|
462
|
+
preventCwdChanges: !isMainThread,
|
|
463
|
+
isMainThread,
|
|
464
|
+
toolUseId: toolUseContext.toolUseId,
|
|
465
|
+
agentId: toolUseContext.agentId
|
|
466
|
+
});
|
|
467
|
+
let generatorResult;
|
|
468
|
+
do {
|
|
469
|
+
generatorResult = await commandGenerator.next();
|
|
470
|
+
if (!generatorResult.done && onProgress) {
|
|
471
|
+
const progress = generatorResult.value;
|
|
472
|
+
onProgress({
|
|
473
|
+
toolUseID: `ps-progress-${progressCounter++}`,
|
|
474
|
+
data: {
|
|
475
|
+
type: 'powershell_progress',
|
|
476
|
+
output: progress.output,
|
|
477
|
+
fullOutput: progress.fullOutput,
|
|
478
|
+
elapsedTimeSeconds: progress.elapsedTimeSeconds,
|
|
479
|
+
totalLines: progress.totalLines,
|
|
480
|
+
totalBytes: progress.totalBytes,
|
|
481
|
+
timeoutMs: progress.timeoutMs,
|
|
482
|
+
taskId: progress.taskId
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
} while (!generatorResult.done);
|
|
487
|
+
const result = generatorResult.value;
|
|
488
|
+
|
|
489
|
+
// Feed git/PR usage metrics (same counters as BashTool). PS invokes
|
|
490
|
+
// git/gh/glab/curl as external binaries with identical syntax, so the
|
|
491
|
+
// shell-agnostic regex detection in trackGitOperations works as-is.
|
|
492
|
+
// Called before the backgroundTaskId early-return so backgrounded
|
|
493
|
+
// commands are counted too (matches BashTool.tsx:912).
|
|
494
|
+
//
|
|
495
|
+
// Pre-flight sentinel guard: the two PS pre-flight paths (pwsh-not-found,
|
|
496
|
+
// exec-spawn-catch) return code: 0 + empty stdout + stderr so call() can
|
|
497
|
+
// surface stderr gracefully instead of throwing ShellError. But
|
|
498
|
+
// gitOperationTracking.ts:48 treats code 0 as success and would
|
|
499
|
+
// regex-match the command, mis-counting a command that never ran.
|
|
500
|
+
// BashTool is safe — its pre-flight goes through createFailedCommand
|
|
501
|
+
// (code: 1) so tracking early-returns. Skip tracking on this sentinel.
|
|
502
|
+
const isPreFlightSentinel = result.code === 0 && !result.stdout && result.stderr && !result.backgroundTaskId;
|
|
503
|
+
if (!isPreFlightSentinel) {
|
|
504
|
+
trackGitOperations(input.command, result.code, result.stdout);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// Distinguish user-driven interrupt (new message submitted) from other
|
|
508
|
+
// interrupted states. Only user-interrupt should suppress ShellError —
|
|
509
|
+
// timeout-kill or process-kill with isError should still throw.
|
|
510
|
+
// Matches BashTool's isInterrupt.
|
|
511
|
+
const isInterrupt = result.interrupted && abortController.signal.reason === 'interrupt';
|
|
512
|
+
|
|
513
|
+
// Only the main thread tracks/resets cwd; agents have their own cwd
|
|
514
|
+
// isolation. Matches BashTool's !preventCwdChanges guard.
|
|
515
|
+
// Runs before the backgroundTaskId early-return: a command may change
|
|
516
|
+
// CWD before being backgrounded (e.g. `Set-Location C:\temp;
|
|
517
|
+
// Start-Sleep 60`), and BashTool has no such early return — its
|
|
518
|
+
// backgrounded results flow through resetCwdIfOutsideProject at :945.
|
|
519
|
+
let stderrForShellReset = '';
|
|
520
|
+
if (isMainThread) {
|
|
521
|
+
const appState = toolUseContext.getAppState();
|
|
522
|
+
if (resetCwdIfOutsideProject(appState.toolPermissionContext)) {
|
|
523
|
+
stderrForShellReset = stdErrAppendShellResetMessage('');
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// If backgrounded, return immediately with task ID. Strip hints first
|
|
528
|
+
// so interrupt-backgrounded fullOutput doesn't leak the tag to the
|
|
529
|
+
// model (BashTool has no early return, so all paths flow through its
|
|
530
|
+
// single extraction site).
|
|
531
|
+
if (result.backgroundTaskId) {
|
|
532
|
+
const bgExtracted = extractClaudeCodeHints(result.stdout || '', input.command);
|
|
533
|
+
if (isMainThread && bgExtracted.hints.length > 0) {
|
|
534
|
+
for (const hint of bgExtracted.hints) maybeRecordPluginHint(hint);
|
|
535
|
+
}
|
|
536
|
+
return {
|
|
537
|
+
data: {
|
|
538
|
+
stdout: bgExtracted.stripped,
|
|
539
|
+
stderr: [result.stderr || '', stderrForShellReset].filter(Boolean).join('\n'),
|
|
540
|
+
interrupted: false,
|
|
541
|
+
backgroundTaskId: result.backgroundTaskId,
|
|
542
|
+
backgroundedByUser: result.backgroundedByUser,
|
|
543
|
+
assistantAutoBackgrounded: result.assistantAutoBackgrounded
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
const stdoutAccumulator = new EndTruncatingAccumulator();
|
|
548
|
+
const processedStdout = (result.stdout || '').trimEnd();
|
|
549
|
+
stdoutAccumulator.append(processedStdout + EOL);
|
|
550
|
+
|
|
551
|
+
// Interpret exit code using semantic rules. PS-native cmdlets (Select-String,
|
|
552
|
+
// Compare-Object, Test-Path) exit 0 on no-match so they always hit the default
|
|
553
|
+
// here. This primarily handles external .exe's (grep, rg, findstr, fc, robocopy)
|
|
554
|
+
// where non-zero can mean "no match" / "files copied" rather than failure.
|
|
555
|
+
const interpretation = interpretCommandResult(input.command, result.code, processedStdout, result.stderr || '');
|
|
556
|
+
|
|
557
|
+
// getErrorParts() in toolErrors.ts already prepends 'Exit code N'
|
|
558
|
+
// from error.code when building the ShellError message. Do not
|
|
559
|
+
// duplicate it into stdout here (BashTool's append at :939 is dead
|
|
560
|
+
// code — it throws before stdoutAccumulator.toString() is read).
|
|
561
|
+
|
|
562
|
+
let stdout = stripEmptyLines(stdoutAccumulator.toString());
|
|
563
|
+
|
|
564
|
+
// Claude Code hints protocol: CLIs/SDKs gated on CLAUDECODE=1 emit a
|
|
565
|
+
// `<claude-code-hint />` tag to stderr (merged into stdout here). Scan,
|
|
566
|
+
// record for useClaudeCodeHintRecommendation to surface, then strip
|
|
567
|
+
// so the model never sees the tag — a zero-token side channel.
|
|
568
|
+
// Stripping runs unconditionally (subagent output must stay clean too);
|
|
569
|
+
// only the dialog recording is main-thread-only.
|
|
570
|
+
const extracted = extractClaudeCodeHints(stdout, input.command);
|
|
571
|
+
stdout = extracted.stripped;
|
|
572
|
+
if (isMainThread && extracted.hints.length > 0) {
|
|
573
|
+
for (const hint of extracted.hints) maybeRecordPluginHint(hint);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// preSpawnError means exec() succeeded but the inner shell failed before
|
|
577
|
+
// the command ran (e.g. CWD deleted). createFailedCommand sets code=1,
|
|
578
|
+
// which interpretCommandResult can mistake for grep-no-match / findstr
|
|
579
|
+
// string-not-found. Throw it directly. Matches BashTool.tsx:957.
|
|
580
|
+
if (result.preSpawnError) {
|
|
581
|
+
throw new Error(result.preSpawnError);
|
|
582
|
+
}
|
|
583
|
+
if (interpretation.isError && !isInterrupt) {
|
|
584
|
+
throw new ShellError(stdout, result.stderr || '', result.code, result.interrupted);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// Large output: file on disk has more than getMaxOutputLength() bytes.
|
|
588
|
+
// stdout already contains the first chunk. Copy the output file to the
|
|
589
|
+
// tool-results dir so the model can read it via FileRead. If > 64 MB,
|
|
590
|
+
// truncate after copying. Matches BashTool.tsx:983-1005.
|
|
591
|
+
//
|
|
592
|
+
// Placed AFTER the preSpawnError/ShellError throws (matches BashTool's
|
|
593
|
+
// ordering, where persistence is post-try/finally): a failing command
|
|
594
|
+
// that also produced >maxOutputLength bytes would otherwise do 3-4 disk
|
|
595
|
+
// syscalls, store to tool-results/, then throw — orphaning the file.
|
|
596
|
+
const MAX_PERSISTED_SIZE = 64 * 1024 * 1024;
|
|
597
|
+
let persistedOutputPath: string | undefined;
|
|
598
|
+
let persistedOutputSize: number | undefined;
|
|
599
|
+
if (result.outputFilePath && result.outputTaskId) {
|
|
600
|
+
try {
|
|
601
|
+
const fileStat = await fsStat(result.outputFilePath);
|
|
602
|
+
persistedOutputSize = fileStat.size;
|
|
603
|
+
await ensureToolResultsDir();
|
|
604
|
+
const dest = getToolResultPath(result.outputTaskId, false);
|
|
605
|
+
if (fileStat.size > MAX_PERSISTED_SIZE) {
|
|
606
|
+
await fsTruncate(result.outputFilePath, MAX_PERSISTED_SIZE);
|
|
607
|
+
}
|
|
608
|
+
try {
|
|
609
|
+
await link(result.outputFilePath, dest);
|
|
610
|
+
} catch {
|
|
611
|
+
await copyFile(result.outputFilePath, dest);
|
|
612
|
+
}
|
|
613
|
+
persistedOutputPath = dest;
|
|
614
|
+
} catch {
|
|
615
|
+
// File may already be gone — stdout preview is sufficient
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// Cap image dimensions + size if present (CC-304 — see
|
|
620
|
+
// resizeShellImageOutput). Scope the decoded buffer so it can be
|
|
621
|
+
// reclaimed before we build the output object.
|
|
622
|
+
let isImage = isImageOutput(stdout);
|
|
623
|
+
let compressedStdout = stdout;
|
|
624
|
+
if (isImage) {
|
|
625
|
+
const resized = await resizeShellImageOutput(stdout, result.outputFilePath, persistedOutputSize);
|
|
626
|
+
if (resized) {
|
|
627
|
+
compressedStdout = resized;
|
|
628
|
+
} else {
|
|
629
|
+
// Parse failed (e.g. multi-line stdout after the data URL). Keep
|
|
630
|
+
// isImage in sync with what we actually send so the UI label stays
|
|
631
|
+
// accurate — mapToolResultToToolResultBlockParam's defensive
|
|
632
|
+
// fallthrough will send text, not an image block.
|
|
633
|
+
isImage = false;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
const finalStderr = [result.stderr || '', stderrForShellReset].filter(Boolean).join('\n');
|
|
637
|
+
logEvent('tengu_powershell_tool_command_executed', {
|
|
638
|
+
command_type: getCommandTypeForLogging(input.command),
|
|
639
|
+
stdout_length: compressedStdout.length,
|
|
640
|
+
stderr_length: finalStderr.length,
|
|
641
|
+
exit_code: result.code,
|
|
642
|
+
interrupted: result.interrupted
|
|
643
|
+
});
|
|
644
|
+
return {
|
|
645
|
+
data: {
|
|
646
|
+
stdout: compressedStdout,
|
|
647
|
+
stderr: finalStderr,
|
|
648
|
+
interrupted: result.interrupted,
|
|
649
|
+
returnCodeInterpretation: interpretation.message,
|
|
650
|
+
isImage,
|
|
651
|
+
persistedOutputPath,
|
|
652
|
+
persistedOutputSize
|
|
653
|
+
}
|
|
654
|
+
};
|
|
655
|
+
} finally {
|
|
656
|
+
if (setToolJSX) setToolJSX(null);
|
|
657
|
+
}
|
|
658
|
+
},
|
|
659
|
+
isResultTruncated(output: Out): boolean {
|
|
660
|
+
return isOutputLineTruncated(output.stdout) || isOutputLineTruncated(output.stderr);
|
|
661
|
+
}
|
|
662
|
+
} satisfies ToolDef<InputSchema, Out>);
|
|
663
|
+
async function* runPowerShellCommand({
|
|
664
|
+
input,
|
|
665
|
+
abortController,
|
|
666
|
+
setAppState,
|
|
667
|
+
setToolJSX,
|
|
668
|
+
preventCwdChanges,
|
|
669
|
+
isMainThread,
|
|
670
|
+
toolUseId,
|
|
671
|
+
agentId
|
|
672
|
+
}: {
|
|
673
|
+
input: PowerShellToolInput;
|
|
674
|
+
abortController: AbortController;
|
|
675
|
+
setAppState: (f: (prev: AppState) => AppState) => void;
|
|
676
|
+
setToolJSX?: SetToolJSXFn;
|
|
677
|
+
preventCwdChanges?: boolean;
|
|
678
|
+
isMainThread?: boolean;
|
|
679
|
+
toolUseId?: string;
|
|
680
|
+
agentId?: AgentId;
|
|
681
|
+
}): AsyncGenerator<{
|
|
682
|
+
type: 'progress';
|
|
683
|
+
output: string;
|
|
684
|
+
fullOutput: string;
|
|
685
|
+
elapsedTimeSeconds: number;
|
|
686
|
+
totalLines: number;
|
|
687
|
+
totalBytes: number;
|
|
688
|
+
taskId?: string;
|
|
689
|
+
timeoutMs?: number;
|
|
690
|
+
}, ExecResult, void> {
|
|
691
|
+
const {
|
|
692
|
+
command,
|
|
693
|
+
description,
|
|
694
|
+
timeout,
|
|
695
|
+
run_in_background,
|
|
696
|
+
dangerouslyDisableSandbox
|
|
697
|
+
} = input;
|
|
698
|
+
const timeoutMs = Math.min(timeout || getDefaultTimeoutMs(), getMaxTimeoutMs());
|
|
699
|
+
let fullOutput = '';
|
|
700
|
+
let lastProgressOutput = '';
|
|
701
|
+
let lastTotalLines = 0;
|
|
702
|
+
let lastTotalBytes = 0;
|
|
703
|
+
let backgroundShellId: string | undefined = undefined;
|
|
704
|
+
let interruptBackgroundingStarted = false;
|
|
705
|
+
let assistantAutoBackgrounded = false;
|
|
706
|
+
|
|
707
|
+
// Progress signal: resolved when backgroundShellId is set in the async
|
|
708
|
+
// .then() path, waking the generator's Promise.race immediately instead of
|
|
709
|
+
// waiting for the next setTimeout tick (matches BashTool pattern).
|
|
710
|
+
let resolveProgress: (() => void) | null = null;
|
|
711
|
+
function createProgressSignal(): Promise<null> {
|
|
712
|
+
return new Promise<null>(resolve => {
|
|
713
|
+
resolveProgress = () => resolve(null);
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
const shouldAutoBackground = !isBackgroundTasksDisabled && isAutobackgroundingAllowed(command);
|
|
717
|
+
const powershellPath = await getCachedPowerShellPath();
|
|
718
|
+
if (!powershellPath) {
|
|
719
|
+
// Pre-flight failure: pwsh not installed. Return code 0 so call() surfaces
|
|
720
|
+
// this as a graceful stderr message rather than throwing ShellError — the
|
|
721
|
+
// command never ran, so there is no meaningful non-zero exit to report.
|
|
722
|
+
return {
|
|
723
|
+
stdout: '',
|
|
724
|
+
stderr: 'PowerShell is not available on this system.',
|
|
725
|
+
code: 0,
|
|
726
|
+
interrupted: false
|
|
727
|
+
};
|
|
728
|
+
}
|
|
729
|
+
let shellCommand: Awaited<ReturnType<typeof exec>>;
|
|
730
|
+
try {
|
|
731
|
+
shellCommand = await exec(command, abortController.signal, 'powershell', {
|
|
732
|
+
timeout: timeoutMs,
|
|
733
|
+
onProgress(lastLines, allLines, totalLines, totalBytes, isIncomplete) {
|
|
734
|
+
lastProgressOutput = lastLines;
|
|
735
|
+
fullOutput = allLines;
|
|
736
|
+
lastTotalLines = totalLines;
|
|
737
|
+
lastTotalBytes = isIncomplete ? totalBytes : 0;
|
|
738
|
+
},
|
|
739
|
+
preventCwdChanges,
|
|
740
|
+
// Sandbox works on Linux/macOS/WSL2 — pwsh there is a native binary and
|
|
741
|
+
// SandboxManager.wrapWithSandbox wraps it same as bash (Shell.ts uses
|
|
742
|
+
// /bin/sh for the outer spawn to parse the POSIX-quoted bwrap/sandbox-exec
|
|
743
|
+
// string). On Windows native, sandbox is unsupported; shouldUseSandbox()
|
|
744
|
+
// returns false via isSandboxingEnabled() → isSupportedPlatform() → false.
|
|
745
|
+
// The explicit platform check is redundant-but-obvious.
|
|
746
|
+
shouldUseSandbox: getPlatform() === 'windows' ? false : shouldUseSandbox({
|
|
747
|
+
command,
|
|
748
|
+
dangerouslyDisableSandbox
|
|
749
|
+
}),
|
|
750
|
+
shouldAutoBackground
|
|
751
|
+
});
|
|
752
|
+
} catch (e) {
|
|
753
|
+
logError(e);
|
|
754
|
+
// Pre-flight failure: spawn/exec rejected before the command ran. Use
|
|
755
|
+
// code 0 so call() returns stderr gracefully instead of throwing ShellError.
|
|
756
|
+
return {
|
|
757
|
+
stdout: '',
|
|
758
|
+
stderr: `Failed to execute PowerShell command: ${getErrorMessage(e)}`,
|
|
759
|
+
code: 0,
|
|
760
|
+
interrupted: false
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
const resultPromise = shellCommand.result;
|
|
764
|
+
|
|
765
|
+
// Helper to spawn a background task and return its ID
|
|
766
|
+
async function spawnBackgroundTask(): Promise<string> {
|
|
767
|
+
const handle = await spawnShellTask({
|
|
768
|
+
command,
|
|
769
|
+
description: description || command,
|
|
770
|
+
shellCommand,
|
|
771
|
+
toolUseId,
|
|
772
|
+
agentId
|
|
773
|
+
}, {
|
|
774
|
+
abortController,
|
|
775
|
+
getAppState: () => {
|
|
776
|
+
throw new Error('getAppState not available in runPowerShellCommand context');
|
|
777
|
+
},
|
|
778
|
+
setAppState
|
|
779
|
+
});
|
|
780
|
+
return handle.taskId;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
// Helper to start backgrounding with logging
|
|
784
|
+
function startBackgrounding(eventName: string, backgroundFn?: (shellId: string) => void): void {
|
|
785
|
+
// If a foreground task is already registered (via registerForeground in the
|
|
786
|
+
// progress loop), background it in-place instead of re-spawning. Re-spawning
|
|
787
|
+
// would overwrite tasks[taskId], emit a duplicate task_started SDK event,
|
|
788
|
+
// and leak the first cleanup callback.
|
|
789
|
+
if (foregroundTaskId) {
|
|
790
|
+
if (!backgroundExistingForegroundTask(foregroundTaskId, shellCommand, description || command, setAppState, toolUseId)) {
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
backgroundShellId = foregroundTaskId;
|
|
794
|
+
logEvent(eventName, {
|
|
795
|
+
command_type: getCommandTypeForLogging(command)
|
|
796
|
+
});
|
|
797
|
+
backgroundFn?.(foregroundTaskId);
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
// No foreground task registered — spawn a new background task
|
|
802
|
+
// Note: spawn is essentially synchronous despite being async
|
|
803
|
+
void spawnBackgroundTask().then(shellId => {
|
|
804
|
+
backgroundShellId = shellId;
|
|
805
|
+
|
|
806
|
+
// Wake the generator's Promise.race so it sees backgroundShellId.
|
|
807
|
+
// Without this, the generator waits for the current setTimeout to fire
|
|
808
|
+
// (up to ~1s) before noticing the backgrounding. Matches BashTool.
|
|
809
|
+
const resolve = resolveProgress;
|
|
810
|
+
if (resolve) {
|
|
811
|
+
resolveProgress = null;
|
|
812
|
+
resolve();
|
|
813
|
+
}
|
|
814
|
+
logEvent(eventName, {
|
|
815
|
+
command_type: getCommandTypeForLogging(command)
|
|
816
|
+
});
|
|
817
|
+
if (backgroundFn) {
|
|
818
|
+
backgroundFn(shellId);
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
// Set up auto-backgrounding on timeout if enabled
|
|
824
|
+
if (shellCommand.onTimeout && shouldAutoBackground) {
|
|
825
|
+
shellCommand.onTimeout(backgroundFn => {
|
|
826
|
+
startBackgrounding('tengu_powershell_command_timeout_backgrounded', backgroundFn);
|
|
827
|
+
});
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// In assistant mode, the main agent should stay responsive. Auto-background
|
|
831
|
+
// blocking commands after ASSISTANT_BLOCKING_BUDGET_MS so the agent can keep
|
|
832
|
+
// coordinating instead of waiting. The command keeps running — no state loss.
|
|
833
|
+
if (feature('KAIROS') && getKairosActive() && isMainThread && !isBackgroundTasksDisabled && run_in_background !== true) {
|
|
834
|
+
setTimeout(() => {
|
|
835
|
+
if (shellCommand.status === 'running' && backgroundShellId === undefined) {
|
|
836
|
+
assistantAutoBackgrounded = true;
|
|
837
|
+
startBackgrounding('tengu_powershell_command_assistant_auto_backgrounded');
|
|
838
|
+
}
|
|
839
|
+
}, ASSISTANT_BLOCKING_BUDGET_MS).unref();
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// Handle Claude asking to run it in the background explicitly
|
|
843
|
+
// When explicitly requested via run_in_background, always honor the request
|
|
844
|
+
// regardless of the command type (isAutobackgroundingAllowed only applies to automatic backgrounding)
|
|
845
|
+
if (run_in_background === true && !isBackgroundTasksDisabled) {
|
|
846
|
+
const shellId = await spawnBackgroundTask();
|
|
847
|
+
logEvent('tengu_powershell_command_explicitly_backgrounded', {
|
|
848
|
+
command_type: getCommandTypeForLogging(command)
|
|
849
|
+
});
|
|
850
|
+
return {
|
|
851
|
+
stdout: '',
|
|
852
|
+
stderr: '',
|
|
853
|
+
code: 0,
|
|
854
|
+
interrupted: false,
|
|
855
|
+
backgroundTaskId: shellId
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
// Start polling the output file for progress
|
|
860
|
+
TaskOutput.startPolling(shellCommand.taskOutput.taskId);
|
|
861
|
+
|
|
862
|
+
// Set up progress yielding with periodic checks
|
|
863
|
+
const startTime = Date.now();
|
|
864
|
+
let nextProgressTime = startTime + PROGRESS_THRESHOLD_MS;
|
|
865
|
+
let foregroundTaskId: string | undefined = undefined;
|
|
866
|
+
|
|
867
|
+
// Progress loop: wrap in try/finally so stopPolling is called on every exit
|
|
868
|
+
// path — normal completion, timeout/interrupt backgrounding, and Ctrl+B
|
|
869
|
+
// (matches BashTool pattern; see PR #18887 review thread at :560)
|
|
870
|
+
try {
|
|
871
|
+
while (true) {
|
|
872
|
+
const now = Date.now();
|
|
873
|
+
const timeUntilNextProgress = Math.max(0, nextProgressTime - now);
|
|
874
|
+
const progressSignal = createProgressSignal();
|
|
875
|
+
const result = await Promise.race([resultPromise, new Promise<null>(resolve => setTimeout(r => r(null), timeUntilNextProgress, resolve).unref()), progressSignal]);
|
|
876
|
+
if (result !== null) {
|
|
877
|
+
// Race: backgrounding fired (15s timer / onTimeout / Ctrl+B) but the
|
|
878
|
+
// command completed before the next poll tick. #handleExit sets
|
|
879
|
+
// backgroundTaskId but skips outputFilePath (it assumes the background
|
|
880
|
+
// message or <task_notification> will carry the path). Strip
|
|
881
|
+
// backgroundTaskId so the model sees a clean completed command,
|
|
882
|
+
// reconstruct outputFilePath for large outputs, and suppress the
|
|
883
|
+
// redundant <task_notification> from the .then() handler.
|
|
884
|
+
// Check result.backgroundTaskId (not the closure var) to also cover
|
|
885
|
+
// Ctrl+B, which calls shellCommand.background() directly.
|
|
886
|
+
if (result.backgroundTaskId !== undefined) {
|
|
887
|
+
markTaskNotified(result.backgroundTaskId, setAppState);
|
|
888
|
+
const fixedResult: ExecResult = {
|
|
889
|
+
...result,
|
|
890
|
+
backgroundTaskId: undefined
|
|
891
|
+
};
|
|
892
|
+
// Mirror ShellCommand.#handleExit's large-output branch that was
|
|
893
|
+
// skipped because #backgroundTaskId was set.
|
|
894
|
+
const {
|
|
895
|
+
taskOutput
|
|
896
|
+
} = shellCommand;
|
|
897
|
+
if (taskOutput.stdoutToFile && !taskOutput.outputFileRedundant) {
|
|
898
|
+
fixedResult.outputFilePath = taskOutput.path;
|
|
899
|
+
fixedResult.outputFileSize = taskOutput.outputFileSize;
|
|
900
|
+
fixedResult.outputTaskId = taskOutput.taskId;
|
|
901
|
+
}
|
|
902
|
+
// Command completed — cleanup stream listeners here. The finally
|
|
903
|
+
// block's guard (!backgroundShellId && status !== 'backgrounded')
|
|
904
|
+
// correctly skips cleanup for *running* backgrounded tasks, but
|
|
905
|
+
// in this race the process is done. Matches BashTool.tsx:1399.
|
|
906
|
+
shellCommand.cleanup();
|
|
907
|
+
return fixedResult;
|
|
908
|
+
}
|
|
909
|
+
// Command has completed
|
|
910
|
+
return result;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
// Check if command was backgrounded (by timeout or interrupt)
|
|
914
|
+
if (backgroundShellId) {
|
|
915
|
+
return {
|
|
916
|
+
stdout: interruptBackgroundingStarted ? fullOutput : '',
|
|
917
|
+
stderr: '',
|
|
918
|
+
code: 0,
|
|
919
|
+
interrupted: false,
|
|
920
|
+
backgroundTaskId: backgroundShellId,
|
|
921
|
+
assistantAutoBackgrounded
|
|
922
|
+
};
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
// User submitted a new message - background instead of killing
|
|
926
|
+
if (abortController.signal.aborted && abortController.signal.reason === 'interrupt' && !interruptBackgroundingStarted) {
|
|
927
|
+
interruptBackgroundingStarted = true;
|
|
928
|
+
if (!isBackgroundTasksDisabled) {
|
|
929
|
+
startBackgrounding('tengu_powershell_command_interrupt_backgrounded');
|
|
930
|
+
// Reloop so the backgroundShellId check (above) catches the sync
|
|
931
|
+
// foregroundTaskId→background path. Without this, we fall through
|
|
932
|
+
// to the Ctrl+B check below, which matches status==='backgrounded'
|
|
933
|
+
// and incorrectly returns backgroundedByUser:true. (bugs 020/021)
|
|
934
|
+
continue;
|
|
935
|
+
}
|
|
936
|
+
shellCommand.kill();
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
// Check if this foreground task was backgrounded via backgroundAll() (ctrl+b)
|
|
940
|
+
if (foregroundTaskId) {
|
|
941
|
+
if (shellCommand.status === 'backgrounded') {
|
|
942
|
+
return {
|
|
943
|
+
stdout: '',
|
|
944
|
+
stderr: '',
|
|
945
|
+
code: 0,
|
|
946
|
+
interrupted: false,
|
|
947
|
+
backgroundTaskId: foregroundTaskId,
|
|
948
|
+
backgroundedByUser: true
|
|
949
|
+
};
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
// Time for a progress update
|
|
954
|
+
const elapsed = Date.now() - startTime;
|
|
955
|
+
const elapsedSeconds = Math.floor(elapsed / 1000);
|
|
956
|
+
|
|
957
|
+
// Show backgrounding UI hint after threshold
|
|
958
|
+
if (!isBackgroundTasksDisabled && backgroundShellId === undefined && elapsedSeconds >= PROGRESS_THRESHOLD_MS / 1000 && setToolJSX) {
|
|
959
|
+
if (!foregroundTaskId) {
|
|
960
|
+
foregroundTaskId = registerForeground({
|
|
961
|
+
command,
|
|
962
|
+
description: description || command,
|
|
963
|
+
shellCommand,
|
|
964
|
+
agentId
|
|
965
|
+
}, setAppState, toolUseId);
|
|
966
|
+
}
|
|
967
|
+
setToolJSX({
|
|
968
|
+
jsx: <BackgroundHint />,
|
|
969
|
+
shouldHidePromptInput: false,
|
|
970
|
+
shouldContinueAnimation: true,
|
|
971
|
+
showSpinner: true
|
|
972
|
+
});
|
|
973
|
+
}
|
|
974
|
+
yield {
|
|
975
|
+
type: 'progress',
|
|
976
|
+
fullOutput,
|
|
977
|
+
output: lastProgressOutput,
|
|
978
|
+
elapsedTimeSeconds: elapsedSeconds,
|
|
979
|
+
totalLines: lastTotalLines,
|
|
980
|
+
totalBytes: lastTotalBytes,
|
|
981
|
+
taskId: shellCommand.taskOutput.taskId,
|
|
982
|
+
...(timeout ? {
|
|
983
|
+
timeoutMs
|
|
984
|
+
} : undefined)
|
|
985
|
+
};
|
|
986
|
+
nextProgressTime = Date.now() + PROGRESS_INTERVAL_MS;
|
|
987
|
+
}
|
|
988
|
+
} finally {
|
|
989
|
+
TaskOutput.stopPolling(shellCommand.taskOutput.taskId);
|
|
990
|
+
// Ensure cleanup runs on every exit path (success, rejection, abort).
|
|
991
|
+
// Skip when backgrounded — LocalShellTask owns cleanup for those.
|
|
992
|
+
// Matches main #21105.
|
|
993
|
+
if (!backgroundShellId && shellCommand.status !== 'backgrounded') {
|
|
994
|
+
if (foregroundTaskId) {
|
|
995
|
+
unregisterForeground(foregroundTaskId, setAppState);
|
|
996
|
+
}
|
|
997
|
+
shellCommand.cleanup();
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiVG9vbFJlc3VsdEJsb2NrUGFyYW0iLCJjb3B5RmlsZSIsInN0YXQiLCJmc1N0YXQiLCJ0cnVuY2F0ZSIsImZzVHJ1bmNhdGUiLCJsaW5rIiwiUmVhY3QiLCJDYW5Vc2VUb29sRm4iLCJBcHBTdGF0ZSIsInoiLCJnZXRLYWlyb3NBY3RpdmUiLCJUT09MX1NVTU1BUllfTUFYX0xFTkdUSCIsIkFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMiLCJsb2dFdmVudCIsIlNldFRvb2xKU1hGbiIsIlRvb2wiLCJUb29sQ2FsbFByb2dyZXNzIiwiVmFsaWRhdGlvblJlc3VsdCIsImJ1aWxkVG9vbCIsIlRvb2xEZWYiLCJiYWNrZ3JvdW5kRXhpc3RpbmdGb3JlZ3JvdW5kVGFzayIsIm1hcmtUYXNrTm90aWZpZWQiLCJyZWdpc3RlckZvcmVncm91bmQiLCJzcGF3blNoZWxsVGFzayIsInVucmVnaXN0ZXJGb3JlZ3JvdW5kIiwiQWdlbnRJZCIsIkFzc2lzdGFudE1lc3NhZ2UiLCJleHRyYWN0Q2xhdWRlQ29kZUhpbnRzIiwiaXNFbnZUcnV0aHkiLCJlcnJvck1lc3NhZ2UiLCJnZXRFcnJvck1lc3NhZ2UiLCJTaGVsbEVycm9yIiwibGF6eVNjaGVtYSIsImxvZ0Vycm9yIiwiUGVybWlzc2lvblJlc3VsdCIsImdldFBsYXRmb3JtIiwibWF5YmVSZWNvcmRQbHVnaW5IaW50IiwiZXhlYyIsIkV4ZWNSZXN1bHQiLCJTYW5kYm94TWFuYWdlciIsInNlbWFudGljQm9vbGVhbiIsInNlbWFudGljTnVtYmVyIiwiZ2V0Q2FjaGVkUG93ZXJTaGVsbFBhdGgiLCJFbmRUcnVuY2F0aW5nQWNjdW11bGF0b3IiLCJnZXRUYXNrT3V0cHV0UGF0aCIsIlRhc2tPdXRwdXQiLCJpc091dHB1dExpbmVUcnVuY2F0ZWQiLCJidWlsZExhcmdlVG9vbFJlc3VsdE1lc3NhZ2UiLCJlbnN1cmVUb29sUmVzdWx0c0RpciIsImdlbmVyYXRlUHJldmlldyIsImdldFRvb2xSZXN1bHRQYXRoIiwiUFJFVklFV19TSVpFX0JZVEVTIiwic2hvdWxkVXNlU2FuZGJveCIsIkJhY2tncm91bmRIaW50IiwiYnVpbGRJbWFnZVRvb2xSZXN1bHQiLCJpc0ltYWdlT3V0cHV0IiwicmVzZXRDd2RJZk91dHNpZGVQcm9qZWN0IiwicmVzaXplU2hlbGxJbWFnZU91dHB1dCIsInN0ZEVyckFwcGVuZFNoZWxsUmVzZXRNZXNzYWdlIiwic3RyaXBFbXB0eUxpbmVzIiwidHJhY2tHaXRPcGVyYXRpb25zIiwiaW50ZXJwcmV0Q29tbWFuZFJlc3VsdCIsInBvd2Vyc2hlbGxUb29sSGFzUGVybWlzc2lvbiIsImdldERlZmF1bHRUaW1lb3V0TXMiLCJnZXRNYXhUaW1lb3V0TXMiLCJnZXRQcm9tcHQiLCJoYXNTeW5jU2VjdXJpdHlDb25jZXJucyIsImlzUmVhZE9ubHlDb21tYW5kIiwicmVzb2x2ZVRvQ2Fub25pY2FsIiwiUE9XRVJTSEVMTF9UT09MX05BTUUiLCJyZW5kZXJUb29sUmVzdWx0TWVzc2FnZSIsInJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UiLCJyZW5kZXJUb29sVXNlTWVzc2FnZSIsInJlbmRlclRvb2xVc2VQcm9ncmVzc01lc3NhZ2UiLCJyZW5kZXJUb29sVXNlUXVldWVkTWVzc2FnZSIsIkVPTCIsIlBTX1NFQVJDSF9DT01NQU5EUyIsIlNldCIsIlBTX1JFQURfQ09NTUFORFMiLCJQU19TRU1BTlRJQ19ORVVUUkFMX0NPTU1BTkRTIiwiaXNTZWFyY2hPclJlYWRQb3dlclNoZWxsQ29tbWFuZCIsImNvbW1hbmQiLCJpc1NlYXJjaCIsImlzUmVhZCIsInRyaW1tZWQiLCJ0cmltIiwicGFydHMiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJsZW5ndGgiLCJoYXNTZWFyY2giLCJoYXNSZWFkIiwiaGFzTm9uTmV1dHJhbENvbW1hbmQiLCJwYXJ0IiwiYmFzZUNvbW1hbmQiLCJjYW5vbmljYWwiLCJoYXMiLCJpc1BhcnRTZWFyY2giLCJpc1BhcnRSZWFkIiwiUFJPR1JFU1NfVEhSRVNIT0xEX01TIiwiUFJPR1JFU1NfSU5URVJWQUxfTVMiLCJBU1NJU1RBTlRfQkxPQ0tJTkdfQlVER0VUX01TIiwiRElTQUxMT1dFRF9BVVRPX0JBQ0tHUk9VTkRfQ09NTUFORFMiLCJpc0F1dG9iYWNrZ3JvdW5kaW5nQWxsb3dlZCIsImZpcnN0V29yZCIsImluY2x1ZGVzIiwiZGV0ZWN0QmxvY2tlZFNsZWVwUGF0dGVybiIsImZpcnN0IiwibSIsInNlY3MiLCJwYXJzZUludCIsInJlc3QiLCJzbGljZSIsInJlcGxhY2UiLCJXSU5ET1dTX1NBTkRCT1hfUE9MSUNZX1JFRlVTQUwiLCJpc1dpbmRvd3NTYW5kYm94UG9saWN5VmlvbGF0aW9uIiwiaXNTYW5kYm94RW5hYmxlZEluU2V0dGluZ3MiLCJhcmVVbnNhbmRib3hlZENvbW1hbmRzQWxsb3dlZCIsImlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQiLCJwcm9jZXNzIiwiZW52IiwiQ0xBVURFX0NPREVfRElTQUJMRV9CQUNLR1JPVU5EX1RBU0tTIiwiZnVsbElucHV0U2NoZW1hIiwic3RyaWN0T2JqZWN0Iiwic3RyaW5nIiwiZGVzY3JpYmUiLCJ0aW1lb3V0IiwibnVtYmVyIiwib3B0aW9uYWwiLCJkZXNjcmlwdGlvbiIsInJ1bl9pbl9iYWNrZ3JvdW5kIiwiYm9vbGVhbiIsImRhbmdlcm91c2x5RGlzYWJsZVNhbmRib3giLCJpbnB1dFNjaGVtYSIsIm9taXQiLCJJbnB1dFNjaGVtYSIsIlJldHVyblR5cGUiLCJQb3dlclNoZWxsVG9vbElucHV0IiwiaW5mZXIiLCJvdXRwdXRTY2hlbWEiLCJvYmplY3QiLCJzdGRvdXQiLCJzdGRlcnIiLCJpbnRlcnJ1cHRlZCIsInJldHVybkNvZGVJbnRlcnByZXRhdGlvbiIsImlzSW1hZ2UiLCJwZXJzaXN0ZWRPdXRwdXRQYXRoIiwicGVyc2lzdGVkT3V0cHV0U2l6ZSIsImJhY2tncm91bmRUYXNrSWQiLCJiYWNrZ3JvdW5kZWRCeVVzZXIiLCJhc3Npc3RhbnRBdXRvQmFja2dyb3VuZGVkIiwiT3V0cHV0U2NoZW1hIiwiT3V0IiwiUG93ZXJTaGVsbFByb2dyZXNzIiwiQ09NTU9OX0JBQ0tHUk9VTkRfQ09NTUFORFMiLCJjb25zdCIsImdldENvbW1hbmRUeXBlRm9yTG9nZ2luZyIsImNtZCIsInRvTG93ZXJDYXNlIiwiUG93ZXJTaGVsbFRvb2wiLCJuYW1lIiwic2VhcmNoSGludCIsIm1heFJlc3VsdFNpemVDaGFycyIsInN0cmljdCIsIlBhcnRpYWwiLCJQcm9taXNlIiwicHJvbXB0IiwiaXNDb25jdXJyZW5jeVNhZmUiLCJpbnB1dCIsImlzUmVhZE9ubHkiLCJpc1NlYXJjaE9yUmVhZENvbW1hbmQiLCJ0b0F1dG9DbGFzc2lmaWVySW5wdXQiLCJ1c2VyRmFjaW5nTmFtZSIsImdldFRvb2xVc2VTdW1tYXJ5IiwiZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbiIsImRlc2MiLCJpc0VuYWJsZWQiLCJ2YWxpZGF0ZUlucHV0IiwicmVzdWx0IiwibWVzc2FnZSIsImVycm9yQ29kZSIsInNsZWVwUGF0dGVybiIsImNoZWNrUGVybWlzc2lvbnMiLCJjb250ZXh0IiwiUGFyYW1ldGVycyIsIm1hcFRvb2xSZXN1bHRUb1Rvb2xSZXN1bHRCbG9ja1BhcmFtIiwidG9vbFVzZUlEIiwiYmxvY2siLCJwcm9jZXNzZWRTdGRvdXQiLCJ0cmltRW5kIiwicHJldmlldyIsImZpbGVwYXRoIiwib3JpZ2luYWxTaXplIiwiaXNKc29uIiwiaGFzTW9yZSIsImJhY2tncm91bmRJbmZvIiwib3V0cHV0UGF0aCIsInRvb2xfdXNlX2lkIiwidHlwZSIsImNvbnRlbnQiLCJqb2luIiwiaXNfZXJyb3IiLCJjYWxsIiwidG9vbFVzZUNvbnRleHQiLCJfY2FuVXNlVG9vbCIsIl9wYXJlbnRNZXNzYWdlIiwib25Qcm9ncmVzcyIsImRhdGEiLCJFcnJvciIsImFib3J0Q29udHJvbGxlciIsInNldEFwcFN0YXRlIiwic2V0VG9vbEpTWCIsImlzTWFpblRocmVhZCIsImFnZW50SWQiLCJwcm9ncmVzc0NvdW50ZXIiLCJjb21tYW5kR2VuZXJhdG9yIiwicnVuUG93ZXJTaGVsbENvbW1hbmQiLCJzZXRBcHBTdGF0ZUZvclRhc2tzIiwicHJldmVudEN3ZENoYW5nZXMiLCJ0b29sVXNlSWQiLCJnZW5lcmF0b3JSZXN1bHQiLCJuZXh0IiwiZG9uZSIsInByb2dyZXNzIiwidmFsdWUiLCJvdXRwdXQiLCJmdWxsT3V0cHV0IiwiZWxhcHNlZFRpbWVTZWNvbmRzIiwidG90YWxMaW5lcyIsInRvdGFsQnl0ZXMiLCJ0aW1lb3V0TXMiLCJ0YXNrSWQiLCJpc1ByZUZsaWdodFNlbnRpbmVsIiwiY29kZSIsImlzSW50ZXJydXB0Iiwic2lnbmFsIiwicmVhc29uIiwic3RkZXJyRm9yU2hlbGxSZXNldCIsImFwcFN0YXRlIiwiZ2V0QXBwU3RhdGUiLCJ0b29sUGVybWlzc2lvbkNvbnRleHQiLCJiZ0V4dHJhY3RlZCIsImhpbnRzIiwiaGludCIsInN0cmlwcGVkIiwic3Rkb3V0QWNjdW11bGF0b3IiLCJhcHBlbmQiLCJpbnRlcnByZXRhdGlvbiIsInRvU3RyaW5nIiwiZXh0cmFjdGVkIiwicHJlU3Bhd25FcnJvciIsImlzRXJyb3IiLCJNQVhfUEVSU0lTVEVEX1NJWkUiLCJvdXRwdXRGaWxlUGF0aCIsIm91dHB1dFRhc2tJZCIsImZpbGVTdGF0Iiwic2l6ZSIsImRlc3QiLCJjb21wcmVzc2VkU3Rkb3V0IiwicmVzaXplZCIsImZpbmFsU3RkZXJyIiwiY29tbWFuZF90eXBlIiwic3Rkb3V0X2xlbmd0aCIsInN0ZGVycl9sZW5ndGgiLCJleGl0X2NvZGUiLCJpc1Jlc3VsdFRydW5jYXRlZCIsIkFib3J0Q29udHJvbGxlciIsImYiLCJwcmV2IiwiQXN5bmNHZW5lcmF0b3IiLCJNYXRoIiwibWluIiwibGFzdFByb2dyZXNzT3V0cHV0IiwibGFzdFRvdGFsTGluZXMiLCJsYXN0VG90YWxCeXRlcyIsImJhY2tncm91bmRTaGVsbElkIiwidW5kZWZpbmVkIiwiaW50ZXJydXB0QmFja2dyb3VuZGluZ1N0YXJ0ZWQiLCJyZXNvbHZlUHJvZ3Jlc3MiLCJjcmVhdGVQcm9ncmVzc1NpZ25hbCIsInJlc29sdmUiLCJzaG91bGRBdXRvQmFja2dyb3VuZCIsInBvd2Vyc2hlbGxQYXRoIiwic2hlbGxDb21tYW5kIiwiQXdhaXRlZCIsImxhc3RMaW5lcyIsImFsbExpbmVzIiwiaXNJbmNvbXBsZXRlIiwiZSIsInJlc3VsdFByb21pc2UiLCJzcGF3bkJhY2tncm91bmRUYXNrIiwiaGFuZGxlIiwic3RhcnRCYWNrZ3JvdW5kaW5nIiwiZXZlbnROYW1lIiwiYmFja2dyb3VuZEZuIiwic2hlbGxJZCIsImZvcmVncm91bmRUYXNrSWQiLCJ0aGVuIiwib25UaW1lb3V0Iiwic2V0VGltZW91dCIsInN0YXR1cyIsInVucmVmIiwic3RhcnRQb2xsaW5nIiwidGFza091dHB1dCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJuZXh0UHJvZ3Jlc3NUaW1lIiwidGltZVVudGlsTmV4dFByb2dyZXNzIiwibWF4IiwicHJvZ3Jlc3NTaWduYWwiLCJyYWNlIiwiciIsImZpeGVkUmVzdWx0Iiwic3Rkb3V0VG9GaWxlIiwib3V0cHV0RmlsZVJlZHVuZGFudCIsInBhdGgiLCJvdXRwdXRGaWxlU2l6ZSIsImNsZWFudXAiLCJhYm9ydGVkIiwia2lsbCIsImVsYXBzZWQiLCJlbGFwc2VkU2Vjb25kcyIsImZsb29yIiwianN4Iiwic2hvdWxkSGlkZVByb21wdElucHV0Iiwic2hvdWxkQ29udGludWVBbmltYXRpb24iLCJzaG93U3Bpbm5lciIsInN0b3BQb2xsaW5nIl0sInNvdXJjZXMiOlsiUG93ZXJTaGVsbFRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZlYXR1cmUgfSBmcm9tICdidW46YnVuZGxlJ1xuaW1wb3J0IHR5cGUgeyBUb29sUmVzdWx0QmxvY2tQYXJhbSB9IGZyb20gJ0BhbnRocm9waWMtYWkvc2RrL3Jlc291cmNlcy9pbmRleC5tanMnXG5pbXBvcnQge1xuICBjb3B5RmlsZSxcbiAgc3RhdCBhcyBmc1N0YXQsXG4gIHRydW5jYXRlIGFzIGZzVHJ1bmNhdGUsXG4gIGxpbmssXG59IGZyb20gJ2ZzL3Byb21pc2VzJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IENhblVzZVRvb2xGbiB9IGZyb20gJ3NyYy9ob29rcy91c2VDYW5Vc2VUb29sLmpzJ1xuaW1wb3J0IHR5cGUgeyBBcHBTdGF0ZSB9IGZyb20gJ3NyYy9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB7IHogfSBmcm9tICd6b2QvdjQnXG5pbXBvcnQgeyBnZXRLYWlyb3NBY3RpdmUgfSBmcm9tICcuLi8uLi9ib290c3RyYXAvc3RhdGUuanMnXG5pbXBvcnQgeyBUT09MX1NVTU1BUllfTUFYX0xFTkdUSCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy90b29sTGltaXRzLmpzJ1xuaW1wb3J0IHtcbiAgdHlwZSBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICBsb2dFdmVudCxcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUge1xuICBTZXRUb29sSlNYRm4sXG4gIFRvb2wsXG4gIFRvb2xDYWxsUHJvZ3Jlc3MsXG4gIFZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQgeyBidWlsZFRvb2wsIHR5cGUgVG9vbERlZiB9IGZyb20gJy4uLy4uL1Rvb2wuanMnXG5pbXBvcnQge1xuICBiYWNrZ3JvdW5kRXhpc3RpbmdGb3JlZ3JvdW5kVGFzayxcbiAgbWFya1Rhc2tOb3RpZmllZCxcbiAgcmVnaXN0ZXJGb3JlZ3JvdW5kLFxuICBzcGF3blNoZWxsVGFzayxcbiAgdW5yZWdpc3RlckZvcmVncm91bmQsXG59IGZyb20gJy4uLy4uL3Rhc2tzL0xvY2FsU2hlbGxUYXNrL0xvY2FsU2hlbGxUYXNrLmpzJ1xuaW1wb3J0IHR5cGUgeyBBZ2VudElkIH0gZnJvbSAnLi4vLi4vdHlwZXMvaWRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBBc3Npc3RhbnRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvbWVzc2FnZS5qcydcbmltcG9ydCB7IGV4dHJhY3RDbGF1ZGVDb2RlSGludHMgfSBmcm9tICcuLi8uLi91dGlscy9jbGF1ZGVDb2RlSGludHMuanMnXG5pbXBvcnQgeyBpc0VudlRydXRoeSB9IGZyb20gJy4uLy4uL3V0aWxzL2VudlV0aWxzLmpzJ1xuaW1wb3J0IHtcbiAgZXJyb3JNZXNzYWdlIGFzIGdldEVycm9yTWVzc2FnZSxcbiAgU2hlbGxFcnJvcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvZXJyb3JzLmpzJ1xuaW1wb3J0IHsgdHJ1bmNhdGUgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXQuanMnXG5pbXBvcnQgeyBsYXp5U2NoZW1hIH0gZnJvbSAnLi4vLi4vdXRpbHMvbGF6eVNjaGVtYS5qcydcbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJ1xuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvUGVybWlzc2lvblJlc3VsdC5qcydcbmltcG9ydCB7IGdldFBsYXRmb3JtIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGxhdGZvcm0uanMnXG5pbXBvcnQgeyBtYXliZVJlY29yZFBsdWdpbkhpbnQgfSBmcm9tICcuLi8uLi91dGlscy9wbHVnaW5zL2hpbnRSZWNvbW1lbmRhdGlvbi5qcydcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuLi8uLi91dGlscy9TaGVsbC5qcydcbmltcG9ydCB0eXBlIHsgRXhlY1Jlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL1NoZWxsQ29tbWFuZC5qcydcbmltcG9ydCB7IFNhbmRib3hNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2FuZGJveC9zYW5kYm94LWFkYXB0ZXIuanMnXG5pbXBvcnQgeyBzZW1hbnRpY0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy9zZW1hbnRpY0Jvb2xlYW4uanMnXG5pbXBvcnQgeyBzZW1hbnRpY051bWJlciB9IGZyb20gJy4uLy4uL3V0aWxzL3NlbWFudGljTnVtYmVyLmpzJ1xuaW1wb3J0IHsgZ2V0Q2FjaGVkUG93ZXJTaGVsbFBhdGggfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC9wb3dlcnNoZWxsRGV0ZWN0aW9uLmpzJ1xuaW1wb3J0IHsgRW5kVHJ1bmNhdGluZ0FjY3VtdWxhdG9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBnZXRUYXNrT3V0cHV0UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzL3Rhc2svZGlza091dHB1dC5qcydcbmltcG9ydCB7IFRhc2tPdXRwdXQgfSBmcm9tICcuLi8uLi91dGlscy90YXNrL1Rhc2tPdXRwdXQuanMnXG5pbXBvcnQgeyBpc091dHB1dExpbmVUcnVuY2F0ZWQgfSBmcm9tICcuLi8uLi91dGlscy90ZXJtaW5hbC5qcydcbmltcG9ydCB7XG4gIGJ1aWxkTGFyZ2VUb29sUmVzdWx0TWVzc2FnZSxcbiAgZW5zdXJlVG9vbFJlc3VsdHNEaXIsXG4gIGdlbmVyYXRlUHJldmlldyxcbiAgZ2V0VG9vbFJlc3VsdFBhdGgsXG4gIFBSRVZJRVdfU0laRV9CWVRFUyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvdG9vbFJlc3VsdFN0b3JhZ2UuanMnXG5pbXBvcnQgeyBzaG91bGRVc2VTYW5kYm94IH0gZnJvbSAnLi4vQmFzaFRvb2wvc2hvdWxkVXNlU2FuZGJveC5qcydcbmltcG9ydCB7IEJhY2tncm91bmRIaW50IH0gZnJvbSAnLi4vQmFzaFRvb2wvVUkuanMnXG5pbXBvcnQge1xuICBidWlsZEltYWdlVG9vbFJlc3VsdCxcbiAgaXNJbWFnZU91dHB1dCxcbiAgcmVzZXRDd2RJZk91dHNpZGVQcm9qZWN0LFxuICByZXNpemVTaGVsbEltYWdlT3V0cHV0LFxuICBzdGRFcnJBcHBlbmRTaGVsbFJlc2V0TWVzc2FnZSxcbiAgc3RyaXBFbXB0eUxpbmVzLFxufSBmcm9tICcuLi9CYXNoVG9vbC91dGlscy5qcydcbmltcG9ydCB7IHRyYWNrR2l0T3BlcmF0aW9ucyB9IGZyb20gJy4uL3NoYXJlZC9naXRPcGVyYXRpb25UcmFja2luZy5qcydcbmltcG9ydCB7IGludGVycHJldENvbW1hbmRSZXN1bHQgfSBmcm9tICcuL2NvbW1hbmRTZW1hbnRpY3MuanMnXG5pbXBvcnQgeyBwb3dlcnNoZWxsVG9vbEhhc1Blcm1pc3Npb24gfSBmcm9tICcuL3Bvd2Vyc2hlbGxQZXJtaXNzaW9ucy5qcydcbmltcG9ydCB7IGdldERlZmF1bHRUaW1lb3V0TXMsIGdldE1heFRpbWVvdXRNcywgZ2V0UHJvbXB0IH0gZnJvbSAnLi9wcm9tcHQuanMnXG5pbXBvcnQge1xuICBoYXNTeW5jU2VjdXJpdHlDb25jZXJucyxcbiAgaXNSZWFkT25seUNvbW1hbmQsXG4gIHJlc29sdmVUb0Nhbm9uaWNhbCxcbn0gZnJvbSAnLi9yZWFkT25seVZhbGlkYXRpb24uanMnXG5pbXBvcnQgeyBQT1dFUlNIRUxMX1RPT0xfTkFNRSB9IGZyb20gJy4vdG9vbE5hbWUuanMnXG5pbXBvcnQge1xuICByZW5kZXJUb29sUmVzdWx0TWVzc2FnZSxcbiAgcmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSxcbiAgcmVuZGVyVG9vbFVzZU1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VQcm9ncmVzc01lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VRdWV1ZWRNZXNzYWdlLFxufSBmcm9tICcuL1VJLmpzJ1xuXG4vLyBOZXZlciB1c2Ugb3MuRU9MIGZvciB0ZXJtaW5hbCBvdXRwdXQg4oCUIFxcclxcbiBvbiBXaW5kb3dzIGJyZWFrcyBJbmsgcmVuZGVyaW5nXG5jb25zdCBFT0wgPSAnXFxuJ1xuXG4vKipcbiAqIFBvd2VyU2hlbGwgc2VhcmNoIGNvbW1hbmRzIChncmVwIGVxdWl2YWxlbnRzKSBmb3IgY29sbGFwc2libGUgZGlzcGxheS5cbiAqIFN0b3JlZCBhcyBjYW5vbmljYWwgKGxvd2VyY2FzZSkgY21kbGV0IG5hbWVzLlxuICovXG5jb25zdCBQU19TRUFSQ0hfQ09NTUFORFMgPSBuZXcgU2V0KFtcbiAgJ3NlbGVjdC1zdHJpbmcnLCAvLyBncmVwIGVxdWl2YWxlbnRcbiAgJ2dldC1jaGlsZGl0ZW0nLCAvLyBmaW5kIGVxdWl2YWxlbnQgKHdpdGggLVJlY3Vyc2UpXG4gICdmaW5kc3RyJywgLy8gbmF0aXZlIFdpbmRvd3Mgc2VhcmNoXG4gICd3aGVyZS5leGUnLCAvLyBuYXRpdmUgV2luZG93cyB3aGljaFxuXSlcblxuLyoqXG4gKiBQb3dlclNoZWxsIHJlYWQvdmlldyBjb21tYW5kcyBmb3IgY29sbGFwc2libGUgZGlzcGxheS5cbiAqIFN0b3JlZCBhcyBjYW5vbmljYWwgKGxvd2VyY2FzZSkgY21kbGV0IG5hbWVzLlxuICovXG5jb25zdCBQU19SRUFEX0NPTU1BTkRTID0gbmV3IFNldChbXG4gICdnZXQtY29udGVudCcsIC8vIGNhdCBlcXVpdmFsZW50XG4gICdnZXQtaXRlbScsIC8vIGZpbGUgaW5mb1xuICAndGVzdC1wYXRoJywgLy8gdGVzdCAtZSBlcXVpdmFsZW50XG4gICdyZXNvbHZlLXBhdGgnLCAvLyByZWFscGF0aCBlcXVpdmFsZW50XG4gICdnZXQtcHJvY2VzcycsIC8vIHBzIGVxdWl2YWxlbnRcbiAgJ2dldC1zZXJ2aWNlJywgLy8gc3lzdGVtIGluZm9cbiAgJ2dldC1jaGlsZGl0ZW0nLCAvLyBscy9kaXIgZXF1aXZhbGVudCAoYWxzbyBzZWFyY2ggd2hlbiByZWN1cnNpdmUpXG4gICdnZXQtbG9jYXRpb24nLCAvLyBwd2QgZXF1aXZhbGVudFxuICAnZ2V0LWZpbGVoYXNoJywgLy8gY2hlY2tzdW1cbiAgJ2dldC1hY2wnLCAvLyBwZXJtaXNzaW9ucyBpbmZvXG4gICdmb3JtYXQtaGV4JywgLy8gaGV4ZHVtcCBlcXVpdmFsZW50XG5dKVxuXG4vKipcbiAqIFBvd2VyU2hlbGwgc2VtYW50aWMtbmV1dHJhbCBjb21tYW5kcyB0aGF0IGRvbid0IGNoYW5nZSB0aGUgc2VhcmNoL3JlYWQgbmF0dXJlLlxuICovXG5jb25zdCBQU19TRU1BTlRJQ19ORVVUUkFMX0NPTU1BTkRTID0gbmV3IFNldChbXG4gICd3cml0ZS1vdXRwdXQnLCAvLyBlY2hvIGVxdWl2YWxlbnRcbiAgJ3dyaXRlLWhvc3QnLFxuXSlcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBQb3dlclNoZWxsIGNvbW1hbmQgaXMgYSBzZWFyY2ggb3IgcmVhZCBvcGVyYXRpb24uXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgY29sbGFwc2VkIGluIHRoZSBVSS5cbiAqL1xuZnVuY3Rpb24gaXNTZWFyY2hPclJlYWRQb3dlclNoZWxsQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiB7XG4gIGlzU2VhcmNoOiBib29sZWFuXG4gIGlzUmVhZDogYm9vbGVhblxufSB7XG4gIGNvbnN0IHRyaW1tZWQgPSBjb21tYW5kLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4geyBpc1NlYXJjaDogZmFsc2UsIGlzUmVhZDogZmFsc2UgfVxuICB9XG5cbiAgLy8gU2ltcGxlIHNwbGl0IG9uIHN0YXRlbWVudCBzZXBhcmF0b3JzIGFuZCBwaXBlIG9wZXJhdG9yc1xuICAvLyBUaGlzIGlzIGEgc3luYyBmdW5jdGlvbiBzbyB3ZSB1c2UgYSBsaWdodHdlaWdodCBhcHByb2FjaFxuICBjb25zdCBwYXJ0cyA9IHRyaW1tZWQuc3BsaXQoL1xccypbO3xdXFxzKi8pLmZpbHRlcihCb29sZWFuKVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyBpc1NlYXJjaDogZmFsc2UsIGlzUmVhZDogZmFsc2UgfVxuICB9XG5cbiAgbGV0IGhhc1NlYXJjaCA9IGZhbHNlXG4gIGxldCBoYXNSZWFkID0gZmFsc2VcbiAgbGV0IGhhc05vbk5ldXRyYWxDb21tYW5kID0gZmFsc2VcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBiYXNlQ29tbWFuZCA9IHBhcnQudHJpbSgpLnNwbGl0KC9cXHMrLylbMF1cbiAgICBpZiAoIWJhc2VDb21tYW5kKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGNhbm9uaWNhbCA9IHJlc29sdmVUb0Nhbm9uaWNhbChiYXNlQ29tbWFuZClcblxuICAgIGlmIChQU19TRU1BTlRJQ19ORVVUUkFMX0NPTU1BTkRTLmhhcyhjYW5vbmljYWwpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGhhc05vbk5ldXRyYWxDb21tYW5kID0gdHJ1ZVxuXG4gICAgY29uc3QgaXNQYXJ0U2VhcmNoID0gUFNfU0VBUkNIX0NPTU1BTkRTLmhhcyhjYW5vbmljYWwpXG4gICAgY29uc3QgaXNQYXJ0UmVhZCA9IFBTX1JFQURfQ09NTUFORFMuaGFzKGNhbm9uaWNhbClcblxuICAgIGlmICghaXNQYXJ0U2VhcmNoICYmICFpc1BhcnRSZWFkKSB7XG4gICAgICByZXR1cm4geyBpc1NlYXJjaDogZmFsc2UsIGlzUmVhZDogZmFsc2UgfVxuICAgIH1cblxuICAgIGlmIChpc1BhcnRTZWFyY2gpIGhhc1NlYXJjaCA9IHRydWVcbiAgICBpZiAoaXNQYXJ0UmVhZCkgaGFzUmVhZCA9IHRydWVcbiAgfVxuXG4gIGlmICghaGFzTm9uTmV1dHJhbENvbW1hbmQpIHtcbiAgICByZXR1cm4geyBpc1NlYXJjaDogZmFsc2UsIGlzUmVhZDogZmFsc2UgfVxuICB9XG5cbiAgcmV0dXJuIHsgaXNTZWFyY2g6IGhhc1NlYXJjaCwgaXNSZWFkOiBoYXNSZWFkIH1cbn1cblxuLy8gUHJvZ3Jlc3MgZGlzcGxheSBjb25zdGFudHNcbmNvbnN0IFBST0dSRVNTX1RIUkVTSE9MRF9NUyA9IDIwMDBcbmNvbnN0IFBST0dSRVNTX0lOVEVSVkFMX01TID0gMTAwMFxuLy8gSW4gYXNzaXN0YW50IG1vZGUsIGJsb2NraW5nIGNvbW1hbmRzIGF1dG8tYmFja2dyb3VuZCBhZnRlciB0aGlzIG1hbnkgbXMgaW4gdGhlIG1haW4gYWdlbnRcbmNvbnN0IEFTU0lTVEFOVF9CTE9DS0lOR19CVURHRVRfTVMgPSAxNV8wMDBcblxuLy8gQ29tbWFuZHMgdGhhdCBzaG91bGQgbm90IGJlIGF1dG8tYmFja2dyb3VuZGVkIChjYW5vbmljYWwgbG93ZXJjYXNlKS5cbi8vICdzbGVlcCcgaXMgYSBQUyBidWlsdC1pbiBhbGlhcyBmb3IgU3RhcnQtU2xlZXAgYnV0IG5vdCBpbiBDT01NT05fQUxJQVNFUyxcbi8vIHNvIGxpc3QgYm90aCBmb3Jtcy5cbmNvbnN0IERJU0FMTE9XRURfQVVUT19CQUNLR1JPVU5EX0NPTU1BTkRTID0gW1xuICAnc3RhcnQtc2xlZXAnLCAvLyBTdGFydC1TbGVlcCBzaG91bGQgcnVuIGluIGZvcmVncm91bmQgdW5sZXNzIGV4cGxpY2l0bHkgYmFja2dyb3VuZGVkXG4gICdzbGVlcCcsXG5dXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgY29tbWFuZCBpcyBhbGxvd2VkIHRvIGJlIGF1dG9tYXRpY2FsbHkgYmFja2dyb3VuZGVkXG4gKiBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCB0byBjaGVja1xuICogQHJldHVybnMgZmFsc2UgZm9yIGNvbW1hbmRzIHRoYXQgc2hvdWxkIG5vdCBiZSBhdXRvLWJhY2tncm91bmRlZCAobGlrZSBTdGFydC1TbGVlcClcbiAqL1xuZnVuY3Rpb24gaXNBdXRvYmFja2dyb3VuZGluZ0FsbG93ZWQoY29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpcnN0V29yZCA9IGNvbW1hbmQudHJpbSgpLnNwbGl0KC9cXHMrLylbMF1cbiAgaWYgKCFmaXJzdFdvcmQpIHJldHVybiB0cnVlXG4gIGNvbnN0IGNhbm9uaWNhbCA9IHJlc29sdmVUb0Nhbm9uaWNhbChmaXJzdFdvcmQpXG4gIHJldHVybiAhRElTQUxMT1dFRF9BVVRPX0JBQ0tHUk9VTkRfQ09NTUFORFMuaW5jbHVkZXMoY2Fub25pY2FsKVxufVxuXG4vKipcbiAqIFBTLWZsYXZvcmVkIHBvcnQgb2YgQmFzaFRvb2wncyBkZXRlY3RCbG9ja2VkU2xlZXBQYXR0ZXJuLlxuICogQ2F0Y2hlcyBgU3RhcnQtU2xlZXAgTmAsIGBTdGFydC1TbGVlcCAtU2Vjb25kcyBOYCwgYHNsZWVwIE5gIChidWlsdC1pbiBhbGlhcylcbiAqIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQuIERvZXMgTk9UIGJsb2NrIGBTdGFydC1TbGVlcCAtTWlsbGlzZWNvbmRzYCAoc3ViLXNlY29uZFxuICogcGFjaW5nIGlzIGZpbmUpIG9yIGZsb2F0IHNlY29uZHMgKGxlZ2l0IHJhdGUgbGltaXRpbmcpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QmxvY2tlZFNsZWVwUGF0dGVybihjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gRmlyc3Qgc3RhdGVtZW50IG9ubHkg4oCUIHNwbGl0IG9uIFBTIHN0YXRlbWVudCBzZXBhcmF0b3JzOiBgO2AsIGB8YCxcbiAgLy8gYCZgL2AmJmAvYHx8YCAocHdzaCA3KyksIGFuZCBuZXdsaW5lIChQUydzIHByaW1hcnkgc2VwYXJhdG9yKS4gVGhpcyBpc1xuICAvLyBpbnRlbnRpb25hbGx5IHNoYWxsb3cg4oCUIHNsZWVwIGluc2lkZSBzY3JpcHQgYmxvY2tzLCBzdWJzaGVsbHMsIG9yIGxhdGVyXG4gIC8vIHBpcGVsaW5lIHN0YWdlcyBpcyBmaW5lLiBNYXRjaGVzIEJhc2hUb29sJ3Mgc3BsaXRDb21tYW5kV2l0aE9wZXJhdG9yc1xuICAvLyBpbnRlbnQgKHNyYy91dGlscy9iYXNoL2NvbW1hbmRzLnRzKSB3aXRob3V0IGEgZnVsbCBQUyBwYXJzZXIuXG4gIGNvbnN0IGZpcnN0ID1cbiAgICBjb21tYW5kXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoL1s7fCZcXHJcXG5dLylbMF1cbiAgICAgID8udHJpbSgpID8/ICcnXG4gIC8vIE1hdGNoOiBTdGFydC1TbGVlcCBOLCBTdGFydC1TbGVlcCAtU2Vjb25kcyBOLCBTdGFydC1TbGVlcCAtcyBOLCBzbGVlcCBOXG4gIC8vIChjYXNlLWluc2Vuc2l0aXZlOyAtU2Vjb25kcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gLXMgcGVyIFBTIGNvbnZlbnRpb24pXG4gIGNvbnN0IG0gPSAvXig/OnN0YXJ0LXNsZWVwfHNsZWVwKSg/Olxccystcyg/OmVjb25kcyk/KT9cXHMrKFxcZCspXFxzKiQvaS5leGVjKFxuICAgIGZpcnN0LFxuICApXG4gIGlmICghbSkgcmV0dXJuIG51bGxcbiAgY29uc3Qgc2VjcyA9IHBhcnNlSW50KG1bMV0hLCAxMClcbiAgaWYgKHNlY3MgPCAyKSByZXR1cm4gbnVsbCAvLyBzdWItMnMgc2xlZXBzIGFyZSBmaW5lIChyYXRlIGxpbWl0aW5nLCBwYWNpbmcpXG5cbiAgY29uc3QgcmVzdCA9IGNvbW1hbmRcbiAgICAudHJpbSgpXG4gICAgLnNsaWNlKGZpcnN0Lmxlbmd0aClcbiAgICAucmVwbGFjZSgvXltcXHM7fCZdKy8sICcnKVxuICByZXR1cm4gcmVzdFxuICAgID8gYFN0YXJ0LVNsZWVwICR7c2Vjc30gZm9sbG93ZWQgYnk6ICR7cmVzdH1gXG4gICAgOiBgc3RhbmRhbG9uZSBTdGFydC1TbGVlcCAke3NlY3N9YFxufVxuXG4vKipcbiAqIE9uIFdpbmRvd3MgbmF0aXZlLCBzYW5kYm94IGlzIHVuYXZhaWxhYmxlIChid3JhcC9zYW5kYm94LWV4ZWMgYXJlXG4gKiBQT1NJWC1vbmx5KS4gSWYgZW50ZXJwcmlzZSBwb2xpY3kgaGFzIHNhbmRib3guZW5hYmxlZCBBTkQgZm9yYmlkc1xuICogdW5zYW5kYm94ZWQgY29tbWFuZHMsIFBvd2VyU2hlbGwgY2Fubm90IGNvbXBseSDigJQgcmVmdXNlIGV4ZWN1dGlvblxuICogcmF0aGVyIHRoYW4gc2lsZW50bHkgYnlwYXNzIHRoZSBwb2xpY3kuIE9uIExpbnV4L21hY09TL1dTTDIsIHB3c2hcbiAqIHJ1bnMgYXMgYSBuYXRpdmUgYmluYXJ5IHVuZGVyIHRoZSBzYW5kYm94IHNhbWUgYXMgYmFzaCwgc28gdGhpc1xuICogZ2F0ZSBkb2VzIG5vdCBhcHBseS5cbiAqXG4gKiBDaGVja2VkIGluIEJPVEggdmFsaWRhdGVJbnB1dCAoY2xlYW4gdG9vbC1ydW5uZXIgZXJyb3IpIGFuZCBjYWxsKClcbiAqIChjb3ZlcnMgZGlyZWN0IGNhbGxlcnMgbGlrZSBwcm9tcHRTaGVsbEV4ZWN1dGlvbi50cyB0aGF0IHNraXBcbiAqIHZhbGlkYXRlSW5wdXQpLiBUaGUgY2FsbCgpIGd1YXJkIGlzIHRoZSBsb2FkLWJlYXJpbmcgb25lLlxuICovXG5jb25zdCBXSU5ET1dTX1NBTkRCT1hfUE9MSUNZX1JFRlVTQUwgPVxuICAnRW50ZXJwcmlzZSBwb2xpY3kgcmVxdWlyZXMgc2FuZGJveGluZywgYnV0IHNhbmRib3hpbmcgaXMgbm90IGF2YWlsYWJsZSBvbiBuYXRpdmUgV2luZG93cy4gU2hlbGwgY29tbWFuZCBleGVjdXRpb24gaXMgYmxvY2tlZCBvbiB0aGlzIHBsYXRmb3JtIGJ5IHBvbGljeS4nXG5mdW5jdGlvbiBpc1dpbmRvd3NTYW5kYm94UG9saWN5VmlvbGF0aW9uKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGdldFBsYXRmb3JtKCkgPT09ICd3aW5kb3dzJyAmJlxuICAgIFNhbmRib3hNYW5hZ2VyLmlzU2FuZGJveEVuYWJsZWRJblNldHRpbmdzKCkgJiZcbiAgICAhU2FuZGJveE1hbmFnZXIuYXJlVW5zYW5kYm94ZWRDb21tYW5kc0FsbG93ZWQoKVxuICApXG59XG5cbi8vIENoZWNrIGlmIGJhY2tncm91bmQgdGFza3MgYXJlIGRpc2FibGVkIGF0IG1vZHVsZSBsb2FkIHRpbWVcbmNvbnN0IGlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY3VzdG9tLXJ1bGVzL25vLXByb2Nlc3MtZW52LXRvcC1sZXZlbCAtLSBJbnRlbnRpb25hbDogc2NoZW1hIG11c3QgYmUgZGVmaW5lZCBhdCBtb2R1bGUgbG9hZFxuICBpc0VudlRydXRoeShwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9ESVNBQkxFX0JBQ0tHUk9VTkRfVEFTS1MpXG5cbmNvbnN0IGZ1bGxJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgei5zdHJpY3RPYmplY3Qoe1xuICAgIGNvbW1hbmQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ1RoZSBQb3dlclNoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZScpLFxuICAgIHRpbWVvdXQ6IHNlbWFudGljTnVtYmVyKHoubnVtYmVyKCkub3B0aW9uYWwoKSkuZGVzY3JpYmUoXG4gICAgICBgT3B0aW9uYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKG1heCAke2dldE1heFRpbWVvdXRNcygpfSlgLFxuICAgICksXG4gICAgZGVzY3JpcHRpb246IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ0NsZWFyLCBjb25jaXNlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBjb21tYW5kIGRvZXMgaW4gYWN0aXZlIHZvaWNlLicsXG4gICAgICApLFxuICAgIHJ1bl9pbl9iYWNrZ3JvdW5kOiBzZW1hbnRpY0Jvb2xlYW4oei5ib29sZWFuKCkub3B0aW9uYWwoKSkuZGVzY3JpYmUoXG4gICAgICBgU2V0IHRvIHRydWUgdG8gcnVuIHRoaXMgY29tbWFuZCBpbiB0aGUgYmFja2dyb3VuZC4gVXNlIFJlYWQgdG8gcmVhZCB0aGUgb3V0cHV0IGxhdGVyLmAsXG4gICAgKSxcbiAgICBkYW5nZXJvdXNseURpc2FibGVTYW5kYm94OiBzZW1hbnRpY0Jvb2xlYW4oei5ib29sZWFuKCkub3B0aW9uYWwoKSkuZGVzY3JpYmUoXG4gICAgICAnU2V0IHRoaXMgdG8gdHJ1ZSB0byBkYW5nZXJvdXNseSBvdmVycmlkZSBzYW5kYm94IG1vZGUgYW5kIHJ1biBjb21tYW5kcyB3aXRob3V0IHNhbmRib3hpbmcuJyxcbiAgICApLFxuICB9KSxcbilcblxuLy8gQ29uZGl0aW9uYWxseSByZW1vdmUgcnVuX2luX2JhY2tncm91bmQgZnJvbSBzY2hlbWEgd2hlbiBiYWNrZ3JvdW5kIHRhc2tzIGFyZSBkaXNhYmxlZFxuY29uc3QgaW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+XG4gIGlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWRcbiAgICA/IGZ1bGxJbnB1dFNjaGVtYSgpLm9taXQoeyBydW5faW5fYmFja2dyb3VuZDogdHJ1ZSB9KVxuICAgIDogZnVsbElucHV0U2NoZW1hKCksXG4pXG50eXBlIElucHV0U2NoZW1hID0gUmV0dXJuVHlwZTx0eXBlb2YgaW5wdXRTY2hlbWE+XG5cbi8vIFVzZSBmdWxsSW5wdXRTY2hlbWEgZm9yIHRoZSB0eXBlIHRvIGFsd2F5cyBpbmNsdWRlIHJ1bl9pbl9iYWNrZ3JvdW5kXG4vLyAoZXZlbiB3aGVuIGl0J3Mgb21pdHRlZCBmcm9tIHRoZSBzY2hlbWEsIHRoZSBjb2RlIG5lZWRzIHRvIGhhbmRsZSBpdClcbmV4cG9ydCB0eXBlIFBvd2VyU2hlbGxUb29sSW5wdXQgPSB6LmluZmVyPFJldHVyblR5cGU8dHlwZW9mIGZ1bGxJbnB1dFNjaGVtYT4+XG5cbmNvbnN0IG91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIHN0ZG91dDogei5zdHJpbmcoKS5kZXNjcmliZSgnVGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgY29tbWFuZCcpLFxuICAgIHN0ZGVycjogei5zdHJpbmcoKS5kZXNjcmliZSgnVGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBvZiB0aGUgY29tbWFuZCcpLFxuICAgIGludGVycnVwdGVkOiB6LmJvb2xlYW4oKS5kZXNjcmliZSgnV2hldGhlciB0aGUgY29tbWFuZCB3YXMgaW50ZXJydXB0ZWQnKSxcbiAgICByZXR1cm5Db2RlSW50ZXJwcmV0YXRpb246IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1NlbWFudGljIGludGVycHJldGF0aW9uIGZvciBub24tZXJyb3IgZXhpdCBjb2RlcyB3aXRoIHNwZWNpYWwgbWVhbmluZycsXG4gICAgICApLFxuICAgIGlzSW1hZ2U6IHpcbiAgICAgIC5ib29sZWFuKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoJ0ZsYWcgdG8gaW5kaWNhdGUgaWYgc3Rkb3V0IGNvbnRhaW5zIGltYWdlIGRhdGEnKSxcbiAgICBwZXJzaXN0ZWRPdXRwdXRQYXRoOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoJ1BhdGggdG8gcGVyc2lzdGVkIGZ1bGwgb3V0cHV0IHdoZW4gdG9vIGxhcmdlIGZvciBpbmxpbmUnKSxcbiAgICBwZXJzaXN0ZWRPdXRwdXRTaXplOiB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoJ1RvdGFsIG91dHB1dCBzaXplIGluIGJ5dGVzIHdoZW4gcGVyc2lzdGVkJyksXG4gICAgYmFja2dyb3VuZFRhc2tJZDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAnSUQgb2YgdGhlIGJhY2tncm91bmQgdGFzayBpZiBjb21tYW5kIGlzIHJ1bm5pbmcgaW4gYmFja2dyb3VuZCcsXG4gICAgICApLFxuICAgIGJhY2tncm91bmRlZEJ5VXNlcjogelxuICAgICAgLmJvb2xlYW4oKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RydWUgaWYgdGhlIHVzZXIgbWFudWFsbHkgYmFja2dyb3VuZGVkIHRoZSBjb21tYW5kIHdpdGggQ3RybCtCJyxcbiAgICAgICksXG4gICAgYXNzaXN0YW50QXV0b0JhY2tncm91bmRlZDogelxuICAgICAgLmJvb2xlYW4oKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RydWUgaWYgdGhlIGNvbW1hbmQgd2FzIGF1dG8tYmFja2dyb3VuZGVkIGJ5IHRoZSBhc3Npc3RhbnQtbW9kZSBibG9ja2luZyBidWRnZXQnLFxuICAgICAgKSxcbiAgfSksXG4pXG50eXBlIE91dHB1dFNjaGVtYSA9IFJldHVyblR5cGU8dHlwZW9mIG91dHB1dFNjaGVtYT5cbmV4cG9ydCB0eXBlIE91dCA9IHouaW5mZXI8T3V0cHV0U2NoZW1hPlxuXG5pbXBvcnQgdHlwZSB7IFBvd2VyU2hlbGxQcm9ncmVzcyB9IGZyb20gJy4uLy4uL3R5cGVzL3Rvb2xzLmpzJ1xuXG5leHBvcnQgdHlwZSB7IFBvd2VyU2hlbGxQcm9ncmVzcyB9IGZyb20gJy4uLy4uL3R5cGVzL3Rvb2xzLmpzJ1xuXG5jb25zdCBDT01NT05fQkFDS0dST1VORF9DT01NQU5EUyA9IFtcbiAgJ25wbScsXG4gICd5YXJuJyxcbiAgJ3BucG0nLFxuICAnbm9kZScsXG4gICdweXRob24nLFxuICAncHl0aG9uMycsXG4gICdnbycsXG4gICdjYXJnbycsXG4gICdtYWtlJyxcbiAgJ2RvY2tlcicsXG4gICd0ZXJyYWZvcm0nLFxuICAnd2VicGFjaycsXG4gICd2aXRlJyxcbiAgJ2plc3QnLFxuICAncHl0ZXN0JyxcbiAgJ2N1cmwnLFxuICAnSW52b2tlLVdlYlJlcXVlc3QnLFxuICAnYnVpbGQnLFxuICAndGVzdCcsXG4gICdzZXJ2ZScsXG4gICd3YXRjaCcsXG4gICdkZXYnLFxuXSBhcyBjb25zdFxuXG5mdW5jdGlvbiBnZXRDb21tYW5kVHlwZUZvckxvZ2dpbmcoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbik6IEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMge1xuICBjb25zdCB0cmltbWVkID0gY29tbWFuZC50cmltKClcbiAgY29uc3QgZmlyc3RXb3JkID0gdHJpbW1lZC5zcGxpdCgvXFxzKy8pWzBdIHx8ICcnXG5cbiAgZm9yIChjb25zdCBjbWQgb2YgQ09NTU9OX0JBQ0tHUk9VTkRfQ09NTUFORFMpIHtcbiAgICBpZiAoZmlyc3RXb3JkLnRvTG93ZXJDYXNlKCkgPT09IGNtZC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gY21kIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFNcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ290aGVyJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTXG59XG5cbmV4cG9ydCBjb25zdCBQb3dlclNoZWxsVG9vbCA9IGJ1aWxkVG9vbCh7XG4gIG5hbWU6IFBPV0VSU0hFTExfVE9PTF9OQU1FLFxuICBzZWFyY2hIaW50OiAnZXhlY3V0ZSBXaW5kb3dzIFBvd2VyU2hlbGwgY29tbWFuZHMnLFxuICBtYXhSZXN1bHRTaXplQ2hhcnM6IDMwXzAwMCxcbiAgc3RyaWN0OiB0cnVlLFxuXG4gIGFzeW5jIGRlc2NyaXB0aW9uKHtcbiAgICBkZXNjcmlwdGlvbixcbiAgfTogUGFydGlhbDxQb3dlclNoZWxsVG9vbElucHV0Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uIHx8ICdSdW4gUG93ZXJTaGVsbCBjb21tYW5kJ1xuICB9LFxuXG4gIGFzeW5jIHByb21wdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBnZXRQcm9tcHQoKVxuICB9LFxuXG4gIGlzQ29uY3VycmVuY3lTYWZlKGlucHV0OiBQb3dlclNoZWxsVG9vbElucHV0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkT25seT8uKGlucHV0KSA/PyBmYWxzZVxuICB9LFxuXG4gIGlzU2VhcmNoT3JSZWFkQ29tbWFuZChpbnB1dDogUGFydGlhbDxQb3dlclNoZWxsVG9vbElucHV0Pik6IHtcbiAgICBpc1NlYXJjaDogYm9vbGVhblxuICAgIGlzUmVhZDogYm9vbGVhblxuICB9IHtcbiAgICBpZiAoIWlucHV0LmNvbW1hbmQpIHtcbiAgICAgIHJldHVybiB7IGlzU2VhcmNoOiBmYWxzZSwgaXNSZWFkOiBmYWxzZSB9XG4gICAgfVxuICAgIHJldHVybiBpc1NlYXJjaE9yUmVhZFBvd2VyU2hlbGxDb21tYW5kKGlucHV0LmNvbW1hbmQpXG4gIH0sXG5cbiAgaXNSZWFkT25seShpbnB1dDogUG93ZXJTaGVsbFRvb2xJbnB1dCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIHN5bmMgc2VjdXJpdHkgaGV1cmlzdGljcyBiZWZvcmUgZGVjbGFyaW5nIHJlYWQtb25seS5cbiAgICAvLyBUaGUgZnVsbCBBU1QgcGFyc2UgaXMgYXN5bmMgYW5kIHVuYXZhaWxhYmxlIGhlcmUsIHNvIHdlIHVzZVxuICAgIC8vIHJlZ2V4LWJhc2VkIGRldGVjdGlvbiBvZiBzdWJleHByZXNzaW9ucywgc3BsYXR0aW5nLCBtZW1iZXJcbiAgICAvLyBpbnZvY2F0aW9ucywgYW5kIGFzc2lnbm1lbnRzIOKAlCBtYXRjaGluZyBCYXNoVG9vbCdzIHBhdHRlcm4gb2ZcbiAgICAvLyBjaGVja2luZyBzZWN1cml0eSBjb25jZXJucyBiZWZvcmUgY21kbGV0IGFsbG93bGlzdCBldmFsdWF0aW9uLlxuICAgIGlmIChoYXNTeW5jU2VjdXJpdHlDb25jZXJucyhpbnB1dC5jb21tYW5kKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIE5PVEU6IFRoaXMgY2FsbHMgaXNSZWFkT25seUNvbW1hbmQgd2l0aG91dCB0aGUgcGFyc2VkIEFTVC4gV2l0aG91dCB0aGVcbiAgICAvLyBBU1QsIGlzUmVhZE9ubHlDb21tYW5kIGNhbm5vdCBzcGxpdCBwaXBlbGluZXMvc3RhdGVtZW50cyBhbmQgd2lsbCByZXR1cm5cbiAgICAvLyBmYWxzZSBmb3IgYW55dGhpbmcgYnV0IHRoZSBzaW1wbGVzdCBzaW5nbGUtdG9rZW4gY29tbWFuZHMuIFRoaXMgaXMgYVxuICAgIC8vIGtub3duIGxpbWl0YXRpb24gb2YgdGhlIHN5bmMgVG9vbC5pc1JlYWRPbmx5KCkgaW50ZXJmYWNlIOKAlCB0aGUgcmVhbFxuICAgIC8vIHJlYWQtb25seSBhdXRvLWFsbG93IGhhcHBlbnMgYXN5bmMgaW4gcG93ZXJzaGVsbFRvb2xIYXNQZXJtaXNzaW9uIChzdGVwXG4gICAgLy8gNC41KSB3aGVyZSB0aGUgcGFyc2VkIEFTVCBpcyBhdmFpbGFibGUuXG4gICAgcmV0dXJuIGlzUmVhZE9ubHlDb21tYW5kKGlucHV0LmNvbW1hbmQpXG4gIH0sXG4gIHRvQXV0b0NsYXNzaWZpZXJJbnB1dChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC5jb21tYW5kXG4gIH0sXG5cbiAgZ2V0IGlucHV0U2NoZW1hKCk6IElucHV0U2NoZW1hIHtcbiAgICByZXR1cm4gaW5wdXRTY2hlbWEoKVxuICB9LFxuXG4gIGdldCBvdXRwdXRTY2hlbWEoKTogT3V0cHV0U2NoZW1hIHtcbiAgICByZXR1cm4gb3V0cHV0U2NoZW1hKClcbiAgfSxcblxuICB1c2VyRmFjaW5nTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnUG93ZXJTaGVsbCdcbiAgfSxcblxuICBnZXRUb29sVXNlU3VtbWFyeShcbiAgICBpbnB1dDogUGFydGlhbDxQb3dlclNoZWxsVG9vbElucHV0PiB8IHVuZGVmaW5lZCxcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpbnB1dD8uY29tbWFuZCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3QgeyBjb21tYW5kLCBkZXNjcmlwdGlvbiB9ID0gaW5wdXRcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblxuICAgIH1cbiAgICByZXR1cm4gdHJ1bmNhdGUoY29tbWFuZCwgVE9PTF9TVU1NQVJZX01BWF9MRU5HVEgpXG4gIH0sXG5cbiAgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbihcbiAgICBpbnB1dDogUGFydGlhbDxQb3dlclNoZWxsVG9vbElucHV0PiB8IHVuZGVmaW5lZCxcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoIWlucHV0Py5jb21tYW5kKSB7XG4gICAgICByZXR1cm4gJ1J1bm5pbmcgY29tbWFuZCdcbiAgICB9XG4gICAgY29uc3QgZGVzYyA9XG4gICAgICBpbnB1dC5kZXNjcmlwdGlvbiA/PyB0cnVuY2F0ZShpbnB1dC5jb21tYW5kLCBUT09MX1NVTU1BUllfTUFYX0xFTkdUSClcbiAgICByZXR1cm4gYFJ1bm5pbmcgJHtkZXNjfWBcbiAgfSxcblxuICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWVcbiAgfSxcblxuICBhc3luYyB2YWxpZGF0ZUlucHV0KGlucHV0OiBQb3dlclNoZWxsVG9vbElucHV0KTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gRGVmZW5zZS1pbi1kZXB0aDogYWxzbyBndWFyZGVkIGluIGNhbGwoKSBmb3IgZGlyZWN0IGNhbGxlcnMuXG4gICAgaWYgKGlzV2luZG93c1NhbmRib3hQb2xpY3lWaW9sYXRpb24oKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogV0lORE9XU19TQU5EQk9YX1BPTElDWV9SRUZVU0FMLFxuICAgICAgICBlcnJvckNvZGU6IDExLFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBmZWF0dXJlKCdNT05JVE9SX1RPT0wnKSAmJlxuICAgICAgIWlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgJiZcbiAgICAgICFpbnB1dC5ydW5faW5fYmFja2dyb3VuZFxuICAgICkge1xuICAgICAgY29uc3Qgc2xlZXBQYXR0ZXJuID0gZGV0ZWN0QmxvY2tlZFNsZWVwUGF0dGVybihpbnB1dC5jb21tYW5kKVxuICAgICAgaWYgKHNsZWVwUGF0dGVybiAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEJsb2NrZWQ6ICR7c2xlZXBQYXR0ZXJufS4gUnVuIGJsb2NraW5nIGNvbW1hbmRzIGluIHRoZSBiYWNrZ3JvdW5kIHdpdGggcnVuX2luX2JhY2tncm91bmQ6IHRydWUg4oCUIHlvdSdsbCBnZXQgYSBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiB3aGVuIGRvbmUuIEZvciBzdHJlYW1pbmcgZXZlbnRzICh3YXRjaGluZyBsb2dzLCBwb2xsaW5nIEFQSXMpLCB1c2UgdGhlIE1vbml0b3IgdG9vbC4gSWYgeW91IGdlbnVpbmVseSBuZWVkIGEgZGVsYXkgKHJhdGUgbGltaXRpbmcsIGRlbGliZXJhdGUgcGFjaW5nKSwga2VlcCBpdCB1bmRlciAyIHNlY29uZHMuYCxcbiAgICAgICAgICBlcnJvckNvZGU6IDEwLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgYXN5bmMgY2hlY2tQZXJtaXNzaW9ucyhcbiAgICBpbnB1dDogUG93ZXJTaGVsbFRvb2xJbnB1dCxcbiAgICBjb250ZXh0OiBQYXJhbWV0ZXJzPFRvb2xbJ2NoZWNrUGVybWlzc2lvbnMnXT5bMV0sXG4gICk6IFByb21pc2U8UGVybWlzc2lvblJlc3VsdD4ge1xuICAgIHJldHVybiBhd2FpdCBwb3dlcnNoZWxsVG9vbEhhc1Blcm1pc3Npb24oaW5wdXQsIGNvbnRleHQpXG4gIH0sXG5cbiAgcmVuZGVyVG9vbFVzZU1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VQcm9ncmVzc01lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VRdWV1ZWRNZXNzYWdlLFxuICByZW5kZXJUb29sUmVzdWx0TWVzc2FnZSxcbiAgcmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSxcblxuICBtYXBUb29sUmVzdWx0VG9Ub29sUmVzdWx0QmxvY2tQYXJhbShcbiAgICB7XG4gICAgICBpbnRlcnJ1cHRlZCxcbiAgICAgIHN0ZG91dCxcbiAgICAgIHN0ZGVycixcbiAgICAgIGlzSW1hZ2UsXG4gICAgICBwZXJzaXN0ZWRPdXRwdXRQYXRoLFxuICAgICAgcGVyc2lzdGVkT3V0cHV0U2l6ZSxcbiAgICAgIGJhY2tncm91bmRUYXNrSWQsXG4gICAgICBiYWNrZ3JvdW5kZWRCeVVzZXIsXG4gICAgICBhc3Npc3RhbnRBdXRvQmFja2dyb3VuZGVkLFxuICAgIH06IE91dCxcbiAgICB0b29sVXNlSUQ6IHN0cmluZyxcbiAgKTogVG9vbFJlc3VsdEJsb2NrUGFyYW0ge1xuICAgIC8vIEZvciBpbWFnZSBkYXRhLCBmb3JtYXQgYXMgaW1hZ2UgY29udGVudCBibG9jayBmb3IgQ2xhdWRlXG4gICAgaWYgKGlzSW1hZ2UpIHtcbiAgICAgIGNvbnN0IGJsb2NrID0gYnVpbGRJbWFnZVRvb2xSZXN1bHQoc3Rkb3V0LCB0b29sVXNlSUQpXG4gICAgICBpZiAoYmxvY2spIHJldHVybiBibG9ja1xuICAgIH1cblxuICAgIGxldCBwcm9jZXNzZWRTdGRvdXQgPSBzdGRvdXRcblxuICAgIGlmIChwZXJzaXN0ZWRPdXRwdXRQYXRoKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gc3Rkb3V0ID8gc3Rkb3V0LnJlcGxhY2UoL14oXFxzKlxcbikrLywgJycpLnRyaW1FbmQoKSA6ICcnXG4gICAgICBjb25zdCBwcmV2aWV3ID0gZ2VuZXJhdGVQcmV2aWV3KHRyaW1tZWQsIFBSRVZJRVdfU0laRV9CWVRFUylcbiAgICAgIHByb2Nlc3NlZFN0ZG91dCA9IGJ1aWxkTGFyZ2VUb29sUmVzdWx0TWVzc2FnZSh7XG4gICAgICAgIGZpbGVwYXRoOiBwZXJzaXN0ZWRPdXRwdXRQYXRoLFxuICAgICAgICBvcmlnaW5hbFNpemU6IHBlcnNpc3RlZE91dHB1dFNpemUgPz8gMCxcbiAgICAgICAgaXNKc29uOiBmYWxzZSxcbiAgICAgICAgcHJldmlldzogcHJldmlldy5wcmV2aWV3LFxuICAgICAgICBoYXNNb3JlOiBwcmV2aWV3Lmhhc01vcmUsXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoc3Rkb3V0KSB7XG4gICAgICBwcm9jZXNzZWRTdGRvdXQgPSBzdGRvdXQucmVwbGFjZSgvXihcXHMqXFxuKSsvLCAnJylcbiAgICAgIHByb2Nlc3NlZFN0ZG91dCA9IHByb2Nlc3NlZFN0ZG91dC50cmltRW5kKClcbiAgICB9XG5cbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gc3RkZXJyLnRyaW0oKVxuICAgIGlmIChpbnRlcnJ1cHRlZCkge1xuICAgICAgaWYgKHN0ZGVycikgZXJyb3JNZXNzYWdlICs9IEVPTFxuICAgICAgZXJyb3JNZXNzYWdlICs9ICc8ZXJyb3I+Q29tbWFuZCB3YXMgYWJvcnRlZCBiZWZvcmUgY29tcGxldGlvbjwvZXJyb3I+J1xuICAgIH1cblxuICAgIGxldCBiYWNrZ3JvdW5kSW5mbyA9ICcnXG4gICAgaWYgKGJhY2tncm91bmRUYXNrSWQpIHtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBnZXRUYXNrT3V0cHV0UGF0aChiYWNrZ3JvdW5kVGFza0lkKVxuICAgICAgaWYgKGFzc2lzdGFudEF1dG9CYWNrZ3JvdW5kZWQpIHtcbiAgICAgICAgYmFja2dyb3VuZEluZm8gPSBgQ29tbWFuZCBleGNlZWRlZCB0aGUgYXNzaXN0YW50LW1vZGUgYmxvY2tpbmcgYnVkZ2V0ICgke0FTU0lTVEFOVF9CTE9DS0lOR19CVURHRVRfTVMgLyAxMDAwfXMpIGFuZCB3YXMgbW92ZWQgdG8gdGhlIGJhY2tncm91bmQgd2l0aCBJRDogJHtiYWNrZ3JvdW5kVGFza0lkfS4gSXQgaXMgc3RpbGwgcnVubmluZyDigJQgeW91IHdpbGwgYmUgbm90aWZpZWQgd2hlbiBpdCBjb21wbGV0ZXMuIE91dHB1dCBpcyBiZWluZyB3cml0dGVuIHRvOiAke291dHB1dFBhdGh9LiBJbiBhc3Npc3RhbnQgbW9kZSwgZGVsZWdhdGUgbG9uZy1ydW5uaW5nIHdvcmsgdG8gYSBzdWJhZ2VudCBvciB1c2UgcnVuX2luX2JhY2tncm91bmQgdG8ga2VlcCB0aGlzIGNvbnZlcnNhdGlvbiByZXNwb25zaXZlLmBcbiAgICAgIH0gZWxzZSBpZiAoYmFja2dyb3VuZGVkQnlVc2VyKSB7XG4gICAgICAgIGJhY2tncm91bmRJbmZvID0gYENvbW1hbmQgd2FzIG1hbnVhbGx5IGJhY2tncm91bmRlZCBieSB1c2VyIHdpdGggSUQ6ICR7YmFja2dyb3VuZFRhc2tJZH0uIE91dHB1dCBpcyBiZWluZyB3cml0dGVuIHRvOiAke291dHB1dFBhdGh9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFja2dyb3VuZEluZm8gPSBgQ29tbWFuZCBydW5uaW5nIGluIGJhY2tncm91bmQgd2l0aCBJRDogJHtiYWNrZ3JvdW5kVGFza0lkfS4gT3V0cHV0IGlzIGJlaW5nIHdyaXR0ZW4gdG86ICR7b3V0cHV0UGF0aH1gXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvb2xfdXNlX2lkOiB0b29sVXNlSUQsXG4gICAgICB0eXBlOiAndG9vbF9yZXN1bHQnIGFzIGNvbnN0LFxuICAgICAgY29udGVudDogW3Byb2Nlc3NlZFN0ZG91dCwgZXJyb3JNZXNzYWdlLCBiYWNrZ3JvdW5kSW5mb11cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignXFxuJyksXG4gICAgICBpc19lcnJvcjogaW50ZXJydXB0ZWQsXG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIGNhbGwoXG4gICAgaW5wdXQ6IFBvd2VyU2hlbGxUb29sSW5wdXQsXG4gICAgdG9vbFVzZUNvbnRleHQ6IFBhcmFtZXRlcnM8VG9vbFsnY2FsbCddPlsxXSxcbiAgICBfY2FuVXNlVG9vbD86IENhblVzZVRvb2xGbixcbiAgICBfcGFyZW50TWVzc2FnZT86IEFzc2lzdGFudE1lc3NhZ2UsXG4gICAgb25Qcm9ncmVzcz86IFRvb2xDYWxsUHJvZ3Jlc3M8UG93ZXJTaGVsbFByb2dyZXNzPixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IE91dCB9PiB7XG4gICAgLy8gTG9hZC1iZWFyaW5nIGd1YXJkOiBwcm9tcHRTaGVsbEV4ZWN1dGlvbi50cyBhbmQgcHJvY2Vzc0Jhc2hDb21tYW5kLnRzeFxuICAgIC8vIGNhbGwgUG93ZXJTaGVsbFRvb2wuY2FsbCgpIGRpcmVjdGx5LCBieXBhc3NpbmcgdmFsaWRhdGVJbnB1dC4gVGhpcyBpc1xuICAgIC8vIHRoZSBjaGVjayB0aGF0IGNvdmVycyBBTEwgY2FsbGVycy4gU2VlIGlzV2luZG93c1NhbmRib3hQb2xpY3lWaW9sYXRpb25cbiAgICAvLyBjb21tZW50IGZvciB0aGUgcG9saWN5IHJhdGlvbmFsZS5cbiAgICBpZiAoaXNXaW5kb3dzU2FuZGJveFBvbGljeVZpb2xhdGlvbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoV0lORE9XU19TQU5EQk9YX1BPTElDWV9SRUZVU0FMKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYWJvcnRDb250cm9sbGVyLCBzZXRBcHBTdGF0ZSwgc2V0VG9vbEpTWCB9ID0gdG9vbFVzZUNvbnRleHRcblxuICAgIGNvbnN0IGlzTWFpblRocmVhZCA9ICF0b29sVXNlQ29udGV4dC5hZ2VudElkXG5cbiAgICBsZXQgcHJvZ3Jlc3NDb3VudGVyID0gMFxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRHZW5lcmF0b3IgPSBydW5Qb3dlclNoZWxsQ29tbWFuZCh7XG4gICAgICAgIGlucHV0LFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIC8vIFVzZSB0aGUgYWx3YXlzLXNoYXJlZCB0YXNrIGNoYW5uZWwgc28gYXN5bmMgYWdlbnRzJyBiYWNrZ3JvdW5kXG4gICAgICAgIC8vIHNoZWxsIHRhc2tzIGFyZSBhY3R1YWxseSByZWdpc3RlcmVkIChhbmQga2lsbGFibGUgb24gYWdlbnQgZXhpdCkuXG4gICAgICAgIHNldEFwcFN0YXRlOiB0b29sVXNlQ29udGV4dC5zZXRBcHBTdGF0ZUZvclRhc2tzID8/IHNldEFwcFN0YXRlLFxuICAgICAgICBzZXRUb29sSlNYLFxuICAgICAgICBwcmV2ZW50Q3dkQ2hhbmdlczogIWlzTWFpblRocmVhZCxcbiAgICAgICAgaXNNYWluVGhyZWFkLFxuICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VDb250ZXh0LnRvb2xVc2VJZCxcbiAgICAgICAgYWdlbnRJZDogdG9vbFVzZUNvbnRleHQuYWdlbnRJZCxcbiAgICAgIH0pXG5cbiAgICAgIGxldCBnZW5lcmF0b3JSZXN1bHRcbiAgICAgIGRvIHtcbiAgICAgICAgZ2VuZXJhdG9yUmVzdWx0ID0gYXdhaXQgY29tbWFuZEdlbmVyYXRvci5uZXh0KClcbiAgICAgICAgaWYgKCFnZW5lcmF0b3JSZXN1bHQuZG9uZSAmJiBvblByb2dyZXNzKSB7XG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBnZW5lcmF0b3JSZXN1bHQudmFsdWVcbiAgICAgICAgICBvblByb2dyZXNzKHtcbiAgICAgICAgICAgIHRvb2xVc2VJRDogYHBzLXByb2dyZXNzLSR7cHJvZ3Jlc3NDb3VudGVyKyt9YCxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3Bvd2Vyc2hlbGxfcHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHByb2dyZXNzLm91dHB1dCxcbiAgICAgICAgICAgICAgZnVsbE91dHB1dDogcHJvZ3Jlc3MuZnVsbE91dHB1dCxcbiAgICAgICAgICAgICAgZWxhcHNlZFRpbWVTZWNvbmRzOiBwcm9ncmVzcy5lbGFwc2VkVGltZVNlY29uZHMsXG4gICAgICAgICAgICAgIHRvdGFsTGluZXM6IHByb2dyZXNzLnRvdGFsTGluZXMsXG4gICAgICAgICAgICAgIHRvdGFsQnl0ZXM6IHByb2dyZXNzLnRvdGFsQnl0ZXMsXG4gICAgICAgICAgICAgIHRpbWVvdXRNczogcHJvZ3Jlc3MudGltZW91dE1zLFxuICAgICAgICAgICAgICB0YXNrSWQ6IHByb2dyZXNzLnRhc2tJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoIWdlbmVyYXRvclJlc3VsdC5kb25lKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0b3JSZXN1bHQudmFsdWVcblxuICAgICAgLy8gRmVlZCBnaXQvUFIgdXNhZ2UgbWV0cmljcyAoc2FtZSBjb3VudGVycyBhcyBCYXNoVG9vbCkuIFBTIGludm9rZXNcbiAgICAgIC8vIGdpdC9naC9nbGFiL2N1cmwgYXMgZXh0ZXJuYWwgYmluYXJpZXMgd2l0aCBpZGVudGljYWwgc3ludGF4LCBzbyB0aGVcbiAgICAgIC8vIHNoZWxsLWFnbm9zdGljIHJlZ2V4IGRldGVjdGlvbiBpbiB0cmFja0dpdE9wZXJhdGlvbnMgd29ya3MgYXMtaXMuXG4gICAgICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kVGFza0lkIGVhcmx5LXJldHVybiBzbyBiYWNrZ3JvdW5kZWRcbiAgICAgIC8vIGNvbW1hbmRzIGFyZSBjb3VudGVkIHRvbyAobWF0Y2hlcyBCYXNoVG9vbC50c3g6OTEyKS5cbiAgICAgIC8vXG4gICAgICAvLyBQcmUtZmxpZ2h0IHNlbnRpbmVsIGd1YXJkOiB0aGUgdHdvIFBTIHByZS1mbGlnaHQgcGF0aHMgKHB3c2gtbm90LWZvdW5kLFxuICAgICAgLy8gZXhlYy1zcGF3bi1jYXRjaCkgcmV0dXJuIGNvZGU6IDAgKyBlbXB0eSBzdGRvdXQgKyBzdGRlcnIgc28gY2FsbCgpIGNhblxuICAgICAgLy8gc3VyZmFjZSBzdGRlcnIgZ3JhY2VmdWxseSBpbnN0ZWFkIG9mIHRocm93aW5nIFNoZWxsRXJyb3IuIEJ1dFxuICAgICAgLy8gZ2l0T3BlcmF0aW9uVHJhY2tpbmcudHM6NDggdHJlYXRzIGNvZGUgMCBhcyBzdWNjZXNzIGFuZCB3b3VsZFxuICAgICAgLy8gcmVnZXgtbWF0Y2ggdGhlIGNvbW1hbmQsIG1pcy1jb3VudGluZyBhIGNvbW1hbmQgdGhhdCBuZXZlciByYW4uXG4gICAgICAvLyBCYXNoVG9vbCBpcyBzYWZlIOKAlCBpdHMgcHJlLWZsaWdodCBnb2VzIHRocm91Z2ggY3JlYXRlRmFpbGVkQ29tbWFuZFxuICAgICAgLy8gKGNvZGU6IDEpIHNvIHRyYWNraW5nIGVhcmx5LXJldHVybnMuIFNraXAgdHJhY2tpbmcgb24gdGhpcyBzZW50aW5lbC5cbiAgICAgIGNvbnN0IGlzUHJlRmxpZ2h0U2VudGluZWwgPVxuICAgICAgICByZXN1bHQuY29kZSA9PT0gMCAmJlxuICAgICAgICAhcmVzdWx0LnN0ZG91dCAmJlxuICAgICAgICByZXN1bHQuc3RkZXJyICYmXG4gICAgICAgICFyZXN1bHQuYmFja2dyb3VuZFRhc2tJZFxuICAgICAgaWYgKCFpc1ByZUZsaWdodFNlbnRpbmVsKSB7XG4gICAgICAgIHRyYWNrR2l0T3BlcmF0aW9ucyhpbnB1dC5jb21tYW5kLCByZXN1bHQuY29kZSwgcmVzdWx0LnN0ZG91dClcbiAgICAgIH1cblxuICAgICAgLy8gRGlzdGluZ3Vpc2ggdXNlci1kcml2ZW4gaW50ZXJydXB0IChuZXcgbWVzc2FnZSBzdWJtaXR0ZWQpIGZyb20gb3RoZXJcbiAgICAgIC8vIGludGVycnVwdGVkIHN0YXRlcy4gT25seSB1c2VyLWludGVycnVwdCBzaG91bGQgc3VwcHJlc3MgU2hlbGxFcnJvciDigJRcbiAgICAgIC8vIHRpbWVvdXQta2lsbCBvciBwcm9jZXNzLWtpbGwgd2l0aCBpc0Vycm9yIHNob3VsZCBzdGlsbCB0aHJvdy5cbiAgICAgIC8vIE1hdGNoZXMgQmFzaFRvb2wncyBpc0ludGVycnVwdC5cbiAgICAgIGNvbnN0IGlzSW50ZXJydXB0ID1cbiAgICAgICAgcmVzdWx0LmludGVycnVwdGVkICYmIGFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uID09PSAnaW50ZXJydXB0J1xuXG4gICAgICAvLyBPbmx5IHRoZSBtYWluIHRocmVhZCB0cmFja3MvcmVzZXRzIGN3ZDsgYWdlbnRzIGhhdmUgdGhlaXIgb3duIGN3ZFxuICAgICAgLy8gaXNvbGF0aW9uLiBNYXRjaGVzIEJhc2hUb29sJ3MgIXByZXZlbnRDd2RDaGFuZ2VzIGd1YXJkLlxuICAgICAgLy8gUnVucyBiZWZvcmUgdGhlIGJhY2tncm91bmRUYXNrSWQgZWFybHktcmV0dXJuOiBhIGNvbW1hbmQgbWF5IGNoYW5nZVxuICAgICAgLy8gQ1dEIGJlZm9yZSBiZWluZyBiYWNrZ3JvdW5kZWQgKGUuZy4gYFNldC1Mb2NhdGlvbiBDOlxcdGVtcDtcbiAgICAgIC8vIFN0YXJ0LVNsZWVwIDYwYCksIGFuZCBCYXNoVG9vbCBoYXMgbm8gc3VjaCBlYXJseSByZXR1cm4g4oCUIGl0c1xuICAgICAgLy8gYmFja2dyb3VuZGVkIHJlc3VsdHMgZmxvdyB0aHJvdWdoIHJlc2V0Q3dkSWZPdXRzaWRlUHJvamVjdCBhdCA6OTQ1LlxuICAgICAgbGV0IHN0ZGVyckZvclNoZWxsUmVzZXQgPSAnJ1xuICAgICAgaWYgKGlzTWFpblRocmVhZCkge1xuICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IHRvb2xVc2VDb250ZXh0LmdldEFwcFN0YXRlKClcbiAgICAgICAgaWYgKHJlc2V0Q3dkSWZPdXRzaWRlUHJvamVjdChhcHBTdGF0ZS50b29sUGVybWlzc2lvbkNvbnRleHQpKSB7XG4gICAgICAgICAgc3RkZXJyRm9yU2hlbGxSZXNldCA9IHN0ZEVyckFwcGVuZFNoZWxsUmVzZXRNZXNzYWdlKCcnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGJhY2tncm91bmRlZCwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggdGFzayBJRC4gU3RyaXAgaGludHMgZmlyc3RcbiAgICAgIC8vIHNvIGludGVycnVwdC1iYWNrZ3JvdW5kZWQgZnVsbE91dHB1dCBkb2Vzbid0IGxlYWsgdGhlIHRhZyB0byB0aGVcbiAgICAgIC8vIG1vZGVsIChCYXNoVG9vbCBoYXMgbm8gZWFybHkgcmV0dXJuLCBzbyBhbGwgcGF0aHMgZmxvdyB0aHJvdWdoIGl0c1xuICAgICAgLy8gc2luZ2xlIGV4dHJhY3Rpb24gc2l0ZSkuXG4gICAgICBpZiAocmVzdWx0LmJhY2tncm91bmRUYXNrSWQpIHtcbiAgICAgICAgY29uc3QgYmdFeHRyYWN0ZWQgPSBleHRyYWN0Q2xhdWRlQ29kZUhpbnRzKFxuICAgICAgICAgIHJlc3VsdC5zdGRvdXQgfHwgJycsXG4gICAgICAgICAgaW5wdXQuY29tbWFuZCxcbiAgICAgICAgKVxuICAgICAgICBpZiAoaXNNYWluVGhyZWFkICYmIGJnRXh0cmFjdGVkLmhpbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGhpbnQgb2YgYmdFeHRyYWN0ZWQuaGludHMpIG1heWJlUmVjb3JkUGx1Z2luSGludChoaW50KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgc3Rkb3V0OiBiZ0V4dHJhY3RlZC5zdHJpcHBlZCxcbiAgICAgICAgICAgIHN0ZGVycjogW3Jlc3VsdC5zdGRlcnIgfHwgJycsIHN0ZGVyckZvclNoZWxsUmVzZXRdXG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgaW50ZXJydXB0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgYmFja2dyb3VuZFRhc2tJZDogcmVzdWx0LmJhY2tncm91bmRUYXNrSWQsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kZWRCeVVzZXI6IHJlc3VsdC5iYWNrZ3JvdW5kZWRCeVVzZXIsXG4gICAgICAgICAgICBhc3Npc3RhbnRBdXRvQmFja2dyb3VuZGVkOiByZXN1bHQuYXNzaXN0YW50QXV0b0JhY2tncm91bmRlZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0ZG91dEFjY3VtdWxhdG9yID0gbmV3IEVuZFRydW5jYXRpbmdBY2N1bXVsYXRvcigpXG4gICAgICBjb25zdCBwcm9jZXNzZWRTdGRvdXQgPSAocmVzdWx0LnN0ZG91dCB8fCAnJykudHJpbUVuZCgpXG5cbiAgICAgIHN0ZG91dEFjY3VtdWxhdG9yLmFwcGVuZChwcm9jZXNzZWRTdGRvdXQgKyBFT0wpXG5cbiAgICAgIC8vIEludGVycHJldCBleGl0IGNvZGUgdXNpbmcgc2VtYW50aWMgcnVsZXMuIFBTLW5hdGl2ZSBjbWRsZXRzIChTZWxlY3QtU3RyaW5nLFxuICAgICAgLy8gQ29tcGFyZS1PYmplY3QsIFRlc3QtUGF0aCkgZXhpdCAwIG9uIG5vLW1hdGNoIHNvIHRoZXkgYWx3YXlzIGhpdCB0aGUgZGVmYXVsdFxuICAgICAgLy8gaGVyZS4gVGhpcyBwcmltYXJpbHkgaGFuZGxlcyBleHRlcm5hbCAuZXhlJ3MgKGdyZXAsIHJnLCBmaW5kc3RyLCBmYywgcm9ib2NvcHkpXG4gICAgICAvLyB3aGVyZSBub24temVybyBjYW4gbWVhbiBcIm5vIG1hdGNoXCIgLyBcImZpbGVzIGNvcGllZFwiIHJhdGhlciB0aGFuIGZhaWx1cmUuXG4gICAgICBjb25zdCBpbnRlcnByZXRhdGlvbiA9IGludGVycHJldENvbW1hbmRSZXN1bHQoXG4gICAgICAgIGlucHV0LmNvbW1hbmQsXG4gICAgICAgIHJlc3VsdC5jb2RlLFxuICAgICAgICBwcm9jZXNzZWRTdGRvdXQsXG4gICAgICAgIHJlc3VsdC5zdGRlcnIgfHwgJycsXG4gICAgICApXG5cbiAgICAgIC8vIGdldEVycm9yUGFydHMoKSBpbiB0b29sRXJyb3JzLnRzIGFscmVhZHkgcHJlcGVuZHMgJ0V4aXQgY29kZSBOJ1xuICAgICAgLy8gZnJvbSBlcnJvci5jb2RlIHdoZW4gYnVpbGRpbmcgdGhlIFNoZWxsRXJyb3IgbWVzc2FnZS4gRG8gbm90XG4gICAgICAvLyBkdXBsaWNhdGUgaXQgaW50byBzdGRvdXQgaGVyZSAoQmFzaFRvb2wncyBhcHBlbmQgYXQgOjkzOSBpcyBkZWFkXG4gICAgICAvLyBjb2RlIOKAlCBpdCB0aHJvd3MgYmVmb3JlIHN0ZG91dEFjY3VtdWxhdG9yLnRvU3RyaW5nKCkgaXMgcmVhZCkuXG5cbiAgICAgIGxldCBzdGRvdXQgPSBzdHJpcEVtcHR5TGluZXMoc3Rkb3V0QWNjdW11bGF0b3IudG9TdHJpbmcoKSlcblxuICAgICAgLy8gQ2xhdWRlIENvZGUgaGludHMgcHJvdG9jb2w6IENMSXMvU0RLcyBnYXRlZCBvbiBDTEFVREVDT0RFPTEgZW1pdCBhXG4gICAgICAvLyBgPGNsYXVkZS1jb2RlLWhpbnQgLz5gIHRhZyB0byBzdGRlcnIgKG1lcmdlZCBpbnRvIHN0ZG91dCBoZXJlKS4gU2NhbixcbiAgICAgIC8vIHJlY29yZCBmb3IgdXNlQ2xhdWRlQ29kZUhpbnRSZWNvbW1lbmRhdGlvbiB0byBzdXJmYWNlLCB0aGVuIHN0cmlwXG4gICAgICAvLyBzbyB0aGUgbW9kZWwgbmV2ZXIgc2VlcyB0aGUgdGFnIOKAlCBhIHplcm8tdG9rZW4gc2lkZSBjaGFubmVsLlxuICAgICAgLy8gU3RyaXBwaW5nIHJ1bnMgdW5jb25kaXRpb25hbGx5IChzdWJhZ2VudCBvdXRwdXQgbXVzdCBzdGF5IGNsZWFuIHRvbyk7XG4gICAgICAvLyBvbmx5IHRoZSBkaWFsb2cgcmVjb3JkaW5nIGlzIG1haW4tdGhyZWFkLW9ubHkuXG4gICAgICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0Q2xhdWRlQ29kZUhpbnRzKHN0ZG91dCwgaW5wdXQuY29tbWFuZClcbiAgICAgIHN0ZG91dCA9IGV4dHJhY3RlZC5zdHJpcHBlZFxuICAgICAgaWYgKGlzTWFpblRocmVhZCAmJiBleHRyYWN0ZWQuaGludHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGhpbnQgb2YgZXh0cmFjdGVkLmhpbnRzKSBtYXliZVJlY29yZFBsdWdpbkhpbnQoaGludClcbiAgICAgIH1cblxuICAgICAgLy8gcHJlU3Bhd25FcnJvciBtZWFucyBleGVjKCkgc3VjY2VlZGVkIGJ1dCB0aGUgaW5uZXIgc2hlbGwgZmFpbGVkIGJlZm9yZVxuICAgICAgLy8gdGhlIGNvbW1hbmQgcmFuIChlLmcuIENXRCBkZWxldGVkKS4gY3JlYXRlRmFpbGVkQ29tbWFuZCBzZXRzIGNvZGU9MSxcbiAgICAgIC8vIHdoaWNoIGludGVycHJldENvbW1hbmRSZXN1bHQgY2FuIG1pc3Rha2UgZm9yIGdyZXAtbm8tbWF0Y2ggLyBmaW5kc3RyXG4gICAgICAvLyBzdHJpbmctbm90LWZvdW5kLiBUaHJvdyBpdCBkaXJlY3RseS4gTWF0Y2hlcyBCYXNoVG9vbC50c3g6OTU3LlxuICAgICAgaWYgKHJlc3VsdC5wcmVTcGF3bkVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQucHJlU3Bhd25FcnJvcilcbiAgICAgIH1cbiAgICAgIGlmIChpbnRlcnByZXRhdGlvbi5pc0Vycm9yICYmICFpc0ludGVycnVwdCkge1xuICAgICAgICB0aHJvdyBuZXcgU2hlbGxFcnJvcihcbiAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgcmVzdWx0LnN0ZGVyciB8fCAnJyxcbiAgICAgICAgICByZXN1bHQuY29kZSxcbiAgICAgICAgICByZXN1bHQuaW50ZXJydXB0ZWQsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gTGFyZ2Ugb3V0cHV0OiBmaWxlIG9uIGRpc2sgaGFzIG1vcmUgdGhhbiBnZXRNYXhPdXRwdXRMZW5ndGgoKSBieXRlcy5cbiAgICAgIC8vIHN0ZG91dCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBmaXJzdCBjaHVuay4gQ29weSB0aGUgb3V0cHV0IGZpbGUgdG8gdGhlXG4gICAgICAvLyB0b29sLXJlc3VsdHMgZGlyIHNvIHRoZSBtb2RlbCBjYW4gcmVhZCBpdCB2aWEgRmlsZVJlYWQuIElmID4gNjQgTUIsXG4gICAgICAvLyB0cnVuY2F0ZSBhZnRlciBjb3B5aW5nLiBNYXRjaGVzIEJhc2hUb29sLnRzeDo5ODMtMTAwNS5cbiAgICAgIC8vXG4gICAgICAvLyBQbGFjZWQgQUZURVIgdGhlIHByZVNwYXduRXJyb3IvU2hlbGxFcnJvciB0aHJvd3MgKG1hdGNoZXMgQmFzaFRvb2wnc1xuICAgICAgLy8gb3JkZXJpbmcsIHdoZXJlIHBlcnNpc3RlbmNlIGlzIHBvc3QtdHJ5L2ZpbmFsbHkpOiBhIGZhaWxpbmcgY29tbWFuZFxuICAgICAgLy8gdGhhdCBhbHNvIHByb2R1Y2VkID5tYXhPdXRwdXRMZW5ndGggYnl0ZXMgd291bGQgb3RoZXJ3aXNlIGRvIDMtNCBkaXNrXG4gICAgICAvLyBzeXNjYWxscywgc3RvcmUgdG8gdG9vbC1yZXN1bHRzLywgdGhlbiB0aHJvdyDigJQgb3JwaGFuaW5nIHRoZSBmaWxlLlxuICAgICAgY29uc3QgTUFYX1BFUlNJU1RFRF9TSVpFID0gNjQgKiAxMDI0ICogMTAyNFxuICAgICAgbGV0IHBlcnNpc3RlZE91dHB1dFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHBlcnNpc3RlZE91dHB1dFNpemU6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHJlc3VsdC5vdXRwdXRGaWxlUGF0aCAmJiByZXN1bHQub3V0cHV0VGFza0lkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVN0YXQgPSBhd2FpdCBmc1N0YXQocmVzdWx0Lm91dHB1dEZpbGVQYXRoKVxuICAgICAgICAgIHBlcnNpc3RlZE91dHB1dFNpemUgPSBmaWxlU3RhdC5zaXplXG5cbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb29sUmVzdWx0c0RpcigpXG4gICAgICAgICAgY29uc3QgZGVzdCA9IGdldFRvb2xSZXN1bHRQYXRoKHJlc3VsdC5vdXRwdXRUYXNrSWQsIGZhbHNlKVxuICAgICAgICAgIGlmIChmaWxlU3RhdC5zaXplID4gTUFYX1BFUlNJU1RFRF9TSVpFKSB7XG4gICAgICAgICAgICBhd2FpdCBmc1RydW5jYXRlKHJlc3VsdC5vdXRwdXRGaWxlUGF0aCwgTUFYX1BFUlNJU1RFRF9TSVpFKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbGluayhyZXN1bHQub3V0cHV0RmlsZVBhdGgsIGRlc3QpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBhd2FpdCBjb3B5RmlsZShyZXN1bHQub3V0cHV0RmlsZVBhdGgsIGRlc3QpXG4gICAgICAgICAgfVxuICAgICAgICAgIHBlcnNpc3RlZE91dHB1dFBhdGggPSBkZXN0XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZpbGUgbWF5IGFscmVhZHkgYmUgZ29uZSDigJQgc3Rkb3V0IHByZXZpZXcgaXMgc3VmZmljaWVudFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENhcCBpbWFnZSBkaW1lbnNpb25zICsgc2l6ZSBpZiBwcmVzZW50IChDQy0zMDQg4oCUIHNlZVxuICAgICAgLy8gcmVzaXplU2hlbGxJbWFnZU91dHB1dCkuIFNjb3BlIHRoZSBkZWNvZGVkIGJ1ZmZlciBzbyBpdCBjYW4gYmVcbiAgICAgIC8vIHJlY2xhaW1lZCBiZWZvcmUgd2UgYnVpbGQgdGhlIG91dHB1dCBvYmplY3QuXG4gICAgICBsZXQgaXNJbWFnZSA9IGlzSW1hZ2VPdXRwdXQoc3Rkb3V0KVxuICAgICAgbGV0IGNvbXByZXNzZWRTdGRvdXQgPSBzdGRvdXRcbiAgICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZWQgPSBhd2FpdCByZXNpemVTaGVsbEltYWdlT3V0cHV0KFxuICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICByZXN1bHQub3V0cHV0RmlsZVBhdGgsXG4gICAgICAgICAgcGVyc2lzdGVkT3V0cHV0U2l6ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAocmVzaXplZCkge1xuICAgICAgICAgIGNvbXByZXNzZWRTdGRvdXQgPSByZXNpemVkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFyc2UgZmFpbGVkIChlLmcuIG11bHRpLWxpbmUgc3Rkb3V0IGFmdGVyIHRoZSBkYXRhIFVSTCkuIEtlZXBcbiAgICAgICAgICAvLyBpc0ltYWdlIGluIHN5bmMgd2l0aCB3aGF0IHdlIGFjdHVhbGx5IHNlbmQgc28gdGhlIFVJIGxhYmVsIHN0YXlzXG4gICAgICAgICAgLy8gYWNjdXJhdGUg4oCUIG1hcFRvb2xSZXN1bHRUb1Rvb2xSZXN1bHRCbG9ja1BhcmFtJ3MgZGVmZW5zaXZlXG4gICAgICAgICAgLy8gZmFsbHRocm91Z2ggd2lsbCBzZW5kIHRleHQsIG5vdCBhbiBpbWFnZSBibG9jay5cbiAgICAgICAgICBpc0ltYWdlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaW5hbFN0ZGVyciA9IFtyZXN1bHQuc3RkZXJyIHx8ICcnLCBzdGRlcnJGb3JTaGVsbFJlc2V0XVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuXG4gICAgICBsb2dFdmVudCgndGVuZ3VfcG93ZXJzaGVsbF90b29sX2NvbW1hbmRfZXhlY3V0ZWQnLCB7XG4gICAgICAgIGNvbW1hbmRfdHlwZTogZ2V0Q29tbWFuZFR5cGVGb3JMb2dnaW5nKGlucHV0LmNvbW1hbmQpLFxuICAgICAgICBzdGRvdXRfbGVuZ3RoOiBjb21wcmVzc2VkU3Rkb3V0Lmxlbmd0aCxcbiAgICAgICAgc3RkZXJyX2xlbmd0aDogZmluYWxTdGRlcnIubGVuZ3RoLFxuICAgICAgICBleGl0X2NvZGU6IHJlc3VsdC5jb2RlLFxuICAgICAgICBpbnRlcnJ1cHRlZDogcmVzdWx0LmludGVycnVwdGVkLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHN0ZG91dDogY29tcHJlc3NlZFN0ZG91dCxcbiAgICAgICAgICBzdGRlcnI6IGZpbmFsU3RkZXJyLFxuICAgICAgICAgIGludGVycnVwdGVkOiByZXN1bHQuaW50ZXJydXB0ZWQsXG4gICAgICAgICAgcmV0dXJuQ29kZUludGVycHJldGF0aW9uOiBpbnRlcnByZXRhdGlvbi5tZXNzYWdlLFxuICAgICAgICAgIGlzSW1hZ2UsXG4gICAgICAgICAgcGVyc2lzdGVkT3V0cHV0UGF0aCxcbiAgICAgICAgICBwZXJzaXN0ZWRPdXRwdXRTaXplLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoc2V0VG9vbEpTWCkgc2V0VG9vbEpTWChudWxsKVxuICAgIH1cbiAgfSxcbiAgaXNSZXN1bHRUcnVuY2F0ZWQob3V0cHV0OiBPdXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXNPdXRwdXRMaW5lVHJ1bmNhdGVkKG91dHB1dC5zdGRvdXQpIHx8XG4gICAgICBpc091dHB1dExpbmVUcnVuY2F0ZWQob3V0cHV0LnN0ZGVycilcbiAgICApXG4gIH0sXG59IHNhdGlzZmllcyBUb29sRGVmPElucHV0U2NoZW1hLCBPdXQ+KVxuXG5hc3luYyBmdW5jdGlvbiogcnVuUG93ZXJTaGVsbENvbW1hbmQoe1xuICBpbnB1dCxcbiAgYWJvcnRDb250cm9sbGVyLFxuICBzZXRBcHBTdGF0ZSxcbiAgc2V0VG9vbEpTWCxcbiAgcHJldmVudEN3ZENoYW5nZXMsXG4gIGlzTWFpblRocmVhZCxcbiAgdG9vbFVzZUlkLFxuICBhZ2VudElkLFxufToge1xuICBpbnB1dDogUG93ZXJTaGVsbFRvb2xJbnB1dFxuICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlclxuICBzZXRBcHBTdGF0ZTogKGY6IChwcmV2OiBBcHBTdGF0ZSkgPT4gQXBwU3RhdGUpID0+IHZvaWRcbiAgc2V0VG9vbEpTWD86IFNldFRvb2xKU1hGblxuICBwcmV2ZW50Q3dkQ2hhbmdlcz86IGJvb2xlYW5cbiAgaXNNYWluVGhyZWFkPzogYm9vbGVhblxuICB0b29sVXNlSWQ/OiBzdHJpbmdcbiAgYWdlbnRJZD86IEFnZW50SWRcbn0pOiBBc3luY0dlbmVyYXRvcjxcbiAge1xuICAgIHR5cGU6ICdwcm9ncmVzcydcbiAgICBvdXRwdXQ6IHN0cmluZ1xuICAgIGZ1bGxPdXRwdXQ6IHN0cmluZ1xuICAgIGVsYXBzZWRUaW1lU2Vjb25kczogbnVtYmVyXG4gICAgdG90YWxMaW5lczogbnVtYmVyXG4gICAgdG90YWxCeXRlczogbnVtYmVyXG4gICAgdGFza0lkPzogc3RyaW5nXG4gICAgdGltZW91dE1zPzogbnVtYmVyXG4gIH0sXG4gIEV4ZWNSZXN1bHQsXG4gIHZvaWRcbj4ge1xuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBkZXNjcmlwdGlvbixcbiAgICB0aW1lb3V0LFxuICAgIHJ1bl9pbl9iYWNrZ3JvdW5kLFxuICAgIGRhbmdlcm91c2x5RGlzYWJsZVNhbmRib3gsXG4gIH0gPSBpbnB1dFxuICBjb25zdCB0aW1lb3V0TXMgPSBNYXRoLm1pbihcbiAgICB0aW1lb3V0IHx8IGdldERlZmF1bHRUaW1lb3V0TXMoKSxcbiAgICBnZXRNYXhUaW1lb3V0TXMoKSxcbiAgKVxuXG4gIGxldCBmdWxsT3V0cHV0ID0gJydcbiAgbGV0IGxhc3RQcm9ncmVzc091dHB1dCA9ICcnXG4gIGxldCBsYXN0VG90YWxMaW5lcyA9IDBcbiAgbGV0IGxhc3RUb3RhbEJ5dGVzID0gMFxuICBsZXQgYmFja2dyb3VuZFNoZWxsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICBsZXQgaW50ZXJydXB0QmFja2dyb3VuZGluZ1N0YXJ0ZWQgPSBmYWxzZVxuICBsZXQgYXNzaXN0YW50QXV0b0JhY2tncm91bmRlZCA9IGZhbHNlXG5cbiAgLy8gUHJvZ3Jlc3Mgc2lnbmFsOiByZXNvbHZlZCB3aGVuIGJhY2tncm91bmRTaGVsbElkIGlzIHNldCBpbiB0aGUgYXN5bmNcbiAgLy8gLnRoZW4oKSBwYXRoLCB3YWtpbmcgdGhlIGdlbmVyYXRvcidzIFByb21pc2UucmFjZSBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mXG4gIC8vIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHNldFRpbWVvdXQgdGljayAobWF0Y2hlcyBCYXNoVG9vbCBwYXR0ZXJuKS5cbiAgbGV0IHJlc29sdmVQcm9ncmVzczogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGxcbiAgZnVuY3Rpb24gY3JlYXRlUHJvZ3Jlc3NTaWduYWwoKTogUHJvbWlzZTxudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPG51bGw+KHJlc29sdmUgPT4ge1xuICAgICAgcmVzb2x2ZVByb2dyZXNzID0gKCkgPT4gcmVzb2x2ZShudWxsKVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBzaG91bGRBdXRvQmFja2dyb3VuZCA9XG4gICAgIWlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgJiYgaXNBdXRvYmFja2dyb3VuZGluZ0FsbG93ZWQoY29tbWFuZClcblxuICBjb25zdCBwb3dlcnNoZWxsUGF0aCA9IGF3YWl0IGdldENhY2hlZFBvd2VyU2hlbGxQYXRoKClcbiAgaWYgKCFwb3dlcnNoZWxsUGF0aCkge1xuICAgIC8vIFByZS1mbGlnaHQgZmFpbHVyZTogcHdzaCBub3QgaW5zdGFsbGVkLiBSZXR1cm4gY29kZSAwIHNvIGNhbGwoKSBzdXJmYWNlc1xuICAgIC8vIHRoaXMgYXMgYSBncmFjZWZ1bCBzdGRlcnIgbWVzc2FnZSByYXRoZXIgdGhhbiB0aHJvd2luZyBTaGVsbEVycm9yIOKAlCB0aGVcbiAgICAvLyBjb21tYW5kIG5ldmVyIHJhbiwgc28gdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBub24temVybyBleGl0IHRvIHJlcG9ydC5cbiAgICByZXR1cm4ge1xuICAgICAgc3Rkb3V0OiAnJyxcbiAgICAgIHN0ZGVycjogJ1Bvd2VyU2hlbGwgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbS4nLFxuICAgICAgY29kZTogMCxcbiAgICAgIGludGVycnVwdGVkOiBmYWxzZSxcbiAgICB9XG4gIH1cblxuICBsZXQgc2hlbGxDb21tYW5kOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGV4ZWM+PlxuICB0cnkge1xuICAgIHNoZWxsQ29tbWFuZCA9IGF3YWl0IGV4ZWMoY29tbWFuZCwgYWJvcnRDb250cm9sbGVyLnNpZ25hbCwgJ3Bvd2Vyc2hlbGwnLCB7XG4gICAgICB0aW1lb3V0OiB0aW1lb3V0TXMsXG4gICAgICBvblByb2dyZXNzKGxhc3RMaW5lcywgYWxsTGluZXMsIHRvdGFsTGluZXMsIHRvdGFsQnl0ZXMsIGlzSW5jb21wbGV0ZSkge1xuICAgICAgICBsYXN0UHJvZ3Jlc3NPdXRwdXQgPSBsYXN0TGluZXNcbiAgICAgICAgZnVsbE91dHB1dCA9IGFsbExpbmVzXG4gICAgICAgIGxhc3RUb3RhbExpbmVzID0gdG90YWxMaW5lc1xuICAgICAgICBsYXN0VG90YWxCeXRlcyA9IGlzSW5jb21wbGV0ZSA/IHRvdGFsQnl0ZXMgOiAwXG4gICAgICB9LFxuICAgICAgcHJldmVudEN3ZENoYW5nZXMsXG4gICAgICAvLyBTYW5kYm94IHdvcmtzIG9uIExpbnV4L21hY09TL1dTTDIg4oCUIHB3c2ggdGhlcmUgaXMgYSBuYXRpdmUgYmluYXJ5IGFuZFxuICAgICAgLy8gU2FuZGJveE1hbmFnZXIud3JhcFdpdGhTYW5kYm94IHdyYXBzIGl0IHNhbWUgYXMgYmFzaCAoU2hlbGwudHMgdXNlc1xuICAgICAgLy8gL2Jpbi9zaCBmb3IgdGhlIG91dGVyIHNwYXduIHRvIHBhcnNlIHRoZSBQT1NJWC1xdW90ZWQgYndyYXAvc2FuZGJveC1leGVjXG4gICAgICAvLyBzdHJpbmcpLiBPbiBXaW5kb3dzIG5hdGl2ZSwgc2FuZGJveCBpcyB1bnN1cHBvcnRlZDsgc2hvdWxkVXNlU2FuZGJveCgpXG4gICAgICAvLyByZXR1cm5zIGZhbHNlIHZpYSBpc1NhbmRib3hpbmdFbmFibGVkKCkg4oaSIGlzU3VwcG9ydGVkUGxhdGZvcm0oKSDihpIgZmFsc2UuXG4gICAgICAvLyBUaGUgZXhwbGljaXQgcGxhdGZvcm0gY2hlY2sgaXMgcmVkdW5kYW50LWJ1dC1vYnZpb3VzLlxuICAgICAgc2hvdWxkVXNlU2FuZGJveDpcbiAgICAgICAgZ2V0UGxhdGZvcm0oKSA9PT0gJ3dpbmRvd3MnXG4gICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgIDogc2hvdWxkVXNlU2FuZGJveCh7IGNvbW1hbmQsIGRhbmdlcm91c2x5RGlzYWJsZVNhbmRib3ggfSksXG4gICAgICBzaG91bGRBdXRvQmFja2dyb3VuZCxcbiAgICB9KVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nRXJyb3IoZSlcbiAgICAvLyBQcmUtZmxpZ2h0IGZhaWx1cmU6IHNwYXduL2V4ZWMgcmVqZWN0ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHJhbi4gVXNlXG4gICAgLy8gY29kZSAwIHNvIGNhbGwoKSByZXR1cm5zIHN0ZGVyciBncmFjZWZ1bGx5IGluc3RlYWQgb2YgdGhyb3dpbmcgU2hlbGxFcnJvci5cbiAgICByZXR1cm4ge1xuICAgICAgc3Rkb3V0OiAnJyxcbiAgICAgIHN0ZGVycjogYEZhaWxlZCB0byBleGVjdXRlIFBvd2VyU2hlbGwgY29tbWFuZDogJHtnZXRFcnJvck1lc3NhZ2UoZSl9YCxcbiAgICAgIGNvZGU6IDAsXG4gICAgICBpbnRlcnJ1cHRlZDogZmFsc2UsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHNoZWxsQ29tbWFuZC5yZXN1bHRcblxuICAvLyBIZWxwZXIgdG8gc3Bhd24gYSBiYWNrZ3JvdW5kIHRhc2sgYW5kIHJldHVybiBpdHMgSURcbiAgYXN5bmMgZnVuY3Rpb24gc3Bhd25CYWNrZ3JvdW5kVGFzaygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHNwYXduU2hlbGxUYXNrKFxuICAgICAge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfHwgY29tbWFuZCxcbiAgICAgICAgc2hlbGxDb21tYW5kLFxuICAgICAgICB0b29sVXNlSWQsXG4gICAgICAgIGFnZW50SWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIGdldEFwcFN0YXRlOiAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2dldEFwcFN0YXRlIG5vdCBhdmFpbGFibGUgaW4gcnVuUG93ZXJTaGVsbENvbW1hbmQgY29udGV4dCcsXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICBzZXRBcHBTdGF0ZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHJldHVybiBoYW5kbGUudGFza0lkXG4gIH1cblxuICAvLyBIZWxwZXIgdG8gc3RhcnQgYmFja2dyb3VuZGluZyB3aXRoIGxvZ2dpbmdcbiAgZnVuY3Rpb24gc3RhcnRCYWNrZ3JvdW5kaW5nKFxuICAgIGV2ZW50TmFtZTogc3RyaW5nLFxuICAgIGJhY2tncm91bmRGbj86IChzaGVsbElkOiBzdHJpbmcpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIC8vIElmIGEgZm9yZWdyb3VuZCB0YXNrIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAodmlhIHJlZ2lzdGVyRm9yZWdyb3VuZCBpbiB0aGVcbiAgICAvLyBwcm9ncmVzcyBsb29wKSwgYmFja2dyb3VuZCBpdCBpbi1wbGFjZSBpbnN0ZWFkIG9mIHJlLXNwYXduaW5nLiBSZS1zcGF3bmluZ1xuICAgIC8vIHdvdWxkIG92ZXJ3cml0ZSB0YXNrc1t0YXNrSWRdLCBlbWl0IGEgZHVwbGljYXRlIHRhc2tfc3RhcnRlZCBTREsgZXZlbnQsXG4gICAgLy8gYW5kIGxlYWsgdGhlIGZpcnN0IGNsZWFudXAgY2FsbGJhY2suXG4gICAgaWYgKGZvcmVncm91bmRUYXNrSWQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWJhY2tncm91bmRFeGlzdGluZ0ZvcmVncm91bmRUYXNrKFxuICAgICAgICAgIGZvcmVncm91bmRUYXNrSWQsXG4gICAgICAgICAgc2hlbGxDb21tYW5kLFxuICAgICAgICAgIGRlc2NyaXB0aW9uIHx8IGNvbW1hbmQsXG4gICAgICAgICAgc2V0QXBwU3RhdGUsXG4gICAgICAgICAgdG9vbFVzZUlkLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBiYWNrZ3JvdW5kU2hlbGxJZCA9IGZvcmVncm91bmRUYXNrSWRcbiAgICAgIGxvZ0V2ZW50KGV2ZW50TmFtZSwge1xuICAgICAgICBjb21tYW5kX3R5cGU6IGdldENvbW1hbmRUeXBlRm9yTG9nZ2luZyhjb21tYW5kKSxcbiAgICAgIH0pXG4gICAgICBiYWNrZ3JvdW5kRm4/Lihmb3JlZ3JvdW5kVGFza0lkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTm8gZm9yZWdyb3VuZCB0YXNrIHJlZ2lzdGVyZWQg4oCUIHNwYXduIGEgbmV3IGJhY2tncm91bmQgdGFza1xuICAgIC8vIE5vdGU6IHNwYXduIGlzIGVzc2VudGlhbGx5IHN5bmNocm9ub3VzIGRlc3BpdGUgYmVpbmcgYXN5bmNcbiAgICB2b2lkIHNwYXduQmFja2dyb3VuZFRhc2soKS50aGVuKHNoZWxsSWQgPT4ge1xuICAgICAgYmFja2dyb3VuZFNoZWxsSWQgPSBzaGVsbElkXG5cbiAgICAgIC8vIFdha2UgdGhlIGdlbmVyYXRvcidzIFByb21pc2UucmFjZSBzbyBpdCBzZWVzIGJhY2tncm91bmRTaGVsbElkLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCB0aGUgZ2VuZXJhdG9yIHdhaXRzIGZvciB0aGUgY3VycmVudCBzZXRUaW1lb3V0IHRvIGZpcmVcbiAgICAgIC8vICh1cCB0byB+MXMpIGJlZm9yZSBub3RpY2luZyB0aGUgYmFja2dyb3VuZGluZy4gTWF0Y2hlcyBCYXNoVG9vbC5cbiAgICAgIGNvbnN0IHJlc29sdmUgPSByZXNvbHZlUHJvZ3Jlc3NcbiAgICAgIGlmIChyZXNvbHZlKSB7XG4gICAgICAgIHJlc29sdmVQcm9ncmVzcyA9IG51bGxcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIGxvZ0V2ZW50KGV2ZW50TmFtZSwge1xuICAgICAgICBjb21tYW5kX3R5cGU6IGdldENvbW1hbmRUeXBlRm9yTG9nZ2luZyhjb21tYW5kKSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChiYWNrZ3JvdW5kRm4pIHtcbiAgICAgICAgYmFja2dyb3VuZEZuKHNoZWxsSWQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIFNldCB1cCBhdXRvLWJhY2tncm91bmRpbmcgb24gdGltZW91dCBpZiBlbmFibGVkXG4gIGlmIChzaGVsbENvbW1hbmQub25UaW1lb3V0ICYmIHNob3VsZEF1dG9CYWNrZ3JvdW5kKSB7XG4gICAgc2hlbGxDb21tYW5kLm9uVGltZW91dChiYWNrZ3JvdW5kRm4gPT4ge1xuICAgICAgc3RhcnRCYWNrZ3JvdW5kaW5nKFxuICAgICAgICAndGVuZ3VfcG93ZXJzaGVsbF9jb21tYW5kX3RpbWVvdXRfYmFja2dyb3VuZGVkJyxcbiAgICAgICAgYmFja2dyb3VuZEZuLFxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICAvLyBJbiBhc3Npc3RhbnQgbW9kZSwgdGhlIG1haW4gYWdlbnQgc2hvdWxkIHN0YXkgcmVzcG9uc2l2ZS4gQXV0by1iYWNrZ3JvdW5kXG4gIC8vIGJsb2NraW5nIGNvbW1hbmRzIGFmdGVyIEFTU0lTVEFOVF9CTE9DS0lOR19CVURHRVRfTVMgc28gdGhlIGFnZW50IGNhbiBrZWVwXG4gIC8vIGNvb3JkaW5hdGluZyBpbnN0ZWFkIG9mIHdhaXRpbmcuIFRoZSBjb21tYW5kIGtlZXBzIHJ1bm5pbmcg4oCUIG5vIHN0YXRlIGxvc3MuXG4gIGlmIChcbiAgICBmZWF0dXJlKCdLQUlST1MnKSAmJlxuICAgIGdldEthaXJvc0FjdGl2ZSgpICYmXG4gICAgaXNNYWluVGhyZWFkICYmXG4gICAgIWlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgJiZcbiAgICBydW5faW5fYmFja2dyb3VuZCAhPT0gdHJ1ZVxuICApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgc2hlbGxDb21tYW5kLnN0YXR1cyA9PT0gJ3J1bm5pbmcnICYmXG4gICAgICAgIGJhY2tncm91bmRTaGVsbElkID09PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBhc3Npc3RhbnRBdXRvQmFja2dyb3VuZGVkID0gdHJ1ZVxuICAgICAgICBzdGFydEJhY2tncm91bmRpbmcoXG4gICAgICAgICAgJ3Rlbmd1X3Bvd2Vyc2hlbGxfY29tbWFuZF9hc3Npc3RhbnRfYXV0b19iYWNrZ3JvdW5kZWQnLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSwgQVNTSVNUQU5UX0JMT0NLSU5HX0JVREdFVF9NUykudW5yZWYoKVxuICB9XG5cbiAgLy8gSGFuZGxlIENsYXVkZSBhc2tpbmcgdG8gcnVuIGl0IGluIHRoZSBiYWNrZ3JvdW5kIGV4cGxpY2l0bHlcbiAgLy8gV2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCB2aWEgcnVuX2luX2JhY2tncm91bmQsIGFsd2F5cyBob25vciB0aGUgcmVxdWVzdFxuICAvLyByZWdhcmRsZXNzIG9mIHRoZSBjb21tYW5kIHR5cGUgKGlzQXV0b2JhY2tncm91bmRpbmdBbGxvd2VkIG9ubHkgYXBwbGllcyB0byBhdXRvbWF0aWMgYmFja2dyb3VuZGluZylcbiAgaWYgKHJ1bl9pbl9iYWNrZ3JvdW5kID09PSB0cnVlICYmICFpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkKSB7XG4gICAgY29uc3Qgc2hlbGxJZCA9IGF3YWl0IHNwYXduQmFja2dyb3VuZFRhc2soKVxuXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X3Bvd2Vyc2hlbGxfY29tbWFuZF9leHBsaWNpdGx5X2JhY2tncm91bmRlZCcsIHtcbiAgICAgIGNvbW1hbmRfdHlwZTogZ2V0Q29tbWFuZFR5cGVGb3JMb2dnaW5nKGNvbW1hbmQpLFxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3Rkb3V0OiAnJyxcbiAgICAgIHN0ZGVycjogJycsXG4gICAgICBjb2RlOiAwLFxuICAgICAgaW50ZXJydXB0ZWQ6IGZhbHNlLFxuICAgICAgYmFja2dyb3VuZFRhc2tJZDogc2hlbGxJZCxcbiAgICB9XG4gIH1cblxuICAvLyBTdGFydCBwb2xsaW5nIHRoZSBvdXRwdXQgZmlsZSBmb3IgcHJvZ3Jlc3NcbiAgVGFza091dHB1dC5zdGFydFBvbGxpbmcoc2hlbGxDb21tYW5kLnRhc2tPdXRwdXQudGFza0lkKVxuXG4gIC8vIFNldCB1cCBwcm9ncmVzcyB5aWVsZGluZyB3aXRoIHBlcmlvZGljIGNoZWNrc1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gIGxldCBuZXh0UHJvZ3Jlc3NUaW1lID0gc3RhcnRUaW1lICsgUFJPR1JFU1NfVEhSRVNIT0xEX01TXG4gIGxldCBmb3JlZ3JvdW5kVGFza0lkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICAvLyBQcm9ncmVzcyBsb29wOiB3cmFwIGluIHRyeS9maW5hbGx5IHNvIHN0b3BQb2xsaW5nIGlzIGNhbGxlZCBvbiBldmVyeSBleGl0XG4gIC8vIHBhdGgg4oCUIG5vcm1hbCBjb21wbGV0aW9uLCB0aW1lb3V0L2ludGVycnVwdCBiYWNrZ3JvdW5kaW5nLCBhbmQgQ3RybCtCXG4gIC8vIChtYXRjaGVzIEJhc2hUb29sIHBhdHRlcm47IHNlZSBQUiAjMTg4ODcgcmV2aWV3IHRocmVhZCBhdCA6NTYwKVxuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCB0aW1lVW50aWxOZXh0UHJvZ3Jlc3MgPSBNYXRoLm1heCgwLCBuZXh0UHJvZ3Jlc3NUaW1lIC0gbm93KVxuXG4gICAgICBjb25zdCBwcm9ncmVzc1NpZ25hbCA9IGNyZWF0ZVByb2dyZXNzU2lnbmFsKClcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIHJlc3VsdFByb21pc2UsXG4gICAgICAgIG5ldyBQcm9taXNlPG51bGw+KHJlc29sdmUgPT5cbiAgICAgICAgICBzZXRUaW1lb3V0KHIgPT4gcihudWxsKSwgdGltZVVudGlsTmV4dFByb2dyZXNzLCByZXNvbHZlKS51bnJlZigpLFxuICAgICAgICApLFxuICAgICAgICBwcm9ncmVzc1NpZ25hbCxcbiAgICAgIF0pXG5cbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gUmFjZTogYmFja2dyb3VuZGluZyBmaXJlZCAoMTVzIHRpbWVyIC8gb25UaW1lb3V0IC8gQ3RybCtCKSBidXQgdGhlXG4gICAgICAgIC8vIGNvbW1hbmQgY29tcGxldGVkIGJlZm9yZSB0aGUgbmV4dCBwb2xsIHRpY2suICNoYW5kbGVFeGl0IHNldHNcbiAgICAgICAgLy8gYmFja2dyb3VuZFRhc2tJZCBidXQgc2tpcHMgb3V0cHV0RmlsZVBhdGggKGl0IGFzc3VtZXMgdGhlIGJhY2tncm91bmRcbiAgICAgICAgLy8gbWVzc2FnZSBvciA8dGFza19ub3RpZmljYXRpb24+IHdpbGwgY2FycnkgdGhlIHBhdGgpLiBTdHJpcFxuICAgICAgICAvLyBiYWNrZ3JvdW5kVGFza0lkIHNvIHRoZSBtb2RlbCBzZWVzIGEgY2xlYW4gY29tcGxldGVkIGNvbW1hbmQsXG4gICAgICAgIC8vIHJlY29uc3RydWN0IG91dHB1dEZpbGVQYXRoIGZvciBsYXJnZSBvdXRwdXRzLCBhbmQgc3VwcHJlc3MgdGhlXG4gICAgICAgIC8vIHJlZHVuZGFudCA8dGFza19ub3RpZmljYXRpb24+IGZyb20gdGhlIC50aGVuKCkgaGFuZGxlci5cbiAgICAgICAgLy8gQ2hlY2sgcmVzdWx0LmJhY2tncm91bmRUYXNrSWQgKG5vdCB0aGUgY2xvc3VyZSB2YXIpIHRvIGFsc28gY292ZXJcbiAgICAgICAgLy8gQ3RybCtCLCB3aGljaCBjYWxscyBzaGVsbENvbW1hbmQuYmFja2dyb3VuZCgpIGRpcmVjdGx5LlxuICAgICAgICBpZiAocmVzdWx0LmJhY2tncm91bmRUYXNrSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG1hcmtUYXNrTm90aWZpZWQocmVzdWx0LmJhY2tncm91bmRUYXNrSWQsIHNldEFwcFN0YXRlKVxuICAgICAgICAgIGNvbnN0IGZpeGVkUmVzdWx0OiBFeGVjUmVzdWx0ID0ge1xuICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgYmFja2dyb3VuZFRhc2tJZDogdW5kZWZpbmVkLFxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNaXJyb3IgU2hlbGxDb21tYW5kLiNoYW5kbGVFeGl0J3MgbGFyZ2Utb3V0cHV0IGJyYW5jaCB0aGF0IHdhc1xuICAgICAgICAgIC8vIHNraXBwZWQgYmVjYXVzZSAjYmFja2dyb3VuZFRhc2tJZCB3YXMgc2V0LlxuICAgICAgICAgIGNvbnN0IHsgdGFza091dHB1dCB9ID0gc2hlbGxDb21tYW5kXG4gICAgICAgICAgaWYgKHRhc2tPdXRwdXQuc3Rkb3V0VG9GaWxlICYmICF0YXNrT3V0cHV0Lm91dHB1dEZpbGVSZWR1bmRhbnQpIHtcbiAgICAgICAgICAgIGZpeGVkUmVzdWx0Lm91dHB1dEZpbGVQYXRoID0gdGFza091dHB1dC5wYXRoXG4gICAgICAgICAgICBmaXhlZFJlc3VsdC5vdXRwdXRGaWxlU2l6ZSA9IHRhc2tPdXRwdXQub3V0cHV0RmlsZVNpemVcbiAgICAgICAgICAgIGZpeGVkUmVzdWx0Lm91dHB1dFRhc2tJZCA9IHRhc2tPdXRwdXQudGFza0lkXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENvbW1hbmQgY29tcGxldGVkIOKAlCBjbGVhbnVwIHN0cmVhbSBsaXN0ZW5lcnMgaGVyZS4gVGhlIGZpbmFsbHlcbiAgICAgICAgICAvLyBibG9jaydzIGd1YXJkICghYmFja2dyb3VuZFNoZWxsSWQgJiYgc3RhdHVzICE9PSAnYmFja2dyb3VuZGVkJylcbiAgICAgICAgICAvLyBjb3JyZWN0bHkgc2tpcHMgY2xlYW51cCBmb3IgKnJ1bm5pbmcqIGJhY2tncm91bmRlZCB0YXNrcywgYnV0XG4gICAgICAgICAgLy8gaW4gdGhpcyByYWNlIHRoZSBwcm9jZXNzIGlzIGRvbmUuIE1hdGNoZXMgQmFzaFRvb2wudHN4OjEzOTkuXG4gICAgICAgICAgc2hlbGxDb21tYW5kLmNsZWFudXAoKVxuICAgICAgICAgIHJldHVybiBmaXhlZFJlc3VsdFxuICAgICAgICB9XG4gICAgICAgIC8vIENvbW1hbmQgaGFzIGNvbXBsZXRlZFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGNvbW1hbmQgd2FzIGJhY2tncm91bmRlZCAoYnkgdGltZW91dCBvciBpbnRlcnJ1cHQpXG4gICAgICBpZiAoYmFja2dyb3VuZFNoZWxsSWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGRvdXQ6IGludGVycnVwdEJhY2tncm91bmRpbmdTdGFydGVkID8gZnVsbE91dHB1dCA6ICcnLFxuICAgICAgICAgIHN0ZGVycjogJycsXG4gICAgICAgICAgY29kZTogMCxcbiAgICAgICAgICBpbnRlcnJ1cHRlZDogZmFsc2UsXG4gICAgICAgICAgYmFja2dyb3VuZFRhc2tJZDogYmFja2dyb3VuZFNoZWxsSWQsXG4gICAgICAgICAgYXNzaXN0YW50QXV0b0JhY2tncm91bmRlZCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVc2VyIHN1Ym1pdHRlZCBhIG5ldyBtZXNzYWdlIC0gYmFja2dyb3VuZCBpbnN0ZWFkIG9mIGtpbGxpbmdcbiAgICAgIGlmIChcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkICYmXG4gICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uID09PSAnaW50ZXJydXB0JyAmJlxuICAgICAgICAhaW50ZXJydXB0QmFja2dyb3VuZGluZ1N0YXJ0ZWRcbiAgICAgICkge1xuICAgICAgICBpbnRlcnJ1cHRCYWNrZ3JvdW5kaW5nU3RhcnRlZCA9IHRydWVcbiAgICAgICAgaWYgKCFpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkKSB7XG4gICAgICAgICAgc3RhcnRCYWNrZ3JvdW5kaW5nKCd0ZW5ndV9wb3dlcnNoZWxsX2NvbW1hbmRfaW50ZXJydXB0X2JhY2tncm91bmRlZCcpXG4gICAgICAgICAgLy8gUmVsb29wIHNvIHRoZSBiYWNrZ3JvdW5kU2hlbGxJZCBjaGVjayAoYWJvdmUpIGNhdGNoZXMgdGhlIHN5bmNcbiAgICAgICAgICAvLyBmb3JlZ3JvdW5kVGFza0lk4oaSYmFja2dyb3VuZCBwYXRoLiBXaXRob3V0IHRoaXMsIHdlIGZhbGwgdGhyb3VnaFxuICAgICAgICAgIC8vIHRvIHRoZSBDdHJsK0IgY2hlY2sgYmVsb3csIHdoaWNoIG1hdGNoZXMgc3RhdHVzPT09J2JhY2tncm91bmRlZCdcbiAgICAgICAgICAvLyBhbmQgaW5jb3JyZWN0bHkgcmV0dXJucyBiYWNrZ3JvdW5kZWRCeVVzZXI6dHJ1ZS4gKGJ1Z3MgMDIwLzAyMSlcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHNoZWxsQ29tbWFuZC5raWxsKClcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBmb3JlZ3JvdW5kIHRhc2sgd2FzIGJhY2tncm91bmRlZCB2aWEgYmFja2dyb3VuZEFsbCgpIChjdHJsK2IpXG4gICAgICBpZiAoZm9yZWdyb3VuZFRhc2tJZCkge1xuICAgICAgICBpZiAoc2hlbGxDb21tYW5kLnN0YXR1cyA9PT0gJ2JhY2tncm91bmRlZCcpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Rkb3V0OiAnJyxcbiAgICAgICAgICAgIHN0ZGVycjogJycsXG4gICAgICAgICAgICBjb2RlOiAwLFxuICAgICAgICAgICAgaW50ZXJydXB0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgYmFja2dyb3VuZFRhc2tJZDogZm9yZWdyb3VuZFRhc2tJZCxcbiAgICAgICAgICAgIGJhY2tncm91bmRlZEJ5VXNlcjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGltZSBmb3IgYSBwcm9ncmVzcyB1cGRhdGVcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lXG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvIDEwMDApXG5cbiAgICAgIC8vIFNob3cgYmFja2dyb3VuZGluZyBVSSBoaW50IGFmdGVyIHRocmVzaG9sZFxuICAgICAgaWYgKFxuICAgICAgICAhaXNCYWNrZ3JvdW5kVGFza3NEaXNhYmxlZCAmJlxuICAgICAgICBiYWNrZ3JvdW5kU2hlbGxJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGVsYXBzZWRTZWNvbmRzID49IFBST0dSRVNTX1RIUkVTSE9MRF9NUyAvIDEwMDAgJiZcbiAgICAgICAgc2V0VG9vbEpTWFxuICAgICAgKSB7XG4gICAgICAgIGlmICghZm9yZWdyb3VuZFRhc2tJZCkge1xuICAgICAgICAgIGZvcmVncm91bmRUYXNrSWQgPSByZWdpc3RlckZvcmVncm91bmQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB8fCBjb21tYW5kLFxuICAgICAgICAgICAgICBzaGVsbENvbW1hbmQsXG4gICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0QXBwU3RhdGUsXG4gICAgICAgICAgICB0b29sVXNlSWQsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0VG9vbEpTWCh7XG4gICAgICAgICAganN4OiA8QmFja2dyb3VuZEhpbnQgLz4sXG4gICAgICAgICAgc2hvdWxkSGlkZVByb21wdElucHV0OiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRDb250aW51ZUFuaW1hdGlvbjogdHJ1ZSxcbiAgICAgICAgICBzaG93U3Bpbm5lcjogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgeWllbGQge1xuICAgICAgICB0eXBlOiAncHJvZ3Jlc3MnLFxuICAgICAgICBmdWxsT3V0cHV0LFxuICAgICAgICBvdXRwdXQ6IGxhc3RQcm9ncmVzc091dHB1dCxcbiAgICAgICAgZWxhcHNlZFRpbWVTZWNvbmRzOiBlbGFwc2VkU2Vjb25kcyxcbiAgICAgICAgdG90YWxMaW5lczogbGFzdFRvdGFsTGluZXMsXG4gICAgICAgIHRvdGFsQnl0ZXM6IGxhc3RUb3RhbEJ5dGVzLFxuICAgICAgICB0YXNrSWQ6IHNoZWxsQ29tbWFuZC50YXNrT3V0cHV0LnRhc2tJZCxcbiAgICAgICAgLi4uKHRpbWVvdXQgPyB7IHRpbWVvdXRNcyB9IDogdW5kZWZpbmVkKSxcbiAgICAgIH1cblxuICAgICAgbmV4dFByb2dyZXNzVGltZSA9IERhdGUubm93KCkgKyBQUk9HUkVTU19JTlRFUlZBTF9NU1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBUYXNrT3V0cHV0LnN0b3BQb2xsaW5nKHNoZWxsQ29tbWFuZC50YXNrT3V0cHV0LnRhc2tJZClcbiAgICAvLyBFbnN1cmUgY2xlYW51cCBydW5zIG9uIGV2ZXJ5IGV4aXQgcGF0aCAoc3VjY2VzcywgcmVqZWN0aW9uLCBhYm9ydCkuXG4gICAgLy8gU2tpcCB3aGVuIGJhY2tncm91bmRlZCDigJQgTG9jYWxTaGVsbFRhc2sgb3ducyBjbGVhbnVwIGZvciB0aG9zZS5cbiAgICAvLyBNYXRjaGVzIG1haW4gIzIxMTA1LlxuICAgIGlmICghYmFja2dyb3VuZFNoZWxsSWQgJiYgc2hlbGxDb21tYW5kLnN0YXR1cyAhPT0gJ2JhY2tncm91bmRlZCcpIHtcbiAgICAgIGlmIChmb3JlZ3JvdW5kVGFza0lkKSB7XG4gICAgICAgIHVucmVnaXN0ZXJGb3JlZ3JvdW5kKGZvcmVncm91bmRUYXNrSWQsIHNldEFwcFN0YXRlKVxuICAgICAgfVxuICAgICAgc2hlbGxDb21tYW5kLmNsZWFudXAoKVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLFFBQVEsWUFBWTtBQUNwQyxjQUFjQyxvQkFBb0IsUUFBUSx1Q0FBdUM7QUFDakYsU0FDRUMsUUFBUSxFQUNSQyxJQUFJLElBQUlDLE1BQU0sRUFDZEMsUUFBUSxJQUFJQyxVQUFVLEVBQ3RCQyxJQUFJLFFBQ0MsYUFBYTtBQUNwQixPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLGNBQWNDLFlBQVksUUFBUSw0QkFBNEI7QUFDOUQsY0FBY0MsUUFBUSxRQUFRLHVCQUF1QjtBQUNyRCxTQUFTQyxDQUFDLFFBQVEsUUFBUTtBQUMxQixTQUFTQyxlQUFlLFFBQVEsMEJBQTBCO0FBQzFELFNBQVNDLHVCQUF1QixRQUFRLCtCQUErQjtBQUN2RSxTQUNFLEtBQUtDLDBEQUEwRCxFQUMvREMsUUFBUSxRQUNILG1DQUFtQztBQUMxQyxjQUNFQyxZQUFZLEVBQ1pDLElBQUksRUFDSkMsZ0JBQWdCLEVBQ2hCQyxnQkFBZ0IsUUFDWCxlQUFlO0FBQ3RCLFNBQVNDLFNBQVMsRUFBRSxLQUFLQyxPQUFPLFFBQVEsZUFBZTtBQUN2RCxTQUNFQyxnQ0FBZ0MsRUFDaENDLGdCQUFnQixFQUNoQkMsa0JBQWtCLEVBQ2xCQyxjQUFjLEVBQ2RDLG9CQUFvQixRQUNmLDhDQUE4QztBQUNyRCxjQUFjQyxPQUFPLFFBQVEsb0JBQW9CO0FBQ2pELGNBQWNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUM5RCxTQUFTQyxzQkFBc0IsUUFBUSxnQ0FBZ0M7QUFDdkUsU0FBU0MsV0FBVyxRQUFRLHlCQUF5QjtBQUNyRCxTQUNFQyxZQUFZLElBQUlDLGVBQWUsRUFDL0JDLFVBQVUsUUFDTCx1QkFBdUI7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
|