@iaforged/context-code 2.0.1 → 2.0.2
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/dist/src/bridge/bridgeMain.js +1 -1
- package/dist/src/bridge/types.js +1 -1
- package/dist/src/cli/handlers/auth.js +1 -1
- package/dist/src/cli/handlers/mcp.js +1 -1
- package/dist/src/cli/print.js +1 -1
- package/dist/src/commands/copy/copy.js +1 -1
- package/dist/src/commands/heartbeat/heartbeat.js +1 -0
- package/dist/src/commands/heartbeat/index.js +1 -0
- package/dist/src/commands/insights.js +1 -1
- package/dist/src/commands/install-github-app/ExistingWorkflowStep.js +1 -1
- package/dist/src/commands/install-github-app/InstallAppStep.js +1 -1
- package/dist/src/commands/install-github-app/OAuthFlowStep.js +1 -1
- package/dist/src/commands/install-github-app/SuccessStep.js +1 -1
- package/dist/src/commands/install-github-app/setupGitHubActions.js +1 -1
- package/dist/src/commands/login-openai/index.js +1 -1
- package/dist/src/commands/mobile/mobile.js +1 -1
- package/dist/src/commands/remote-setup/remote-setup.js +1 -1
- package/dist/src/commands/swarm-auto/swarmAuto.js +1 -1
- package/dist/src/commands/timeline/timeline.js +1 -1
- package/dist/src/commands/webapp/webapp.js +1 -1
- package/dist/src/commands.js +1 -1
- package/dist/src/components/ApproveApiKey.js +1 -1
- package/dist/src/components/ChannelDowngradeDialog.js +1 -1
- package/dist/src/components/ClaudeCodeHint/PluginHintMenu.js +1 -1
- package/dist/src/components/ConsoleOAuthFlow.js +1 -1
- package/dist/src/components/CostThresholdDialog.js +1 -1
- package/dist/src/components/CtrlOToExpand.js +1 -1
- package/dist/src/components/CustomSelect/select.js +1 -1
- package/dist/src/components/DesktopHandoff.js +1 -1
- package/dist/src/components/DesktopUpsell/DesktopUpsellStartup.js +1 -1
- package/dist/src/components/ExportDialog.js +1 -1
- package/dist/src/components/Feedback.js +1 -1
- package/dist/src/components/FeedbackSurvey/FeedbackSurvey.js +1 -1
- package/dist/src/components/FeedbackSurvey/FeedbackSurveyView.js +1 -1
- package/dist/src/components/IdeAutoConnectDialog.js +1 -1
- package/dist/src/components/IdeOnboardingDialog.js +1 -1
- package/dist/src/components/IdleReturnDialog.js +1 -1
- package/dist/src/components/InterruptedByUser.js +1 -1
- package/dist/src/components/InvalidConfigDialog.js +1 -1
- package/dist/src/components/InvalidSettingsDialog.js +1 -1
- package/dist/src/components/LanguagePicker.js +1 -1
- package/dist/src/components/LogSelector.js +1 -1
- package/dist/src/components/LogoV2/ChannelsNotice.js +1 -1
- package/dist/src/components/LogoV2/LogoV2.js +1 -1
- package/dist/src/components/LogoV2/feedConfigs.js +1 -1
- package/dist/src/components/LspRecommendation/LspRecommendationMenu.js +1 -1
- package/dist/src/components/MCPServerApprovalDialog.js +1 -1
- package/dist/src/components/MCPServerDesktopImportDialog.js +1 -1
- package/dist/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.js +1 -1
- package/dist/src/components/MessageSelector.js +1 -1
- package/dist/src/components/OutputStylePicker.js +1 -1
- package/dist/src/components/PromptInput/PromptInput.js +1 -1
- package/dist/src/components/RemoteCallout.js +1 -1
- package/dist/src/components/ResumeTask.js +1 -1
- package/dist/src/components/Settings/Config.js +1 -1
- package/dist/src/components/ShowInIDEPrompt.js +1 -1
- package/dist/src/components/Stats.js +1 -1
- package/dist/src/components/TagTabs.js +1 -1
- package/dist/src/components/TeleportError.js +1 -1
- package/dist/src/components/TeleportResumeWrapper.js +1 -1
- package/dist/src/components/TextInput.js +1 -1
- package/dist/src/components/agents/new-agent-creation/wizard-steps/MethodStep.js +1 -1
- package/dist/src/components/design-system/KeyboardShortcutHint.js +1 -1
- package/dist/src/components/diff/DiffDetailView.js +1 -1
- package/dist/src/components/grove/Grove.js +1 -1
- package/dist/src/components/hooks/SelectEventMode.js +1 -1
- package/dist/src/components/hooks/SelectHookMode.js +1 -1
- package/dist/src/components/hooks/SelectMatcherMode.js +1 -1
- package/dist/src/components/hooks/ViewHookMode.js +1 -1
- package/dist/src/components/mcp/MCPAgentServerMenu.js +1 -1
- package/dist/src/components/mcp/utils/reconnectHelpers.js +1 -1
- package/dist/src/components/memory/MemoryFileSelector.js +1 -1
- package/dist/src/components/messages/AssistantTextMessage.js +1 -1
- package/dist/src/components/messages/PlanApprovalMessage.js +1 -1
- package/dist/src/components/messages/ShutdownMessage.js +1 -1
- package/dist/src/components/messages/SystemAPIErrorMessage.js +1 -1
- package/dist/src/components/messages/UserPlanMessage.js +1 -1
- package/dist/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.js +1 -1
- package/dist/src/components/permissions/ComputerUseApproval/ComputerUseApproval.js +1 -1
- package/dist/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +1 -1
- package/dist/src/components/permissions/FilePermissionDialog/FilePermissionDialog.js +1 -1
- package/dist/src/components/permissions/FilePermissionDialog/permissionOptions.js +1 -1
- package/dist/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +1 -1
- package/dist/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +1 -1
- package/dist/src/components/permissions/PermissionRequest.js +1 -1
- package/dist/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.js +1 -1
- package/dist/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.js +1 -1
- package/dist/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.js +1 -1
- package/dist/src/components/permissions/rules/AddPermissionRules.js +1 -1
- package/dist/src/components/permissions/rules/AddWorkspaceDirectory.js +1 -1
- package/dist/src/components/permissions/rules/PermissionRuleList.js +1 -1
- package/dist/src/components/permissions/rules/RemoveWorkspaceDirectory.js +1 -1
- package/dist/src/components/sandbox/SandboxConfigTab.js +1 -1
- package/dist/src/components/sandbox/SandboxOverridesTab.js +1 -1
- package/dist/src/components/tasks/RemoteSessionDetailDialog.js +1 -1
- package/dist/src/constants/outputStyles.js +1 -1
- package/dist/src/entrypoints/cli.js +1 -1
- package/dist/src/hooks/notifs/useCanSwitchToExistingSubscription.js +1 -1
- package/dist/src/main.js +1 -1
- package/dist/src/projectOnboardingState.js +1 -1
- package/dist/src/screens/REPL.js +1 -1
- package/dist/src/services/api/errors.js +1 -1
- package/dist/src/services/api/filesApi.js +1 -1
- package/dist/src/services/tips/tipRegistry.js +1 -1
- package/dist/src/tasks/RemoteAgentTask/RemoteAgentTask.js +1 -1
- package/dist/src/tools/AgentTool/AgentTool.js +1 -1
- package/dist/src/tools/ConfigTool/supportedSettings.js +1 -1
- package/dist/src/tools/EnterWorktreeTool/EnterWorktreeTool.js +1 -1
- package/dist/src/tools/ExitWorktreeTool/ExitWorktreeTool.js +1 -1
- package/dist/src/tools/WebFetchTool/WebFetchTool.js +1 -1
- package/dist/src/utils/computerUse/cleanup.js +1 -1
- package/dist/src/utils/computerUse/wrapper.js +1 -1
- package/dist/src/utils/fileHistory.js +1 -1
- package/dist/src/utils/heartbeat.js +1 -0
- package/dist/src/utils/model/providers.js +1 -1
- package/dist/src/utils/permissions/filesystem.js +1 -1
- package/dist/src/utils/permissions/permissions.js +1 -1
- package/dist/src/utils/processUserInput/processSlashCommand.js +1 -1
- package/dist/src/utils/releaseNoteTranslations.js +1 -1
- package/dist/src/utils/shell/shellToolUtils.js +1 -1
- package/dist/src/utils/sshMcp/common.js +1 -0
- package/dist/src/utils/sshMcp/setup.js +1 -0
- package/dist/src/utils/sshMcp/sshMcpServer.js +1 -0
- package/dist/src/utils/sshMcp/sshMcpServer.test.js +1 -0
- package/dist/src/utils/teleport.js +1 -1
- package/dist/src/webapp/server.js +1 -1
- package/dist/sshMcpServer.js +1 -0
- package/dist/sshMcpServer.test.js +1 -0
- package/dist/webapp/chunk-AMCDNAIG.js +1 -0
- package/dist/webapp/{chunk-YUEYJPXQ.js → chunk-NFYBHCXF.js} +1 -1
- package/dist/webapp/{chunk-DFKSSBHI.js → chunk-OJZNEHPP.js} +1 -1
- package/dist/webapp/chunk-VAB2VXFI.js +1 -0
- package/dist/webapp/index.html +2 -2
- package/dist/webapp/main-MTQLKGXD.js +1 -0
- package/dist/webapp/ngsw.json +14 -14
- package/dist/webapp/styles-DIKEDJBH.css +1 -0
- package/package.json +2 -1
- package/dist/webapp/chunk-4SRNXNLW.js +0 -1
- package/dist/webapp/chunk-SIHYW6PA.js +0 -1
- package/dist/webapp/main-LBNRQBXX.js +0 -1
- package/dist/webapp/styles-FUPULZDX.css +0 -1
package/dist/src/cli/print.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{feature as e}from"../recovery/bunBundleShim.js";import{createRequire as t}from"module";const s=t(import.meta.url);import{readFile as o,stat as n}from"fs/promises";import{dirname as r}from"path";import{downloadUserSettings as i,redownloadUserSettings as a}from"../services/settingsSync/index.js";import{waitForRemoteManagedSettingsToLoad as l}from"../services/remoteManagedSettings/index.js";import{StructuredIO as u}from"./structuredIO.js";import{RemoteIO as c}from"./remoteIO.js";import{formatDescriptionWithSource as m,getCommandName as p}from"../commands.js";import{createStreamlinedTransformer as d}from"../utils/streamlinedTransform.js";import{installStreamJsonStdoutGuard as f}from"../utils/streamJsonStdoutGuard.js";import{assembleToolPool as g,filterToolsByDenyRules as _}from"../tools.js";import y from"lodash-es/uniqBy.js";import{uniq as h}from"../utils/array.js";import{mergeAndFilterTools as v}from"../utils/toolPool.js";import{logEvent as S}from"../services/analytics/index.js";import{getFeatureValue_CACHED_MAY_BE_STALE as b}from"../services/analytics/growthbook.js";import{logForDebugging as w}from"../utils/debug.js";import{logForDiagnosticsNoPII as E,withDiagnosticsTiming as k}from"../utils/diagLogs.js";import{toolMatchesName as C}from"../Tool.js";import{isBuiltInAgent as j,parseAgentsFromJson as I}from"../tools/AgentTool/loadAgentsDir.js";import{dequeue as P,dequeueAllMatching as T,enqueue as A,hasCommandsInQueue as q,peek as R,subscribeToCommandQueue as O,getCommandsByMaxPriority as M}from"../utils/messageQueueManager.js";import{notifyCommandLifecycle as U}from"../utils/commandLifecycle.js";import{getSessionState as x,notifySessionStateChanged as N,notifySessionMetadataChanged as D,setPermissionModeChangedListener as $,setSessionMetadataChangedListener as L}from"../utils/sessionState.js";import{externalMetadataToAppState as F}from"../state/onChangeAppState.js";import{getInMemoryErrors as H,logError as B,logMCPDebug as W}from"../utils/log.js";import{writeToStdout as G,registerProcessOutputErrorHandlers as K}from"../utils/process.js";import{EMPTY_USAGE as z}from"../services/api/logging.js";import{loadConversationForResume as X}from"../utils/conversationRecovery.js";import{ChannelMessageNotificationSchema as V,gateChannelServer as Y,wrapChannelMessage as Q,findChannelEntry as J}from"../services/mcp/channelNotification.js";import{isChannelAllowlisted as Z,isChannelsEnabled as ee}from"../services/mcp/channelAllowlist.js";import{parsePluginIdentifier as te}from"../utils/plugins/pluginIdentifier.js";import{validateUuid as se}from"../utils/uuid.js";import{fromArray as oe}from"../utils/generators.js";import{ask as ne}from"../QueryEngine.js";import{createFileStateCacheWithSizeLimit as re,mergeFileStateCaches as ie,READ_FILE_STATE_CACHE_SIZE as ae}from"../utils/fileStateCache.js";import{expandPath as le}from"../utils/path.js";import{extractReadFilesFromMessages as ue}from"../utils/queryHelpers.js";import{registerHookEventHandler as ce}from"../utils/hooks/hookEvents.js";import{executeFilePersistence as me}from"../utils/filePersistence/filePersistence.js";import{finalizePendingAsyncHooks as pe}from"../utils/hooks/AsyncHookRegistry.js";import{gracefulShutdown as de,gracefulShutdownSync as fe,isShuttingDown as ge}from"../utils/gracefulShutdown.js";import{registerCleanup as _e}from"../utils/cleanupRegistry.js";import{createIdleTimeoutManager as ye}from"../utils/idleTimeout.js";import{cwd as he}from"process";import{getCwd as ve}from"../utils/cwd.js";import Se from"lodash-es/omit.js";import be from"lodash-es/reject.js";import{isPolicyAllowed as we}from"../services/policyLimits/index.js";import{getRemoteSessionUrl as Ee}from"../constants/product.js";import{buildBridgeConnectUrl as ke}from"../bridge/bridgeStatusUtil.js";import{extractInboundMessageFields as Ce}from"../bridge/inboundMessages.js";import{resolveAndPrepend as je}from"../bridge/inboundAttachments.js";import{hasPermissionsToUseTool as Ie}from"../utils/permissions/permissions.js";import{safeParseJSON as Pe}from"../utils/json.js";import{outputSchema as Te,permissionPromptToolResultToPermissionDecision as Ae}from"../utils/permissions/PermissionPromptToolResultSchema.js";import{createAbortController as qe}from"../utils/abortController.js";import{createCombinedAbortSignal as Re}from"../utils/combinedAbortSignal.js";import{generateSessionTitle as Oe}from"../utils/sessionTitle.js";import{buildSideQuestionFallbackParams as Me}from"../utils/queryContext.js";import{runSideQuestion as Ue}from"../utils/sideQuestion.js";import{processSessionStartHooks as xe,processSetupHooks as Ne,takeInitialUserMessage as De}from"../utils/sessionStart.js";import{DEFAULT_OUTPUT_STYLE_NAME as $e,getAllOutputStyles as Le}from"../constants/outputStyles.js";import{TEAMMATE_MESSAGE_TAG as Fe,TICK_TAG as He}from"../constants/xml.js";import{getSettings_DEPRECATED as Be,getSettingsWithSources as We}from"../utils/settings/settings.js";import{settingsChangeDetector as Ge}from"../utils/settings/changeDetector.js";import{applySettingsChange as Ke}from"../utils/settings/applySettingsChange.js";import{isFastModeAvailable as ze,isFastModeEnabled as Xe,isFastModeSupportedByModel as Ve,getFastModeState as Ye}from"../utils/fastMode.js";import{isAutoModeGateEnabled as Qe,getAutoModeUnavailableNotification as Je,getAutoModeUnavailableReason as Ze,isBypassPermissionsModeDisabled as et,transitionPermissionMode as tt}from"../utils/permissions/permissionSetup.js";import{tryGenerateSuggestion as st,logSuggestionOutcome as ot,logSuggestionSuppressed as nt}from"../services/PromptSuggestion/promptSuggestion.js";import{getLastCacheSafeParams as rt}from"../utils/forkedAgent.js";import{getAccountInformation as it}from"../utils/auth.js";import{OAuthService as at}from"../services/oauth/index.js";import{installOAuthTokens as lt}from"./handlers/auth.js";import{getAPIProvider as ut}from"../utils/model/providers.js";import{AwsAuthStatusManager as ct}from"../utils/awsAuthStatusManager.js";import{registerHookCallbacks as mt,setInitJsonSchema as pt,getInitJsonSchema as dt,setSdkAgentProgressSummariesEnabled as ft}from"../bootstrap/state.js";import{createSyntheticOutputTool as gt}from"../tools/SyntheticOutputTool/SyntheticOutputTool.js";import{parseSessionIdentifier as _t}from"../utils/sessionUrl.js";import{hydrateRemoteSession as yt,hydrateFromCCRv2InternalEvents as ht,resetSessionFilePointer as vt,doesMessageExistInSession as St,findUnresolvedToolUse as bt,recordAttributionSnapshot as wt,saveAgentSetting as Et,saveMode as kt,saveAiGeneratedTitle as Ct,restoreSessionMetadata as jt}from"../utils/sessionStorage.js";import{incrementPromptCount as It}from"../utils/commitAttribution.js";import{setupSdkMcpClients as Pt,connectToServer as Tt,clearServerCache as At,fetchToolsForClient as qt,areMcpConfigsEqual as Rt,reconnectMcpServerImpl as Ot}from"../services/mcp/client.js";import{filterMcpServersByPolicy as Mt,getMcpConfigByName as Ut,isMcpServerDisabled as xt,setMcpServerEnabled as Nt}from"../services/mcp/config.js";import{performMCPOAuthFlow as Dt,revokeServerTokens as $t}from"../services/mcp/auth.js";import{runElicitationHooks as Lt,runElicitationResultHooks as Ft}from"../services/mcp/elicitationHandler.js";import{executeNotificationHooks as Ht}from"../utils/hooks.js";import{ElicitRequestSchema as Bt,ElicitationCompleteNotificationSchema as Wt}from"@modelcontextprotocol/sdk/types.js";import{getMcpPrefix as Gt}from"../services/mcp/mcpStringUtils.js";import{commandBelongsToServer as Kt,filterToolsByServer as zt}from"../services/mcp/utils.js";import{setupVscodeSdkMcp as Xt}from"../services/mcp/vscodeSdkMcp.js";import{getAllMcpConfigs as Vt}from"../services/mcp/config.js";import{isQualifiedForGrove as Yt,checkGroveForNonInteractive as Qt}from"../services/api/grove.js";import{toInternalMessages as Jt,toSDKRateLimitInfo as Zt}from"../utils/messages/mappers.js";import{createModelSwitchBreadcrumbs as es}from"../utils/messages.js";import{collectContextData as ts}from"../commands/context/context-noninteractive.js";import{LOCAL_COMMAND_STDOUT_TAG as ss}from"../constants/xml.js";import{statusListeners as os}from"../services/claudeAiLimits.js";import{getDefaultMainLoopModel as ns,getMainLoopModel as rs,modelDisplayString as is,parseUserSpecifiedModel as as}from"../utils/model/model.js";import{getModelOptions as ls}from"../utils/model/modelOptions.js";import{modelSupportsEffort as us,modelSupportsMaxEffort as cs,EFFORT_LEVELS as ms,resolveAppliedEffort as ps}from"../utils/effort.js";import{modelSupportsAdaptiveThinking as ds}from"../utils/thinking.js";import{modelSupportsAutoMode as fs}from"../utils/betas.js";import{ensureModelStringsInitialized as gs}from"../utils/model/modelStrings.js";import{getSessionId as _s,setMainLoopModelOverride as ys,setMainThreadAgentType as hs,switchSession as vs,isSessionPersistenceDisabled as Ss,getIsRemoteMode as bs,getFlagSettingsInline as ws,setFlagSettingsInline as Es,getMainThreadAgentType as ks,getAllowedChannels as Cs,setAllowedChannels as js}from"../bootstrap/state.js";import{runWithWorkload as Is,WORKLOAD_CRON as Ps}from"../utils/workloadContext.js";import{randomUUID as Ts}from"crypto";import{fileHistoryRewind as As,fileHistoryCanRestore as qs,fileHistoryEnabled as Rs,fileHistoryGetDiffStats as Os}from"../utils/fileHistory.js";import{restoreAgentFromSession as Ms,restoreSessionStateFromLog as Us}from"../utils/sessionRestore.js";import{SandboxManager as xs}from"../utils/sandbox/sandbox-adapter.js";import{headlessProfilerStartTurn as Ns,headlessProfilerCheckpoint as Ds,logHeadlessProfilerTurn as $s}from"../utils/headlessProfiler.js";import{startQueryProfile as Ls,logQueryProfileReport as Fs}from"../utils/queryProfiler.js";import{asSessionId as Hs}from"../types/ids.js";import{jsonStringify as Bs}from"../utils/slowOperations.js";import{skillChangeDetector as Ws}from"../utils/skills/skillChangeDetector.js";import{getCommands as Gs,clearCommandsCache as Ks}from"../commands.js";import{isBareMode as zs,isEnvTruthy as Xs,isEnvDefinedFalsy as Vs}from"../utils/envUtils.js";import{installPluginsForHeadless as Ys}from"../utils/plugins/headlessPluginInstall.js";import{refreshActivePlugins as Qs}from"../utils/plugins/refresh.js";import{loadAllPluginsCacheOnly as Js}from"../utils/plugins/pluginLoader.js";import{isTeamLead as Zs,hasActiveInProcessTeammates as eo,hasWorkingInProcessTeammates as to,waitForTeammatesToBecomeIdle as so}from"../utils/teammate.js";import{readUnreadMessages as oo,markMessagesAsRead as no,isShutdownApproved as ro}from"../utils/teammateMailbox.js";import{removeTeammateFromTeamFile as io}from"../utils/swarm/teamHelpers.js";import{unassignTeammateTasks as ao}from"../utils/tasks.js";import{getRunningTasks as lo}from"../utils/task/framework.js";import{isBackgroundTask as uo}from"../tasks/types.js";import{stopTask as co}from"../tasks/stopTask.js";import{drainSdkEvents as mo}from"../utils/sdkEventQueue.js";import{initializeGrowthBook as po}from"../services/analytics/growthbook.js";import{errorMessage as fo,toError as go}from"../utils/errors.js";import{sleep as _o}from"../utils/sleep.js";import{isExtractModeActive as yo}from"../memdir/paths.js";const ho=e("COORDINATOR_MODE")?s("../coordinator/coordinatorMode.js"):null,vo=e("PROACTIVE")||e("KAIROS")?s("../proactive/index.js"):null,So=e("AGENT_TRIGGERS")?s("../utils/cronScheduler.js"):null,bo=e("AGENT_TRIGGERS")?s("../utils/cronJitterConfig.js"):null,wo=e("AGENT_TRIGGERS")?s("../tools/ScheduleCronTool/prompt.js"):null,Eo=e("EXTRACT_MEMORIES")?s("../services/extractMemories/extractMemories.js"):null,ko="<system-reminder>\nYou are running in non-interactive mode and cannot return a response to the user until your team is shut down.\n\nYou MUST shut down your team before preparing your final response:\n1. Use requestShutdown to ask each team member to shut down gracefully\n2. Wait for shutdown approvals\n3. Use the cleanup operation to clean up the team\n4. Only then provide your final response to the user\n\nThe user cannot receive your response until the team is completely shut down.\n</system-reminder>\n\nShut down your team and prepare your final response for the user.",Co=new Set,jo=[];function trackReceivedMessageUuid(e){if(Co.has(e))return!1;if(Co.add(e),jo.push(e),jo.length>1e4){const e=jo.splice(0,jo.length-1e4);for(const t of e)Co.delete(t)}return!0}function toBlocks(e){return"string"==typeof e?[{type:"text",text:e}]:e}export function joinPromptValues(e){return 1===e.length?e[0]:e.every(e=>"string"==typeof e)?e.join("\n"):e.flatMap(toBlocks)}export function canBatchWith(e,t){return void 0!==t&&"prompt"===t.mode&&t.workload===e.workload&&t.isMeta===e.isMeta}export async function runHeadless(t,I,V,Y,Q,J,te,Ie){if("ant"===process.env.USER_TYPE&&(Xs(process.env.CONTEXT_CODE_EXIT_AFTER_FIRST_RENDER)||Xs(process.env.CLAUDE_CODE_EXIT_AFTER_FIRST_RENDER))&&(process.stderr.write(`\nStartup time: ${Math.round(1e3*process.uptime())}ms\n`),process.exit(0)),e("DOWNLOAD_USER_SETTINGS")&&(Xs(process.env.CONTEXT_CODE_REMOTE)||Xs(process.env.CLAUDE_CODE_REMOTE)||bs())&&i(),Ge.subscribe(e=>{Ke(e,V),Xe()&&V(e=>{const t=e.settings,s=!0===t.fastMode&&!t.fastModePerSessionOptIn;return{...e,fastMode:s}})}),(e("PROACTIVE")||e("KAIROS"))&&vo&&!vo.isProactiveActive()&&(Xs(process.env.CONTEXT_CODE_PROACTIVE)||Xs(process.env.CLAUDE_CODE_PROACTIVE))&&vo.activateProactive("command"),"undefined"!=typeof Bun){setInterval(Bun.gc,1e3).unref()}if(Ns(),Ds("runHeadless_entry"),await Yt()&&await Qt(),Ds("after_grove_check"),po(),Ie.resumeSessionAt&&!Ie.resume)return process.stderr.write("Error: --resume-session-at requires --resume\n"),void fe(1);if(Ie.rewindFiles&&!Ie.resume)return process.stderr.write("Error: --rewind-files requires --resume\n"),void fe(1);if(Ie.rewindFiles&&t)return process.stderr.write("Error: --rewind-files is a standalone operation and cannot be used with a prompt\n"),void fe(1);const Pe=function(e,t){let s;s="string"==typeof e?""!==e.trim()?oe([Bs({type:"user",session_id:"",message:{role:"user",content:e},parent_tool_use_id:null})]):oe([]):e;return t.sdkUrl?new c(t.sdkUrl,s,t.replayUserMessages):new u(s,t.replayUserMessages)}(t,Ie);"stream-json"===Ie.outputFormat&&f();const Te=xs.getSandboxUnavailableReason();if(Te){if(xs.isSandboxRequired())return process.stderr.write(`\nError: sandbox required but unavailable: ${Te}\n sandbox.failIfUnavailable is set — refusing to start without a working sandbox.\n\n`),void fe(1);process.stderr.write(`\n⚠ Sandbox disabled: ${Te}\n Commands will run WITHOUT sandboxing. Network and filesystem restrictions will NOT be enforced.\n\n`)}else if(xs.isSandboxingEnabled())try{await xs.initialize(Pe.createSandboxAskCallback())}catch(e){return process.stderr.write(`\n❌ Sandbox Error: ${fo(e)}\n`),void fe(1,"other")}"stream-json"===Ie.outputFormat&&Ie.verbose&&ce(e=>{const t=(()=>{switch(e.type){case"started":return{type:"system",subtype:"hook_started",hook_id:e.hookId,hook_name:e.hookName,hook_event:e.hookEvent,uuid:Ts(),session_id:_s()};case"progress":return{type:"system",subtype:"hook_progress",hook_id:e.hookId,hook_name:e.hookName,hook_event:e.hookEvent,stdout:e.stdout,stderr:e.stderr,output:e.output,uuid:Ts(),session_id:_s()};case"response":return{type:"system",subtype:"hook_response",hook_id:e.hookId,hook_name:e.hookName,hook_event:e.hookEvent,output:e.output,stdout:e.stdout,stderr:e.stderr,exit_code:e.exitCode,outcome:e.outcome,uuid:Ts(),session_id:_s()}}})();Pe.write(t)}),Ie.setupTrigger&&await Ne(Ie.setupTrigger),Ds("before_loadInitialMessages");const Ae=I(),{messages:Re,turnInterruptionState:$e,agentSetting:Le}=await async function(t,o){const n=!Ss();if(o.continue)try{S("tengu_continue_print",{});const i=await X(void 0,void 0);if(i){if(e("COORDINATOR_MODE")&&ho){const e=ho.matchSessionMode(i.mode);if(e){process.stderr.write(e+"\n");const{getAgentDefinitionsWithOverrides:o,getActiveAgentsFromList:n}=s("../tools/AgentTool/loadAgentsDir.js");o.cache.clear?.();const r=await o(ve());t(e=>({...e,agentDefinitions:{...r,allAgents:r.allAgents,activeAgents:n(r.allAgents)}}))}}return o.forkSession||i.sessionId&&(vs(Hs(i.sessionId),i.fullPath?r(i.fullPath):null),n&&await vt()),Us(i,t),jt(o.forkSession?{...i,worktreeSession:void 0}:i),e("COORDINATOR_MODE")&&ho&&kt(ho.isCoordinatorMode()?"coordinator":"normal"),{messages:i.messages,turnInterruptionState:i.turnInterruptionState,agentSetting:i.agentSetting}}}catch(e){return B(e),fe(1),{messages:[]}}if(o.teleport)try{if(!we("allow_remote_sessions"))throw new Error("Remote sessions are disabled by your organization's policy.");if(S("tengu_teleport_print",{}),"string"!=typeof o.teleport)throw new Error("No session ID provided for teleport");const{checkOutTeleportedSessionBranch:e,processMessagesForTeleportResume:t,teleportResumeCodeSession:s,validateGitState:n}=await import("../utils/teleport.js");await n();const r=await s(o.teleport),{branchError:i}=await e(r.branch);return{messages:t(r.log,i)}}catch(e){return B(e),fe(1),{messages:[]}}if(o.resume)try{S("tengu_resume_print",{});const i=_t("string"==typeof o.resume?o.resume:"");if(!i){let e="Error: --resume requires a valid session ID when used with --print. Usage: claude -p --resume <session-id>";return"string"==typeof o.resume&&(e+=`. Session IDs must be in UUID format (e.g., 550e8400-e29b-41d4-a716-446655440000). Provided value "${o.resume}" is not a valid UUID`),emitLoadError(e,o.outputFormat),fe(1),{messages:[]}}if(Xs(process.env.CLAUDE_CODE_USE_CCR_V2)){const[,e]=await Promise.all([ht(i.sessionId),o.restoredWorkerState]);e&&(t(F(e)),"string"==typeof e.model&&ys(e.model))}else i.isUrl&&i.ingressUrl&&Xs(process.env.ENABLE_SESSION_PERSISTENCE)&&await yt(i.sessionId,i.ingressUrl);const a=await X(i.sessionId,i.jsonlFile||void 0);if(!a||0===a.messages.length)return i.isUrl||Xs(process.env.CLAUDE_CODE_USE_CCR_V2)?{messages:await(o.sessionStartHooksPromise??xe("startup"))}:(emitLoadError(`No conversation found with session ID: ${i.sessionId}`,o.outputFormat),fe(1),{messages:[]});if(o.resumeSessionAt){const e=a.messages.findIndex(e=>e.uuid===o.resumeSessionAt);if(e<0)return emitLoadError(`No message found with message.uuid of: ${o.resumeSessionAt}`,o.outputFormat),fe(1),{messages:[]};a.messages=e>=0?a.messages.slice(0,e+1):[]}if(e("COORDINATOR_MODE")&&ho){const e=ho.matchSessionMode(a.mode);if(e){process.stderr.write(e+"\n");const{getAgentDefinitionsWithOverrides:o,getActiveAgentsFromList:n}=s("../tools/AgentTool/loadAgentsDir.js");o.cache.clear?.();const r=await o(ve());t(e=>({...e,agentDefinitions:{...r,allAgents:r.allAgents,activeAgents:n(r.allAgents)}}))}}return!o.forkSession&&a.sessionId&&(vs(Hs(a.sessionId),a.fullPath?r(a.fullPath):null),n&&await vt()),Us(a,t),jt(o.forkSession?{...a,worktreeSession:void 0}:a),e("COORDINATOR_MODE")&&ho&&kt(ho.isCoordinatorMode()?"coordinator":"normal"),{messages:a.messages,turnInterruptionState:a.turnInterruptionState,agentSetting:a.agentSetting}}catch(e){B(e);return emitLoadError(e instanceof Error?`Failed to resume session: ${e.message}`:"Failed to resume session with --print mode",o.outputFormat),fe(1),{messages:[]}}return{messages:await(o.sessionStartHooksPromise??xe("startup"))}}(V,{continue:Ie.continue,teleport:Ie.teleport,resume:Ie.resume,resumeSessionAt:Ie.resumeSessionAt,forkSession:Ie.forkSession,outputFormat:Ie.outputFormat,sessionStartHooksPromise:Ie.sessionStartHooksPromise,restoredWorkerState:Pe.restoredWorkerState}),Be=De();if(Be&&Pe.prependUserMessage(Be),!Ie.agent&&!ks()&&Le){const{agentDefinition:e}=Ms(Le,void 0,{activeAgents:te,allAgents:te});if(e){if(V(t=>({...t,agent:e.agentType})),!Ie.systemPrompt&&!j(e)){const t=e.getSystemPrompt();t&&(Ie.systemPrompt=t)}Et(e.agentType)}}if(0===Re.length&&void 0!==process.exitCode)return;if(Ie.rewindFiles){const e=Re.find(e=>e.uuid===Ie.rewindFiles);if(!e||"user"!==e.type)return process.stderr.write(`Error: --rewind-files requires a user message UUID, but ${Ie.rewindFiles} is not a user message in this session\n`),void fe(1);const t=I(),s=await handleRewindFiles(Ie.rewindFiles,t,V,!1);return s.canRewind?(process.stdout.write(`Files rewound to state at message ${Ie.rewindFiles}\n`),void fe(0)):(process.stderr.write(`Error: ${s.error||"Unexpected error"}\n`),void fe(1))}const ze="string"==typeof Ie.resume&&(Boolean(se(Ie.resume))||Ie.resume.endsWith(".jsonl")),Ye=Boolean(Ie.sdkUrl);if(!t&&!ze&&!Ye)return process.stderr.write("Error: Input must be provided either through stdin or as a prompt argument when using --print\n"),void fe(1);if("stream-json"===Ie.outputFormat&&!Ie.verbose)return process.stderr.write("Error: When using --print, --output-format=stream-json requires --verbose\n"),void fe(1);let Qe=[...Q,..._(Ae.mcp.tools,Ae.toolPermissionContext)];const Je=getCanUseToolFn(Ie.sdkUrl?"stdio":Ie.permissionPromptToolName,Pe,()=>I().mcp.tools,t=>{e("COMMIT_ATTRIBUTION")&&V(e=>({...e,attribution:{...e.attribution,permissionPromptCount:e.attribution.permissionPromptCount+1}})),N("requires_action",t)});Ie.permissionPromptToolName&&(Qe=Qe.filter(e=>!C(e,Ie.permissionPromptToolName))),K(),Ds("after_loadInitialMessages"),await gs(),Ds("after_modelStrings");const Ze="json"===Ie.outputFormat&&Ie.verbose,et=[];let tt;const mt=e("STREAMLINED_OUTPUT")&&(Xs(process.env.CONTEXT_CODE_STREAMLINED_OUTPUT)||Xs(process.env.CLAUDE_CODE_STREAMLINED_OUTPUT))&&"stream-json"===Ie.outputFormat?d():null;Ds("before_runHeadlessStreaming");for await(const t of function(t,r,u,d,f,_,j,I,F,G,K,X){let V,Y,Q=!1,J=!1,te=!1,se=null;const oe=t.outbound,sigintHandler=()=>{E("info","shutdown_signal",{signal:"SIGINT"}),Y&&!Y.signal.aborted&&Y.abort(),de(0)};process.on("SIGINT",sigintHandler),_e(async()=>{const e={};for(const t of lo(I()))uo(t)&&(e[t.type]=(e[t.type]??0)+1);E("info","run_state_at_shutdown",{run_active:Q,run_phase:V,worker_status:x(),internal_events_pending:t.internalEventsPending,bg_tasks:e})}),$(t=>{"default"!==t&&"acceptEdits"!==t&&"bypassPermissions"!==t&&"plan"!==t&&t!==(e("TRANSCRIPT_CLASSIFIER")&&"auto")&&"dontAsk"!==t||oe.enqueue({type:"system",subtype:"status",status:null,permissionMode:t,uuid:Ts(),session_id:_s()})}),L(e=>{void 0!==e.orchestration_activity&&oe.enqueue({type:"system",subtype:"orchestration_activity",activity:e.orchestration_activity??null,uuid:Ts(),session_id:_s()})});const ce={abortController:null,inflightPromise:null,lastEmitted:null,pendingSuggestion:null,pendingLastEmittedEntry:null};let ve;if(K.enableAuthStatus){const e=ct.getInstance();ve=e.subscribe(e=>{oe.enqueue({type:"auth_status",isAuthenticating:e.isAuthenticating,output:e.output,error:e.error,uuid:Ts(),session_id:_s()})})}const rateLimitListener=e=>{const t=Zt(e);t&&oe.enqueue({type:"rate_limit_event",rate_limit_info:t,uuid:Ts(),session_id:_s()})};os.add(rateLimitListener);const we=f;let Ie=ue(f,he(),ae);const Pe=re(ae),Te=process.env.CONTEXT_CODE_RESUME_INTERRUPTED_TURN??process.env.CLAUDE_CODE_RESUME_INTERRUPTED_TURN;X&&"none"!==X.kind&&Te&&(w(`[print.ts] Auto-resuming interrupted turn (kind: ${X.kind})`),removeInterruptedMessage(we,X.message),A({mode:"prompt",value:X.message.message.content,uuid:Ts()}));const Ae=ls().map(e=>{const t=null===e.value?"default":e.value,s="default"===t?ns():as(t),o=us(s),n=ds(s),r=Ve(e.value),i=fs(s);return{value:t,displayName:e.label,description:e.description,...o&&{supportsEffort:!0,supportedEffortLevels:cs(s)?[...ms]:ms.filter(e=>"max"!==e)},...n&&{supportsAdaptiveThinking:!0},...r&&{supportsFastMode:!0},...i&&{supportsAutoMode:!0}}});let Re=K.userSpecifiedModel;function injectModelSwitchBreadcrumbs(e,t){const s=es(e,is(t));we.push(...s);for(const e of s)"string"==typeof e.message.content&&e.message.content.includes(`<${ss}>`)&&oe.enqueue({type:"user",message:e.message,session_id:_s(),parent_tool_use_id:null,uuid:e.uuid,timestamp:e.timestamp,isReplay:!0})}let xe=[],Ne=[];const De=new Set;function registerElicitationHandlers(e){for(const s of e){if("connected"!==s.type||De.has(s.name))continue;if("sdk"===s.config.type)continue;const e=s.name;try{s.client.setRequestHandler(Bt,async(s,o)=>{W(e,`Elicitation request received in print mode: ${Bs(s)}`);const n="url"===s.params.mode?"url":"form";S("tengu_mcp_elicitation_shown",{mode:n});const r=await Lt(e,s.params,o.signal);if(r)return W(e,`Elicitation resolved by hook: ${Bs(r)}`),S("tengu_mcp_elicitation_response",{mode:n,action:r.action}),r;const i="url"in s.params?s.params.url:void 0,a="requestedSchema"in s.params?s.params.requestedSchema:void 0,l="elicitationId"in s.params?s.params.elicitationId:void 0,u=await t.handleElicitation(e,s.params.message,a,o.signal,n,i,l),c=await Ft(e,u,o.signal,n,l);return S("tengu_mcp_elicitation_response",{mode:n,action:c.action}),c}),s.client.setNotificationHandler(Wt,t=>{const{elicitationId:s}=t.params;W(e,`Elicitation completion notification: ${s}`),Ht({message:`MCP server "${e}" confirmed elicitation ${s} complete`,notificationType:"elicitation_complete"}),oe.enqueue({type:"system",subtype:"elicitation_complete",mcp_server_name:e,elicitation_id:s,uuid:Ts(),session_id:_s()})}),De.add(e)}catch{}}}async function updateSdkMcp(){const e=new Set(Object.keys(j)),s=new Set(xe.map(e=>e.name)),o=Array.from(e).some(e=>!s.has(e)),n=Array.from(s).some(t=>!e.has(t)),r=xe.some(e=>"pending"===e.type),i=xe.some(e=>"failed"===e.type);if(o||n||r||i){for(const t of xe)e.has(t.name)||"connected"===t.type&&await t.cleanup();const o=await Pt(j,(e,s)=>t.sendMcpMessage(e,s));xe=o.clients,Ne=o.tools;const n=h([...s,...e]);F(e=>({...e,mcp:{...e.mcp,tools:[...e.mcp.tools.filter(e=>!n.some(t=>e.name.startsWith(Gt(t)))),...Ne]}})),Xt(xe)}}updateSdkMcp();let $e={clients:[],tools:[],configs:{}};const buildAllTools=e=>{const t=g(e.toolPermissionContext,e.mcp.tools);let s=y(v([...d,...Ne,...$e.tools],t,e.toolPermissionContext.mode),"name");K.permissionPromptToolName&&(s=s.filter(e=>!C(e,K.permissionPromptToolName)));const o=dt();if(o&&!K.jsonSchema){const e=gt(o);"tool"in e&&(s=[...s,e.tool])}return s};let Le=null,Be=0;function forwardMessagesToBridge(){if(!Le)return;const e=Math.min(Be,we.length),t=we.slice(e).filter(e=>"user"===e.type||"assistant"===e.type);Be=we.length,t.length>0&&Le.writeMessages(t)}let Ke=Promise.resolve({response:{added:[],removed:[],errors:{}},sdkServersChanged:!1});function applyMcpServerChanges(e){const doWork=async()=>{const t=new Set(xe.map(e=>e.name)),s=await handleMcpSetServers(e,{configs:j,clients:xe,tools:Ne},$e,F);for(const e of Object.keys(j))delete j[e];if(Object.assign(j,s.newSdkState.configs),xe=s.newSdkState.clients,Ne=s.newSdkState.tools,$e=s.newDynamicState,s.sdkServersChanged){const e=new Set(xe.map(e=>e.name)),s=h([...t,...e]);F(e=>({...e,mcp:{...e.mcp,tools:[...e.mcp.tools.filter(e=>!s.some(t=>e.name.startsWith(Gt(t)))),...Ne]}}))}return{response:s.response,sdkServersChanged:s.sdkServersChanged}};return Ke=Ke.then(doWork,doWork),Ke}function buildMcpServerStatuses(){const t=I(),s=t.mcp.clients,o=y([...t.mcp.tools,...$e.tools],"name"),n=new Set([...s.map(e=>e.name),...xe.map(e=>e.name)]);return[...s,...xe,...$e.clients.filter(e=>!n.has(e.name))].map(t=>{let s;"sse"===t.config.type||"http"===t.config.type?s={type:t.config.type,url:t.config.url,headers:t.config.headers,oauth:t.config.oauth}:"claudeai-proxy"===t.config.type?s={type:"claudeai-proxy",url:t.config.url,id:t.config.id}:"stdio"!==t.config.type&&void 0!==t.config.type||(s={type:"stdio",command:t.config.command,args:t.config.args});const n="connected"===t.type?zt(o,t.name).map(e=>({name:e.mcpInfo?.toolName??e.name,annotations:{readOnly:e.isReadOnly({})||void 0,destructive:e.isDestructive?.({})||void 0,openWorld:e.isOpenWorld?.({})||void 0}})):void 0;let r;if((e("KAIROS")||e("KAIROS_CHANNELS"))&&"connected"===t.type&&t.capabilities.experimental){const e={...t.capabilities.experimental};!e["claude/channel"]||ee()&&Z(t.config.pluginSource)||delete e["claude/channel"],Object.keys(e).length>0&&(r={experimental:e})}return{name:t.name,status:t.type,serverInfo:"connected"===t.type?t.serverInfo:void 0,error:"failed"===t.type?t.error:void 0,config:s,scope:t.config.scope,tools:n,capabilities:r}})}async function installPluginsAndApplyMcpInBackground(){try{await Promise.all([e("DOWNLOAD_USER_SETTINGS")&&(Xs(process.env.CONTEXT_CODE_REMOTE)||Xs(process.env.CLAUDE_CODE_REMOTE)||bs())?k("headless_user_settings_download",()=>i()):Promise.resolve(),k("headless_managed_settings_wait",()=>l())]);await Ys()&&await applyPluginMcpDiff()}catch(e){B(e)}}let ze=null;zs()||(Xs(process.env.CONTEXT_CODE_SYNC_PLUGIN_INSTALL)||Xs(process.env.CLAUDE_CODE_SYNC_PLUGIN_INSTALL)?ze=installPluginsAndApplyMcpInBackground():installPluginsAndApplyMcpInBackground());const Xe=ye(()=>!Q);let Ye=u,Qe=G;async function refreshPluginState(){const{agentDefinitions:e}=await Qs(F);Ye=await Gs(he());const t=Qe.filter(e=>"flagSettings"===e.source);Qe=[...e.allAgents,...t]}async function applyPluginMcpDiff(){const{servers:e}=await Vt(),t={};for(const[s,o]of Object.entries(e)){const e=o.type;void 0!==e&&"stdio"!==e&&"sse"!==e&&"http"!==e&&"sdk"!==e||(t[s]=o)}for(const[e,s]of Object.entries(j))"sdk"!==s.type||e in t||(t[e]=s);const{response:s,sdkServersChanged:o}=await applyMcpServerChanges(t);o&&updateSdkMcp(),w(`Headless MCP refresh: added=${s.added.length}, removed=${s.removed.length}`)}const Je=Ws.subscribe(()=>{Ks(),Gs(he()).then(e=>{Ye=e})}),Ze=e("PROACTIVE")||e("KAIROS")?()=>{setTimeout(()=>{if(!vo?.isProactiveActive()||vo.isProactivePaused()||J)return;const e=`<${He}>${(new Date).toLocaleTimeString()}</${He}>`;A({mode:"prompt",value:e,uuid:Ts(),priority:"later",isMeta:!0}),run()},0)}:void 0;O(()=>{Y&&M("now").length>0&&Y.abort("interrupt")});const run=async()=>{if(Q)return;if(Q=!0,V=void 0,N("running"),Xe.stop(),Ds("run_entry"),await updateSdkMcp(),Ds("after_updateSdkMcp"),ze){const e=parseInt(process.env.CONTEXT_CODE_SYNC_PLUGIN_INSTALL_TIMEOUT_MS||process.env.CLAUDE_CODE_SYNC_PLUGIN_INSTALL_TIMEOUT_MS||"",10);if(e>0){const t=_o(e).then(()=>"timeout");"timeout"===await Promise.race([ze,t])&&(B(new Error(`CLAUDE_CODE_SYNC_PLUGIN_INSTALL: plugin installation timed out after ${e}ms`)),S("tengu_sync_plugin_install_timeout",{timeout_ms:e}))}else await ze;ze=null,await refreshPluginState();const{setupPluginHookHotReload:t}=await import("../utils/plugins/loadPluginHooks.js");t()}const isMainThread=e=>void 0===e.agentId;try{let s,o=!1;const drainCommandQueue=async()=>{for(;s=P(isMainThread);){if("prompt"!==s.mode&&"orphaned-permission"!==s.mode&&"task-notification"!==s.mode)throw new Error("only prompt commands are supported in streaming mode");const o=[s];if("prompt"===s.mode){for(;canBatchWith(s,R(isMainThread));)o.push(P(isMainThread));o.length>1&&(s={...s,value:joinPromptValues(o.map(e=>e.value)),uuid:o.findLast(e=>e.uuid)?.uuid??s.uuid})}const n=o.map(e=>e.uuid).filter(e=>void 0!==e);if(K.replayUserMessages&&o.length>1)for(const e of o)e.uuid&&e.uuid!==s.uuid&&oe.enqueue({type:"user",message:{role:"user",content:e.value},session_id:_s(),parent_tool_use_id:null,uuid:e.uuid,isReplay:!0});const r=I(),i=[...r.mcp.clients,...xe,...$e.clients];registerElicitationHandlers(i);for(const e of i)reregisterChannelHandlerAfterReconnect(e);const a=buildAllTools(r);for(const e of n)U(e,"started");if("task-notification"===s.mode){const e="string"==typeof s.value?s.value:"",t=e.match(/<task-id>([^<]+)<\/task-id>/),o=e.match(/<tool-use-id>([^<]+)<\/tool-use-id>/),n=e.match(/<output-file>([^<]+)<\/output-file>/),r=e.match(/<status>([^<]+)<\/status>/),i=e.match(/<summary>([^<]+)<\/summary>/),isValidStatus=e=>"completed"===e||"failed"===e||"stopped"===e||"killed"===e,a=r?.[1],l=isValidStatus(a)?"killed"===a?"stopped":a:"completed",u=e.match(/<usage>([\s\S]*?)<\/usage>/),c=u?.[1]??"",m=c.match(/<total_tokens>(\d+)<\/total_tokens>/),p=c.match(/<tool_uses>(\d+)<\/tool_uses>/),d=c.match(/<duration_ms>(\d+)<\/duration_ms>/);r&&oe.enqueue({type:"system",subtype:"task_notification",task_id:t?.[1]??"",tool_use_id:o?.[1],status:l,output_file:n?.[1]??"",summary:i?.[1]??"",usage:m&&p?{total_tokens:parseInt(m[1],10),tool_uses:parseInt(p[1],10),duration_ms:d?parseInt(d[1],10):0}:void 0,session_id:_s(),uuid:Ts()})}const l=s.value;if(t instanceof c&&"prompt"===s.mode&&S("tengu_bridge_message_received",{is_repl:!1}),ce.abortController?.abort(),ce.abortController=null,ce.pendingSuggestion=null,ce.pendingLastEmittedEntry=null,ce.lastEmitted&&"prompt"===s.mode){const e="string"==typeof l?l:l.find(e=>"text"===e.type)?.text;"string"==typeof e&&ot(ce.lastEmitted.text,e,ce.lastEmitted.emittedAt,ce.lastEmitted.promptId,ce.lastEmitted.generationRequestId),ce.lastEmitted=null}Y=qe();const u=e("FILE_PERSISTENCE")?Date.now():void 0;Ds("before_ask"),Ls();const m=s;await Is(m.workload??K.workload,async()=>{for await(const e of ne({commands:y([...Ye,...r.mcp.commands],"name"),prompt:l,promptUuid:m.uuid,isMeta:m.isMeta,cwd:he(),tools:a,verbose:K.verbose,mcpClients:i,thinkingConfig:K.thinkingConfig,maxTurns:K.maxTurns,maxBudgetUsd:K.maxBudgetUsd,taskBudget:K.taskBudget,canUseTool:_,userSpecifiedModel:Re,fallbackModel:K.fallbackModel,jsonSchema:dt()??K.jsonSchema,mutableMessages:we,getReadFileCache:()=>0===Pe.size?Ie:ie(Ie,Pe),setReadFileCache:e=>{Ie=e;for(const[e,t]of Pe.entries()){const s=Ie.get(e);(!s||t.timestamp>s.timestamp)&&Ie.set(e,t)}Pe.clear()},customSystemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,getAppState:I,setAppState:F,abortController:Y,replayUserMessages:K.replayUserMessages,includePartialMessages:K.includePartialMessages,handleElicitation:(e,s,o)=>t.handleElicitation(e,s.message,void 0,o,s.mode,s.url,"elicitationId"in s?s.elicitationId:void 0),agents:Qe,orphanedPermission:m.orphanedPermission,setSDKStatus:e=>{oe.enqueue({type:"system",subtype:"status",status:e,session_id:_s(),uuid:Ts()})},onCoreQueryEvent:"0"!==process.env.CORE_QUERY_ENABLED&&"stream-json"===K.outputFormat?e=>{const t={type:"core_query_event",eventType:e.type,...e};try{process.stdout.write(Bs(t)+"\n")}catch{}}:void 0}))if(forwardMessagesToBridge(),"result"===e.type){for(const e of mo())oe.enqueue(e);const t=I();lo(t).some(e=>("local_agent"===e.type||"local_workflow"===e.type)&&uo(e))?se=e:(se=null,oe.enqueue(e))}else{for(const e of mo())oe.enqueue(e);oe.enqueue(e)}});for(const e of n)U(e,"completed");if(forwardMessagesToBridge(),Le?.sendResult(),e("FILE_PERSISTENCE")&&void 0!==u&&me(u,Y.signal,e=>{oe.enqueue({type:"system",subtype:"files_persisted",files:e.files,failed:e.failed,processed_at:(new Date).toISOString(),uuid:Ts(),session_id:_s()})}),K.promptSuggestions&&!Vs(process.env.CONTEXT_CODE_ENABLE_PROMPT_SUGGESTION)&&!Vs(process.env.CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION)){const e=ce;e.abortController?.abort();const t=new AbortController;ce.abortController=t;const s=rt();if(s){const e={promise:null};e.promise=(async()=>{try{const e=await st(t,we,I,s,"sdk");if(!e||t.signal.aborted)return;const o={type:"prompt_suggestion",suggestion:e.suggestion,uuid:Ts(),session_id:_s()},n={text:e.suggestion,emittedAt:Date.now(),promptId:e.promptId,generationRequestId:e.generationRequestId};se?(ce.pendingSuggestion=o,ce.pendingLastEmittedEntry={text:n.text,promptId:n.promptId,generationRequestId:n.generationRequestId}):(ce.lastEmitted=n,oe.enqueue(o))}catch(e){if(e instanceof Error&&("AbortError"===e.name||"APIUserAbortError"===e.name))return void nt("aborted",void 0,void 0,"sdk");B(go(e))}finally{ce.inflightPromise===e.promise&&(ce.inflightPromise=null)}})(),ce.inflightPromise=e.promise}else nt("sdk_no_params",void 0,void 0,"sdk")}$s(),Fs(),Ns()}};do{for(const e of mo())oe.enqueue(e);V="draining_commands",await drainCommandQueue(),o=!1;{const e=I(),t=lo(e).some(e=>uo(e)&&"in_process_teammate"!==e.type),s=void 0!==R(isMainThread);(t||s)&&(o=!0,s||(V="waiting_for_agents",await _o(100)))}}while(o);se&&(oe.enqueue(se),se=null,ce.pendingSuggestion&&(oe.enqueue(ce.pendingSuggestion),ce.pendingLastEmittedEntry&&(ce.lastEmitted={...ce.pendingLastEmittedEntry,emittedAt:Date.now()},ce.pendingLastEmittedEntry=null),ce.pendingSuggestion=null))}catch(e){try{await t.write({type:"result",subtype:"error_during_execution",duration_ms:0,duration_api_ms:0,is_error:!0,num_turns:0,stop_reason:null,session_id:_s(),total_cost_usd:0,usage:z,modelUsage:{},permission_denials:[],uuid:Ts(),errors:[fo(e),...H().map(e=>e.error)]})}catch{}return ce.abortController?.abort(),void fe(1)}finally{if(V="finally_flush",await t.flushInternalEvents(),V="finally_post_flush",!ge()){N("idle");for(const e of mo())oe.enqueue(e)}Q=!1,Xe.start()}if(!e("PROACTIVE")&&!e("KAIROS")||!vo?.isProactiveActive()||vo.isProactivePaused()||void 0!==R(isMainThread)||J)if(void 0===R(isMainThread)){{const e=I().teamContext;if(e&&Zs(e)){const e="team-lead",t=500;for(;;){const s=I();if(!(eo(s)||s.teamContext&&Object.keys(s.teamContext.teammates).length>0)){w("[print.ts] No more active teammates, stopping poll");break}const o=await oo(e,s.teamContext?.teamName);if(o.length>0){w(`[print.ts] Team-lead found ${o.length} unread messages`),await no(e,s.teamContext?.teamName);const t=s.teamContext?.teamName;for(const e of o){const o=ro(e.text);if(o&&t){const e=o.from;w(`[print.ts] Processing shutdown_approved from ${e}`);const n=s.teamContext?.teammates?Object.entries(s.teamContext.teammates).find(([,t])=>t.name===e)?.[0]:void 0;n&&(io(t,{agentId:n,name:e}),w(`[print.ts] Removed ${e} from team file`),await ao(t,n,e,"shutdown"),F(e=>{if(!e.teamContext?.teammates)return e;if(!(n in e.teamContext.teammates))return e;const{[n]:t,...s}=e.teamContext.teammates;return{...e,teamContext:{...e.teamContext,teammates:s}}}))}}const n=o.map(e=>`<${Fe} teammate_id="${e.from}"${e.color?` color="${e.color}"`:""}>\n${e.text}\n</${Fe}>`).join("\n\n");return A({mode:"prompt",value:n,uuid:Ts()}),void run()}if(J&&!te)return te=!0,w("[print.ts] Input closed with active teammates, injecting shutdown prompt"),A({mode:"prompt",value:ko,uuid:Ts()}),void run();await _o(t)}}}if(J){await(async()=>{const e=I();to(e)&&await so(F,e);const t=I(),s=t.teamContext;return s&&Object.keys(s.teammates).length>0||eo(t)})()?(A({mode:"prompt",value:ko,uuid:Ts()}),run()):(ce.inflightPromise&&await Promise.race([ce.inflightPromise,_o(5e3)]),ce.abortController?.abort(),ce.abortController=null,await pe(),Je(),ve?.(),os.delete(rateLimitListener),oe.done())}}else run();else Ze()};if(e("UDS_INBOX")){const{setOnEnqueue:e}=s("../utils/udsMessaging.js");e(()=>{J||run()})}let et=null;e("AGENT_TRIGGERS")&&So&&wo?.isKairosCronEnabled()&&(et=So.createCronScheduler({onFire:e=>{J||(A({mode:"prompt",value:e,uuid:Ts(),priority:"later",isMeta:!0,workload:Ps}),run())},isLoading:()=>Q||J,getJitterConfig:bo?.getCronJitterConfig,isKilled:()=>!wo?.isKairosCronEnabled()}),et.start());const sendControlResponseSuccess=function(e,t){oe.enqueue({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:t}})},sendControlResponseError=function(e,t){oe.enqueue({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:t}})},tt=new Set;t.setUnexpectedResponseCallback(async e=>{await handleOrphanedPermissionResponse({message:e,setAppState:F,handledToolUseIds:tt,onEnqueued:()=>{run()}})});const mt=new Map,pt=new Map,_t=new Set,yt=new Map;let ht=null;return(async()=>{let s=!1;E("info","cli_message_loop_started");for await(const i of t.structuredInput){const l="uuid"in i?i.uuid:void 0;if(l&&"user"!==i.type&&"control_response"!==i.type&&U(l,"completed"),"control_request"!==i.type)if("control_response"!==i.type){if("keep_alive"!==i.type&&"update_environment_variables"!==i.type){if("assistant"===i.type||"system"===i.type){const e=Jt([i]);we.push(...e),"assistant"===i.type&&K.replayUserMessages&&oe.enqueue(i);continue}if("user"===i.type){if(s=!0,i.uuid){const e=_s(),t=await St(e,i.uuid);if(t||Co.has(i.uuid)){w(`Skipping duplicate user message: ${i.uuid}`),K.replayUserMessages&&(w(`Sending acknowledgment for duplicate user message: ${i.uuid}`),oe.enqueue({type:"user",message:i.message,session_id:e,parent_tool_use_id:null,uuid:i.uuid,timestamp:i.timestamp,isReplay:!0})),t&&U(i.uuid,"completed");continue}trackReceivedMessageUuid(i.uuid)}A({mode:"prompt",value:await je(i,i.message.content),uuid:i.uuid,priority:i.priority}),e("COMMIT_ATTRIBUTION")&&F(e=>({...e,attribution:It(e.attribution,e=>{wt(e).catch(e=>{w(`Attribution: Failed to save snapshot: ${e}`)})})})),run()}}}else K.replayUserMessages&&oe.enqueue(i);else if("interrupt"===i.request.subtype)e("COMMIT_ATTRIBUTION")&&F(e=>({...e,attribution:{...e.attribution,escapeCount:e.attribution.escapeCount+1}})),Y&&Y.abort(),ce.abortController?.abort(),ce.abortController=null,ce.lastEmitted=null,ce.pendingSuggestion=null,sendControlResponseSuccess(i);else{if("end_session"===i.request.subtype){w(`[print.ts] end_session received, reason=${i.request.reason??"unspecified"}`),Y&&Y.abort(),ce.abortController?.abort(),ce.abortController=null,ce.lastEmitted=null,ce.pendingSuggestion=null,sendControlResponseSuccess(i);break}if("initialize"===i.request.subtype){if(i.request.sdkMcpServers&&i.request.sdkMcpServers.length>0)for(const e of i.request.sdkMcpServers)j[e]={type:"sdk",name:e};await handleInitializeRequest(i.request,i.request_id,s,oe,u,Ae,t,!!K.enableAuthStatus,K,G,I),i.request.promptSuggestions&&F(e=>e.promptSuggestionEnabled?e:{...e,promptSuggestionEnabled:!0}),i.request.agentProgressSummaries&&b("tengu_slate_prism",!0)&&ft(!0),s=!0,q()&&run()}else if("set_permission_mode"===i.request.subtype){const e=i.request;F(t=>({...t,toolPermissionContext:handleSetPermissionMode(e,i.request_id,t.toolPermissionContext,oe),isUltraplanMode:e.ultraplan??t.isUltraplanMode}))}else if("set_model"===i.request.subtype){const e=i.request.model??"default",t="default"===e?ns():e;Re=t,ys(t),D({model:t}),injectModelSwitchBreadcrumbs(e,t),sendControlResponseSuccess(i)}else if("set_max_thinking_tokens"===i.request.subtype)null===i.request.max_thinking_tokens?K.thinkingConfig=void 0:0===i.request.max_thinking_tokens?K.thinkingConfig={type:"disabled"}:K.thinkingConfig={type:"enabled",budgetTokens:i.request.max_thinking_tokens},sendControlResponseSuccess(i);else if("mcp_status"===i.request.subtype)sendControlResponseSuccess(i,{mcpServers:buildMcpServerStatuses()});else if("get_context_usage"===i.request.subtype)try{const e=I(),t=await ts({messages:we,getAppState:I,options:{mainLoopModel:rs(),tools:buildAllTools(e),agentDefinitions:e.agentDefinitions,customSystemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt}});sendControlResponseSuccess(i,{...t})}catch(e){sendControlResponseError(i,fo(e))}else if("mcp_message"===i.request.subtype){const e=i.request,t=xe.find(t=>t.name===e.server_name);t&&"connected"===t.type&&t.client?.transport?.onmessage&&t.client.transport.onmessage(e.message),sendControlResponseSuccess(i)}else if("rewind_files"===i.request.subtype){const e=I(),t=await handleRewindFiles(i.request.user_message_id,e,F,i.request.dry_run??!1);t.canRewind||i.request.dry_run?sendControlResponseSuccess(i,t):sendControlResponseError(i,t.error??"Unexpected error")}else if("cancel_async_message"===i.request.subtype){const e=i.request.message_uuid,t=T(t=>t.uuid===e);sendControlResponseSuccess(i,{cancelled:t.length>0})}else if("seed_read_state"===i.request.subtype){try{const e=le(i.request.path),t=Math.floor((await n(e)).mtimeMs);if(t<=i.request.mtime){const s=await o(e,"utf-8"),n=(65279===s.charCodeAt(0)?s.slice(1):s).replaceAll("\r\n","\n");Pe.set(e,{content:n,timestamp:t,offset:void 0,limit:void 0})}}catch{}sendControlResponseSuccess(i)}else if("mcp_set_servers"===i.request.subtype){const{response:e,sdkServersChanged:t}=await applyMcpServerChanges(i.request.servers);sendControlResponseSuccess(i,e),t&&updateSdkMcp()}else if("reload_plugins"===i.request.subtype)try{if(e("DOWNLOAD_USER_SETTINGS")&&(Xs(process.env.CONTEXT_CODE_REMOTE)||Xs(process.env.CLAUDE_CODE_REMOTE)||bs())){await a()&&Ge.notifyChange("userSettings")}const t=await Qs(F),s=Qe.filter(e=>"flagSettings"===e.source);Qe=[...t.agentDefinitions.allAgents,...s];let o=[];const[n,r,l]=await Promise.allSettled([Gs(he()),applyPluginMcpDiff(),Js()]);"fulfilled"===n.status?Ye=n.value:B(n.reason),"rejected"===r.status&&B(r.reason),"fulfilled"===l.status?o=l.value.enabled.map(e=>({name:e.name,path:e.path,source:e.source})):B(l.reason),sendControlResponseSuccess(i,{commands:Ye.filter(e=>!1!==e.userInvocable).map(e=>({name:p(e),description:m(e),argumentHint:e.argumentHint||""})),agents:Qe.map(e=>({name:e.agentType,description:e.whenToUse,model:"inherit"===e.model?void 0:e.model})),plugins:o,mcpServers:buildMcpServerStatuses(),error_count:t.error_count})}catch(e){sendControlResponseError(i,fo(e))}else if("mcp_reconnect"===i.request.subtype){const e=I(),{serverName:t}=i.request;De.delete(t);const s=Ut(t)??r.find(e=>e.name===t)?.config??xe.find(e=>e.name===t)?.config??$e.clients.find(e=>e.name===t)?.config??e.mcp.clients.find(e=>e.name===t)?.config??null;if(s){const e=await Ot(t,s),o=Gt(t);if(F(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.map(s=>s.name===t?e.client:s),tools:[...be(s.mcp.tools,e=>e.name?.startsWith(o)),...e.tools],commands:[...be(s.mcp.commands,e=>Kt(e,t)),...e.commands],resources:e.resources&&e.resources.length>0?{...s.mcp.resources,[t]:e.resources}:Se(s.mcp.resources,t)}})),$e={...$e,clients:[...$e.clients.filter(e=>e.name!==t),e.client],tools:[...$e.tools.filter(e=>!e.name?.startsWith(o)),...e.tools]},"connected"===e.client.type)registerElicitationHandlers([e.client]),reregisterChannelHandlerAfterReconnect(e.client),sendControlResponseSuccess(i);else{const t="failed"===e.client.type?e.client.error??"Connection failed":`Server status: ${e.client.type}`;sendControlResponseError(i,t)}}else sendControlResponseError(i,`Server not found: ${t}`)}else if("mcp_toggle"===i.request.subtype){const e=I(),{serverName:t,enabled:s}=i.request;De.delete(t);const o=Ut(t)??r.find(e=>e.name===t)?.config??xe.find(e=>e.name===t)?.config??$e.clients.find(e=>e.name===t)?.config??e.mcp.clients.find(e=>e.name===t)?.config??null;if(o)if(s){Nt(t,!0);const e=await Ot(t,o),s=Gt(t);if(F(o=>({...o,mcp:{...o.mcp,clients:o.mcp.clients.map(s=>s.name===t?e.client:s),tools:[...be(o.mcp.tools,e=>e.name?.startsWith(s)),...e.tools],commands:[...be(o.mcp.commands,e=>Kt(e,t)),...e.commands],resources:e.resources&&e.resources.length>0?{...o.mcp.resources,[t]:e.resources}:Se(o.mcp.resources,t)}})),"connected"===e.client.type)registerElicitationHandlers([e.client]),reregisterChannelHandlerAfterReconnect(e.client),sendControlResponseSuccess(i);else{const t="failed"===e.client.type?e.client.error??"Connection failed":`Server status: ${e.client.type}`;sendControlResponseError(i,t)}}else{Nt(t,!1);const s=[...r,...xe,...$e.clients,...e.mcp.clients].find(e=>e.name===t);s&&"connected"===s.type&&await At(t,o);const n=Gt(t);F(e=>({...e,mcp:{...e.mcp,clients:e.mcp.clients.map(e=>e.name===t?{name:t,type:"disabled",config:o}:e),tools:be(e.mcp.tools,e=>e.name?.startsWith(n)),commands:be(e.mcp.commands,e=>Kt(e,t)),resources:Se(e.mcp.resources,t)}})),sendControlResponseSuccess(i)}else sendControlResponseError(i,`Server not found: ${t}`)}else if("channel_enable"===i.request.subtype){const e=I();handleChannelEnable(i.request_id,i.request.serverName,[...e.mcp.clients,...xe,...$e.clients],oe)}else if("mcp_authenticate"===i.request.subtype){const{serverName:e}=i.request,t=I(),s=Ut(e)??r.find(t=>t.name===e)?.config??t.mcp.clients.find(t=>t.name===e)?.config??null;if(s)if("sse"!==s.type&&"http"!==s.type)sendControlResponseError(i,`Server type "${s.type}" does not support OAuth authentication`);else try{mt.get(e)?.abort();const t=new AbortController;let o;mt.set(e,t);const n=new Promise(e=>{o=e}),r=Dt(e,s,e=>o(e),t.signal,{skipBrowserOpen:!0,onWaitingForCallback:t=>{pt.set(e,t)}}),a=await Promise.race([n,r.then(()=>null)]);sendControlResponseSuccess(i,a?{authUrl:a,requiresUserAction:!0}:{requiresUserAction:!1}),yt.set(e,r);r.then(async()=>{if(xt(e))return;if(_t.has(e))return;const t=await Ot(e,s),o=Gt(e);F(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.map(s=>s.name===e?t.client:s),tools:[...be(s.mcp.tools,e=>e.name?.startsWith(o)),...t.tools],commands:[...be(s.mcp.commands,t=>Kt(t,e)),...t.commands],resources:t.resources&&t.resources.length>0?{...s.mcp.resources,[e]:t.resources}:Se(s.mcp.resources,e)}})),$e={...$e,clients:[...$e.clients.filter(t=>t.name!==e),t.client],tools:[...$e.tools.filter(e=>!e.name?.startsWith(o)),...t.tools]}}).catch(t=>{w(`MCP OAuth failed for ${e}: ${t}`,{level:"error"})}).finally(()=>{mt.get(e)===t&&(mt.delete(e),pt.delete(e),_t.delete(e),yt.delete(e))})}catch(e){sendControlResponseError(i,fo(e))}else sendControlResponseError(i,`Server not found: ${e}`)}else if("mcp_oauth_callback_url"===i.request.subtype){const{serverName:e,callbackUrl:t}=i.request,s=pt.get(e);if(s){let o=!1;try{const e=new URL(t);o=e.searchParams.has("code")||e.searchParams.has("error")}catch{}if(o){_t.add(e),s(t);const o=yt.get(e);if(o)try{await o,sendControlResponseSuccess(i)}catch(e){sendControlResponseError(i,e instanceof Error?e.message:"OAuth authentication failed")}else sendControlResponseSuccess(i)}else sendControlResponseError(i,"Invalid callback URL: missing authorization code. Please paste the full redirect URL including the code parameter.")}else sendControlResponseError(i,`No active OAuth flow for server: ${e}`)}else if("claude_authenticate"===i.request.subtype){const{loginWithClaudeAi:e}=i.request;ht?.service.cleanup(),S("tengu_oauth_flow_start",{loginWithClaudeAi:e??!0});const t=new at;let s;const o=new Promise(e=>{s=e}),n=t.startOAuthFlow(async(e,t)=>{s({manualUrl:e,automaticUrl:t})},{loginWithClaudeAi:e??!0,skipBrowserOpen:!0}).then(async t=>{await lt(t),S("tengu_oauth_success",{loginWithClaudeAi:e??!0})}).finally(()=>{t.cleanup(),ht?.service===t&&(ht=null)});ht={service:t,flow:n},n.catch(e=>w(`claude_authenticate flow ended: ${e}`,{level:"info"}));try{const{manualUrl:e,automaticUrl:t}=await Promise.race([o,n.then(()=>{throw new Error("OAuth flow completed without producing auth URLs")})]);sendControlResponseSuccess(i,{manualUrl:e,automaticUrl:t})}catch(e){sendControlResponseError(i,fo(e))}}else if("claude_oauth_callback"===i.request.subtype||"claude_oauth_wait_for_completion"===i.request.subtype)if(ht){"claude_oauth_callback"===i.request.subtype&&ht.service.handleManualAuthCodeInput({authorizationCode:i.request.authorizationCode,state:i.request.state});const{flow:e}=ht;e.then(()=>{const e=it();sendControlResponseSuccess(i,{account:{email:e?.email,organization:e?.organization,subscriptionType:e?.subscription,tokenSource:e?.tokenSource,apiKeySource:e?.apiKeySource,apiProvider:ut()}})},e=>sendControlResponseError(i,fo(e)))}else sendControlResponseError(i,"No active claude_authenticate flow");else if("mcp_clear_auth"===i.request.subtype){const{serverName:e}=i.request,t=I(),s=Ut(e)??r.find(t=>t.name===e)?.config??t.mcp.clients.find(t=>t.name===e)?.config??null;if(s)if("sse"!==s.type&&"http"!==s.type)sendControlResponseError(i,`Cannot clear auth for server type "${s.type}"`);else{await $t(e,s);const t=await Ot(e,s),o=Gt(e);F(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.map(s=>s.name===e?t.client:s),tools:[...be(s.mcp.tools,e=>e.name?.startsWith(o)),...t.tools],commands:[...be(s.mcp.commands,t=>Kt(t,e)),...t.commands],resources:t.resources&&t.resources.length>0?{...s.mcp.resources,[e]:t.resources}:Se(s.mcp.resources,e)}})),sendControlResponseSuccess(i,{})}else sendControlResponseError(i,`Server not found: ${e}`)}else if("apply_flag_settings"===i.request.subtype){const e=rs(),t=ws()??{},s=i.request.settings,o={...t,...s};for(const e of Object.keys(o))null===o[e]&&delete o[e];Es(o),Ge.notifyChange("flagSettings"),"model"in s&&(null!=s.model?ys(String(s.model)):ys(void 0));const n=rs();if(n!==e){Re=n;const e=s.model?String(s.model):"default";D({model:n}),injectModelSwitchBreadcrumbs(e,n)}sendControlResponseSuccess(i)}else if("get_settings"===i.request.subtype){const e=I(),t=rs(),s=us(t)?ps(t,e.effortValue):void 0;sendControlResponseSuccess(i,{...We(),applied:{model:t,effort:"string"==typeof s?s:null}})}else if("stop_task"===i.request.subtype){const{task_id:e}=i.request;try{await co(e,{getAppState:I,setAppState:F}),sendControlResponseSuccess(i,{})}catch(e){sendControlResponseError(i,fo(e))}}else if("generate_session_title"===i.request.subtype){const{description:e,persist:t}=i.request,s=(Y&&!Y.signal.aborted?Y:qe()).signal;(async()=>{try{const o=await Oe(e,s);if(o&&t)try{Ct(_s(),o)}catch(e){B(e)}sendControlResponseSuccess(i,{title:o})}catch(e){sendControlResponseError(i,fo(e))}})()}else if("side_question"===i.request.subtype){const{question:e}=i.request;(async()=>{try{const t=rt(),s=t?{...t,toolUseContext:{...t.toolUseContext,abortController:qe()}}:await Me({tools:buildAllTools(I()),commands:Ye,mcpClients:[...I().mcp.clients,...xe,...$e.clients],messages:we,readFileState:Ie,getAppState:I,setAppState:F,customSystemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,thinkingConfig:K.thinkingConfig,agents:Qe}),o=await Ue({question:e,cacheSafeParams:s});sendControlResponseSuccess(i,{response:o.response})}catch(e){sendControlResponseError(i,fo(e))}})()}else if((e("PROACTIVE")||e("KAIROS"))&&"set_proactive"===i.request.subtype){i.request.enabled?vo.isProactiveActive()||(vo.activateProactive("command"),Ze()):vo.deactivateProactive(),sendControlResponseSuccess(i)}else if("remote_control"===i.request.subtype)if(i.request.enabled)if(Le)sendControlResponseSuccess(i,{session_url:Ee(Le.bridgeSessionId,Le.sessionIngressUrl),connect_url:ke(Le.environmentId,Le.sessionIngressUrl),environment_id:Le.environmentId});else{let e;try{const{initReplBridge:s}=await import("../bridge/initReplBridge.js"),o=await s({onInboundMessage(e){const t=Ce(e);if(!t)return;const{content:s,uuid:o}=t;A({value:s,mode:"prompt",uuid:o,skipSlashCommands:!0}),run()},onPermissionResponse(e){t.injectControlResponse(e)},onInterrupt(){Y?.abort()},onSetModel(e){const t="default"===e?ns():e;Re=t,ys(t)},onSetMaxThinkingTokens(e){K.thinkingConfig=null===e?void 0:0===e?{type:"disabled"}:{type:"enabled",budgetTokens:e}},onStateChange(t,s){"failed"===t&&(e=s),w(`[bridge:sdk] State change: ${t}${s?` — ${s}`:""}`),oe.enqueue({type:"system",subtype:"bridge_state",state:t,detail:s,uuid:Ts(),session_id:_s()})},initialMessages:we.length>0?we:void 0});o?(Le=o,Be=we.length,t.setOnControlRequestSent(e=>{o.sendControlRequest(e)}),t.setOnControlRequestResolved(e=>{o.sendControlCancelRequest(e)}),sendControlResponseSuccess(i,{session_url:Ee(o.bridgeSessionId,o.sessionIngressUrl),connect_url:ke(o.environmentId,o.sessionIngressUrl),environment_id:o.environmentId})):sendControlResponseError(i,e??"Remote Control initialization failed")}catch(e){sendControlResponseError(i,fo(e))}}else Le&&(t.setOnControlRequestSent(void 0),t.setOnControlRequestResolved(void 0),await Le.teardown(),Le=null),sendControlResponseSuccess(i);else sendControlResponseError(i,`Unsupported control request subtype: ${i.request.subtype}`)}}J=!0,et?.stop(),Q||(ce.inflightPromise&&await Promise.race([ce.inflightPromise,_o(5e3)]),ce.abortController?.abort(),ce.abortController=null,await pe(),Je(),ve?.(),os.delete(rateLimitListener),oe.done())})(),oe}(Pe,Ae.mcp.clients,[...Y,...Ae.mcp.commands],Qe,Re,Je,J,I,V,te,Ie,$e)){if(mt){const e=mt(t);e&&await Pe.write(e)}else"stream-json"===Ie.outputFormat&&Ie.verbose&&await Pe.write(t);"control_response"!==t.type&&"control_request"!==t.type&&"control_cancel_request"!==t.type&&("system"!==t.type||"session_state_changed"!==t.subtype&&"task_notification"!==t.subtype&&"task_started"!==t.subtype&&"task_progress"!==t.subtype&&"post_turn_summary"!==t.subtype)&&"stream_event"!==t.type&&"keep_alive"!==t.type&&"streamlined_text"!==t.type&&"streamlined_tool_use_summary"!==t.type&&"prompt_suggestion"!==t.type&&(Ze&&et.push(t),tt=t)}switch(Ie.outputFormat){case"json":if(!tt||"result"!==tt.type)throw new Error("No messages returned");if(Ie.verbose){G(Bs(et)+"\n");break}G(Bs(tt)+"\n");break;case"stream-json":break;default:if(!tt||"result"!==tt.type)throw new Error("No messages returned");switch(tt.subtype){case"success":G(tt.result.endsWith("\n")?tt.result:tt.result+"\n");break;case"error_during_execution":G("Execution error");break;case"error_max_turns":G(`Error: Reached max turns (${Ie.maxTurns})`);break;case"error_max_budget_usd":G(`Error: Exceeded USD budget (${Ie.maxBudgetUsd})`);break;case"error_max_structured_output_retries":G("Error: Failed to provide valid structured output after maximum retries")}}$s(),e("EXTRACT_MEMORIES")&&yo()&&await Eo.drainPendingExtraction(),fe("result"===tt?.type&&tt?.is_error?1:0)}export function createCanUseToolWithPermissionPrompt(e){const canUseTool=async(t,s,o,n,r,i)=>{const a=i??await Ie(t,s,o,n,r);if("allow"===a.behavior||"deny"===a.behavior)return a;const{signal:l,cleanup:u}=Re(o.abortController.signal);if(l.aborted)return u(),{behavior:"deny",message:"Permission prompt was aborted.",decisionReason:{type:"permissionPromptTool",permissionPromptToolName:t.name,toolResult:void 0}};const c=new Promise(e=>{l.addEventListener("abort",()=>e("aborted"),{once:!0})}),m=e.call({tool_name:t.name,input:s,tool_use_id:r},o,canUseTool,n),p=await Promise.race([m,c]);if(u(),"aborted"===p||l.aborted)return{behavior:"deny",message:"Permission prompt was aborted.",decisionReason:{type:"permissionPromptTool",permissionPromptToolName:t.name,toolResult:void 0}};const d=p,f=e.mapToolResultToToolResultBlockParam(d.data,"1");if(!f.content||!Array.isArray(f.content)||!f.content[0]||"text"!==f.content[0].type||"string"!=typeof f.content[0].text)throw new Error('Permission prompt tool returned an invalid result. Expected a single text block param with type="text" and a string text value.');return Ae(Te().parse(Pe(f.content[0].text)),e,s,o)};return canUseTool}export function getCanUseToolFn(e,t,s,o){if("stdio"===e)return t.createCanUseTool(o);if(!e)return async(e,t,s,o,n,r)=>r??await Ie(e,t,s,o,n);let n=null;return async(t,o,r,i,a,l)=>{if(!n){const t=s(),o=t.find(t=>C(t,e));if(!o){const s=`Error: MCP tool ${e} (passed via --permission-prompt-tool) not found. Available MCP tools: ${t.map(e=>e.name).join(", ")||"none"}`;throw process.stderr.write(`${s}\n`),fe(1),new Error(s)}if(!o.inputJSONSchema){const t=`Error: tool ${e} (passed via --permission-prompt-tool) must be an MCP tool`;throw process.stderr.write(`${t}\n`),fe(1),new Error(t)}n=createCanUseToolWithPermissionPrompt(o)}return n(t,o,r,i,a,l)}}async function handleInitializeRequest(e,t,s,o,n,r,i,a,l,u,c){if(s)return void o.enqueue({type:"control_response",response:{subtype:"error",error:"Already initialized",request_id:t,pending_permission_requests:i.getPendingPermissionRequests()}});if(void 0!==e.systemPrompt&&(l.systemPrompt=e.systemPrompt),void 0!==e.appendSystemPrompt&&(l.appendSystemPrompt=e.appendSystemPrompt),void 0!==e.promptSuggestions&&(l.promptSuggestions=e.promptSuggestions),e.agents){const t=I(e.agents,"flagSettings");u.push(...t)}if(l.agent){const e=ks()===l.agent,t=u.find(e=>e.agentType===l.agent);if(t&&!e){if(hs(t.agentType),!l.systemPrompt&&!j(t)){const e=t.getSystemPrompt();e&&(l.systemPrompt=e)}if(!l.userSpecifiedModel&&t.model&&"inherit"!==t.model){const e=as(t.model);ys(e)}t.initialPrompt&&i.prependUserMessage(t.initialPrompt)}else t?.initialPrompt&&i.prependUserMessage(t.initialPrompt)}const d=Be(),f=d?.outputStyle||$e,g=await Le(ve()),_=it();if(e.hooks){const t={};for(const[s,o]of Object.entries(e.hooks))t[s]=o.map(e=>{const t=e.hookCallbackIds.map(t=>i.createHookCallback(t,e.timeout));return{matcher:e.matcher,hooks:t}});mt(t)}e.jsonSchema&&pt(e.jsonSchema);const y={commands:n.filter(e=>!1!==e.userInvocable).map(e=>({name:p(e),description:m(e),argumentHint:e.argumentHint||""})),agents:u.map(e=>({name:e.agentType,description:e.whenToUse,model:"inherit"===e.model?void 0:e.model})),output_style:f,available_output_styles:Object.keys(g),models:r,account:{email:_?.email,organization:_?.organization,subscriptionType:_?.subscription,tokenSource:_?.tokenSource,apiKeySource:_?.apiKeySource,apiProvider:ut()},pid:process.pid};if(Xe()&&ze()){const e=c();y.fast_mode_state=Ye(l.userSpecifiedModel??null,e.fastMode)}if(o.enqueue({type:"control_response",response:{subtype:"success",request_id:t,response:y}}),a){const e=ct.getInstance().getStatus();e&&o.enqueue({type:"auth_status",isAuthenticating:e.isAuthenticating,output:e.output,error:e.error,uuid:Ts(),session_id:_s()})}}async function handleRewindFiles(e,t,s,o){if(!Rs())return{canRewind:!1,error:"File rewinding is not enabled."};if(!qs(t.fileHistory,e))return{canRewind:!1,error:"No file checkpoint found for this message."};if(o){const s=await Os(t.fileHistory,e);return{canRewind:!0,filesChanged:s?.filesChanged,insertions:s?.insertions,deletions:s?.deletions}}try{await As(e=>s(t=>({...t,fileHistory:e(t.fileHistory)})),e)}catch(e){return{canRewind:!1,error:`Failed to rewind: ${fo(e)}`}}return{canRewind:!0}}function handleSetPermissionMode(t,s,o,n){if("bypassPermissions"===t.mode){if(et())return n.enqueue({type:"control_response",response:{subtype:"error",request_id:s,error:"Cannot set permission mode to bypassPermissions because it is disabled by settings or configuration"}}),o;if(!o.isBypassPermissionsModeAvailable)return n.enqueue({type:"control_response",response:{subtype:"error",request_id:s,error:"Cannot set permission mode to bypassPermissions because the session was not launched with --dangerously-skip-permissions"}}),o}if(e("TRANSCRIPT_CLASSIFIER")&&"auto"===t.mode&&!Qe()){const e=Ze();return n.enqueue({type:"control_response",response:{subtype:"error",request_id:s,error:e?`Cannot set permission mode to auto: ${Je(e)}`:"Cannot set permission mode to auto"}}),o}return n.enqueue({type:"control_response",response:{subtype:"success",request_id:s,response:{mode:t.mode}}}),{...tt(o.mode,t.mode,o),mode:t.mode}}function handleChannelEnable(t,s,o,n){const respondError=e=>n.enqueue({type:"control_response",response:{subtype:"error",request_id:t,error:e}});if(!e("KAIROS")&&!e("KAIROS_CHANNELS"))return respondError("channels feature not available in this build");const r=o.find(e=>e.name===s&&"connected"===e.type);if(!r||"connected"!==r.type)return respondError(`server ${s} is not connected`);const i=r.config.pluginSource,a=i?te(i):void 0;if(!a?.marketplace)return respondError(`server ${s} is not plugin-sourced; channel_enable requires a marketplace plugin`);const l={kind:"plugin",name:a.name,marketplace:a.marketplace},u=Cs(),c=u.some(e=>"plugin"===e.kind&&e.name===l.name&&e.marketplace===l.marketplace);c||js([...u,l]);const m=Y(s,r.capabilities,i);if("skip"===m.action)return c||js(u),respondError(m.reason);const p=`${l.name}@${l.marketplace}`;W(s,"Channel notifications registered"),S("tengu_mcp_channel_enable",{plugin:p}),r.client.setNotificationHandler(V(),async e=>{const{content:t,meta:o}=e.params;W(s,`notifications/claude/channel: ${t.slice(0,80)}`),S("tengu_mcp_channel_message",{content_length:t.length,meta_key_count:Object.keys(o??{}).length,entry_kind:"plugin",is_dev:!1,plugin:p}),A({mode:"prompt",value:Q(s,t,o),priority:"next",isMeta:!0,origin:{kind:"channel",server:s},skipSlashCommands:!0})}),n.enqueue({type:"control_response",response:{subtype:"success",request_id:t,response:void 0}})}function reregisterChannelHandlerAfterReconnect(t){if(!e("KAIROS")&&!e("KAIROS_CHANNELS"))return;if("connected"!==t.type)return;if("register"!==Y(t.name,t.capabilities,t.config.pluginSource).action)return;const s=J(t.name,Cs()),o="plugin"===s?.kind?`${s.name}@${s.marketplace}`:void 0;W(t.name,"Channel notifications re-registered after reconnect"),t.client.setNotificationHandler(V(),async e=>{const{content:n,meta:r}=e.params;W(t.name,`notifications/claude/channel: ${n.slice(0,80)}`),S("tengu_mcp_channel_message",{content_length:n.length,meta_key_count:Object.keys(r??{}).length,entry_kind:s?.kind,is_dev:s?.dev??!1,plugin:o}),A({mode:"prompt",value:Q(t.name,n,r),priority:"next",isMeta:!0,origin:{kind:"channel",server:t.name},skipSlashCommands:!0})})}function emitLoadError(e,t){if("stream-json"===t){const t={type:"result",subtype:"error_during_execution",duration_ms:0,duration_api_ms:0,is_error:!0,num_turns:0,stop_reason:null,session_id:_s(),total_cost_usd:0,usage:z,modelUsage:{},permission_denials:[],uuid:Ts(),errors:[e]};process.stdout.write(Bs(t)+"\n")}else process.stderr.write(e+"\n")}export function removeInterruptedMessage(e,t){const s=e.findIndex(e=>e.uuid===t.uuid);-1!==s&&e.splice(s,2)}export async function handleOrphanedPermissionResponse({message:e,setAppState:t,onEnqueued:s,handledToolUseIds:o}){if("success"===e.response.subtype&&e.response.response?.toolUseID&&"string"==typeof e.response.response.toolUseID){const t=e.response.response,{toolUseID:n}=t;if(!n)return!1;if(w(`handleOrphanedPermissionResponse: received orphaned control_response for toolUseID=${n} request_id=${e.response.request_id}`),o.has(n))return w(`handleOrphanedPermissionResponse: skipping duplicate orphaned permission for toolUseID=${n} (already handled)`),!1;const r=await bt(n);return r?(o.add(n),w(`handleOrphanedPermissionResponse: enqueuing orphaned permission for toolUseID=${n} messageID=${r.message.id}`),A({mode:"orphaned-permission",value:[],orphanedPermission:{permissionResult:t,assistantMessage:r}}),s?.(),!0):(w(`handleOrphanedPermissionResponse: no unresolved tool_use found for toolUseID=${n} (already resolved in transcript)`),!1)}return!1}function toScopedConfig(e){return{...e,scope:"dynamic"}}export async function handleMcpSetServers(e,t,s,o){const{allowed:n,blocked:r}=Mt(e),i={};for(const e of r)i[e]="Blocked by enterprise policy (allowedMcpServers/deniedMcpServers)";const a={},l={};for(const[e,t]of Object.entries(n))"sdk"===t.type?a[e]=t:l[e]=t;const u=new Set(Object.keys(t.configs)),c=new Set(Object.keys(a)),m=[],p=[],d={...t.configs};let f=[...t.clients],g=[...t.tools];for(const e of u)if(!c.has(e)){const t=f.find(t=>t.name===e);t&&"connected"===t.type&&await t.cleanup(),f=f.filter(t=>t.name!==e);const s=`mcp__${e}__`;g=g.filter(e=>!e.name.startsWith(s)),delete d[e],p.push(e)}for(const[e,t]of Object.entries(a))if(!u.has(e)){d[e]=t;const s={type:"pending",name:e,config:{...t,scope:"dynamic"}};f=[...f,s],m.push(e)}const _=await reconcileMcpServers(l,s,o);return{response:{added:[...m,..._.response.added],removed:[...p,..._.response.removed],errors:{...i,..._.response.errors}},newSdkState:{configs:d,clients:f,tools:g},newDynamicState:_.newState,sdkServersChanged:m.length>0||p.length>0}}export async function reconcileMcpServers(e,t,s){const o=new Set(Object.keys(t.configs)),n=new Set(Object.keys(e)),r=[...o].filter(e=>!n.has(e)),i=[...n].filter(e=>!o.has(e)),a=[...o].filter(e=>n.has(e)).filter(s=>{const o=t.configs[s],n=e[s];if(!o||!n)return!0;const r=toScopedConfig(n);return!Rt(o,r)}),l=[],u=[],c={};let m=[...t.clients],p=[...t.tools];for(const e of[...r,...a]){const s=m.find(t=>t.name===e),o=t.configs[e];if(s&&o){if("connected"===s.type)try{await s.cleanup()}catch(e){B(e)}await At(e,o)}const n=`mcp__${e}__`;p=p.filter(e=>!e.name.startsWith(n)),m=m.filter(t=>t.name!==e),r.includes(e)&&l.push(e)}for(const t of[...i,...a]){const s=e[t];if(!s)continue;const o=toScopedConfig(s);if("sdk"!==s.type)try{const e=await Tt(t,o);if(m.push(e),"connected"===e.type){const t=await qt(e);p.push(...t)}else"failed"===e.type&&(c[t]=e.error||"Connection failed");u.push(t)}catch(e){const s=go(e);c[t]=s.message,B(s)}else u.push(t)}const d={};for(const t of n){const s=e[t];s&&(d[t]=toScopedConfig(s))}const f={clients:m,tools:p,configs:d};return s(e=>{const s=new Set([...Object.keys(t.configs),...Object.keys(d)]),o=e.mcp.tools.filter(e=>{for(const t of s)if(e.name.startsWith(`mcp__${t}__`))return!1;return!0}),n=e.mcp.clients.filter(e=>!s.has(e.name));return{...e,mcp:{...e.mcp,tools:[...o,...p],clients:[...n,...m]}}}),{response:{added:u,removed:l,errors:c},newState:f}}
|
|
1
|
+
import{feature as e}from"../recovery/bunBundleShim.js";import{createRequire as t}from"module";const s=t(import.meta.url);import{readFile as o,stat as n}from"fs/promises";import{dirname as r}from"path";import{downloadUserSettings as i,redownloadUserSettings as a}from"../services/settingsSync/index.js";import{waitForRemoteManagedSettingsToLoad as l}from"../services/remoteManagedSettings/index.js";import{StructuredIO as u}from"./structuredIO.js";import{RemoteIO as c}from"./remoteIO.js";import{formatDescriptionWithSource as m,getCommandName as p}from"../commands.js";import{createStreamlinedTransformer as d}from"../utils/streamlinedTransform.js";import{installStreamJsonStdoutGuard as f}from"../utils/streamJsonStdoutGuard.js";import{assembleToolPool as g,filterToolsByDenyRules as _}from"../tools.js";import y from"lodash-es/uniqBy.js";import{uniq as h}from"../utils/array.js";import{mergeAndFilterTools as v}from"../utils/toolPool.js";import{logEvent as S}from"../services/analytics/index.js";import{getFeatureValue_CACHED_MAY_BE_STALE as b}from"../services/analytics/growthbook.js";import{logForDebugging as w}from"../utils/debug.js";import{logForDiagnosticsNoPII as E,withDiagnosticsTiming as k}from"../utils/diagLogs.js";import{toolMatchesName as C}from"../Tool.js";import{isBuiltInAgent as j,parseAgentsFromJson as I}from"../tools/AgentTool/loadAgentsDir.js";import{dequeue as P,dequeueAllMatching as T,enqueue as A,hasCommandsInQueue as q,peek as R,subscribeToCommandQueue as O,getCommandsByMaxPriority as M}from"../utils/messageQueueManager.js";import{notifyCommandLifecycle as U}from"../utils/commandLifecycle.js";import{getSessionState as x,notifySessionStateChanged as N,notifySessionMetadataChanged as D,setPermissionModeChangedListener as $,setSessionMetadataChangedListener as L}from"../utils/sessionState.js";import{externalMetadataToAppState as F}from"../state/onChangeAppState.js";import{getInMemoryErrors as H,logError as B,logMCPDebug as W}from"../utils/log.js";import{writeToStdout as G,registerProcessOutputErrorHandlers as K}from"../utils/process.js";import{EMPTY_USAGE as z}from"../services/api/logging.js";import{loadConversationForResume as X}from"../utils/conversationRecovery.js";import{ChannelMessageNotificationSchema as V,gateChannelServer as Y,wrapChannelMessage as Q,findChannelEntry as J}from"../services/mcp/channelNotification.js";import{isChannelAllowlisted as Z,isChannelsEnabled as ee}from"../services/mcp/channelAllowlist.js";import{parsePluginIdentifier as te}from"../utils/plugins/pluginIdentifier.js";import{validateUuid as se}from"../utils/uuid.js";import{fromArray as oe}from"../utils/generators.js";import{ask as ne}from"../QueryEngine.js";import{createFileStateCacheWithSizeLimit as re,mergeFileStateCaches as ie,READ_FILE_STATE_CACHE_SIZE as ae}from"../utils/fileStateCache.js";import{expandPath as le}from"../utils/path.js";import{extractReadFilesFromMessages as ue}from"../utils/queryHelpers.js";import{registerHookEventHandler as ce}from"../utils/hooks/hookEvents.js";import{executeFilePersistence as me}from"../utils/filePersistence/filePersistence.js";import{finalizePendingAsyncHooks as pe}from"../utils/hooks/AsyncHookRegistry.js";import{gracefulShutdown as de,gracefulShutdownSync as fe,isShuttingDown as ge}from"../utils/gracefulShutdown.js";import{registerCleanup as _e}from"../utils/cleanupRegistry.js";import{createIdleTimeoutManager as ye}from"../utils/idleTimeout.js";import{cwd as he}from"process";import{getCwd as ve}from"../utils/cwd.js";import Se from"lodash-es/omit.js";import be from"lodash-es/reject.js";import{isPolicyAllowed as we}from"../services/policyLimits/index.js";import{getRemoteSessionUrl as Ee}from"../constants/product.js";import{buildBridgeConnectUrl as ke}from"../bridge/bridgeStatusUtil.js";import{extractInboundMessageFields as Ce}from"../bridge/inboundMessages.js";import{resolveAndPrepend as je}from"../bridge/inboundAttachments.js";import{hasPermissionsToUseTool as Ie}from"../utils/permissions/permissions.js";import{safeParseJSON as Pe}from"../utils/json.js";import{outputSchema as Te,permissionPromptToolResultToPermissionDecision as Ae}from"../utils/permissions/PermissionPromptToolResultSchema.js";import{createAbortController as qe}from"../utils/abortController.js";import{createCombinedAbortSignal as Re}from"../utils/combinedAbortSignal.js";import{generateSessionTitle as Oe}from"../utils/sessionTitle.js";import{buildSideQuestionFallbackParams as Me}from"../utils/queryContext.js";import{runSideQuestion as Ue}from"../utils/sideQuestion.js";import{processSessionStartHooks as xe,processSetupHooks as Ne,takeInitialUserMessage as De}from"../utils/sessionStart.js";import{DEFAULT_OUTPUT_STYLE_NAME as $e,getAllOutputStyles as Le}from"../constants/outputStyles.js";import{TEAMMATE_MESSAGE_TAG as Fe,TICK_TAG as He}from"../constants/xml.js";import{getSettings_DEPRECATED as Be,getSettingsWithSources as We}from"../utils/settings/settings.js";import{settingsChangeDetector as Ge}from"../utils/settings/changeDetector.js";import{applySettingsChange as Ke}from"../utils/settings/applySettingsChange.js";import{isFastModeAvailable as ze,isFastModeEnabled as Xe,isFastModeSupportedByModel as Ve,getFastModeState as Ye}from"../utils/fastMode.js";import{isAutoModeGateEnabled as Qe,getAutoModeUnavailableNotification as Je,getAutoModeUnavailableReason as Ze,isBypassPermissionsModeDisabled as et,transitionPermissionMode as tt}from"../utils/permissions/permissionSetup.js";import{tryGenerateSuggestion as st,logSuggestionOutcome as ot,logSuggestionSuppressed as nt}from"../services/PromptSuggestion/promptSuggestion.js";import{getLastCacheSafeParams as rt}from"../utils/forkedAgent.js";import{getAccountInformation as it}from"../utils/auth.js";import{OAuthService as at}from"../services/oauth/index.js";import{installOAuthTokens as lt}from"./handlers/auth.js";import{getAPIProvider as ut}from"../utils/model/providers.js";import{AwsAuthStatusManager as ct}from"../utils/awsAuthStatusManager.js";import{registerHookCallbacks as mt,setInitJsonSchema as pt,getInitJsonSchema as dt,setSdkAgentProgressSummariesEnabled as ft}from"../bootstrap/state.js";import{createSyntheticOutputTool as gt}from"../tools/SyntheticOutputTool/SyntheticOutputTool.js";import{parseSessionIdentifier as _t}from"../utils/sessionUrl.js";import{hydrateRemoteSession as yt,hydrateFromCCRv2InternalEvents as ht,resetSessionFilePointer as vt,doesMessageExistInSession as St,findUnresolvedToolUse as bt,recordAttributionSnapshot as wt,saveAgentSetting as Et,saveMode as kt,saveAiGeneratedTitle as Ct,restoreSessionMetadata as jt}from"../utils/sessionStorage.js";import{incrementPromptCount as It}from"../utils/commitAttribution.js";import{setupSdkMcpClients as Pt,connectToServer as Tt,clearServerCache as At,fetchToolsForClient as qt,areMcpConfigsEqual as Rt,reconnectMcpServerImpl as Ot}from"../services/mcp/client.js";import{filterMcpServersByPolicy as Mt,getMcpConfigByName as Ut,isMcpServerDisabled as xt,setMcpServerEnabled as Nt}from"../services/mcp/config.js";import{performMCPOAuthFlow as Dt,revokeServerTokens as $t}from"../services/mcp/auth.js";import{runElicitationHooks as Lt,runElicitationResultHooks as Ft}from"../services/mcp/elicitationHandler.js";import{executeNotificationHooks as Ht}from"../utils/hooks.js";import{ElicitRequestSchema as Bt,ElicitationCompleteNotificationSchema as Wt}from"@modelcontextprotocol/sdk/types.js";import{getMcpPrefix as Gt}from"../services/mcp/mcpStringUtils.js";import{commandBelongsToServer as Kt,filterToolsByServer as zt}from"../services/mcp/utils.js";import{setupVscodeSdkMcp as Xt}from"../services/mcp/vscodeSdkMcp.js";import{getAllMcpConfigs as Vt}from"../services/mcp/config.js";import{isQualifiedForGrove as Yt,checkGroveForNonInteractive as Qt}from"../services/api/grove.js";import{toInternalMessages as Jt,toSDKRateLimitInfo as Zt}from"../utils/messages/mappers.js";import{createModelSwitchBreadcrumbs as es}from"../utils/messages.js";import{collectContextData as ts}from"../commands/context/context-noninteractive.js";import{LOCAL_COMMAND_STDOUT_TAG as ss}from"../constants/xml.js";import{statusListeners as os}from"../services/claudeAiLimits.js";import{getDefaultMainLoopModel as ns,getMainLoopModel as rs,modelDisplayString as is,parseUserSpecifiedModel as as}from"../utils/model/model.js";import{getModelOptions as ls}from"../utils/model/modelOptions.js";import{modelSupportsEffort as us,modelSupportsMaxEffort as cs,EFFORT_LEVELS as ms,resolveAppliedEffort as ps}from"../utils/effort.js";import{modelSupportsAdaptiveThinking as ds}from"../utils/thinking.js";import{modelSupportsAutoMode as fs}from"../utils/betas.js";import{ensureModelStringsInitialized as gs}from"../utils/model/modelStrings.js";import{getSessionId as _s,setMainLoopModelOverride as ys,setMainThreadAgentType as hs,switchSession as vs,isSessionPersistenceDisabled as Ss,getIsRemoteMode as bs,getFlagSettingsInline as ws,setFlagSettingsInline as Es,getMainThreadAgentType as ks,getAllowedChannels as Cs,setAllowedChannels as js}from"../bootstrap/state.js";import{runWithWorkload as Is,WORKLOAD_CRON as Ps}from"../utils/workloadContext.js";import{randomUUID as Ts}from"crypto";import{fileHistoryRewind as As,fileHistoryCanRestore as qs,fileHistoryEnabled as Rs,fileHistoryGetDiffStats as Os}from"../utils/fileHistory.js";import{restoreAgentFromSession as Ms,restoreSessionStateFromLog as Us}from"../utils/sessionRestore.js";import{SandboxManager as xs}from"../utils/sandbox/sandbox-adapter.js";import{headlessProfilerStartTurn as Ns,headlessProfilerCheckpoint as Ds,logHeadlessProfilerTurn as $s}from"../utils/headlessProfiler.js";import{startQueryProfile as Ls,logQueryProfileReport as Fs}from"../utils/queryProfiler.js";import{asSessionId as Hs}from"../types/ids.js";import{jsonStringify as Bs}from"../utils/slowOperations.js";import{skillChangeDetector as Ws}from"../utils/skills/skillChangeDetector.js";import{getCommands as Gs,clearCommandsCache as Ks}from"../commands.js";import{isBareMode as zs,isEnvTruthy as Xs,isEnvDefinedFalsy as Vs}from"../utils/envUtils.js";import{installPluginsForHeadless as Ys}from"../utils/plugins/headlessPluginInstall.js";import{refreshActivePlugins as Qs}from"../utils/plugins/refresh.js";import{loadAllPluginsCacheOnly as Js}from"../utils/plugins/pluginLoader.js";import{isTeamLead as Zs,hasActiveInProcessTeammates as eo,hasWorkingInProcessTeammates as to,waitForTeammatesToBecomeIdle as so}from"../utils/teammate.js";import{readUnreadMessages as oo,markMessagesAsRead as no,isShutdownApproved as ro}from"../utils/teammateMailbox.js";import{removeTeammateFromTeamFile as io}from"../utils/swarm/teamHelpers.js";import{unassignTeammateTasks as ao}from"../utils/tasks.js";import{getRunningTasks as lo}from"../utils/task/framework.js";import{isBackgroundTask as uo}from"../tasks/types.js";import{stopTask as co}from"../tasks/stopTask.js";import{drainSdkEvents as mo}from"../utils/sdkEventQueue.js";import{initializeGrowthBook as po}from"../services/analytics/growthbook.js";import{errorMessage as fo,toError as go}from"../utils/errors.js";import{sleep as _o}from"../utils/sleep.js";import{isExtractModeActive as yo}from"../memdir/paths.js";const ho=e("COORDINATOR_MODE")?s("../coordinator/coordinatorMode.js"):null,vo=e("PROACTIVE")||e("KAIROS")?s("../proactive/index.js"):null,So=e("AGENT_TRIGGERS")?s("../utils/cronScheduler.js"):null,bo=e("AGENT_TRIGGERS")?s("../utils/cronJitterConfig.js"):null,wo=e("AGENT_TRIGGERS")?s("../tools/ScheduleCronTool/prompt.js"):null,Eo=e("EXTRACT_MEMORIES")?s("../services/extractMemories/extractMemories.js"):null,ko="<system-reminder>\nYou are running in non-interactive mode and cannot return a response to the user until your team is shut down.\n\nYou MUST shut down your team before preparing your final response:\n1. Use requestShutdown to ask each team member to shut down gracefully\n2. Wait for shutdown approvals\n3. Use the cleanup operation to clean up the team\n4. Only then provide your final response to the user\n\nThe user cannot receive your response until the team is completely shut down.\n</system-reminder>\n\nShut down your team and prepare your final response for the user.",Co=new Set,jo=[];function trackReceivedMessageUuid(e){if(Co.has(e))return!1;if(Co.add(e),jo.push(e),jo.length>1e4){const e=jo.splice(0,jo.length-1e4);for(const t of e)Co.delete(t)}return!0}function toBlocks(e){return"string"==typeof e?[{type:"text",text:e}]:e}export function joinPromptValues(e){return 1===e.length?e[0]:e.every(e=>"string"==typeof e)?e.join("\n"):e.flatMap(toBlocks)}export function canBatchWith(e,t){return void 0!==t&&"prompt"===t.mode&&t.workload===e.workload&&t.isMeta===e.isMeta}export async function runHeadless(t,I,V,Y,Q,J,te,Ie){if("ant"===process.env.USER_TYPE&&(Xs(process.env.CONTEXT_CODE_EXIT_AFTER_FIRST_RENDER)||Xs(process.env.CLAUDE_CODE_EXIT_AFTER_FIRST_RENDER))&&(process.stderr.write(`\nStartup time: ${Math.round(1e3*process.uptime())}ms\n`),process.exit(0)),e("DOWNLOAD_USER_SETTINGS")&&(Xs(process.env.CONTEXT_CODE_REMOTE)||Xs(process.env.CLAUDE_CODE_REMOTE)||bs())&&i(),Ge.subscribe(e=>{Ke(e,V),Xe()&&V(e=>{const t=e.settings,s=!0===t.fastMode&&!t.fastModePerSessionOptIn;return{...e,fastMode:s}})}),(e("PROACTIVE")||e("KAIROS"))&&vo&&!vo.isProactiveActive()&&(Xs(process.env.CONTEXT_CODE_PROACTIVE)||Xs(process.env.CLAUDE_CODE_PROACTIVE))&&vo.activateProactive("command"),"undefined"!=typeof Bun){setInterval(Bun.gc,1e3).unref()}if(Ns(),Ds("runHeadless_entry"),await Yt()&&await Qt(),Ds("after_grove_check"),po(),Ie.resumeSessionAt&&!Ie.resume)return process.stderr.write("Error: --resume-session-at requires --resume\n"),void fe(1);if(Ie.rewindFiles&&!Ie.resume)return process.stderr.write("Error: --rewind-files requires --resume\n"),void fe(1);if(Ie.rewindFiles&&t)return process.stderr.write("Error: --rewind-files is a standalone operation and cannot be used with a prompt\n"),void fe(1);const Pe=function(e,t){let s;s="string"==typeof e?""!==e.trim()?oe([Bs({type:"user",session_id:"",message:{role:"user",content:e},parent_tool_use_id:null})]):oe([]):e;return t.sdkUrl?new c(t.sdkUrl,s,t.replayUserMessages):new u(s,t.replayUserMessages)}(t,Ie);"stream-json"===Ie.outputFormat&&f();const Te=xs.getSandboxUnavailableReason();if(Te){if(xs.isSandboxRequired())return process.stderr.write(`\nError: sandbox required but unavailable: ${Te}\n sandbox.failIfUnavailable is set — refusing to start without a working sandbox.\n\n`),void fe(1);process.stderr.write(`\n⚠ Sandbox disabled: ${Te}\n Commands will run WITHOUT sandboxing. Network and filesystem restrictions will NOT be enforced.\n\n`)}else if(xs.isSandboxingEnabled())try{await xs.initialize(Pe.createSandboxAskCallback())}catch(e){return process.stderr.write(`\n❌ Sandbox Error: ${fo(e)}\n`),void fe(1,"other")}"stream-json"===Ie.outputFormat&&Ie.verbose&&ce(e=>{const t=(()=>{switch(e.type){case"started":return{type:"system",subtype:"hook_started",hook_id:e.hookId,hook_name:e.hookName,hook_event:e.hookEvent,uuid:Ts(),session_id:_s()};case"progress":return{type:"system",subtype:"hook_progress",hook_id:e.hookId,hook_name:e.hookName,hook_event:e.hookEvent,stdout:e.stdout,stderr:e.stderr,output:e.output,uuid:Ts(),session_id:_s()};case"response":return{type:"system",subtype:"hook_response",hook_id:e.hookId,hook_name:e.hookName,hook_event:e.hookEvent,output:e.output,stdout:e.stdout,stderr:e.stderr,exit_code:e.exitCode,outcome:e.outcome,uuid:Ts(),session_id:_s()}}})();Pe.write(t)}),Ie.setupTrigger&&await Ne(Ie.setupTrigger),Ds("before_loadInitialMessages");const Ae=I(),{messages:Re,turnInterruptionState:$e,agentSetting:Le}=await async function(t,o){const n=!Ss();if(o.continue)try{S("tengu_continue_print",{});const i=await X(void 0,void 0);if(i){if(e("COORDINATOR_MODE")&&ho){const e=ho.matchSessionMode(i.mode);if(e){process.stderr.write(e+"\n");const{getAgentDefinitionsWithOverrides:o,getActiveAgentsFromList:n}=s("../tools/AgentTool/loadAgentsDir.js");o.cache.clear?.();const r=await o(ve());t(e=>({...e,agentDefinitions:{...r,allAgents:r.allAgents,activeAgents:n(r.allAgents)}}))}}return o.forkSession||i.sessionId&&(vs(Hs(i.sessionId),i.fullPath?r(i.fullPath):null),n&&await vt()),Us(i,t),jt(o.forkSession?{...i,worktreeSession:void 0}:i),e("COORDINATOR_MODE")&&ho&&kt(ho.isCoordinatorMode()?"coordinator":"normal"),{messages:i.messages,turnInterruptionState:i.turnInterruptionState,agentSetting:i.agentSetting}}}catch(e){return B(e),fe(1),{messages:[]}}if(o.teleport)try{if(!we("allow_remote_sessions"))throw new Error("Remote sessions are disabled by your organization's policy.");if(S("tengu_teleport_print",{}),"string"!=typeof o.teleport)throw new Error("No session ID provided for teleport");const{checkOutTeleportedSessionBranch:e,processMessagesForTeleportResume:t,teleportResumeCodeSession:s,validateGitState:n}=await import("../utils/teleport.js");await n();const r=await s(o.teleport),{branchError:i}=await e(r.branch);return{messages:t(r.log,i)}}catch(e){return B(e),fe(1),{messages:[]}}if(o.resume)try{S("tengu_resume_print",{});const i=_t("string"==typeof o.resume?o.resume:"");if(!i){let e="Error: --resume requires a valid session ID when used with --print. Usage: claude -p --resume <session-id>";return"string"==typeof o.resume&&(e+=`. Session IDs must be in UUID format (e.g., 550e8400-e29b-41d4-a716-446655440000). Provided value "${o.resume}" is not a valid UUID`),emitLoadError(e,o.outputFormat),fe(1),{messages:[]}}if(Xs(process.env.CLAUDE_CODE_USE_CCR_V2)){const[,e]=await Promise.all([ht(i.sessionId),o.restoredWorkerState]);e&&(t(F(e)),"string"==typeof e.model&&ys(e.model))}else i.isUrl&&i.ingressUrl&&Xs(process.env.ENABLE_SESSION_PERSISTENCE)&&await yt(i.sessionId,i.ingressUrl);const a=await X(i.sessionId,i.jsonlFile||void 0);if(!a||0===a.messages.length)return i.isUrl||Xs(process.env.CLAUDE_CODE_USE_CCR_V2)?{messages:await(o.sessionStartHooksPromise??xe("startup"))}:(emitLoadError(`No conversation found with session ID: ${i.sessionId}`,o.outputFormat),fe(1),{messages:[]});if(o.resumeSessionAt){const e=a.messages.findIndex(e=>e.uuid===o.resumeSessionAt);if(e<0)return emitLoadError(`No message found with message.uuid of: ${o.resumeSessionAt}`,o.outputFormat),fe(1),{messages:[]};a.messages=e>=0?a.messages.slice(0,e+1):[]}if(e("COORDINATOR_MODE")&&ho){const e=ho.matchSessionMode(a.mode);if(e){process.stderr.write(e+"\n");const{getAgentDefinitionsWithOverrides:o,getActiveAgentsFromList:n}=s("../tools/AgentTool/loadAgentsDir.js");o.cache.clear?.();const r=await o(ve());t(e=>({...e,agentDefinitions:{...r,allAgents:r.allAgents,activeAgents:n(r.allAgents)}}))}}return!o.forkSession&&a.sessionId&&(vs(Hs(a.sessionId),a.fullPath?r(a.fullPath):null),n&&await vt()),Us(a,t),jt(o.forkSession?{...a,worktreeSession:void 0}:a),e("COORDINATOR_MODE")&&ho&&kt(ho.isCoordinatorMode()?"coordinator":"normal"),{messages:a.messages,turnInterruptionState:a.turnInterruptionState,agentSetting:a.agentSetting}}catch(e){B(e);return emitLoadError(e instanceof Error?`Failed to resume session: ${e.message}`:"Failed to resume session with --print mode",o.outputFormat),fe(1),{messages:[]}}return{messages:await(o.sessionStartHooksPromise??xe("startup"))}}(V,{continue:Ie.continue,teleport:Ie.teleport,resume:Ie.resume,resumeSessionAt:Ie.resumeSessionAt,forkSession:Ie.forkSession,outputFormat:Ie.outputFormat,sessionStartHooksPromise:Ie.sessionStartHooksPromise,restoredWorkerState:Pe.restoredWorkerState}),Be=De();if(Be&&Pe.prependUserMessage(Be),!Ie.agent&&!ks()&&Le){const{agentDefinition:e}=Ms(Le,void 0,{activeAgents:te,allAgents:te});if(e){if(V(t=>({...t,agent:e.agentType})),!Ie.systemPrompt&&!j(e)){const t=e.getSystemPrompt();t&&(Ie.systemPrompt=t)}Et(e.agentType)}}if(0===Re.length&&void 0!==process.exitCode)return;if(Ie.rewindFiles){const e=Re.find(e=>e.uuid===Ie.rewindFiles);if(!e||"user"!==e.type)return process.stderr.write(`Error: --rewind-files requires a user message UUID, but ${Ie.rewindFiles} is not a user message in this session\n`),void fe(1);const t=I(),s=await handleRewindFiles(Ie.rewindFiles,t,V,!1);return s.canRewind?(process.stdout.write(`Files rewound to state at message ${Ie.rewindFiles}\n`),void fe(0)):(process.stderr.write(`Error: ${s.error||"Unexpected error"}\n`),void fe(1))}const ze="string"==typeof Ie.resume&&(Boolean(se(Ie.resume))||Ie.resume.endsWith(".jsonl")),Ye=Boolean(Ie.sdkUrl);if(!t&&!ze&&!Ye)return process.stderr.write("Error: Input must be provided either through stdin or as a prompt argument when using --print\n"),void fe(1);if("stream-json"===Ie.outputFormat&&!Ie.verbose)return process.stderr.write("Error: When using --print, --output-format=stream-json requires --verbose\n"),void fe(1);let Qe=[...Q,..._(Ae.mcp.tools,Ae.toolPermissionContext)];const Je=getCanUseToolFn(Ie.sdkUrl?"stdio":Ie.permissionPromptToolName,Pe,()=>I().mcp.tools,t=>{e("COMMIT_ATTRIBUTION")&&V(e=>({...e,attribution:{...e.attribution,permissionPromptCount:e.attribution.permissionPromptCount+1}})),N("requires_action",t)});Ie.permissionPromptToolName&&(Qe=Qe.filter(e=>!C(e,Ie.permissionPromptToolName))),K(),Ds("after_loadInitialMessages"),await gs(),Ds("after_modelStrings");const Ze="json"===Ie.outputFormat&&Ie.verbose,et=[];let tt;const mt=e("STREAMLINED_OUTPUT")&&(Xs(process.env.CONTEXT_CODE_STREAMLINED_OUTPUT)||Xs(process.env.CLAUDE_CODE_STREAMLINED_OUTPUT))&&"stream-json"===Ie.outputFormat?d():null;Ds("before_runHeadlessStreaming");for await(const t of function(t,r,u,d,f,_,j,I,F,G,K,X){let V,Y,Q=!1,J=!1,te=!1,se=null;const oe=t.outbound,sigintHandler=()=>{E("info","shutdown_signal",{signal:"SIGINT"}),Y&&!Y.signal.aborted&&Y.abort(),de(0)};process.on("SIGINT",sigintHandler),_e(async()=>{const e={};for(const t of lo(I()))uo(t)&&(e[t.type]=(e[t.type]??0)+1);E("info","run_state_at_shutdown",{run_active:Q,run_phase:V,worker_status:x(),internal_events_pending:t.internalEventsPending,bg_tasks:e})}),$(t=>{"default"!==t&&"acceptEdits"!==t&&"bypassPermissions"!==t&&"plan"!==t&&t!==(e("TRANSCRIPT_CLASSIFIER")&&"auto")&&"dontAsk"!==t||oe.enqueue({type:"system",subtype:"status",status:null,permissionMode:t,uuid:Ts(),session_id:_s()})}),L(e=>{void 0!==e.orchestration_activity&&oe.enqueue({type:"system",subtype:"orchestration_activity",activity:e.orchestration_activity??null,uuid:Ts(),session_id:_s()})});const ce={abortController:null,inflightPromise:null,lastEmitted:null,pendingSuggestion:null,pendingLastEmittedEntry:null};let ve;if(K.enableAuthStatus){const e=ct.getInstance();ve=e.subscribe(e=>{oe.enqueue({type:"auth_status",isAuthenticating:e.isAuthenticating,output:e.output,error:e.error,uuid:Ts(),session_id:_s()})})}const rateLimitListener=e=>{const t=Zt(e);t&&oe.enqueue({type:"rate_limit_event",rate_limit_info:t,uuid:Ts(),session_id:_s()})};os.add(rateLimitListener);const we=f;let Ie=ue(f,he(),ae);const Pe=re(ae),Te=process.env.CONTEXT_CODE_RESUME_INTERRUPTED_TURN??process.env.CLAUDE_CODE_RESUME_INTERRUPTED_TURN;X&&"none"!==X.kind&&Te&&(w(`[print.ts] Auto-resuming interrupted turn (kind: ${X.kind})`),removeInterruptedMessage(we,X.message),A({mode:"prompt",value:X.message.message.content,uuid:Ts()}));const Ae=ls().map(e=>{const t=null===e.value?"default":e.value,s="default"===t?ns():as(t),o=us(s),n=ds(s),r=Ve(e.value),i=fs(s);return{value:t,displayName:e.label,description:e.description,...o&&{supportsEffort:!0,supportedEffortLevels:cs(s)?[...ms]:ms.filter(e=>"max"!==e)},...n&&{supportsAdaptiveThinking:!0},...r&&{supportsFastMode:!0},...i&&{supportsAutoMode:!0}}});let Re=K.userSpecifiedModel;function injectModelSwitchBreadcrumbs(e,t){const s=es(e,is(t));we.push(...s);for(const e of s)"string"==typeof e.message.content&&e.message.content.includes(`<${ss}>`)&&oe.enqueue({type:"user",message:e.message,session_id:_s(),parent_tool_use_id:null,uuid:e.uuid,timestamp:e.timestamp,isReplay:!0})}let xe=[],Ne=[];const De=new Set;function registerElicitationHandlers(e){for(const s of e){if("connected"!==s.type||De.has(s.name))continue;if("sdk"===s.config.type)continue;const e=s.name;try{s.client.setRequestHandler(Bt,async(s,o)=>{W(e,`Elicitation request received in print mode: ${Bs(s)}`);const n="url"===s.params.mode?"url":"form";S("tengu_mcp_elicitation_shown",{mode:n});const r=await Lt(e,s.params,o.signal);if(r)return W(e,`Elicitation resolved by hook: ${Bs(r)}`),S("tengu_mcp_elicitation_response",{mode:n,action:r.action}),r;const i="url"in s.params?s.params.url:void 0,a="requestedSchema"in s.params?s.params.requestedSchema:void 0,l="elicitationId"in s.params?s.params.elicitationId:void 0,u=await t.handleElicitation(e,s.params.message,a,o.signal,n,i,l),c=await Ft(e,u,o.signal,n,l);return S("tengu_mcp_elicitation_response",{mode:n,action:c.action}),c}),s.client.setNotificationHandler(Wt,t=>{const{elicitationId:s}=t.params;W(e,`Elicitation completion notification: ${s}`),Ht({message:`MCP server "${e}" confirmed elicitation ${s} complete`,notificationType:"elicitation_complete"}),oe.enqueue({type:"system",subtype:"elicitation_complete",mcp_server_name:e,elicitation_id:s,uuid:Ts(),session_id:_s()})}),De.add(e)}catch{}}}async function updateSdkMcp(){const e=new Set(Object.keys(j)),s=new Set(xe.map(e=>e.name)),o=Array.from(e).some(e=>!s.has(e)),n=Array.from(s).some(t=>!e.has(t)),r=xe.some(e=>"pending"===e.type),i=xe.some(e=>"failed"===e.type);if(o||n||r||i){for(const t of xe)e.has(t.name)||"connected"===t.type&&await t.cleanup();const o=await Pt(j,(e,s)=>t.sendMcpMessage(e,s));xe=o.clients,Ne=o.tools;const n=h([...s,...e]);F(e=>({...e,mcp:{...e.mcp,tools:[...e.mcp.tools.filter(e=>!n.some(t=>e.name.startsWith(Gt(t)))),...Ne]}})),Xt(xe)}}updateSdkMcp();let $e={clients:[],tools:[],configs:{}};const buildAllTools=e=>{const t=g(e.toolPermissionContext,e.mcp.tools);let s=y(v([...d,...Ne,...$e.tools],t,e.toolPermissionContext.mode),"name");K.permissionPromptToolName&&(s=s.filter(e=>!C(e,K.permissionPromptToolName)));const o=dt();if(o&&!K.jsonSchema){const e=gt(o);"tool"in e&&(s=[...s,e.tool])}return s};let Le=null,Be=0;function forwardMessagesToBridge(){if(!Le)return;const e=Math.min(Be,we.length),t=we.slice(e).filter(e=>"user"===e.type||"assistant"===e.type);Be=we.length,t.length>0&&Le.writeMessages(t)}let Ke=Promise.resolve({response:{added:[],removed:[],errors:{}},sdkServersChanged:!1});function applyMcpServerChanges(e){const doWork=async()=>{const t=new Set(xe.map(e=>e.name)),s=await handleMcpSetServers(e,{configs:j,clients:xe,tools:Ne},$e,F);for(const e of Object.keys(j))delete j[e];if(Object.assign(j,s.newSdkState.configs),xe=s.newSdkState.clients,Ne=s.newSdkState.tools,$e=s.newDynamicState,s.sdkServersChanged){const e=new Set(xe.map(e=>e.name)),s=h([...t,...e]);F(e=>({...e,mcp:{...e.mcp,tools:[...e.mcp.tools.filter(e=>!s.some(t=>e.name.startsWith(Gt(t)))),...Ne]}}))}return{response:s.response,sdkServersChanged:s.sdkServersChanged}};return Ke=Ke.then(doWork,doWork),Ke}function buildMcpServerStatuses(){const t=I(),s=t.mcp.clients,o=y([...t.mcp.tools,...$e.tools],"name"),n=new Set([...s.map(e=>e.name),...xe.map(e=>e.name)]);return[...s,...xe,...$e.clients.filter(e=>!n.has(e.name))].map(t=>{let s;"sse"===t.config.type||"http"===t.config.type?s={type:t.config.type,url:t.config.url,headers:t.config.headers,oauth:t.config.oauth}:"claudeai-proxy"===t.config.type?s={type:"claudeai-proxy",url:t.config.url,id:t.config.id}:"stdio"!==t.config.type&&void 0!==t.config.type||(s={type:"stdio",command:t.config.command,args:t.config.args});const n="connected"===t.type?zt(o,t.name).map(e=>({name:e.mcpInfo?.toolName??e.name,annotations:{readOnly:e.isReadOnly({})||void 0,destructive:e.isDestructive?.({})||void 0,openWorld:e.isOpenWorld?.({})||void 0}})):void 0;let r;if((e("KAIROS")||e("KAIROS_CHANNELS"))&&"connected"===t.type&&t.capabilities.experimental){const e={...t.capabilities.experimental};!e["claude/channel"]||ee()&&Z(t.config.pluginSource)||delete e["claude/channel"],Object.keys(e).length>0&&(r={experimental:e})}return{name:t.name,status:t.type,serverInfo:"connected"===t.type?t.serverInfo:void 0,error:"failed"===t.type?t.error:void 0,config:s,scope:t.config.scope,tools:n,capabilities:r}})}async function installPluginsAndApplyMcpInBackground(){try{await Promise.all([e("DOWNLOAD_USER_SETTINGS")&&(Xs(process.env.CONTEXT_CODE_REMOTE)||Xs(process.env.CLAUDE_CODE_REMOTE)||bs())?k("headless_user_settings_download",()=>i()):Promise.resolve(),k("headless_managed_settings_wait",()=>l())]);await Ys()&&await applyPluginMcpDiff()}catch(e){B(e)}}let ze=null;zs()||(Xs(process.env.CONTEXT_CODE_SYNC_PLUGIN_INSTALL)||Xs(process.env.CLAUDE_CODE_SYNC_PLUGIN_INSTALL)?ze=installPluginsAndApplyMcpInBackground():installPluginsAndApplyMcpInBackground());const Xe=ye(()=>!Q);let Ye=u,Qe=G;async function refreshPluginState(){const{agentDefinitions:e}=await Qs(F);Ye=await Gs(he());const t=Qe.filter(e=>"flagSettings"===e.source);Qe=[...e.allAgents,...t]}async function applyPluginMcpDiff(){const{servers:e}=await Vt(),t={};for(const[s,o]of Object.entries(e)){const e=o.type;void 0!==e&&"stdio"!==e&&"sse"!==e&&"http"!==e&&"sdk"!==e||(t[s]=o)}for(const[e,s]of Object.entries(j))"sdk"!==s.type||e in t||(t[e]=s);const{response:s,sdkServersChanged:o}=await applyMcpServerChanges(t);o&&updateSdkMcp(),w(`Headless MCP refresh: added=${s.added.length}, removed=${s.removed.length}`)}const Je=Ws.subscribe(()=>{Ks(),Gs(he()).then(e=>{Ye=e})}),Ze=e("PROACTIVE")||e("KAIROS")?()=>{setTimeout(()=>{if(!vo?.isProactiveActive()||vo.isProactivePaused()||J)return;const e=`<${He}>${(new Date).toLocaleTimeString()}</${He}>`;A({mode:"prompt",value:e,uuid:Ts(),priority:"later",isMeta:!0}),run()},0)}:void 0;O(()=>{Y&&M("now").length>0&&Y.abort("interrupt")});const run=async()=>{if(Q)return;if(Q=!0,V=void 0,N("running"),Xe.stop(),Ds("run_entry"),await updateSdkMcp(),Ds("after_updateSdkMcp"),ze){const e=parseInt(process.env.CONTEXT_CODE_SYNC_PLUGIN_INSTALL_TIMEOUT_MS||process.env.CLAUDE_CODE_SYNC_PLUGIN_INSTALL_TIMEOUT_MS||"",10);if(e>0){const t=_o(e).then(()=>"timeout");"timeout"===await Promise.race([ze,t])&&(B(new Error(`CLAUDE_CODE_SYNC_PLUGIN_INSTALL: plugin installation timed out after ${e}ms`)),S("tengu_sync_plugin_install_timeout",{timeout_ms:e}))}else await ze;ze=null,await refreshPluginState();const{setupPluginHookHotReload:t}=await import("../utils/plugins/loadPluginHooks.js");t()}const isMainThread=e=>void 0===e.agentId;try{let s,o=!1;const drainCommandQueue=async()=>{for(;s=P(isMainThread);){if("prompt"!==s.mode&&"orphaned-permission"!==s.mode&&"task-notification"!==s.mode)throw new Error("only prompt commands are supported in streaming mode");const o=[s];if("prompt"===s.mode){for(;canBatchWith(s,R(isMainThread));)o.push(P(isMainThread));o.length>1&&(s={...s,value:joinPromptValues(o.map(e=>e.value)),uuid:o.findLast(e=>e.uuid)?.uuid??s.uuid})}const n=o.map(e=>e.uuid).filter(e=>void 0!==e);if(K.replayUserMessages&&o.length>1)for(const e of o)e.uuid&&e.uuid!==s.uuid&&oe.enqueue({type:"user",message:{role:"user",content:e.value},session_id:_s(),parent_tool_use_id:null,uuid:e.uuid,isReplay:!0});const r=I(),i=[...r.mcp.clients,...xe,...$e.clients];registerElicitationHandlers(i);for(const e of i)reregisterChannelHandlerAfterReconnect(e);const a=buildAllTools(r);for(const e of n)U(e,"started");if("task-notification"===s.mode){const e="string"==typeof s.value?s.value:"",t=e.match(/<task-id>([^<]+)<\/task-id>/),o=e.match(/<tool-use-id>([^<]+)<\/tool-use-id>/),n=e.match(/<output-file>([^<]+)<\/output-file>/),r=e.match(/<status>([^<]+)<\/status>/),i=e.match(/<summary>([^<]+)<\/summary>/),isValidStatus=e=>"completed"===e||"failed"===e||"stopped"===e||"killed"===e,a=r?.[1],l=isValidStatus(a)?"killed"===a?"stopped":a:"completed",u=e.match(/<usage>([\s\S]*?)<\/usage>/),c=u?.[1]??"",m=c.match(/<total_tokens>(\d+)<\/total_tokens>/),p=c.match(/<tool_uses>(\d+)<\/tool_uses>/),d=c.match(/<duration_ms>(\d+)<\/duration_ms>/);r&&oe.enqueue({type:"system",subtype:"task_notification",task_id:t?.[1]??"",tool_use_id:o?.[1],status:l,output_file:n?.[1]??"",summary:i?.[1]??"",usage:m&&p?{total_tokens:parseInt(m[1],10),tool_uses:parseInt(p[1],10),duration_ms:d?parseInt(d[1],10):0}:void 0,session_id:_s(),uuid:Ts()})}const l=s.value;if(t instanceof c&&"prompt"===s.mode&&S("tengu_bridge_message_received",{is_repl:!1}),ce.abortController?.abort(),ce.abortController=null,ce.pendingSuggestion=null,ce.pendingLastEmittedEntry=null,ce.lastEmitted&&"prompt"===s.mode){const e="string"==typeof l?l:l.find(e=>"text"===e.type)?.text;"string"==typeof e&&ot(ce.lastEmitted.text,e,ce.lastEmitted.emittedAt,ce.lastEmitted.promptId,ce.lastEmitted.generationRequestId),ce.lastEmitted=null}Y=qe();const u=e("FILE_PERSISTENCE")?Date.now():void 0;Ds("before_ask"),Ls();const m=s;await Is(m.workload??K.workload,async()=>{for await(const e of ne({commands:y([...Ye,...r.mcp.commands],"name"),prompt:l,promptUuid:m.uuid,isMeta:m.isMeta,cwd:he(),tools:a,verbose:K.verbose,mcpClients:i,thinkingConfig:K.thinkingConfig,maxTurns:K.maxTurns,maxBudgetUsd:K.maxBudgetUsd,taskBudget:K.taskBudget,canUseTool:_,userSpecifiedModel:Re,fallbackModel:K.fallbackModel,jsonSchema:dt()??K.jsonSchema,mutableMessages:we,getReadFileCache:()=>0===Pe.size?Ie:ie(Ie,Pe),setReadFileCache:e=>{Ie=e;for(const[e,t]of Pe.entries()){const s=Ie.get(e);(!s||t.timestamp>s.timestamp)&&Ie.set(e,t)}Pe.clear()},customSystemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,getAppState:I,setAppState:F,abortController:Y,replayUserMessages:K.replayUserMessages,includePartialMessages:K.includePartialMessages,handleElicitation:(e,s,o)=>t.handleElicitation(e,s.message,void 0,o,s.mode,s.url,"elicitationId"in s?s.elicitationId:void 0),agents:Qe,orphanedPermission:m.orphanedPermission,setSDKStatus:e=>{oe.enqueue({type:"system",subtype:"status",status:e,session_id:_s(),uuid:Ts()})},onCoreQueryEvent:"0"!==process.env.CORE_QUERY_ENABLED&&"stream-json"===K.outputFormat?e=>{const t={type:"core_query_event",eventType:e.type,...e};try{process.stdout.write(Bs(t)+"\n")}catch{}}:void 0}))if(forwardMessagesToBridge(),"result"===e.type){for(const e of mo())oe.enqueue(e);const t=I();lo(t).some(e=>("local_agent"===e.type||"local_workflow"===e.type)&&uo(e))?se=e:(se=null,oe.enqueue(e))}else{for(const e of mo())oe.enqueue(e);oe.enqueue(e)}});for(const e of n)U(e,"completed");if(forwardMessagesToBridge(),Le?.sendResult(),e("FILE_PERSISTENCE")&&void 0!==u&&me(u,Y.signal,e=>{oe.enqueue({type:"system",subtype:"files_persisted",files:e.files,failed:e.failed,processed_at:(new Date).toISOString(),uuid:Ts(),session_id:_s()})}),K.promptSuggestions&&!Vs(process.env.CONTEXT_CODE_ENABLE_PROMPT_SUGGESTION)&&!Vs(process.env.CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION)){const e=ce;e.abortController?.abort();const t=new AbortController;ce.abortController=t;const s=rt();if(s){const e={promise:null};e.promise=(async()=>{try{const e=await st(t,we,I,s,"sdk");if(!e||t.signal.aborted)return;const o={type:"prompt_suggestion",suggestion:e.suggestion,uuid:Ts(),session_id:_s()},n={text:e.suggestion,emittedAt:Date.now(),promptId:e.promptId,generationRequestId:e.generationRequestId};se?(ce.pendingSuggestion=o,ce.pendingLastEmittedEntry={text:n.text,promptId:n.promptId,generationRequestId:n.generationRequestId}):(ce.lastEmitted=n,oe.enqueue(o))}catch(e){if(e instanceof Error&&("AbortError"===e.name||"APIUserAbortError"===e.name))return void nt("aborted",void 0,void 0,"sdk");B(go(e))}finally{ce.inflightPromise===e.promise&&(ce.inflightPromise=null)}})(),ce.inflightPromise=e.promise}else nt("sdk_no_params",void 0,void 0,"sdk")}$s(),Fs(),Ns()}};do{for(const e of mo())oe.enqueue(e);V="draining_commands",await drainCommandQueue(),o=!1;{const e=I(),t=lo(e).some(e=>uo(e)&&"in_process_teammate"!==e.type),s=void 0!==R(isMainThread);(t||s)&&(o=!0,s||(V="waiting_for_agents",await _o(100)))}}while(o);se&&(oe.enqueue(se),se=null,ce.pendingSuggestion&&(oe.enqueue(ce.pendingSuggestion),ce.pendingLastEmittedEntry&&(ce.lastEmitted={...ce.pendingLastEmittedEntry,emittedAt:Date.now()},ce.pendingLastEmittedEntry=null),ce.pendingSuggestion=null))}catch(e){try{await t.write({type:"result",subtype:"error_during_execution",duration_ms:0,duration_api_ms:0,is_error:!0,num_turns:0,stop_reason:null,session_id:_s(),total_cost_usd:0,usage:z,modelUsage:{},permission_denials:[],uuid:Ts(),errors:[fo(e),...H().map(e=>e.error)]})}catch{}return ce.abortController?.abort(),void fe(1)}finally{if(V="finally_flush",await t.flushInternalEvents(),V="finally_post_flush",!ge()){N("idle");for(const e of mo())oe.enqueue(e)}Q=!1,Xe.start()}if(!e("PROACTIVE")&&!e("KAIROS")||!vo?.isProactiveActive()||vo.isProactivePaused()||void 0!==R(isMainThread)||J)if(void 0===R(isMainThread)){{const e=I().teamContext;if(e&&Zs(e)){const e="team-lead",t=500;for(;;){const s=I();if(!(eo(s)||s.teamContext&&Object.keys(s.teamContext.teammates).length>0)){w("[print.ts] No more active teammates, stopping poll");break}const o=await oo(e,s.teamContext?.teamName);if(o.length>0){w(`[print.ts] Team-lead found ${o.length} unread messages`),await no(e,s.teamContext?.teamName);const t=s.teamContext?.teamName;for(const e of o){const o=ro(e.text);if(o&&t){const e=o.from;w(`[print.ts] Processing shutdown_approved from ${e}`);const n=s.teamContext?.teammates?Object.entries(s.teamContext.teammates).find(([,t])=>t.name===e)?.[0]:void 0;n&&(io(t,{agentId:n,name:e}),w(`[print.ts] Removed ${e} from team file`),await ao(t,n,e,"shutdown"),F(e=>{if(!e.teamContext?.teammates)return e;if(!(n in e.teamContext.teammates))return e;const{[n]:t,...s}=e.teamContext.teammates;return{...e,teamContext:{...e.teamContext,teammates:s}}}))}}const n=o.map(e=>`<${Fe} teammate_id="${e.from}"${e.color?` color="${e.color}"`:""}>\n${e.text}\n</${Fe}>`).join("\n\n");return A({mode:"prompt",value:n,uuid:Ts()}),void run()}if(J&&!te)return te=!0,w("[print.ts] Input closed with active teammates, injecting shutdown prompt"),A({mode:"prompt",value:ko,uuid:Ts()}),void run();await _o(t)}}}if(J){await(async()=>{const e=I();to(e)&&await so(F,e);const t=I(),s=t.teamContext;return s&&Object.keys(s.teammates).length>0||eo(t)})()?(A({mode:"prompt",value:ko,uuid:Ts()}),run()):(ce.inflightPromise&&await Promise.race([ce.inflightPromise,_o(5e3)]),ce.abortController?.abort(),ce.abortController=null,await pe(),Je(),ve?.(),os.delete(rateLimitListener),oe.done())}}else run();else Ze()};if(e("UDS_INBOX")){const{setOnEnqueue:e}=s("../utils/udsMessaging.js");e(()=>{J||run()})}let et=null;e("AGENT_TRIGGERS")&&So&&wo?.isKairosCronEnabled()&&(et=So.createCronScheduler({onFire:e=>{J||(A({mode:"prompt",value:e,uuid:Ts(),priority:"later",isMeta:!0,workload:Ps}),run())},isLoading:()=>Q||J,getJitterConfig:bo?.getCronJitterConfig,isKilled:()=>!wo?.isKairosCronEnabled()}),et.start());const sendControlResponseSuccess=function(e,t){oe.enqueue({type:"control_response",response:{subtype:"success",request_id:e.request_id,response:t}})},sendControlResponseError=function(e,t){oe.enqueue({type:"control_response",response:{subtype:"error",request_id:e.request_id,error:t}})},tt=new Set;t.setUnexpectedResponseCallback(async e=>{await handleOrphanedPermissionResponse({message:e,setAppState:F,handledToolUseIds:tt,onEnqueued:()=>{run()}})});const mt=new Map,pt=new Map,_t=new Set,yt=new Map;let ht=null;return(async()=>{let s=!1;E("info","cli_message_loop_started");for await(const i of t.structuredInput){const l="uuid"in i?i.uuid:void 0;if(l&&"user"!==i.type&&"control_response"!==i.type&&U(l,"completed"),"control_request"!==i.type)if("control_response"!==i.type){if("keep_alive"!==i.type&&"update_environment_variables"!==i.type){if("assistant"===i.type||"system"===i.type){const e=Jt([i]);we.push(...e),"assistant"===i.type&&K.replayUserMessages&&oe.enqueue(i);continue}if("user"===i.type){if(s=!0,i.uuid){const e=_s(),t=await St(e,i.uuid);if(t||Co.has(i.uuid)){w(`Skipping duplicate user message: ${i.uuid}`),K.replayUserMessages&&(w(`Sending acknowledgment for duplicate user message: ${i.uuid}`),oe.enqueue({type:"user",message:i.message,session_id:e,parent_tool_use_id:null,uuid:i.uuid,timestamp:i.timestamp,isReplay:!0})),t&&U(i.uuid,"completed");continue}trackReceivedMessageUuid(i.uuid)}A({mode:"prompt",value:await je(i,i.message.content),uuid:i.uuid,priority:i.priority}),e("COMMIT_ATTRIBUTION")&&F(e=>({...e,attribution:It(e.attribution,e=>{wt(e).catch(e=>{w(`Attribution: Failed to save snapshot: ${e}`)})})})),run()}}}else K.replayUserMessages&&oe.enqueue(i);else if("interrupt"===i.request.subtype)e("COMMIT_ATTRIBUTION")&&F(e=>({...e,attribution:{...e.attribution,escapeCount:e.attribution.escapeCount+1}})),Y&&Y.abort(),ce.abortController?.abort(),ce.abortController=null,ce.lastEmitted=null,ce.pendingSuggestion=null,sendControlResponseSuccess(i);else{if("end_session"===i.request.subtype){w(`[print.ts] end_session received, reason=${i.request.reason??"unspecified"}`),Y&&Y.abort(),ce.abortController?.abort(),ce.abortController=null,ce.lastEmitted=null,ce.pendingSuggestion=null,sendControlResponseSuccess(i);break}if("initialize"===i.request.subtype){if(i.request.sdkMcpServers&&i.request.sdkMcpServers.length>0)for(const e of i.request.sdkMcpServers)j[e]={type:"sdk",name:e};await handleInitializeRequest(i.request,i.request_id,s,oe,u,Ae,t,!!K.enableAuthStatus,K,G,I),i.request.promptSuggestions&&F(e=>e.promptSuggestionEnabled?e:{...e,promptSuggestionEnabled:!0}),i.request.agentProgressSummaries&&b("tengu_slate_prism",!0)&&ft(!0),s=!0,q()&&run()}else if("set_permission_mode"===i.request.subtype){const e=i.request;F(t=>({...t,toolPermissionContext:handleSetPermissionMode(e,i.request_id,t.toolPermissionContext,oe),isUltraplanMode:e.ultraplan??t.isUltraplanMode}))}else if("set_model"===i.request.subtype){const e=i.request.model??"default",t="default"===e?ns():e;Re=t,ys(t),D({model:t}),injectModelSwitchBreadcrumbs(e,t),sendControlResponseSuccess(i)}else if("set_max_thinking_tokens"===i.request.subtype)null===i.request.max_thinking_tokens?K.thinkingConfig=void 0:0===i.request.max_thinking_tokens?K.thinkingConfig={type:"disabled"}:K.thinkingConfig={type:"enabled",budgetTokens:i.request.max_thinking_tokens},sendControlResponseSuccess(i);else if("mcp_status"===i.request.subtype)sendControlResponseSuccess(i,{mcpServers:buildMcpServerStatuses()});else if("get_context_usage"===i.request.subtype)try{const e=I(),t=await ts({messages:we,getAppState:I,options:{mainLoopModel:rs(),tools:buildAllTools(e),agentDefinitions:e.agentDefinitions,customSystemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt}});sendControlResponseSuccess(i,{...t})}catch(e){sendControlResponseError(i,fo(e))}else if("mcp_message"===i.request.subtype){const e=i.request,t=xe.find(t=>t.name===e.server_name);t&&"connected"===t.type&&t.client?.transport?.onmessage&&t.client.transport.onmessage(e.message),sendControlResponseSuccess(i)}else if("rewind_files"===i.request.subtype){const e=I(),t=await handleRewindFiles(i.request.user_message_id,e,F,i.request.dry_run??!1);t.canRewind||i.request.dry_run?sendControlResponseSuccess(i,t):sendControlResponseError(i,t.error??"Unexpected error")}else if("cancel_async_message"===i.request.subtype){const e=i.request.message_uuid,t=T(t=>t.uuid===e);sendControlResponseSuccess(i,{cancelled:t.length>0})}else if("seed_read_state"===i.request.subtype){try{const e=le(i.request.path),t=Math.floor((await n(e)).mtimeMs);if(t<=i.request.mtime){const s=await o(e,"utf-8"),n=(65279===s.charCodeAt(0)?s.slice(1):s).replaceAll("\r\n","\n");Pe.set(e,{content:n,timestamp:t,offset:void 0,limit:void 0})}}catch{}sendControlResponseSuccess(i)}else if("mcp_set_servers"===i.request.subtype){const{response:e,sdkServersChanged:t}=await applyMcpServerChanges(i.request.servers);sendControlResponseSuccess(i,e),t&&updateSdkMcp()}else if("reload_plugins"===i.request.subtype)try{if(e("DOWNLOAD_USER_SETTINGS")&&(Xs(process.env.CONTEXT_CODE_REMOTE)||Xs(process.env.CLAUDE_CODE_REMOTE)||bs())){await a()&&Ge.notifyChange("userSettings")}const t=await Qs(F),s=Qe.filter(e=>"flagSettings"===e.source);Qe=[...t.agentDefinitions.allAgents,...s];let o=[];const[n,r,l]=await Promise.allSettled([Gs(he()),applyPluginMcpDiff(),Js()]);"fulfilled"===n.status?Ye=n.value:B(n.reason),"rejected"===r.status&&B(r.reason),"fulfilled"===l.status?o=l.value.enabled.map(e=>({name:e.name,path:e.path,source:e.source})):B(l.reason),sendControlResponseSuccess(i,{commands:Ye.filter(e=>!1!==e.userInvocable).map(e=>({name:p(e),description:m(e),argumentHint:e.argumentHint||""})),agents:Qe.map(e=>({name:e.agentType,description:e.whenToUse,model:"inherit"===e.model?void 0:e.model})),plugins:o,mcpServers:buildMcpServerStatuses(),error_count:t.error_count})}catch(e){sendControlResponseError(i,fo(e))}else if("mcp_reconnect"===i.request.subtype){const e=I(),{serverName:t}=i.request;De.delete(t);const s=Ut(t)??r.find(e=>e.name===t)?.config??xe.find(e=>e.name===t)?.config??$e.clients.find(e=>e.name===t)?.config??e.mcp.clients.find(e=>e.name===t)?.config??null;if(s){const e=await Ot(t,s),o=Gt(t);if(F(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.map(s=>s.name===t?e.client:s),tools:[...be(s.mcp.tools,e=>e.name?.startsWith(o)),...e.tools],commands:[...be(s.mcp.commands,e=>Kt(e,t)),...e.commands],resources:e.resources&&e.resources.length>0?{...s.mcp.resources,[t]:e.resources}:Se(s.mcp.resources,t)}})),$e={...$e,clients:[...$e.clients.filter(e=>e.name!==t),e.client],tools:[...$e.tools.filter(e=>!e.name?.startsWith(o)),...e.tools]},"connected"===e.client.type)registerElicitationHandlers([e.client]),reregisterChannelHandlerAfterReconnect(e.client),sendControlResponseSuccess(i);else{const t="failed"===e.client.type?e.client.error??"Connection failed":`Server status: ${e.client.type}`;sendControlResponseError(i,t)}}else sendControlResponseError(i,`Server not found: ${t}`)}else if("mcp_toggle"===i.request.subtype){const e=I(),{serverName:t,enabled:s}=i.request;De.delete(t);const o=Ut(t)??r.find(e=>e.name===t)?.config??xe.find(e=>e.name===t)?.config??$e.clients.find(e=>e.name===t)?.config??e.mcp.clients.find(e=>e.name===t)?.config??null;if(o)if(s){Nt(t,!0);const e=await Ot(t,o),s=Gt(t);if(F(o=>({...o,mcp:{...o.mcp,clients:o.mcp.clients.map(s=>s.name===t?e.client:s),tools:[...be(o.mcp.tools,e=>e.name?.startsWith(s)),...e.tools],commands:[...be(o.mcp.commands,e=>Kt(e,t)),...e.commands],resources:e.resources&&e.resources.length>0?{...o.mcp.resources,[t]:e.resources}:Se(o.mcp.resources,t)}})),"connected"===e.client.type)registerElicitationHandlers([e.client]),reregisterChannelHandlerAfterReconnect(e.client),sendControlResponseSuccess(i);else{const t="failed"===e.client.type?e.client.error??"Connection failed":`Server status: ${e.client.type}`;sendControlResponseError(i,t)}}else{Nt(t,!1);const s=[...r,...xe,...$e.clients,...e.mcp.clients].find(e=>e.name===t);s&&"connected"===s.type&&await At(t,o);const n=Gt(t);F(e=>({...e,mcp:{...e.mcp,clients:e.mcp.clients.map(e=>e.name===t?{name:t,type:"disabled",config:o}:e),tools:be(e.mcp.tools,e=>e.name?.startsWith(n)),commands:be(e.mcp.commands,e=>Kt(e,t)),resources:Se(e.mcp.resources,t)}})),sendControlResponseSuccess(i)}else sendControlResponseError(i,`Server not found: ${t}`)}else if("channel_enable"===i.request.subtype){const e=I();handleChannelEnable(i.request_id,i.request.serverName,[...e.mcp.clients,...xe,...$e.clients],oe)}else if("mcp_authenticate"===i.request.subtype){const{serverName:e}=i.request,t=I(),s=Ut(e)??r.find(t=>t.name===e)?.config??t.mcp.clients.find(t=>t.name===e)?.config??null;if(s)if("sse"!==s.type&&"http"!==s.type)sendControlResponseError(i,`Server type "${s.type}" does not support OAuth authentication`);else try{mt.get(e)?.abort();const t=new AbortController;let o;mt.set(e,t);const n=new Promise(e=>{o=e}),r=Dt(e,s,e=>o(e),t.signal,{skipBrowserOpen:!0,onWaitingForCallback:t=>{pt.set(e,t)}}),a=await Promise.race([n,r.then(()=>null)]);sendControlResponseSuccess(i,a?{authUrl:a,requiresUserAction:!0}:{requiresUserAction:!1}),yt.set(e,r);r.then(async()=>{if(xt(e))return;if(_t.has(e))return;const t=await Ot(e,s),o=Gt(e);F(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.map(s=>s.name===e?t.client:s),tools:[...be(s.mcp.tools,e=>e.name?.startsWith(o)),...t.tools],commands:[...be(s.mcp.commands,t=>Kt(t,e)),...t.commands],resources:t.resources&&t.resources.length>0?{...s.mcp.resources,[e]:t.resources}:Se(s.mcp.resources,e)}})),$e={...$e,clients:[...$e.clients.filter(t=>t.name!==e),t.client],tools:[...$e.tools.filter(e=>!e.name?.startsWith(o)),...t.tools]}}).catch(t=>{w(`MCP OAuth failed for ${e}: ${t}`,{level:"error"})}).finally(()=>{mt.get(e)===t&&(mt.delete(e),pt.delete(e),_t.delete(e),yt.delete(e))})}catch(e){sendControlResponseError(i,fo(e))}else sendControlResponseError(i,`Server not found: ${e}`)}else if("mcp_oauth_callback_url"===i.request.subtype){const{serverName:e,callbackUrl:t}=i.request,s=pt.get(e);if(s){let o=!1;try{const e=new URL(t);o=e.searchParams.has("code")||e.searchParams.has("error")}catch{}if(o){_t.add(e),s(t);const o=yt.get(e);if(o)try{await o,sendControlResponseSuccess(i)}catch(e){sendControlResponseError(i,e instanceof Error?e.message:"OAuth authentication failed")}else sendControlResponseSuccess(i)}else sendControlResponseError(i,"Invalid callback URL: missing authorization code. Please paste the full redirect URL including the code parameter.")}else sendControlResponseError(i,`No active OAuth flow for server: ${e}`)}else if("claude_authenticate"===i.request.subtype){const{loginWithClaudeAi:e}=i.request;ht?.service.cleanup(),S("tengu_oauth_flow_start",{loginWithClaudeAi:e??!0});const t=new at;let s;const o=new Promise(e=>{s=e}),n=t.startOAuthFlow(async(e,t)=>{s({manualUrl:e,automaticUrl:t})},{loginWithClaudeAi:e??!0,skipBrowserOpen:!0}).then(async t=>{await lt(t),S("tengu_oauth_success",{loginWithClaudeAi:e??!0})}).finally(()=>{t.cleanup(),ht?.service===t&&(ht=null)});ht={service:t,flow:n},n.catch(e=>w(`claude_authenticate flow ended: ${e}`,{level:"info"}));try{const{manualUrl:e,automaticUrl:t}=await Promise.race([o,n.then(()=>{throw new Error("OAuth flow completed without producing auth URLs")})]);sendControlResponseSuccess(i,{manualUrl:e,automaticUrl:t})}catch(e){sendControlResponseError(i,fo(e))}}else if("claude_oauth_callback"===i.request.subtype||"claude_oauth_wait_for_completion"===i.request.subtype)if(ht){"claude_oauth_callback"===i.request.subtype&&ht.service.handleManualAuthCodeInput({authorizationCode:i.request.authorizationCode,state:i.request.state});const{flow:e}=ht;e.then(()=>{const e=it();sendControlResponseSuccess(i,{account:{email:e?.email,organization:e?.organization,subscriptionType:e?.subscription,tokenSource:e?.tokenSource,apiKeySource:e?.apiKeySource,apiProvider:ut()}})},e=>sendControlResponseError(i,fo(e)))}else sendControlResponseError(i,"No active claude_authenticate flow");else if("mcp_clear_auth"===i.request.subtype){const{serverName:e}=i.request,t=I(),s=Ut(e)??r.find(t=>t.name===e)?.config??t.mcp.clients.find(t=>t.name===e)?.config??null;if(s)if("sse"!==s.type&&"http"!==s.type)sendControlResponseError(i,`Cannot clear auth for server type "${s.type}"`);else{await $t(e,s);const t=await Ot(e,s),o=Gt(e);F(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.map(s=>s.name===e?t.client:s),tools:[...be(s.mcp.tools,e=>e.name?.startsWith(o)),...t.tools],commands:[...be(s.mcp.commands,t=>Kt(t,e)),...t.commands],resources:t.resources&&t.resources.length>0?{...s.mcp.resources,[e]:t.resources}:Se(s.mcp.resources,e)}})),sendControlResponseSuccess(i,{})}else sendControlResponseError(i,`Server not found: ${e}`)}else if("apply_flag_settings"===i.request.subtype){const e=rs(),t=ws()??{},s=i.request.settings,o={...t,...s};for(const e of Object.keys(o))null===o[e]&&delete o[e];Es(o),Ge.notifyChange("flagSettings"),"model"in s&&(null!=s.model?ys(String(s.model)):ys(void 0));const n=rs();if(n!==e){Re=n;const e=s.model?String(s.model):"default";D({model:n}),injectModelSwitchBreadcrumbs(e,n)}sendControlResponseSuccess(i)}else if("get_settings"===i.request.subtype){const e=I(),t=rs(),s=us(t)?ps(t,e.effortValue):void 0;sendControlResponseSuccess(i,{...We(),applied:{model:t,effort:"string"==typeof s?s:null}})}else if("stop_task"===i.request.subtype){const{task_id:e}=i.request;try{await co(e,{getAppState:I,setAppState:F}),sendControlResponseSuccess(i,{})}catch(e){sendControlResponseError(i,fo(e))}}else if("generate_session_title"===i.request.subtype){const{description:e,persist:t}=i.request,s=(Y&&!Y.signal.aborted?Y:qe()).signal;(async()=>{try{const o=await Oe(e,s);if(o&&t)try{Ct(_s(),o)}catch(e){B(e)}sendControlResponseSuccess(i,{title:o})}catch(e){sendControlResponseError(i,fo(e))}})()}else if("side_question"===i.request.subtype){const{question:e}=i.request;(async()=>{try{const t=rt(),s=t?{...t,toolUseContext:{...t.toolUseContext,abortController:qe()}}:await Me({tools:buildAllTools(I()),commands:Ye,mcpClients:[...I().mcp.clients,...xe,...$e.clients],messages:we,readFileState:Ie,getAppState:I,setAppState:F,customSystemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,thinkingConfig:K.thinkingConfig,agents:Qe}),o=await Ue({question:e,cacheSafeParams:s});sendControlResponseSuccess(i,{response:o.response})}catch(e){sendControlResponseError(i,fo(e))}})()}else if((e("PROACTIVE")||e("KAIROS"))&&"set_proactive"===i.request.subtype){i.request.enabled?vo.isProactiveActive()||(vo.activateProactive("command"),Ze()):vo.deactivateProactive(),sendControlResponseSuccess(i)}else if("remote_control"===i.request.subtype)if(i.request.enabled)if(Le)sendControlResponseSuccess(i,{session_url:Ee(Le.bridgeSessionId,Le.sessionIngressUrl),connect_url:ke(Le.environmentId,Le.sessionIngressUrl),environment_id:Le.environmentId});else{let e;try{const{initReplBridge:s}=await import("../bridge/initReplBridge.js"),o=await s({onInboundMessage(e){const t=Ce(e);if(!t)return;const{content:s,uuid:o}=t;A({value:s,mode:"prompt",uuid:o,skipSlashCommands:!0}),run()},onPermissionResponse(e){t.injectControlResponse(e)},onInterrupt(){Y?.abort()},onSetModel(e){const t="default"===e?ns():e;Re=t,ys(t)},onSetMaxThinkingTokens(e){K.thinkingConfig=null===e?void 0:0===e?{type:"disabled"}:{type:"enabled",budgetTokens:e}},onStateChange(t,s){"failed"===t&&(e=s),w(`[bridge:sdk] State change: ${t}${s?` — ${s}`:""}`),oe.enqueue({type:"system",subtype:"bridge_state",state:t,detail:s,uuid:Ts(),session_id:_s()})},initialMessages:we.length>0?we:void 0});o?(Le=o,Be=we.length,t.setOnControlRequestSent(e=>{o.sendControlRequest(e)}),t.setOnControlRequestResolved(e=>{o.sendControlCancelRequest(e)}),sendControlResponseSuccess(i,{session_url:Ee(o.bridgeSessionId,o.sessionIngressUrl),connect_url:ke(o.environmentId,o.sessionIngressUrl),environment_id:o.environmentId})):sendControlResponseError(i,e??"Remote Control initialization failed")}catch(e){sendControlResponseError(i,fo(e))}}else Le&&(t.setOnControlRequestSent(void 0),t.setOnControlRequestResolved(void 0),await Le.teardown(),Le=null),sendControlResponseSuccess(i);else sendControlResponseError(i,`Unsupported control request subtype: ${i.request.subtype}`)}}J=!0,et?.stop(),Q||(ce.inflightPromise&&await Promise.race([ce.inflightPromise,_o(5e3)]),ce.abortController?.abort(),ce.abortController=null,await pe(),Je(),ve?.(),os.delete(rateLimitListener),oe.done())})(),oe}(Pe,Ae.mcp.clients,[...Y,...Ae.mcp.commands],Qe,Re,Je,J,I,V,te,Ie,$e)){if(mt){const e=mt(t);e&&await Pe.write(e)}else"stream-json"===Ie.outputFormat&&Ie.verbose&&await Pe.write(t);"control_response"!==t.type&&"control_request"!==t.type&&"control_cancel_request"!==t.type&&("system"!==t.type||"session_state_changed"!==t.subtype&&"task_notification"!==t.subtype&&"task_started"!==t.subtype&&"task_progress"!==t.subtype&&"post_turn_summary"!==t.subtype)&&"stream_event"!==t.type&&"keep_alive"!==t.type&&"streamlined_text"!==t.type&&"streamlined_tool_use_summary"!==t.type&&"prompt_suggestion"!==t.type&&(Ze&&et.push(t),tt=t)}switch(Ie.outputFormat){case"json":if(!tt||"result"!==tt.type)throw new Error("No messages returned");if(Ie.verbose){G(Bs(et)+"\n");break}G(Bs(tt)+"\n");break;case"stream-json":break;default:if(!tt||"result"!==tt.type)throw new Error("No messages returned");switch(tt.subtype){case"success":G(tt.result.endsWith("\n")?tt.result:tt.result+"\n");break;case"error_during_execution":G("Execution error");break;case"error_max_turns":G(`Error: Reached max turns (${Ie.maxTurns})`);break;case"error_max_budget_usd":G(`Error: Exceeded USD budget (${Ie.maxBudgetUsd})`);break;case"error_max_structured_output_retries":G("Error: Failed to provide valid structured output after maximum retries")}}$s(),e("EXTRACT_MEMORIES")&&yo()&&await Eo.drainPendingExtraction(),fe("result"===tt?.type&&tt?.is_error?1:0)}export function createCanUseToolWithPermissionPrompt(e){const canUseTool=async(t,s,o,n,r,i)=>{const a=i??await Ie(t,s,o,n,r);if("allow"===a.behavior||"deny"===a.behavior)return a;const{signal:l,cleanup:u}=Re(o.abortController.signal);if(l.aborted)return u(),{behavior:"deny",message:"El prompt de permiso fue abortado.",decisionReason:{type:"permissionPromptTool",permissionPromptToolName:t.name,toolResult:void 0}};const c=new Promise(e=>{l.addEventListener("abort",()=>e("aborted"),{once:!0})}),m=e.call({tool_name:t.name,input:s,tool_use_id:r},o,canUseTool,n),p=await Promise.race([m,c]);if(u(),"aborted"===p||l.aborted)return{behavior:"deny",message:"El prompt de permiso fue abortado.",decisionReason:{type:"permissionPromptTool",permissionPromptToolName:t.name,toolResult:void 0}};const d=p,f=e.mapToolResultToToolResultBlockParam(d.data,"1");if(!f.content||!Array.isArray(f.content)||!f.content[0]||"text"!==f.content[0].type||"string"!=typeof f.content[0].text)throw new Error('Permission prompt tool returned an invalid result. Expected a single text block param with type="text" and a string text value.');return Ae(Te().parse(Pe(f.content[0].text)),e,s,o)};return canUseTool}export function getCanUseToolFn(e,t,s,o){if("stdio"===e)return t.createCanUseTool(o);if(!e)return async(e,t,s,o,n,r)=>r??await Ie(e,t,s,o,n);let n=null;return async(t,o,r,i,a,l)=>{if(!n){const t=s(),o=t.find(t=>C(t,e));if(!o){const s=`Error: MCP tool ${e} (passed via --permission-prompt-tool) not found. Available MCP tools: ${t.map(e=>e.name).join(", ")||"none"}`;throw process.stderr.write(`${s}\n`),fe(1),new Error(s)}if(!o.inputJSONSchema){const t=`Error: tool ${e} (passed via --permission-prompt-tool) must be an MCP tool`;throw process.stderr.write(`${t}\n`),fe(1),new Error(t)}n=createCanUseToolWithPermissionPrompt(o)}return n(t,o,r,i,a,l)}}async function handleInitializeRequest(e,t,s,o,n,r,i,a,l,u,c){if(s)return void o.enqueue({type:"control_response",response:{subtype:"error",error:"Already initialized",request_id:t,pending_permission_requests:i.getPendingPermissionRequests()}});if(void 0!==e.systemPrompt&&(l.systemPrompt=e.systemPrompt),void 0!==e.appendSystemPrompt&&(l.appendSystemPrompt=e.appendSystemPrompt),void 0!==e.promptSuggestions&&(l.promptSuggestions=e.promptSuggestions),e.agents){const t=I(e.agents,"flagSettings");u.push(...t)}if(l.agent){const e=ks()===l.agent,t=u.find(e=>e.agentType===l.agent);if(t&&!e){if(hs(t.agentType),!l.systemPrompt&&!j(t)){const e=t.getSystemPrompt();e&&(l.systemPrompt=e)}if(!l.userSpecifiedModel&&t.model&&"inherit"!==t.model){const e=as(t.model);ys(e)}t.initialPrompt&&i.prependUserMessage(t.initialPrompt)}else t?.initialPrompt&&i.prependUserMessage(t.initialPrompt)}const d=Be(),f=d?.outputStyle||$e,g=await Le(ve()),_=it();if(e.hooks){const t={};for(const[s,o]of Object.entries(e.hooks))t[s]=o.map(e=>{const t=e.hookCallbackIds.map(t=>i.createHookCallback(t,e.timeout));return{matcher:e.matcher,hooks:t}});mt(t)}e.jsonSchema&&pt(e.jsonSchema);const y={commands:n.filter(e=>!1!==e.userInvocable).map(e=>({name:p(e),description:m(e),argumentHint:e.argumentHint||""})),agents:u.map(e=>({name:e.agentType,description:e.whenToUse,model:"inherit"===e.model?void 0:e.model})),output_style:f,available_output_styles:Object.keys(g),models:r,account:{email:_?.email,organization:_?.organization,subscriptionType:_?.subscription,tokenSource:_?.tokenSource,apiKeySource:_?.apiKeySource,apiProvider:ut()},pid:process.pid};if(Xe()&&ze()){const e=c();y.fast_mode_state=Ye(l.userSpecifiedModel??null,e.fastMode)}if(o.enqueue({type:"control_response",response:{subtype:"success",request_id:t,response:y}}),a){const e=ct.getInstance().getStatus();e&&o.enqueue({type:"auth_status",isAuthenticating:e.isAuthenticating,output:e.output,error:e.error,uuid:Ts(),session_id:_s()})}}async function handleRewindFiles(e,t,s,o){if(!Rs())return{canRewind:!1,error:"File rewinding is not enabled."};if(!qs(t.fileHistory,e))return{canRewind:!1,error:"No file checkpoint found for this message."};if(o){const s=await Os(t.fileHistory,e);return{canRewind:!0,filesChanged:s?.filesChanged,insertions:s?.insertions,deletions:s?.deletions}}try{await As(e=>s(t=>({...t,fileHistory:e(t.fileHistory)})),e)}catch(e){return{canRewind:!1,error:`Failed to rewind: ${fo(e)}`}}return{canRewind:!0}}function handleSetPermissionMode(t,s,o,n){if("bypassPermissions"===t.mode){if(et())return n.enqueue({type:"control_response",response:{subtype:"error",request_id:s,error:"Cannot set permission mode to bypassPermissions because it is disabled by settings or configuration"}}),o;if(!o.isBypassPermissionsModeAvailable)return n.enqueue({type:"control_response",response:{subtype:"error",request_id:s,error:"Cannot set permission mode to bypassPermissions because the session was not launched with --dangerously-skip-permissions"}}),o}if(e("TRANSCRIPT_CLASSIFIER")&&"auto"===t.mode&&!Qe()){const e=Ze();return n.enqueue({type:"control_response",response:{subtype:"error",request_id:s,error:e?`Cannot set permission mode to auto: ${Je(e)}`:"Cannot set permission mode to auto"}}),o}return n.enqueue({type:"control_response",response:{subtype:"success",request_id:s,response:{mode:t.mode}}}),{...tt(o.mode,t.mode,o),mode:t.mode}}function handleChannelEnable(t,s,o,n){const respondError=e=>n.enqueue({type:"control_response",response:{subtype:"error",request_id:t,error:e}});if(!e("KAIROS")&&!e("KAIROS_CHANNELS"))return respondError("channels feature not available in this build");const r=o.find(e=>e.name===s&&"connected"===e.type);if(!r||"connected"!==r.type)return respondError(`server ${s} is not connected`);const i=r.config.pluginSource,a=i?te(i):void 0;if(!a?.marketplace)return respondError(`server ${s} is not plugin-sourced; channel_enable requires a marketplace plugin`);const l={kind:"plugin",name:a.name,marketplace:a.marketplace},u=Cs(),c=u.some(e=>"plugin"===e.kind&&e.name===l.name&&e.marketplace===l.marketplace);c||js([...u,l]);const m=Y(s,r.capabilities,i);if("skip"===m.action)return c||js(u),respondError(m.reason);const p=`${l.name}@${l.marketplace}`;W(s,"Channel notifications registered"),S("tengu_mcp_channel_enable",{plugin:p}),r.client.setNotificationHandler(V(),async e=>{const{content:t,meta:o}=e.params;W(s,`notifications/claude/channel: ${t.slice(0,80)}`),S("tengu_mcp_channel_message",{content_length:t.length,meta_key_count:Object.keys(o??{}).length,entry_kind:"plugin",is_dev:!1,plugin:p}),A({mode:"prompt",value:Q(s,t,o),priority:"next",isMeta:!0,origin:{kind:"channel",server:s},skipSlashCommands:!0})}),n.enqueue({type:"control_response",response:{subtype:"success",request_id:t,response:void 0}})}function reregisterChannelHandlerAfterReconnect(t){if(!e("KAIROS")&&!e("KAIROS_CHANNELS"))return;if("connected"!==t.type)return;if("register"!==Y(t.name,t.capabilities,t.config.pluginSource).action)return;const s=J(t.name,Cs()),o="plugin"===s?.kind?`${s.name}@${s.marketplace}`:void 0;W(t.name,"Channel notifications re-registered after reconnect"),t.client.setNotificationHandler(V(),async e=>{const{content:n,meta:r}=e.params;W(t.name,`notifications/claude/channel: ${n.slice(0,80)}`),S("tengu_mcp_channel_message",{content_length:n.length,meta_key_count:Object.keys(r??{}).length,entry_kind:s?.kind,is_dev:s?.dev??!1,plugin:o}),A({mode:"prompt",value:Q(t.name,n,r),priority:"next",isMeta:!0,origin:{kind:"channel",server:t.name},skipSlashCommands:!0})})}function emitLoadError(e,t){if("stream-json"===t){const t={type:"result",subtype:"error_during_execution",duration_ms:0,duration_api_ms:0,is_error:!0,num_turns:0,stop_reason:null,session_id:_s(),total_cost_usd:0,usage:z,modelUsage:{},permission_denials:[],uuid:Ts(),errors:[e]};process.stdout.write(Bs(t)+"\n")}else process.stderr.write(e+"\n")}export function removeInterruptedMessage(e,t){const s=e.findIndex(e=>e.uuid===t.uuid);-1!==s&&e.splice(s,2)}export async function handleOrphanedPermissionResponse({message:e,setAppState:t,onEnqueued:s,handledToolUseIds:o}){if("success"===e.response.subtype&&e.response.response?.toolUseID&&"string"==typeof e.response.response.toolUseID){const t=e.response.response,{toolUseID:n}=t;if(!n)return!1;if(w(`handleOrphanedPermissionResponse: received orphaned control_response for toolUseID=${n} request_id=${e.response.request_id}`),o.has(n))return w(`handleOrphanedPermissionResponse: skipping duplicate orphaned permission for toolUseID=${n} (already handled)`),!1;const r=await bt(n);return r?(o.add(n),w(`handleOrphanedPermissionResponse: enqueuing orphaned permission for toolUseID=${n} messageID=${r.message.id}`),A({mode:"orphaned-permission",value:[],orphanedPermission:{permissionResult:t,assistantMessage:r}}),s?.(),!0):(w(`handleOrphanedPermissionResponse: no unresolved tool_use found for toolUseID=${n} (already resolved in transcript)`),!1)}return!1}function toScopedConfig(e){return{...e,scope:"dynamic"}}export async function handleMcpSetServers(e,t,s,o){const{allowed:n,blocked:r}=Mt(e),i={};for(const e of r)i[e]="Blocked by enterprise policy (allowedMcpServers/deniedMcpServers)";const a={},l={};for(const[e,t]of Object.entries(n))"sdk"===t.type?a[e]=t:l[e]=t;const u=new Set(Object.keys(t.configs)),c=new Set(Object.keys(a)),m=[],p=[],d={...t.configs};let f=[...t.clients],g=[...t.tools];for(const e of u)if(!c.has(e)){const t=f.find(t=>t.name===e);t&&"connected"===t.type&&await t.cleanup(),f=f.filter(t=>t.name!==e);const s=`mcp__${e}__`;g=g.filter(e=>!e.name.startsWith(s)),delete d[e],p.push(e)}for(const[e,t]of Object.entries(a))if(!u.has(e)){d[e]=t;const s={type:"pending",name:e,config:{...t,scope:"dynamic"}};f=[...f,s],m.push(e)}const _=await reconcileMcpServers(l,s,o);return{response:{added:[...m,..._.response.added],removed:[...p,..._.response.removed],errors:{...i,..._.response.errors}},newSdkState:{configs:d,clients:f,tools:g},newDynamicState:_.newState,sdkServersChanged:m.length>0||p.length>0}}export async function reconcileMcpServers(e,t,s){const o=new Set(Object.keys(t.configs)),n=new Set(Object.keys(e)),r=[...o].filter(e=>!n.has(e)),i=[...n].filter(e=>!o.has(e)),a=[...o].filter(e=>n.has(e)).filter(s=>{const o=t.configs[s],n=e[s];if(!o||!n)return!0;const r=toScopedConfig(n);return!Rt(o,r)}),l=[],u=[],c={};let m=[...t.clients],p=[...t.tools];for(const e of[...r,...a]){const s=m.find(t=>t.name===e),o=t.configs[e];if(s&&o){if("connected"===s.type)try{await s.cleanup()}catch(e){B(e)}await At(e,o)}const n=`mcp__${e}__`;p=p.filter(e=>!e.name.startsWith(n)),m=m.filter(t=>t.name!==e),r.includes(e)&&l.push(e)}for(const t of[...i,...a]){const s=e[t];if(!s)continue;const o=toScopedConfig(s);if("sdk"!==s.type)try{const e=await Tt(t,o);if(m.push(e),"connected"===e.type){const t=await qt(e);p.push(...t)}else"failed"===e.type&&(c[t]=e.error||"Connection failed");u.push(t)}catch(e){const s=go(e);c[t]=s.message,B(s)}else u.push(t)}const d={};for(const t of n){const s=e[t];s&&(d[t]=toScopedConfig(s))}const f={clients:m,tools:p,configs:d};return s(e=>{const s=new Set([...Object.keys(t.configs),...Object.keys(d)]),o=e.mcp.tools.filter(e=>{for(const t of s)if(e.name.startsWith(`mcp__${t}__`))return!1;return!0}),n=e.mcp.clients.filter(e=>!s.has(e.name));return{...e,mcp:{...e.mcp,tools:[...o,...p],clients:[...n,...m]}}}),{response:{added:u,removed:l,errors:c},newState:f}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{c as
|
|
1
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{c as o}from"react/compiler-runtime";import{mkdir as n,writeFile as s}from"fs/promises";import{marked as c}from"marked";import{tmpdir as r}from"os";import{join as i}from"path";import{useRef as l}from"react";import{Select as a}from"../../components/CustomSelect/select.js";import{Byline as m}from"../../components/design-system/Byline.js";import{KeyboardShortcutHint as u}from"../../components/design-system/KeyboardShortcutHint.js";import{Pane as p}from"../../components/design-system/Pane.js";import{stringWidth as f}from"../../ink/stringWidth.js";import{setClipboard as g}from"../../ink/termio/osc.js";import{Box as y,Text as d}from"../../ink.js";import{logEvent as h}from"../../services/analytics/index.js";import{getGlobalConfig as x,saveGlobalConfig as _}from"../../utils/config.js";import{extractTextContent as w,stripPromptXMLTags as b}from"../../utils/messages.js";import{countCharInString as k}from"../../utils/stringUtils.js";const F=i(r(),"claude"),$="response.md";export function collectRecentAssistantTexts(e){const t=[];for(let o=e.length-1;o>=0&&t.length<20;o--){const n=e[o];if("assistant"!==n?.type||n.isApiErrorMessage)continue;const s=n.message.content;if(!Array.isArray(s))continue;const c=w(s,"\n\n");c&&t.push(c)}return t}export function fileExtension(e){if(e){const t=e.replace(/[^a-zA-Z0-9]/g,"");if(t&&"plaintext"!==t)return`.${t}`}return".txt"}async function writeToFile(e,t){const o=i(F,t);return await n(F,{recursive:!0}),await s(o,e,"utf-8"),o}async function copyOrWriteToFile(e,t){const o=await g(e);o&&process.stdout.write(o);const n=k(e,"\n")+1,s=e.length;try{return`Copied to clipboard (${s} characters, ${n} lines)\nAlso written to ${await writeToFile(e,t)}`}catch{return`Copied to clipboard (${s} characters, ${n} lines)`}}function truncateLine(e,t){const o=e.split("\n")[0]??"";if(f(o)<=t)return o;let n="",s=0;const c=t-1;for(const e of o){const t=f(e);if(s+t>c)break;n+=e,s+=t}return n+"…"}function CopyPicker(n){const s=o(33),{fullText:c,codeBlocks:r,messageAge:i,onDone:f}=n,g=l("full"),w=`${c.length} chars, ${k(c,"\n")+1} lines`;let b,F;if(s[0]!==w?(b={label:"Full response",value:"full",description:w},s[0]=w,s[1]=b):b=s[1],s[2]!==r||s[3]!==b){let e;s[5]===Symbol.for("react.memo_cache_sentinel")?(e={label:"Siempre copiar respuesta completa",value:"always",description:"Omite este selector en el futuro (revierte vía /config)"},s[5]=e):e=s[5],F=[b,...r.map(_temp),e],s[2]=r,s[3]=b,s[4]=F}else F=s[4];const j=F;let v;s[6]!==r||s[7]!==c?(v=function(e){if("full"===e||"always"===e)return{text:c,filename:$};const t=r[e];return{text:t.code,filename:`copy${fileExtension(t.lang)}`,blockIndex:e}},s[6]=r,s[7]=c,s[8]=v):v=s[8];const T=v;let C;s[9]!==r.length||s[10]!==T||s[11]!==i||s[12]!==f?(C=async function(e){const t=T(e);if("always"===e){x().copyFullResponse||_(_temp2),h("tengu_copy",{block_count:r.length,always:!0,message_age:i});const e=await copyOrWriteToFile(t.text,t.filename);return void f(`${e}\nPreference saved. Use /config to change copyFullResponse`)}h("tengu_copy",{selected_block:t.blockIndex,block_count:r.length,message_age:i});const o=await copyOrWriteToFile(t.text,t.filename);f(o)},s[9]=r.length,s[10]=T,s[11]=i,s[12]=f,s[13]=C):C=s[13];const A=C;let S;if(s[14]!==r.length||s[15]!==T||s[16]!==i||s[17]!==f){const handleWrite=async function(e){const t=T(e);h("tengu_copy",{selected_block:t.blockIndex,block_count:r.length,message_age:i,write_shortcut:!0});try{const e=await writeToFile(t.text,t.filename);f(`Written to ${e}`)}catch(e){const t=e;f(`Failed to write file: ${t instanceof Error?t.message:t}`)}};S=function(e){"w"===e.key&&(e.preventDefault(),handleWrite(g.current))},s[14]=r.length,s[15]=T,s[16]=i,s[17]=f,s[18]=S}else S=s[18];const R=S;let I,O,W,D,N,B,E;return s[19]===Symbol.for("react.memo_cache_sentinel")?(I=e(d,{dimColor:!0,children:"Select content to copy:"}),s[19]=I):I=s[19],s[20]===Symbol.for("react.memo_cache_sentinel")?(O=e=>{g.current=e},s[20]=O):O=s[20],s[21]!==A?(W=e=>{A(e)},s[21]=A,s[22]=W):W=s[22],s[23]!==f?(D=()=>{f("Copy cancelled",{display:"system"})},s[23]=f,s[24]=D):D=s[24],s[25]!==j||s[26]!==D||s[27]!==W?(N=e(a,{options:j,hideIndexes:!1,onFocus:O,onChange:W,onCancel:D}),s[25]=j,s[26]=D,s[27]=W,s[28]=N):N=s[28],s[29]===Symbol.for("react.memo_cache_sentinel")?(B=e(d,{dimColor:!0,children:t(m,{children:[e(u,{shortcut:"enter",action:"copy"}),e(u,{shortcut:"w",action:"write to file"}),e(u,{shortcut:"esc",action:"cancelar"})]})}),s[29]=B):B=s[29],s[30]!==R||s[31]!==N?(E=e(p,{children:t(y,{flexDirection:"column",gap:1,tabIndex:0,autoFocus:!0,onKeyDown:R,children:[I,N,B]})}),s[30]=R,s[31]=N,s[32]=E):E=s[32],E}function _temp2(e){return{...e,copyFullResponse:!0}}function _temp(e,t){const o=k(e.code,"\n")+1;return{label:truncateLine(e.code,60),value:t,description:[e.lang,o>1?`${o} lines`:void 0].filter(Boolean).join(", ")||void 0}}export const call=async(t,o,n)=>{const s=collectRecentAssistantTexts(o.messages);if(0===s.length)return t("No assistant message to copy"),null;let r=0;const i=n?.trim();if(i){const e=Number(i);if(!Number.isInteger(e)||e<1)return t(`Usage: /copy [N] where N is 1 (latest), 2, 3, … Got: ${i}`),null;if(e>s.length)return t(`Only ${s.length} assistant ${1===s.length?"message":"messages"} available to copy`),null;r=e-1}const l=s[r],a=function(e){const t=c.lexer(b(e)),o=[];for(const e of t)if("code"===e.type){const t=e;o.push({code:t.text,lang:t.lang})}return o}(l),m=x();if(0===a.length||m.copyFullResponse){h("tengu_copy",{always:m.copyFullResponse,block_count:a.length,message_age:r});return t(await copyOrWriteToFile(l,$)),null}return e(CopyPicker,{fullText:l,codeBlocks:a,messageAge:r,onDone:t})};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getHeartbeatStatus as t}from"../../utils/heartbeat.js";function formatRelative(t){return t<0?"hace un momento":t<1e3?"hace <1s":t<6e4?`hace ${Math.round(t/1e3)}s`:t<36e5?`hace ${Math.round(t/6e4)}min`:`hace ${Math.round(t/36e5)}h`}export async function call(){const e=t(),a=Date.now(),s=[];return s.push("Heartbeat: "+(e.enabled?"✓ activo":"✗ inactivo")),e.enabled&&(s.push(` Iniciado: ${formatRelative(a-e.startedAt)}`),s.push(` Último tick: ${formatRelative(a-e.lastTickAt)}`)),s.push(` Última actividad de stdin: ${null===e.lastStdinEventAt?"ninguna registrada":formatRelative(a-e.lastStdinEventAt)}`),s.push(` Intentos de recuperación: ${e.recoveryAttempts}`),s.push(" Estado stdin: "+(e.stdinStalled?"⚠ bloqueado":"OK")),s.push(""),s.push("Entorno:"),s.push(` Plataforma: ${e.env.platform}`),e.env.msystem&&s.push(` MSYSTEM: ${e.env.msystem}`),e.env.termProgram&&s.push(` TERM_PROGRAM: ${e.env.termProgram}`),e.env.isGitBashOnWindows&&(s.push(""),s.push("Detectamos Git Bash en Windows. Para evitar cuelgues idle, considera:"),s.push(" • Añadir `export MSYS=enable_pcon` a ~/.bashrc"),s.push(" • O usar Windows Terminal con Git Bash como perfil"),s.push("Más info: https://github.com/git-for-windows/git/wiki/ConPTY")),process.env.CONTEXT_HEARTBEAT_DEBUG?(s.push(""),s.push("CONTEXT_HEARTBEAT_DEBUG activo: ticks reportados al stderr.")):(s.push(""),s.push("Para diagnóstico detallado, ejecuta con CONTEXT_HEARTBEAT_DEBUG=1.")),{type:"text",value:s.join("\n")}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={description:"Estado del heartbeat de la sesión",name:"heartbeat",aliases:["latido"],isHidden:!1,type:"local",supportsNonInteractive:!0,load:()=>import("./heartbeat.js")};export default e;
|