UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

4,156 lines • 195 kB
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs";
import { C as parseStrictNonNegativeInteger } from "./number-coercion-CuVhdCBs.mjs";
import { t as coerceErrorMessage } from "./error-coercion-CvJK4lmH.mjs";
import { c as trackAsyncWork } from "./async-work-scope-BYeX3gh6.mjs";
import { o as resolveUserPath } from "./home-dir-Dc6nN6HB.mjs";
import { c as isRecord } from "./record-coerce-TIsquoVR.mjs";
import { r as defaultRuntime } from "./runtime-DlO3PTAd.mjs";
import { n as sanitizeForLog } from "./ansi-BeFJ0Uu7.mjs";
import { c as isSecretRef } from "./ref-contract-D0kWy5jy.mjs";
import "./types.secrets-DsPRn9Dz.mjs";
import "./utils-DgZn2dLu.mjs";
import { i as createAbortError, o as racePromiseWithAbortSignal } from "./src-D1BHGNTj.mjs";
import "./abort-signal-QqAmLWTl.mjs";
import { t as formatErrorMessage } from "./errors-O33D01XW.mjs";
import { t as formatCliCommand } from "./command-format-DwEdrDKL.mjs";
import { p as isDiagnosticsEnabled, s as emitTrustedDiagnosticEvent } from "./diagnostic-events-BADdmgZf.mjs";
import { t as createSubsystemLogger } from "./subsystem-I-uqdx4f.mjs";
import { t as GatewayScheduler } from "./gateway-scheduler-BYbkpAYn.mjs";
import { t as _usingCtx } from "./usingCtx-DwOBYOJf.mjs";
import { n as normalizeAgentId } from "./agent-id-D1-Q6vR4.mjs";
import { r as normalizeProviderId } from "./provider-id-D1VImdKk.mjs";
import { a as parseProviderModelRef, n as buildModelCatalogRef } from "./model-catalog-refs-D3xvQZh0.mjs";
import { a as resolveAgentDir, d as resolveAgentWorkspaceDir, r as resolveAgentConfig, u as resolveAgentRunCwd, y as resolveNativeModelPrimary } from "./agent-scope-config-CDYpzA0r.mjs";
import { r as isIncognitoSessionKey } from "./session-key-CmZ4o9-l.mjs";
import { S as isCronSessionKey, l as resolveAgentIdFromSessionKey, m as scopeLegacySessionKeyToAgent, o as classifySessionKeyShape, s as isUnscopedSessionKeySentinel, w as isSubagentSessionKey } from "./session-key-C09ow4h0.mjs";
import { r as normalizeOptionalAccountId } from "./account-id-DbRsdayc.mjs";
import { i as listAgentIds, n as listAgentEntries } from "./agent-roster-BXD1uMJD.mjs";
import { n as DEFAULT_MODEL, r as DEFAULT_PROVIDER } from "./defaults-Jag53zwP.mjs";
import { t as splitTrailingAuthProfile } from "./model-ref-profile-BNjB2hED.mjs";
import { u as resolvePluginMetadataSnapshot } from "./plugin-metadata-snapshot-pYUEfhY-.mjs";
import { i as resolveSessionAuthProfileOverrideSource, r as resolveCollapsedSessionAuthPinSource } from "./auth-profile-override-provenance-Jztnei-C.mjs";
import { E as hasSessionAutoModelSelection, O as resolveSessionModelOverrideRouteResolution, T as hasSessionAutoModelFallbackProvenance, f as resolveAutoFallbackPrimaryProbe, g as resolveSessionAgentId, i as markAutoFallbackPrimaryProbe, n as entryMatchesAutoFallbackPrimaryProbe, p as resolveEffectiveModelFallbacks, r as hasLegacyAutoFallbackWithoutOrigin, t as clearAutoFallbackPrimaryProbeSelection, v as resolveSessionAgentIds, w as hasSessionActiveAutoModelFallback } from "./agent-scope-CG17uXFn.mjs";
import { n as resolveEffectiveAgentSkillFilter } from "./agent-filter-KIvrTe_y.mjs";
import { i as resolveProviderIdForAuth } from "./provider-auth-aliases-DGVQj_99.mjs";
import { a as getPluginRuntimeGatewayRequestScope, c as withPluginRuntimeGatewayRequestScope } from "./gateway-request-scope-BSmCVVpP.mjs";
import "./agent-runtime-id-BZLMe-UU.mjs";
import { D as setRuntimeConfigSnapshot } from "./runtime-snapshot-DYptB0Cf.mjs";
import { a as clearAgentRunContext, y as registerAgentRunContext } from "./agent-run-registry-BaxMDLZF.mjs";
import { i as emitAgentEvent, n as captureAgentRunLifecycleGeneration, t as assertAgentRunLifecycleGenerationCurrent, y as withAgentRunLifecycleGeneration } from "./agent-events-GvNTkbe3.mjs";
import { v as requireActivePluginRegistry } from "./runtime-NsVZTERq.mjs";
import { i as getLegacyPluginSdkResourceHost, n as bindLegacyPluginSdkResourceHost, r as getBoundLegacyPluginSdkResourceHost, t as LegacyPluginSdkResourceHost } from "./legacy-sdk-resource-host-DC4n8Jcn.mjs";
import { n as withPluginRuntimeGenerationScope } from "./generation-scope-tH9UXyLm.mjs";
import { h as resolveConfiguredModelRef, o as dedupeModelCatalogEntries, r as buildConfiguredModelCatalog } from "./model-selection-shared-DcM6hdAC.mjs";
import { i as prepareModelRunCapabilities, n as findModelInCatalog } from "./model-catalog-lookup-4OgPvT6V.mjs";
import { t as resolveDefaultModelForAgent } from "./model-selection-config-BdeHEviO.mjs";
import { c as normalizeThinkLevel, d as normalizeVerboseLevel } from "./thinking.shared-Jy32Vp-O.mjs";
import { a as listOpenAIAuthProfileProvidersForAgentRuntime } from "./openai-routing-CI5rYN6I.mjs";
import { r as discoverConfigSecretTargetsByIds } from "./target-registry-query-djbCpoM3.mjs";
import "./target-registry-C9njyDoW.mjs";
import { r as getRuntimeConfig, u as readConfigFileSnapshotForWrite } from "./io.runtime-BsUXSsD4.mjs";
import "./io-BYWYXJXl.mjs";
import "./message-channel-constants-B3vfipkP.mjs";
import { a as resolveMessageChannel, t as isDeliverableMessageChannel } from "./message-channel-normalize-DeTO1ikE.mjs";
import "./message-channel-j-k-Nup3.mjs";
import { n as getInstallationTarget, t as LOCAL_INSTALLATION_TARGET_UNSUPPORTED } from "./installation-target-context-BOfhXm_n.mjs";
import { h as labelRuntimeContextText } from "./types-CQc6JNG4.mjs";
import { u as projectRuntimeContextFragments } from "./internal-runtime-context-CAWYwg4i.mjs";
import { _ as recordAgentDatabaseAdmissions, d as hasAgentDatabaseAdmissions, l as evaluateAgentDatabaseAdmissions, n as assertAgentDatabaseAdmitted } from "./agent-database-admission-dWNS6Rcs.mjs";
import { r as resolveModelAliasFromPair } from "./model-selection-resolve-PdD2eskm.mjs";
import { r as SILENT_REPLY_TOKEN } from "./tokens-D4ghQG_g.mjs";
import { E as setReplyPayloadMetadata, c as getReplyPayloadMetadata } from "./reply-payload-NzglYOOT.mjs";
import { f as stringifyRouteThreadId } from "./channel-route-BIxMkFzo.mjs";
import { s as normalizeDeliveryContext } from "./delivery-context.shared-PF5njaoI.mjs";
import { o as getActiveSecretsRuntimeConfigSnapshot } from "./runtime-state-DtxmQnWt.mjs";
import { c as getAdmittedRunDelegatedAuthority, n as assertOperatorModelAllowed, t as assertAdmittedRunOperatorAuthority } from "./admitted-run-context-QJnFIxUZ.mjs";
import { r as resolveOperatorModelDefault } from "./operator-model-policy-7XqG83Qr.mjs";
import { a as SessionWorkStartChangedError, c as isSessionWorkStartInvalidatedError, s as createSessionWorkStartChangedError } from "./work-start-error-Dh9d0ImY.mjs";
import { n as isStoredCredentialCompatibleWithAuthProvider } from "./order-BJ9-s7yV.mjs";
import { n as ensureAuthProfileStore } from "./store-runtime-DZk7O5wt.mjs";
import { a as withPreparedModelRuntimePluginGenerationScope } from "./prepared-model-runtime-generation-scope-B18pp3-E.mjs";
import { n as formatThinkingLevels } from "./thinking-DacLfQjp.mjs";
import "./model-selection-CC48fyGE.mjs";
import { i as resolveThinkingSelectionCore, n as resolveConfiguredThinkingDefaultCore } from "./model-thinking-default-twlQ6xyp.mjs";
import { i as getFailoverErrorCode } from "./error-B1Zb0HrJ.mjs";
import { n as resolveAvailableAgentHarnessPolicy } from "./availability-B_rOizs1.mjs";
import { c as isValidAgentHarnessSessionStoreEntry, l as resolveAgentHarnessSessionContextError, t as AGENT_HARNESS_MODEL_RUN_FORBIDDEN_MESSAGE } from "./agent-harness-session-key-D8EQIzja.mjs";
import { i as resolveSessionRuntimeOverrideForProvider } from "./session-runtime-compat-zlHVO23h.mjs";
import { i as normalizeThinkingCatalogProviders, n as hasResolvedThinkingCatalogEntry, r as needsThinkHydration, s as resolveEffectiveAgentRuntime } from "./thinking-runtime--sshEpUp.mjs";
import { t as ensureAgentWorkspace } from "./workspace-BHjQqjjT.mjs";
import { n as loadManifestModelCatalog } from "./model-catalog-CJEhcezW.mjs";
import { r as withAgentPluginRegistry } from "./runtime-plugins-C5iCn6Pz.mjs";
import { t as acquireAgentRunPreparedModelRuntime } from "./prepared-model-runtime-BbAS5OtQ.mjs";
import { t as resolveModelProviderAuthConfig } from "./model-auth-provider-route-CuvN_iXR.mjs";
import { n as sessionDeliveryChannel, r as sessionDeliveryOrigin } from "./delivery-context.read-CR06zOJ4.mjs";
import { r as resolveSqliteSessionKey } from "./session-accessor.sqlite-scope-helpers-DOK3pvYX.mjs";
import "./session-accessor.sqlite-scope-CdpbxR_m.mjs";
import { l as readPendingUserTurnTranscriptAdmission } from "./session-transcript-read-fence-DfxRHzep.mjs";
import { n as buildSessionCreationStamp } from "./session-entry-provenance-Bfs2J1E7.mjs";
import { l as getSessionWorkAdmissionOwnerRelease, n as beginSessionWorkAdmission } from "./session-lifecycle-admission-GoxISURZ.mjs";
import { i as classifyAgentRunTerminalOutcome } from "./agent-run-terminal-outcome-Ccvy5spR.mjs";
import { i as classifyGatewayStaleInstall } from "./stale-install-CLeiGj_K.mjs";
import { r as formatErrorMessageForDisplay } from "./error-diagnostics-3wa3M_GE.mjs";
import { s as patchSessionEntryCore } from "./session-accessor.sqlite-entry-Dn_MsDKD.mjs";
import { v as renderFailoverCodeUserCopy } from "./user-facing-text-DC1sCo4O.mjs";
import { l as isAgentMediatedCompletionSourceTool, m as isSubagentCoordinationInputProvenance } from "./input-provenance-D1LHo5Qj.mjs";
import { Q as normalizeAgentRunTerminalReplySnapshot, nt as normalizeAgentRunTerminalReceipt } from "./subagent-registry.store.sqlite-DIYyRjhZ.mjs";
import "./session-accessor-BDmTPdtx.mjs";
import { C as applySessionEntryExactReplacements } from "./session-accessor.reset-CwTHm9f4.mjs";
import { a as applyModelOverrideToSessionEntry, c as repairProviderWrappedModelOverride, i as ModelSelectionLockedError, s as isModelSelectionLocked, t as MODEL_SELECTION_LOCKED_MESSAGE } from "./model-overrides-uZFvcSRc.mjs";
import { a as hasBillableUsage, d as toDiagnosticUsage } from "./usage-XmAH1cfG.mjs";
import { n as getRestartRecoveryTerminalDeliveryEvidence, o as mergeRestartRecoveryTerminalDeliveryEvidence, t as buildRestartRecoveryClaimCleanupPatch } from "./restart-recovery-state-IiHiWzPq.mjs";
import { n as buildMainSessionRecoveryClearPatch } from "./main-session-recovery-clear-BczELu-B.mjs";
import { n as resolveSendPolicy } from "./send-policy-CeV-eE65.mjs";
import { d as recordSessionHumanDirectMessage, n as classifySessionStateActor } from "./session-state-events-BApk6l2c.mjs";
import { n as resolveAgentTimeoutMs } from "./timeout-Q2p-0uCf.mjs";
import { g as throwAgentRunRestartAbortReason, l as isAgentRunDirectAbortReason, m as resolveAgentRunErrorLifecycleFields, o as createAgentRunRestartAbortError, p as resolveAgentRunAbortLifecycleFields, u as isAgentRunRestartAbortReason } from "./run-termination-DGv2EKii.mjs";
import { o as getGeneratedMediaTaskIdsForSessionKey, s as hasNewGeneratedMediaTaskForSessionKey } from "./media-generation-activity-JkwDNUkC.mjs";
import { o as resolveSessionWorkStartError } from "./lifecycle-BU4MFl1q.mjs";
import { n as createHarnessCompletionSourceAssertion, r as getOwedHarnessCompletionTask, t as captureHarnessCompletionRecovery } from "./agent-harness-completion-recovery-DlP5x8YM.mjs";
import { n as estimateAggregateUsageCost } from "./usage-format-Dw-I2oJo.mjs";
import { r as recordAgentRunTerminalOutcome } from "./agent-run-terminal-outcome-BOQC0T2X.mjs";
import { i as LiveSessionModelSwitchError } from "./model-fallback-runner-B2yuLP27.mjs";
import { i as resolveSession, n as clearRotatedSessionMetadata } from "./session-BIVksyfW.mjs";
import { t as buildOutboundSessionContext } from "./session-context-Kov7ff_A.mjs";
import { n as runAgentHarnessBeforeMessageWriteHook } from "./hook-helpers-BSadQEM-.mjs";
import { c as normalizePendingFinalRecoveryPayloads, o as buildRecoverablePendingFinalDeliveryText, s as normalizePendingFinalDeliveryPayloads } from "./send-CqAjSzNt.mjs";
import { t as isSyntheticSourceReplyTurn } from "./reply-completion-B5n1Cnxm.mjs";
import { t as resolveChannelModelOverride } from "./model-overrides-B2rdd5aQ.mjs";
import { r as resolveStoredModelOverrideCore, t as resolveDirectStoredModelOverride } from "./stored-model-overrides-mwpRh3rX.mjs";
import { n as resolveSessionStableReplyMode } from "./session-stable-reply-mode-rpaoQPif.mjs";
import { t as MAIN_SESSION_RECOVERY_WORK_ADMISSION_OWNER } from "./main-session-recovery-admission-CE3KTRAe.mjs";
import { t as scheduleMainSessionRecoveryPendingTarget } from "./main-session-recovery-owner-release-BwTkONn1.mjs";
import { i as buildAgentRunTerminalOutcomeFromLifecycleEvent } from "./agent-run-terminal-outcome-BTCs8JFs.mjs";
import { t as mergeAgentRunTerminalOutcome } from "./agent-run-terminal-outcome-merge-DXNYLPhQ.mjs";
import { r as repairMainSessionRecoveryMutation } from "./main-session-recovery-lifecycle-Bj9fhVK-.mjs";
import { a as releaseMainSessionRecoveryOwner, i as refreshMainSessionRecoveryOwner, r as inspectMainSessionRecoveryRequired, t as claimMainSessionRecoveryOwner } from "./main-session-recovery-store-Dikwv7fV.mjs";
import { t as beginForegroundSessionMaintenance } from "./coordinator-j2tQL3v9.mjs";
import { t as createUserTurnTranscriptRecorder } from "./user-turn-transcript-DGjEQrHM.mjs";
import { t as resolveSilentReplySettings } from "./silent-reply-D-IlSCe7.mjs";
import { r as createChatRunState } from "./server-chat-state-BP63MB41.mjs";
import { f as runWithCronCreatorAuthorityCapability, u as createCronCreatorAuthorityCapability } from "./cron-creator-authority-context-aezDQHzt.mjs";
import { t as isHeartbeatLifecycleRunKind } from "./bootstrap-mode-HvSedbJl.mjs";
import { t as resolveFastModeState } from "./fast-mode-CdiysUl0.mjs";
import { n as createModelVisibilityPolicy } from "./model-visibility-policy-CJ73IRCN.mjs";
import { t as bindSessionRowProjection } from "./session-row-projection-access-C2RDnj28.mjs";
import { t as AGENT_LANE_SUBAGENT } from "./lanes-BJoXx6GG.mjs";
import { n as prepareInternalSessionEffectsSession, t as createInternalSessionEffectsCleanup } from "./internal-session-effects-CTJ_mWjV.mjs";
import { r as resolveMessageChannelSelection } from "./channel-selection-H42iGAM4.mjs";
import { a as hasVisibleAgentPayload } from "./message-visibility-D9way_Lv.mjs";
import { c as resolveInternalEventTranscriptBody, o as resolveAcpPromptBody } from "./internal-events-BZWbNO1Z.mjs";
import { _ as hasVisibleCommittedMessagingToolDeliveryEvidence, g as hasUnaccountedMessagingToolAggregateEvidence, i as collectMessagingToolDeliveredMediaUrls, l as hasCommittedOutboundDeliveryEvidence, r as collectDeliveredMediaUrls } from "./delivery-evidence-BEVHUW11.mjs";
import { t as normalizeAgentRunTerminalDeliverySnapshot } from "./agent-run-terminal-delivery-CA3z25Fw.mjs";
import { n as getAgentRuntimeOptionalCommandSecretPaths, t as getAgentRuntimeCommandSecretTargetIds, u as getScopedChannelsCommandSecretTargets } from "./command-secret-targets-BgF7WQKo.mjs";
import { r as shouldPreserveUnavailableSessionAuthProfileOverride } from "./auth-profile-preservation-BCdPUf01.mjs";
import { n as normalizeSpawnedRunMetadata } from "./spawned-context-BjFFoRwI.mjs";
import { i as resolveWorktreeIdForPath, t as acquireWorktreeRunLease } from "./run-lease-BpNdE-no.mjs";
import { n as resolveSessionSkillExecutionWorkspace } from "./workspace-skill-roots-CL28VeX5.mjs";
import { b as createDeferredEmbeddedRunLifecycleManager } from "./builtin-openclaw-qVsnLx0N.mjs";
import { r as buildUsageWithNoCost } from "./stream-message-shared-CYuIJ_XF.mjs";
import { t as createTrajectoryRuntimeRecorder } from "./runtime-Cffvdo3D.mjs";
import "./selection-lyiH3_Xg.mjs";
import { t as ensureSelectedAgentHarnessPlugin } from "./runtime-plugin-CUsUwqcE.mjs";
import { n as mergeAttemptToolMediaPayloads } from "./tool-media-payloads-Cqwq09k_.mjs";
import "./live-model-switch-C768HATZ.mjs";
import { n as incrementCompactionCount } from "./session-updates-L4jnEQfu.mjs";
import { t as applyModelRuntimeDirective } from "./directive-handling.model-runtime-COSNf42A.mjs";
import { t as clearSessionAuthProfileOverride } from "./session-override-Dww-KmFM.mjs";
import { r as mergeSessionSnapshotChanges } from "./session-snapshot-merge-Dh-eJoIb.mjs";
import { n as applyVerboseOverride } from "./level-overrides-DQv3xlxT.mjs";
import { a as resolveGroupRequireMention, i as defaultGroupActivation, n as buildGroupIntro, r as buildSourceConversationContext, t as ensureSessionDiffBaseline } from "./session-diff-baseline-IjSAjyYP.mjs";
import { t as prepareReplyConversation } from "./prompt-session-context-BxRPJusl.mjs";
import { t as buildDeliveryFormatPrompt } from "./delivery-format-prompt-DKkPE5CI.mjs";
import { t as buildInboundMetaSystemPrompt } from "./inbound-meta-WAi441PT.mjs";
import { i as resolveInlineAgentImageAttachments } from "./agent-turn-attachments-YAX9rCDg.mjs";
import { r as clearAgentRunTerminalWriteContext } from "./agent-run-terminal-writes-CXNCfj5F.mjs";
import { n as prepareAgentCommandExecutionIdentity, r as sanitizePublicAgentCommandIngressOpts, t as executionIdentity } from "./agent-command-execution-identity-B_djYUHU.mjs";
import { t as withLocalAgentCronJobsRemoved } from "./local-service-BNrS61S_.mjs";
import { t as loadGatewayConfigRevisionProjector } from "./config-revision-token-BHaFOoT3.mjs";
import { t as NodeRegistry } from "./node-registry-CuiJDygJ.mjs";
import { n as readPreparedServerMethodModelCatalogs } from "./optional-model-catalog-B-pbmxbf.mjs";
import { r as registerGatewayModelCatalogPrivateAccess } from "./server-model-catalog-auth-d5Ty5VGR.mjs";
import { a as readPreparedGatewayModelCatalogBatch, i as readPreparedGatewayModelCatalog, n as loadGatewayModelCatalogSnapshot, o as readPreparedGatewayModelCatalogOwnerSnapshot, r as loadPreparedGatewayModelCatalogSnapshot, t as loadGatewayModelCatalog } from "./server-model-catalog-OVnN45aL.mjs";
import { t as resolveSessionRequestTargets } from "./session-request-targets-Ok7aAt4X.mjs";
import { a as selectSourceDeliverablePayloads, c as resolveAgentOutboundTarget, o as resolveAgentDeliveryPlanWithSessionRoute, s as resolveAgentExplicitRecipientSession } from "./delivery-result-D4CkiJ3m.mjs";
import { t as measureAgentStartup } from "./startup-timing-DYEwQ98-.mjs";
import { _ as resolveAgentCommandDeps, a as loadAcpPolicyRuntime, c as loadAgentRunnerMemoryRuntime, d as loadDeliveryRuntime, f as loadExecDefaultsRuntime, g as loadTranscriptResolveRuntime, h as loadTranscriptAppendRuntime, i as loadAcpManagerRuntime, l as loadAttemptExecutionRuntime, m as loadSkillsRuntime, n as scheduleSessionMaintenance, o as loadAcpRuntimeErrorsRuntime, p as loadSessionStoreRuntime, r as createCommandBudget, s as loadAcpSessionIdentifiersRuntime, t as createSessionMaintenanceFollowup, u as loadCliCompactionRuntime } from "./run-CkGXq02F.mjs";
import { t as createLazyAcpElicitationHandler } from "./acp-elicitation-handler-lazy-BElclT0d.mjs";
import { n as normalizeExplicitOverrideInput, r as parseAgentCommandModelRef, t as normalizeAgentCommandModelRef } from "./model-ref-o6-HOsoe.mjs";
import { t as runEmbeddedAgentEntry } from "./run-entry-gnb95g__.mjs";
import { r as resetAgentAttemptLifecycle, t as createAgentAttemptLifecycleCallbacks } from "./attempt-callbacks-n8R-aP3x.mjs";
import { t as hasSameCompactionWriter } from "./agent-runner-compaction-accounting-B3SiBvkt.mjs";
import path from "node:path";
import { isDeepStrictEqual } from "node:util";
import { randomUUID } from "node:crypto";
//#region src/gateway/local-request-context.ts
async function cronUnavailable() {
	throw new Error("Cron is unavailable in local embedded agent gateway context.");
}
const unavailableCron = {
	start: cronUnavailable,
	stop: () => {},
	pauseScheduling: () => {},
	resumeScheduling: () => {},
	status: cronUnavailable,
	list: cronUnavailable,
	listPage: cronUnavailable,
	add: cronUnavailable,
	update: cronUnavailable,
	updateWithPrecondition: cronUnavailable,
	remove: cronUnavailable,
	removeStaleJobFamily: cronUnavailable,
	removeAgentJobsTransactional: cronUnavailable,
	quiesceJobs: cronUnavailable,
	run: cronUnavailable,
	enqueueRun: cronUnavailable,
	waitForManualRun: cronUnavailable,
	getJob: () => void 0,
	readJob: async () => void 0,
	readScratch: cronUnavailable,
	writeScratch: cronUnavailable,
	getDefaultAgentId: () => void 0,
	wake: () => ({
		ok: false,
		reason: "unwakeable-session-key"
	})
};
/** Creates the minimal gateway context used by embedded local agent execution. */
function createLocalGatewayRequestContext(params) {
	const logGateway = createSubsystemLogger("gateway/local");
	const resourceHost = getLegacyPluginSdkResourceHost();
	const cron = {
		...unavailableCron,
		removeAgentJobsTransactional: async (agentId, commit) => await withLocalAgentCronJobsRemoved(agentId, params.getRuntimeConfig, commit)
	};
	const sessionEvents = /* @__PURE__ */ new Set();
	const chatRunState = createChatRunState();
	const loadCatalogSnapshot = (loadParams) => loadGatewayModelCatalogSnapshot({
		...loadParams,
		getConfig: params.getRuntimeConfig
	});
	registerGatewayModelCatalogPrivateAccess(loadCatalogSnapshot, {
		loadDeferred: (loadParams) => loadPreparedGatewayModelCatalogSnapshot({
			...loadParams,
			getConfig: params.getRuntimeConfig
		}),
		readPrepared: (loadParams) => readPreparedGatewayModelCatalogOwnerSnapshot({
			...loadParams,
			getConfig: params.getRuntimeConfig
		})
	});
	const context = {
		localEmbedded: true,
		trackExecution: trackAsyncWork,
		deps: params.deps,
		configRevisionProjector: loadGatewayConfigRevisionProjector({ env: process.env }),
		cron,
		cronStorePath: "",
		getRuntimeConfig: params.getRuntimeConfig,
		resolveSessionRequestTargets: (request) => resolveSessionRequestTargets({
			...request,
			context
		}),
		isConfigReloadSettled: () => false,
		resolveTerminalLaunchPolicy: () => ({
			ok: false,
			block: { kind: "disabled" }
		}),
		isTerminalEnabled: () => false,
		loadGatewayModelCatalog: (loadParams) => loadGatewayModelCatalog({
			...loadParams,
			getConfig: params.getRuntimeConfig
		}),
		loadGatewayModelCatalogSnapshot: loadCatalogSnapshot,
		readPreparedGatewayModelCatalog: (loadParams) => readPreparedGatewayModelCatalog({
			...loadParams,
			getConfig: params.getRuntimeConfig
		}),
		readPreparedGatewayModelCatalogBatch: (agentIds) => readPreparedGatewayModelCatalogBatch(agentIds, { getConfig: params.getRuntimeConfig }),
		readChatMetadata: async () => {
			throw new Error("Chat metadata is unavailable in local embedded agent gateway context.");
		},
		getHealthCache: () => null,
		refreshHealthSnapshot: async () => ({}),
		logHealth: { error: (message) => logGateway.error(message) },
		logGateway,
		publishPresence: () => {},
		getPresenceSnapshot: () => {
			throw new Error("Presence requires a running Gateway connection.");
		},
		broadcast: () => {},
		broadcastToConnIds: () => {},
		nodeSendToSession: () => {},
		nodeSendToAllSubscribed: () => {},
		nodeSubscribe: () => {},
		nodeUnsubscribe: () => {},
		nodeUnsubscribeAll: () => {},
		hasConnectedTalkNode: async () => false,
		nodeRegistry: new NodeRegistry(),
		agentRunSeq: /* @__PURE__ */ new Map(),
		chatAbortControllers: /* @__PURE__ */ new Map(),
		chatQueuedTurns: /* @__PURE__ */ new Map(),
		chatRunState,
		addChatRun: chatRunState.registry.add,
		removeChatRun: chatRunState.registry.remove,
		subscribeSessionEvents: (connId) => {
			sessionEvents.add(connId);
		},
		unsubscribeSessionEvents: (connId) => {
			sessionEvents.delete(connId);
		},
		forgetConnectionAncestors: () => {},
		subscribeSessionMessageEvents: () => void 0,
		unsubscribeSessionMessageEvents: () => {},
		unsubscribeAllSessionEvents: (connId) => {
			sessionEvents.delete(connId);
		},
		getSessionEventSubscriberConnIds: () => sessionEvents,
		registerToolEventRecipient: () => {},
		dedupe: /* @__PURE__ */ new Map(),
		wizardSessions: /* @__PURE__ */ new Map(),
		systemAgentSessions: /* @__PURE__ */ new Map(),
		findRunningWizard: () => null,
		purgeWizardSession: () => {},
		getRuntimeSnapshot: () => ({}),
		startChannel: async () => {
			throw new Error("Channel start is unavailable in local embedded agent gateway context.");
		},
		stopChannel: async () => {
			throw new Error("Channel stop is unavailable in local embedded agent gateway context.");
		},
		markChannelLoggedOut: () => {},
		wizardRunner: async () => {
			throw new Error("Onboarding wizard is unavailable in local embedded agent gateway context.");
		},
		channelWizardRunner: async () => {
			throw new Error("Channel setup wizard is unavailable in local embedded agent gateway context.");
		},
		broadcastVoiceWakeChanged: () => {},
		broadcastVoiceWakeRoutingChanged: () => {},
		unavailableGatewayMethods: /* @__PURE__ */ new Set()
	};
	let projection;
	let initializing;
	bindSessionRowProjection(context, () => projection);
	context.ensureSessionRowProjection = () => {
		if (!initializing) {
			resourceHost.adopt(context, { release: async () => {
				await initializing?.catch(() => {});
				projection?.dispose();
				await projection?.ensureMaterialized();
			} });
			initializing = import("./session-row-projection-DDGit-Wl.mjs").then(async ({ createSessionRowProjection }) => {
				projection = await createSessionRowProjection({
					cfg: params.getRuntimeConfig(),
					getConfig: params.getRuntimeConfig,
					getModelCatalog: () => readPreparedServerMethodModelCatalogs(context, listAgentIds(params.getRuntimeConfig())),
					context
				});
			});
		}
		return initializing;
	};
	context.createAgentTurnFacade = async (principal) => {
		const { createInternalAgentTurnFacade } = await import("./internal-facade.runtime.js");
		return createInternalAgentTurnFacade({
			...principal,
			getContext: () => context
		});
	};
	return context;
}
/** Runs code inside a local gateway request scope unless an outer scope already exists. */
function withLocalGatewayRequestScope(params, run) {
	const existing = getPluginRuntimeGatewayRequestScope();
	if (existing?.context || existing?.resolveGatewayContext) return run();
	const context = createLocalGatewayRequestContext(params);
	const resolveGatewayContext = () => context;
	context.resolveGatewayContext = resolveGatewayContext;
	bindLegacyPluginSdkResourceHost(resolveGatewayContext, getLegacyPluginSdkResourceHost());
	return withPluginRuntimeGatewayRequestScope({
		...existing,
		context,
		resolveGatewayContext,
		isWebchatConnect: existing?.isWebchatConnect ?? (() => false)
	}, run);
}
//#endregion
//#region src/agents/agent-command-recovery-owner.ts
const log$7 = createSubsystemLogger("agents/agent-command");
function cloneRecoveryOwnerEntry(entry) {
	return {
		...entry,
		...entry.restartRecoveryRuns ? { restartRecoveryRuns: entry.restartRecoveryRuns.map((run) => ({ ...run })) } : {},
		...entry.mainRestartRecovery ? { mainRestartRecovery: structuredClone(entry.mainRestartRecovery) } : {}
	};
}
function refreshPreparedRecoveryOwnerTarget(prepared, acquired) {
	if (!acquired || acquired.entry.sessionId !== prepared.sessionId) return;
	const entry = cloneRecoveryOwnerEntry(acquired.entry);
	prepared.sessionEntry = entry;
	if (prepared.sessionStore && prepared.sessionKey) prepared.sessionStore[prepared.sessionKey] = entry;
}
async function claimAgentCommandRecoveryOwner(params) {
	const transferredLease = params.opts.mainRestartRecoveryOwnerLease;
	if (transferredLease) {
		const expectedLeaseSessionId = params.prepared.isNewSession ? params.prepared.previousSessionId : params.prepared.sessionId;
		if (!(expectedLeaseSessionId !== void 0 && transferredLease.lifecycleGeneration === params.lifecycleGeneration && transferredLease.sessionId === expectedLeaseSessionId && transferredLease.sessionKey === params.prepared.sessionKey && (transferredLease.agentId === void 0 || transferredLease.agentId === params.prepared.sessionAgentId) && path.resolve(transferredLease.storePath) === path.resolve(params.prepared.storePath))) throw new Error("main-session recovery owner changed during ingress preparation; retry");
		const snapshot = await refreshMainSessionRecoveryOwner(transferredLease, params.opts.runId);
		if (!snapshot) throw new Error("main-session recovery owner changed during ingress preparation; retry");
		return snapshot;
	}
	if (params.opts.sessionEffects === "internal") return;
	if (params.opts.mainRestartRecoveryAdmitted === true) return;
	const sessionKey = params.prepared.sessionKey;
	if (!sessionKey) return;
	const target = {
		agentId: params.prepared.sessionAgentId,
		sessionKey,
		storePath: params.prepared.storePath
	};
	if (params.mode === "reject_uncoordinated") {
		const recoveryInspection = await inspectMainSessionRecoveryRequired({
			allowMissingSession: params.prepared.isNewSession && !params.prepared.previousSessionId || params.opts.sessionId?.trim() === params.prepared.sessionId,
			expectedSessionId: params.prepared.previousSessionId ?? params.prepared.sessionId,
			lifecycleGeneration: params.lifecycleGeneration,
			target
		});
		if (recoveryInspection.kind === "invalidated") throw createSessionWorkStartChangedError(sessionKey);
		if (recoveryInspection.kind === "required") throw new Error(`Session "${sessionKey}" has interrupted work pending restart recovery; retry through a healthy Gateway or reset it there with /new or /reset.`);
		return;
	}
	const claim = await claimMainSessionRecoveryOwner({
		allowMissingSession: params.prepared.isNewSession && !params.prepared.previousSessionId || params.opts.sessionId?.trim() === params.prepared.sessionId,
		lifecycleGeneration: params.lifecycleGeneration,
		sessionId: params.prepared.previousSessionId ?? params.prepared.sessionId,
		replacementSessionId: params.prepared.isNewSession ? params.prepared.sessionId : void 0,
		runId: params.opts.runId,
		target
	});
	if (claim.kind === "invalidated") throw createSessionWorkStartChangedError(sessionKey);
	if (claim.kind === "not_required") return;
	return {
		lease: claim.lease,
		entry: claim.entry,
		sessionKey: claim.sessionKey
	};
}
async function runWithAgentCommandRecoveryOwner(params) {
	let lease = params.opts.mainRestartRecoveryOwnerLease;
	let pendingRecovery = void 0;
	let prepared;
	try {
		try {
			prepared = await params.prepare(params.opts);
		} catch (error) {
			const restoreAdmittedRecovery = params.restoreAdmittedRecovery;
			if (restoreAdmittedRecovery) pendingRecovery = await repairMainSessionRecoveryMutation({
				mutation: restoreAdmittedRecovery,
				onDeferredSuccess: scheduleMainSessionRecoveryPendingTarget,
				onError: (restoreError) => log$7.warn(`failed to restore admitted recovery after command preparation: ${formatErrorMessage(restoreError)}`)
			});
			throw error;
		}
		const target = prepared;
		const mayWaitForRecovery = params.mode === "claim" && params.opts.inputProvenance?.sourceTool === "subagent_settle" && params.opts.sessionEffects !== "internal" && !params.opts.mainRestartRecoveryAdmitted && !params.opts.mainRestartRecoveryOwnerLease;
		const recoveryOwnerRelease = () => mayWaitForRecovery ? getSessionWorkAdmissionOwnerRelease({
			scope: target.storePath,
			identities: [target.sessionKey, target.previousSessionId ?? target.sessionId],
			owner: MAIN_SESSION_RECOVERY_WORK_ADMISSION_OWNER
		}) : void 0;
		let pendingOwner = recoveryOwnerRelease();
		let acquired;
		for (;;) {
			if (pendingOwner) {
				await racePromiseWithAbortSignal(pendingOwner, params.opts.abortSignal);
				params.opts.abortSignal?.throwIfAborted();
				assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
				await prepared.runLease?.release();
				prepared = void 0;
				prepared = await params.prepare(params.opts);
				if (prepared.sessionId !== target.sessionId || prepared.previousSessionId !== target.previousSessionId || prepared.sessionKey !== target.sessionKey || path.resolve(prepared.storePath) !== path.resolve(target.storePath)) throw createSessionWorkStartChangedError(target.sessionKey ?? target.sessionId);
			}
			if (mayWaitForRecovery) {
				params.opts.abortSignal?.throwIfAborted();
				assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
			}
			try {
				acquired = await claimAgentCommandRecoveryOwner({
					...params,
					prepared
				});
			} catch (error) {
				pendingOwner = error instanceof SessionWorkStartChangedError ? recoveryOwnerRelease() : void 0;
				if (!pendingOwner) throw error;
				continue;
			}
			pendingOwner = acquired ? void 0 : recoveryOwnerRelease();
			if (!pendingOwner) break;
		}
		lease = acquired?.lease;
		if (mayWaitForRecovery) {
			params.opts.abortSignal?.throwIfAborted();
			assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
		}
		refreshPreparedRecoveryOwnerTarget(prepared, acquired);
		return await params.run(prepared);
	} finally {
		try {
			const releasedRecovery = await releaseMainSessionRecoveryOwner(lease);
			pendingRecovery ??= releasedRecovery;
		} catch (error) {
			log$7.warn(`failed to release main-session recovery owner: ${formatErrorMessage(error)}`);
		}
		try {
			await prepared?.runLease?.release();
		} finally {
			scheduleMainSessionRecoveryPendingTarget(pendingRecovery);
		}
	}
}
//#endregion
//#region src/agents/agent-runtime-config.ts
/** Resolves agent runtime config, including SecretRef materialization for agent command use. */
/** Loads runtime/source config and resolves command SecretRefs when the agent path needs them. */
async function resolveAgentRuntimeConfig(runtime, params) {
	const loadedRaw = getRuntimeConfig();
	const includeChannelTargets = params?.runtimeTargetsChannelSecrets === true;
	const channelSecretScope = params?.runtimeChannelSecretScope;
	const hasRuntimeSecretRefs = hasAgentRuntimeSecretRefs({
		config: loadedRaw,
		includeChannelTargets,
		channel: channelSecretScope?.channel
	});
	const activeSecretsConfig = getActiveSecretsRuntimeConfigSnapshot();
	let pluginMetadataSnapshot;
	const sourceConfig = activeSecretsConfig ? activeSecretsConfig.sourceConfig : await measureAgentStartup("config-source", async () => {
		try {
			const { snapshot, writeOptions } = await readConfigFileSnapshotForWrite();
			if (snapshot.valid) {
				pluginMetadataSnapshot = writeOptions.basePluginMetadataSnapshot;
				return snapshot.resolved;
			}
		} catch {}
		pluginMetadataSnapshot = resolvePluginMetadataSnapshot({ config: loadedRaw });
		return loadedRaw;
	}, { config: loadedRaw });
	let cfg = loadedRaw;
	if (hasRuntimeSecretRefs) {
		const runtimeSecretTargets = resolveAgentRuntimeSecretTargets({
			config: loadedRaw,
			includeChannelTargets,
			channelSecretScope
		});
		const { resolveCommandConfigWithSecrets } = await import("./command-config-resolution.runtime.js");
		cfg = (await resolveCommandConfigWithSecrets({
			config: loadedRaw,
			commandName: "agent",
			targetIds: runtimeSecretTargets.targetIds,
			...runtimeSecretTargets.allowedPaths ? { allowedPaths: runtimeSecretTargets.allowedPaths } : {},
			...runtimeSecretTargets.optionalActivePaths.size > 0 ? { optionalActivePaths: runtimeSecretTargets.optionalActivePaths } : {},
			runtime
		})).resolvedConfig;
	}
	if (activeSecretsConfig && cfg !== loadedRaw) setRuntimeConfigSnapshot(cfg, sourceConfig);
	else if (!activeSecretsConfig) {
		const secretsRuntime = await measureAgentStartup("secrets-runtime-import", () => import("./runtime-Lr1RqU21.mjs"), { config: cfg });
		const snapshot = await measureAgentStartup("secrets-snapshot", () => secretsRuntime.prepareSecretsRuntimeSnapshot({
			config: sourceConfig,
			assignmentConfig: cfg,
			includeConfigRefs: false,
			...pluginMetadataSnapshot ? { pluginMetadataSnapshot } : {}
		}), { config: cfg });
		secretsRuntime.activateSecretsRuntimeSnapshot(snapshot);
	}
	return cfg;
}
function hasNestedSecretRef(value) {
	if (isSecretRef(value)) return true;
	if (Array.isArray(value)) return value.some(hasNestedSecretRef);
	if (!value || typeof value !== "object") return false;
	return Object.values(value).some(hasNestedSecretRef);
}
function hasAgentRuntimeSecretRefs(params) {
	const { config } = params;
	return hasNestedSecretRef(config.models?.providers) || hasNestedSecretRef(config.memory?.search?.remote) || listAgentEntries(config).some((agent) => hasNestedSecretRef({
		memoryRemote: agent.memory?.search?.remote,
		tts: agent.tts
	})) || hasNestedSecretRef(config.tts) || hasNestedSecretRef(config.skills?.entries) || hasNestedSecretRef(config.tools?.web?.search) || Object.values(config.plugins?.entries ?? {}).some((entry) => hasNestedSecretRef({
		webSearch: entry?.config?.webSearch,
		webFetch: entry?.config?.webFetch
	})) || hasNestedSecretRef(params.includeChannelTargets ? config.channels : params.channel ? config.channels?.[params.channel] : void 0);
}
function resolveAgentRuntimeSecretTargets(params) {
	const baseTargetIds = getAgentRuntimeCommandSecretTargetIds({
		config: params.config,
		includeChannelTargets: params.includeChannelTargets
	});
	const optionalActivePaths = getAgentRuntimeOptionalCommandSecretPaths(params.config);
	if (params.includeChannelTargets || !params.channelSecretScope) return {
		targetIds: baseTargetIds,
		optionalActivePaths
	};
	const channelTargets = getScopedChannelsCommandSecretTargets({
		config: params.config,
		channel: params.channelSecretScope.channel,
		accountId: params.channelSecretScope.accountId,
		defaultAccountWhenMissing: true
	});
	const targetIds = new Set(baseTargetIds);
	for (const targetId of channelTargets.targetIds) targetIds.add(targetId);
	if (!channelTargets.allowedPaths) return {
		targetIds,
		optionalActivePaths
	};
	const allowedPaths = new Set(channelTargets.allowedPaths);
	for (const target of discoverConfigSecretTargetsByIds(params.config, baseTargetIds)) allowedPaths.add(target.path);
	return {
		targetIds,
		allowedPaths,
		optionalActivePaths
	};
}
//#endregion
//#region src/agents/command/explicit-session-key.ts
function resolveExplicitAgentCommandSessionKey(params) {
	if (isUnscopedSessionKeySentinel(params.rawExplicitSessionKey)) return params.rawExplicitSessionKey;
	const unscopedOwnerAgentId = classifySessionKeyShape(params.rawExplicitSessionKey) === "legacy_or_alias" && (params.agentIdOverride || params.shouldScopeDefaultAgentKey) ? resolveSessionAgentIds({
		config: params.cfg,
		agentId: params.agentIdOverride,
		sessionKey: params.rawExplicitSessionKey
	}).sessionAgentId : void 0;
	return scopeLegacySessionKeyToAgent({
		agentId: unscopedOwnerAgentId ?? params.agentIdOverride,
		sessionKey: params.rawExplicitSessionKey,
		mainKey: params.cfg.session?.mainKey
	});
}
//#endregion
//#region src/agents/command/prepare.ts
async function prepareAgentCommandExecution(opts, runtime, runtimeContext) {
	const { abortSignal, assertSourceCurrent, operatorAuthority, lifecycleGeneration: preparationLifecycleGeneration } = opts;
	const isRawModelRun = opts.modelRun === true || opts.promptMode === "none";
	const message = opts.message ?? "";
	if (!message.trim()) throw new Error("Message (--message) is required");
	const rawExplicitSessionKey = opts.sessionKey?.trim();
	const requestedSessionId = opts.sessionId?.trim() || void 0;
	const rawTo = opts.to?.trim();
	const toSessionKey = !rawExplicitSessionKey && !requestedSessionId && classifySessionKeyShape(rawTo) === "agent" ? rawTo : void 0;
	const recipientChannel = resolveMessageChannel(opts.channel);
	const shouldResolveExplicitRecipientSession = Boolean(!rawExplicitSessionKey && !requestedSessionId && !toSessionKey && opts.agentId?.trim() && recipientChannel && isDeliverableMessageChannel(recipientChannel) && rawTo);
	if (!opts.to && !requestedSessionId && !rawExplicitSessionKey && !opts.agentId) throw new Error("Pass --to <E.164>, --session-key, --session-id, or --agent to choose a session");
	const cfg = await (runtimeContext?.config ?? resolveAgentRuntimeConfig(runtime, {
		runtimeTargetsChannelSecrets: opts.deliver === true,
		runtimeChannelSecretScope: opts.deliver !== true && shouldResolveExplicitRecipientSession && recipientChannel ? {
			channel: recipientChannel,
			accountId: opts.accountId
		} : void 0
	}));
	const normalizedSpawned = normalizeSpawnedRunMetadata(opts);
	const agentIdOverrideRaw = opts.agentId?.trim();
	const agentIdOverride = agentIdOverrideRaw ? normalizeAgentId(agentIdOverrideRaw) : void 0;
	if (agentIdOverride) {
		if (!listAgentIds(cfg).includes(agentIdOverride)) throw new Error(`Unknown agent id "${agentIdOverrideRaw}". Use "${formatCliCommand("openclaw agents list")}" to see configured agents.`);
	}
	const shouldScopeDefaultAgentKey = Boolean(rawExplicitSessionKey && !agentIdOverride && classifySessionKeyShape(rawExplicitSessionKey) === "legacy_or_alias" && !isUnscopedSessionKeySentinel(rawExplicitSessionKey));
	const explicitSessionKey = toSessionKey ?? resolveExplicitAgentCommandSessionKey({
		rawExplicitSessionKey,
		agentIdOverride,
		shouldScopeDefaultAgentKey,
		cfg
	});
	if (explicitSessionKey && classifySessionKeyShape(explicitSessionKey) === "malformed_agent") throw new Error(`Invalid --session-key "${explicitSessionKey}". Agent-prefixed session keys must use agent:<agent-id>:<session-key>.`);
	if (agentIdOverride && explicitSessionKey && classifySessionKeyShape(explicitSessionKey) === "agent") {
		const sessionAgentId = resolveAgentIdFromSessionKey(explicitSessionKey);
		if (sessionAgentId !== agentIdOverride) throw new Error(`Agent id "${agentIdOverrideRaw}" does not match session key agent "${sessionAgentId}".`);
	}
	if (agentIdOverride || explicitSessionKey) {
		if (!hasAgentDatabaseAdmissions()) recordAgentDatabaseAdmissions(await evaluateAgentDatabaseAdmissions(cfg));
		assertAgentDatabaseAdmitted(agentIdOverride ?? resolveSessionAgentId({
			sessionKey: explicitSessionKey,
			config: cfg
		}));
	}
	const agentCfg = cfg.agents?.defaults;
	const verboseOverride = normalizeVerboseLevel(opts.verbose);
	if (opts.verbose && !verboseOverride) throw new Error("Invalid verbose level. Use \"on\", \"full\", or \"off\".");
	const isSubagentLane = normalizeOptionalString(opts.lane) === AGENT_LANE_SUBAGENT;
	const hasExplicitTimeoutOption = opts.timeout !== void 0;
	const timeoutSecondsRaw = hasExplicitTimeoutOption ? parseStrictNonNegativeInteger(opts.timeout) ?? NaN : isSubagentLane ? 0 : void 0;
	if (Number.isNaN(timeoutSecondsRaw)) throw new Error("--timeout must be a non-negative integer (seconds; 0 means no timeout)");
	const timeoutMs = resolveAgentTimeoutMs({
		cfg,
		overrideSeconds: timeoutSecondsRaw
	});
	const runTimeoutOverrideMs = hasExplicitTimeoutOption ? timeoutMs : void 0;
	const selectedCommandOpts = toSessionKey ? {
		...opts,
		to: void 0,
		sessionKey: explicitSessionKey
	} : opts;
	const explicitRecipientSession = shouldResolveExplicitRecipientSession && agentIdOverride && recipientChannel && rawTo ? await resolveAgentExplicitRecipientSession({
		cfg,
		agentId: agentIdOverride,
		channel: recipientChannel,
		to: rawTo,
		accountId: selectedCommandOpts.accountId,
		threadId: selectedCommandOpts.threadId
	}) : void 0;
	if (explicitRecipientSession?.error) throw explicitRecipientSession.error;
	let commandOpts = explicitRecipientSession?.sessionKey ? {
		...selectedCommandOpts,
		channel: explicitRecipientSession.channel,
		to: explicitRecipientSession.to,
		accountId: explicitRecipientSession.accountId,
		threadId: explicitRecipientSession.threadId
	} : selectedCommandOpts;
	const { sessionId, sessionKey, sessionEntry: sessionEntryRaw, sessionAgentId, storePath, isNewSession, previousSessionId, persistedThinking, persistedVerbose } = resolveSession({
		cfg,
		to: commandOpts.to,
		sessionId: commandOpts.sessionId,
		sessionKey: explicitSessionKey ?? explicitRecipientSession?.sessionKey,
		agentId: agentIdOverride
	});
	const harnessSessionError = sessionKey ? resolveAgentHarnessSessionContextError(sessionKey, sessionEntryRaw) : void 0;
	if (harnessSessionError) throw new Error(harnessSessionError);
	if (isRawModelRun && sessionKey && sessionEntryRaw?.modelSelectionLocked === true) throw new Error(AGENT_HARNESS_MODEL_RUN_FORBIDDEN_MESSAGE);
	const sessionStore = sessionKey && sessionEntryRaw ? { [sessionKey]: sessionEntryRaw } : {};
	assertAgentDatabaseAdmitted(sessionAgentId);
	const outboundSession = buildOutboundSessionContext({
		cfg,
		agentId: sessionAgentId,
		sessionKey
	});
	const agentWorkspaceDir = resolveAgentWorkspaceDir(cfg, sessionAgentId);
	const workspaceDirRaw = normalizedSpawned.workspaceDir ?? agentWorkspaceDir;
	const workspaceDir = resolveUserPath(workspaceDirRaw);
	const { getAcpSessionManager } = await loadAcpManagerRuntime();
	const acpManager = getAcpSessionManager();
	const assertAcpPreparationCurrent = () => {
		if (abortSignal?.aborted) throw createAbortError("Operation aborted", { cause: abortSignal.reason });
		assertSourceCurrent?.();
		operatorAuthority?.assertCurrent();
		if (preparationLifecycleGeneration !== void 0) assertAgentRunLifecycleGenerationCurrent(preparationLifecycleGeneration);
		assertAgentDatabaseAdmitted(sessionAgentId);
	};
	const acpResolution = sessionKey ? await acpManager.resolveSessionAsync({
		cfg,
		sessionKey,
		agentId: sessionAgentId,
		assertCurrent: assertAcpPreparationCurrent
	}) : null;
	assertAcpPreparationCurrent();
	const isAcpPlacedSession = acpResolution !== null && acpResolution.kind !== "none";
	const cwd = normalizeOptionalString(opts.cwd) ?? normalizeOptionalString(sessionEntryRaw?.spawnedCwd) ?? (isAcpPlacedSession ? void 0 : resolveAgentRunCwd(cfg, sessionAgentId));
	const agentDir = resolveAgentDir(cfg, sessionAgentId);
	const pluginsEnabled = cfg.plugins?.enabled !== false;
	const preparedMetadataSnapshot = runtimeContext?.pluginGeneration.pluginMetadataSnapshot;
	const manifestMetadataSnapshot = pluginsEnabled ? preparedMetadataSnapshot ?? resolvePluginMetadataSnapshot({
		config: cfg,
		env: process.env,
		workspaceDir
	}) : void 0;
	const modelManifestContext = { manifestPlugins: manifestMetadataSnapshot ?? [] };
	const configuredModel = resolveConfiguredModelRef({
		cfg,
		agentId: sessionAgentId,
		defaultProvider: DEFAULT_PROVIDER,
		defaultModel: DEFAULT_MODEL,
		allowPluginNormalization: pluginsEnabled,
		...modelManifestContext
	});
	const configuredThinkingCatalog = buildConfiguredModelCatalog({
		cfg,
		workspaceDir,
		...modelManifestContext
	});
	const configuredThinkingRuntime = resolveEffectiveAgentRuntime({
		cfg,
		provider: configuredModel.provider,
		modelId: configuredModel.model,
		agentId: sessionAgentId,
		sessionKey,
		sessionEntry: sessionEntryRaw
	});
	const sessionStableReplyMode = resolveSessionStableReplyMode({
		cfg,
		ctx: { CommandAuthorized: false },
		sessionEntry: sessionEntryRaw,
		sessionAgentId,
		sessionKey
	});
	commandOpts = {
		...commandOpts,
		cliSessionBindingFacts: commandOpts.cliSessionBindingFacts ?? { sourceReplyDeliveryMode: sessionStableReplyMode },
		...sessionEntryRaw && isSyntheticSourceReplyTurn({
			inputProvenance: commandOpts.inputProvenance,
			isHeartbeat: commandOpts.bootstrapContextRunKind === "heartbeat"
		}) ? { sourceReplyDeliveryMode: commandOpts.sourceReplyDeliveryMode ?? sessionStableReplyMode } : {}
	};
	const thinkingLevelsHint = formatThinkingLevels(configuredModel.provider, configuredModel.model, ", ", configuredThinkingCatalog.length > 0 ? configuredThinkingCatalog : void 0, configuredThinkingRuntime);
	const thinkOverride = normalizeThinkLevel(opts.thinking);
	const thinkOnce = normalizeThinkLevel(opts.thinkingOnce);
	if (opts.thinking && !thinkOverride) throw new Error(`Invalid thinking level. Use one of: ${thinkingLevelsHint}.`);
	if (opts.thinkingOnce && !thinkOnce) throw new Error(`Invalid one-shot thinking level. Use one of: ${thinkingLevelsHint}.`);
	const resolvedCwd = cwd ? resolveUserPath(cwd) : void 0;
	const worktreeId = await resolveWorktreeIdForPath({
		sessionEntry: sessionEntryRaw,
		candidatePaths: [resolvedCwd ?? workspaceDir, workspaceDir]
	});
	const runLease = worktreeId ? await acquireWorktreeRunLease(worktreeId) : void 0;
	try {
		const { resolveAcpAgentWorkspaceProvisioningForTurn } = await import("./acp-workspace-provisioning-BfXOvM5y.mjs");
		const workspaceProvisioning = await resolveAcpAgentWorkspaceProvisioningForTurn({
			cfg,
			agentId: sessionAgentId,
			workspaceDir: agentWorkspaceDir,
			cwd: resolvedCwd,
			sessionKey: sessionKey ?? void 0,
			sessionEntry: sessionEntryRaw ?? void 0
		});
		await ensureAgentWorkspace({
			dir: agentWorkspaceDir,
			ensureBootstrapFiles: !agentCfg?.skipBootstrap,
			skipOptionalBootstrapFiles: agentCfg?.skipOptionalBootstrapFiles,
			provisioning: workspaceProvisioning,
			guard: { assertHost: assertAcpPreparationCurrent }
		});
		const runId = opts.runId?.trim() || sessionId;
		let promptMessage = message;
		if (!isRawModelRun && (message.includes("$") || message.trimStart().startsWith("/"))) {
			const { expandExplicitSkillReferences, hasSkillReferenceCandidate, prepareSkillCommandsForWorkspace, resolveEffectiveAgentSkillFilter } = await import("./chat-commands.runtime.js");
			if (message.trimStart().startsWith("/") || hasSkillReferenceCandidate(message)) {
				const skillFilter = resolveEffectiveAgentSkillFilter(cfg, sessionAgentId);
				const commandParams = {
					workspaceDir,
					cfg,
					agentId: sessionAgentId,
					sessionEntry: sessionEntryRaw,
					sessionKey,
					...preparedMetadataSnapshot ? { pluginMetadataSnapshot: preparedMetadataSnapshot } : {},
					...skillFilter ? { skillFilter } : {}
				};
				const lifecycleGeneration = opts.lifecycleGeneration;
				const assertCurrent = lifecycleGeneration !== void 0 ? () => assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration) : void 0;
				const skillCommands = await prepareSkillCommandsForWorkspace(commandParams, assertCurrent);
				const expansion = expandExplicitSkillReferences({
					text: message,
					skillCommands,
					allSkillCommands: skillFilter ? await prepareSkillCommandsForWorkspace({
						...commandParams,
						includeAllowlistHidden: true
					}, assertCurrent) : skillCommands
				});
				if (expansion.error) throw new Error(expansion.error);
				promptMessage = expansion.body;
			}
		}
		const acpRuntimeContext = projectRuntimeContextFragments(opts.runtimeContextFragments ?? []);
		const body = !isRawModelRun && acpResolution?.kind === "ready" ? [acpRuntimeContext ? labelRuntimeContextText(acpRuntimeContext) : "", resolveAcpPromptBody(promptMessage, opts.internalEvents, opts.inputProvenance)].filter(Boolean).join("\n\n") : promptMessage;
		const transcriptBody = opts.transcriptMessage ?? resolveInternalEventTranscriptBody(message, opts.internalEvents, opts.inputProvenance);
		return {
			opts: commandOpts,
			body,
			transcriptBody,
			cfg,
			configuredThinkingCatalog,
			normalizedSpawned,
			agentCfg,
			thinkOverride,
			thinkOnce,
			verboseOverride,
			timeoutMs,
			runTimeoutOverrideMs,
			sessionId,
			sessionKey,
			sessionEntry: sessionEntryRaw,
			sessionStore,
			storePath,
			isNewSession,
			previousSessionId,
			persistedThinking,
			persistedVerbose,
			sessionAgentId,
			outboundSession,
			workspaceDir,
			cwd: resolvedCwd,
			agentDir,
			pluginsEnabled,
			manifestMetadataSnapshot,
			...runtimeContext ? { commandRuntimeContext: runtimeContext } : {},
			modelManifestContext,
			runId,
			isSubagentLane,
			acpManager,
			acpResolution,
			runLease
		};
	} catch (error) {
		await runLease?.release();
		throw error;
	}
}
//#endregion
//#region src/agents/agent-command-local.ts
/** Runs a local command under one request, recovery, and plugin-registry generation. */
async function runLocalAgentCommand(params) {
	const existingHost = getBoundLegacyPluginSdkResourceHost();
	const scheduler = existingHost ? existingHost.scheduler : new GatewayScheduler();
	const host = existingHost ?? new LegacyPluginSdkResourceHost();
	if (!existingHost) host.bindScheduler(scheduler);
	const [outcome] = await Promise.allSettled([host.run(async () => {
		const resolvedDeps = await measureAgentStartup("command-dependencies", () => resolveAgentCommandDeps(params.deps));
		const lifecycleGeneration = params.opts.lifecycleGeneration ?? captureAgentRunLifecycleGeneration(params.opts.runId ?? "");
		return await withAgentRunLifecycleGeneration(lifecycleGeneration, () => withLocalGatewayRequestScope({
			deps: resolvedDeps,
			getRuntimeConfig
		}, async () => await runWithAgentCommandRecoveryOwner({
			lifecycleGeneration,
			mode: "reject_uncoordinated",
			opts: {
				...params.opts,
				lifecycleGeneration,
				senderIsOwner: params.opts.senderIsOwner ?? true,
				allowModelOverride: params.opts.allowModelOverride ?? true,
				cleanupBundleMcpOnRunEnd: existingHost ? params.opts.cleanupBundleMcpOnRunEnd : true
			},
			prepare: async (preparedOpts) => await measureAgentStartup("command-prepare", () => prepareAgentCommandExecution(preparedOpts, params.runtime)),
			run: async (prepared) => {
				const capability = params.operatorAuthority && prepared.opts.senderIsOwner === true ? createCronCreatorAuthorityCapability(prepared.runId, { kind: "local" }) : void 0;
				const admittedPrepared = capability ? {
					...prepared,
					opts: {
						...prepared.opts,
						cronCreatorAuthorityCapability: capability
					}
				} : prepared;
				const run = () => withAgentPluginRegistry({
					config: admittedPrepared.cfg,
					workspaceDir: admittedPrepared.workspaceDir,
					run: async () => {
						try {
							var _usingCtx$1 = _usingCtx();
							const lease = _usingCtx$1.a(await acquireAgentRunPreparedModelRuntime({
								config: admittedPrepared.cfg,
								agentId: admittedPrepared.sessionAgentId,
								agentDir: admittedPrepared.agentDir,
								workspaceDir: admittedPrepared.workspaceDir
							}, { abortSignal: admittedPrepared.opts.abortSignal }));
							let active = true;
							try {
								return await withPluginRuntimeGenerationScope(lease.snapshot, () => withPreparedModelRuntimePluginGenerationScope(lease.pluginGeneration, () => params.run({
									...admittedPrepared,
									commandRuntimeContext: {
										config: lease.snapshot.config,
										pluginGeneration: lease.pluginGeneration
									}
								}, resolvedDeps), () => active ? lease.snapshot : void 0));
							} finally {
								active = false;
							}
						} catch (_) {
							_usingCtx$1.e = _;
						} finally {
							await _usingCtx$1.d();
						}
					}
				});
				return capability ? await runWithCronCreatorAuthorityCapability(capability, run, admittedPrepared.opts.abortSignal) : await run();
			}
		})));
	})]);
	try {
		if (!existingHost) {
			await scheduler.stop();
			await host.close();
		}
	} catch (error) {
		if (outcome.status === "rejected") throw new AggregateError([outcome.reason, error], "Local agent command and resource cleanup failed.", { cause: error });
		throw error;
	}
	if (outcome.status === "rejected") throw outcome.reason;
	return outcome.value;
}
//#endregion
//#region src/agents/agent-command-restart-recovery.ts
/** Restore the exact host-owned delivery constraints before starting a recovery turn. */
function resolveCommandRecoveryOptions(params) {
	const { sessionEntry: entry } = params;
	const media = entry?.restartRecoveryDeliveryRunId === params.runId && Array.isArray(entry.restartRecoveryDeliveryMediaUrls) ? entry.restartRecoveryDeliveryMediaUrls : void 0;
	const opts = media !== void 0 ? {
		...params.opts,
		internalDeliveryMediaUrls: [...media],
		internalDeliverySuppressText: entry?.restartRecoverySuppressTextDelivery,
		sourceReplyDeliveryMode: entry?.restartRecoverySourceReplyDeliveryMode,
		disableMessageTool: entry?.restartRecoveryDisableMessageTool,
		forceRestartSafeTools: entry?.restartRecoveryForceSafeTools
	} : params.opts;
	if (opts.internalDeliverySuppressText === true && opts.internalDeliveryMediaUrls === void 0 || (opts.internalDeliveryMediaUrls !== void 0 || opts.internalDeliverySuppressText === true) && (opts.forceRestartSafeTools !== true || opts.disableMessageTool !== true || opts.sourceReplyDeliveryMode !== "automatic")) throw new Error("internal delivery media constraints require automatic delivery with restart-safe tools and no message tool");
	return opts;
}
function normalizeOptionalThreadId(value) {
	return normalizeOptionalString(value) ?? (typeof value === "number" && Number.isFinite(value) ? String(value) : void 0);
}
/** Replace model-selected media with the exact host-owned delivery set. */
function constrainRestartRecoveryDeliveryPayloads(payloads, mediaUrls, suppressText = false) {
	const constrained = [];
	for (const payload of payloads ?? []) {
		const constrainedPayload = {};
		if (!suppressText && typeof payload.text === "string") constrainedPayload.text = payload.text;
		for (const flag of [
			"isError",
			"isReasoning",
			"isCommentary",
			"isReasoningSnapshot",
			"isCompactionNotice",
			"isFallbackNotice",
			"isStatusNotice"
		]) if (payload[flag] === true) constrainedPayload[flag] = true;
		if (Object.keys(constrainedPayload).length > 0) constrained.push(constrainedPayload);
	}
	const exactMediaUrls = Array.from(new Set(mediaUrls.map((url) => url.trim()).filter((url) => url.length > 0)));
	if (exactMediaUrls.length === 0) return constrained;
	if (!suppressText) {
		const visibleReplyIndex = constrained.findIndex((payload) => hasVisibleAgentPayload({ payloads: [payload] }, {
			includeErrorPayloads: false,
			includeSilentReplyPayloads: false,
			requireTerminalContent: true
		}));
		if (visibleReplyIndex >= 0) {
			const visibleReply = constrained[visibleReplyIndex];
			if (visibleReply) {
				const [mergedReply] = mergeAttemptToolMediaPayloads({
					payloads: [visibleReply],
					toolMediaUrls: exactMediaUrls,
					hostOwnedToolMediaUrls: exactMediaUrls,
					toolTrustedLocalMedia: true,
					sourceReplyDeliveryMode: "automatic"
				}) ?? [];
				if (mergedReply) {
					constrained[visibleReplyIndex] = mergedReply;
					return constrained;
				}
			}
		}
	}
	constrained.push({
		mediaUrls: exactMediaUrls,
		trustedLocalMedia: true
	});
	return constrained;
}
/** Reduce a terminal result to bounded, route-checkable delivery evidence. */
function buildRestartRecoveryTerminalDeliveryEvidence(result) {
	const rawPayloads = Array.isArray(result.payloads) ? result.payloads : void 0;
	const payloads = rawPayloads?.slice(0, 64).map((payload) => {
		const mediaUrls = collectDeliveredMediaUrls({ payloads: [payload] });
		const evidence = { visible: hasVisibleAgentPayload({ payloads: [payload] }, {
			requireTerminalContent: true,
			includeErrorPayloads: false,
			includeReasoningPayloads: false,
			includeSilentReplyPayloads: false
		}) };
		if (mediaUrls.length > 0) evidence.mediaUrls = mediaUrls;
		return evidence;
	});
	const payloadsTruncated = rawPayloads && rawPayloads.length > 64 ? true : void 0;
	const rawDeliveryStatus = result.deliveryStatus;
	const status = rawDeliveryStatus?.status === "failed" || rawDeliveryStatus?.status === "partial_failed" || rawDeliveryStatus?.status === "sent" || rawDeliveryStatus?.status === "suppressed" ? rawDeliveryStatus.status : void 0;
	const rawPayloadOutcomes = rawDeliveryStatus && typeof rawDeliveryStatus === "object" ? rawDeliveryStatus.payloadOutcomes : void 0;
	const payloadOutcomes = Array.isArray(rawPayloadOutcomes) ? rawPayloadOutcomes.flatMap((record) => {
		if (!isRecord(record)) return [];
		const outcomeStatus = record.status === "failed" || record.status === "sent" || record.status === "suppressed" ? record.status : void 0;
		if (!outcomeStatus || typeof record.index !== "number" || !Number.isInteger(record.index)) return [];
		return [{
			index: record.index,
			status: outcomeStatus,
			...typeof record.sentBeforeError === "boolean" ? { sentBeforeError: record.sentBeforeError } : {}
		}];
	}) : void 0;
	const errorMessage = normalizeOptionalString(rawDeliveryStatus?.errorMessage);
	const deliveryStatus = status ? {
		status,
		...typeof rawDeliveryStatus?.resultCount === "number" && Number.isSafeInteger(rawDeliveryStatus.resultCount) && rawDeliveryStatus.resultCount >= 0 ? { resultCount: rawDeliveryStatus.resultCount } : {},
		...errorMessage ? { errorMessage } : {},
		...payloadOutcomes?.length ? { payloadOutcomes } : {}
	} : void 0;
	const rawMessagingToolSentTargets = Array.isArray(result.messagingToolSentTargets) ? result.messagingToolSentTargets : void 0;
	const messagingToolSentTargets = rawMessagingToolSentTargets ? rawMessagingToolSentTargets.slice(0, 64).flatMap((record) => {
		if (!isRecord(record)) return [];
		const mediaUrls = collectMessagingToolDeliveredMediaUrls({ messagingToolSentTargets: [record] });
		const evidence = { visible: hasVisibleCommittedMessagingToolDeliveryEvidence({ messagingToolSentTargets: [record] }) };
		for (const key of [
			"provider",
			"accountId",
			"to"
		]) {
			const value = normalizeOptionalString(record[key]);
			if (value) evidence[key] = value;
		}
		const threadId = normalizeOptionalThreadId(record.threadId);
		if (threadId) evidence.threadId = threadId;
		if (record.threadImplicit === true) evidence.threadImplicit = true;
		if (record.threadSuppressed === true) evidence.threadSuppressed = true;
		if (typeof record.sourceReplyFinal === "boolean") evidence.sourceReplyFinal = record.sourceReplyFinal;
		if (mediaUrls.length > 0) evidence.mediaUrls = mediaUrls;
		return [evidence];
	}) : void 0;
	const messagingToolSentTargetsTruncated = rawMessagingToolSentTargets && rawMessagingToolSentTargets.length > 64 ? true : void 0;
	const messagingToolAggregateEvidenceUnaccounted = hasUnaccountedMessagingToolAggregateEvidence(result) ? true : void 0;
	const restartUnsafeSideEffectsDetected = hasCommittedOutboundDeliveryEvidence(result) || result.didSendDeterministicApprovalPrompt === true ? true : void 0;
	return {
		captured: true,
		...payloads?.length ? { payloads } : {},
		...payloadsTruncated ? { payloadsTruncated } : {},
		...deliveryStatus ? { deliveryStatus } : {},
		...messagingToolSentTargets?.length ? { messagingToolSentTargets } : {},
		...messagingToolSentTargetsTruncated ? { messagingToolSentTargetsTruncated } : {},
		...messagingToolAggregateEvidenceUnaccounted ? { messagingToolAggregateEvidenceUnaccounted } : {},
		...restartUnsafeSideEffectsDetected ? { restartUnsafeSideEffectsDetected } : {}
	};
}
function shouldPersistCurrentRunSessionCleanup(current, sessionId) {
	return current !== void 0 && current.sessionId === sessionId && current.abortedLastRun !== true;
}
function shouldPersistRestartRecoveryContextClaim(current, sessionId, runId, allowCreate) {
	if (!current) return allowCreate;
	if (!shouldPersistCurrentRunSessionCleanup(current, sessionId)) return false;
	return current.restartRecoveryDeliveryRunId === void 0 || current.restartRecoveryDeliveryRunId === runId;
}
function shouldPersistRestartRecoveryCleanup(current, sessionId, runId) {
	return shouldPersistCurrentRunSessionCleanup(current, sessionId) && current?.restartRecoveryDeliveryRunId === runId;
}
function buildCurrentRunRestartRecoveryClaim(params) {
	const bindsAdmittedHarnessSource = params.harnessCompletion?.sourceRunId === params.runId && params.entry.restartRecoveryDeliverySourceRunId === void 0;
	const adoptsExistingClaim = params.entry.restartRecoveryDeliveryRunId === params.runId && !bindsAdmittedHarnessSource;
	const createsTranscriptOnlySourceClaim = params.sourceRunId !== void 0 && params.deliveryContext === void 0;
	const createsScopedDeliveryClaim = params.sourceRunId !== void 0;
	if (!adoptsExistingClaim && createsScopedDeliveryClaim && !params.sourceIngress) throw new Error("restart recovery source ownership is required for a new claim");
	return {
		...adoptsExistingClaim ? params.entry.restartRecoveryHarnessCompletion ? { restartRecoveryHarnessCompletion: params.entry.restartRecoveryHarnessCompletion } : {} : params.harnessCompletion ? { restartRecoveryHarnessCompletion: params.harnessCompletion } : params.entry.restartRecoveryHarnessCompletion ? { restartRecoveryHarnessCompletion: void 0 } : {},
		restartRecoveryDeliveryContext: adoptsExistingClaim ? params.entry.restartRecoveryDeliveryContext : params.deliveryContext,
		restartRecoveryDeliveryMediaUrls: adoptsExistingClaim ? params.entry.restartRecoveryDeliveryMediaUrls : createsScopedDeliveryClaim && params.deliveryMediaUrls !== void 0 ? [...params.deliveryMediaUrls] : void 0,
		restartRecoveryDisableMessageTool: adoptsExistingClaim ? params.entry.restartRecoveryDisableMessageTool : createsScopedDeliveryClaim && params.disableMessageTool === true ? true : void 0,
		restartRecoverySuppressTextDelivery: adoptsExistingClaim ? params.entry.restartRecoverySuppressTextDelivery : createsScopedDeliveryClaim && params.suppressTextDelivery === true ? true : void 0,
		restartRecoveryDeliveryRunId: params.deliveryContext || adoptsExistingClaim || createsTranscriptOnlySourceClaim ? params.runId : void 0,
		restartRecoveryDeliverySourceRunId: adoptsExistingClaim ? params.entry.restartRecoveryDeliverySourceRunId : params.sourceRunId,
		restartRecoverySourceIngress: adoptsExistingClaim ? params.entry.restartRecoverySourceIngress : createsScopedDeliveryClaim ? params.sourceIngress : void 0,
		restartRecoverySourceReplyDeliveryMode: adoptsExistingClaim ? params.entry.restartRecoverySourceReplyDeliveryMode : params.sourceRunId ? params.sourceReplyDeliveryMode : void 0,
		restartRecoveryForceSafeTools: adoptsExistingClaim ? params.entry.restartRecoveryForceSafeTools : createsScopedDeliveryClaim && params.forceRestartSafeTools === true ? true : void 0
	};
}
/** Prepare only an admitted channel completion, or the exact saved recovery claim. */
function prepareCommandHarnessCompletionRecovery(params) {
	const { entry, sessionId, sessionKey, runId, agentId, opts } = params;
	const harnessCompletion = params.hasDeliveryContext ? captureHarnessCompletionRecovery({
		agentId,
		sessionKey,
		entry: {
			...entry,
			sessionId
		},
		runId,
		inputProvenance: opts.inputProvenance
	}) : void 0;
	const generatedMediaSourceRunId = opts.internalDeliveryMediaUrls !== void 0 && opts.inputProvenance?.kind === "inter_session" && isAgentMediatedCompletionSourceTool(opts.inputProvenance.sourceTool) ? runId : void 0;
	const claimedHarnessCompletion = entry.restartRecoveryDeliveryRunId === runId ? entry.restartRecoveryHarnessCompletion : void 0;
	const guardedHarnessCompletion = harnessCompletion ?? claimedHarnessCompletion;
	if (guardedHarnessCompletion && !getOwedHarnessCompletionTask(guardedHarnessCompletion, entry)) throw createSessionWorkStartChangedError(sessionKey);
	return {
		harnessCompletion,
		guardedHarnessCompletion,
		isCompletionCurrent: (current) => !guardedHarnessCompletion || Boolean(current && getOwedHarnessCompletionTask(guardedHarnessCompletion, current)),
		sourceOptions: {
			sourceIngress: generatedMediaSourceRunId || harnessCompletion ? "internal" : void 0,
			sourceRunId: generatedMediaSourceRunId ?? harnessCompletion?.sourceRunId,
			sourceReplyDeliveryMode: opts.sourceReplyDeliveryMode ?? (harnessCompletion ? "automatic" : void 0)
		}
	};
}
/** Called after the caller has recorded the committed entry for failure cleanup. */
function bindCommandHarnessCompletionAssertion(params) {
	const { claim, persisted, sessionKey, storePath, opts } = params;
	if (claim && (!persisted || persisted.restartRecoveryHarnessCompletion?.taskId !== claim.taskId || !getOwedHarnessCompletionTask(claim, persisted))) throw createSessionWorkStartChangedError(sessionKey);
	if (!claim || !storePath) return opts;
	const guarded = {
		...opts,
		assertSourceCurrent: Object.assign(createHarnessCompletionSourceAssertion({
			claim,
			storePath,
			priorAssertion: opts.assertSourceCurrent
		}), { recoveryReference: opts.assertSourceCurrent?.recoveryReference })
	};
	guarded.assertSourceCurrent();
	return guarded;
}
//#endregion
//#region src/agents/command/lifecycle.ts
const log$6 = createSubsystemLogger("agents/agent-command");
const formatLifecycleError = (error) => {
	const staleInstall = classifyGatewayStaleInstall(error);
	return staleInstall ? staleInstall.error.message : formatErrorMessageForDisplay(error, renderFailoverCodeUserCopy(getFailoverErrorCode(error)));
};
function resolveTerminalLogLevel(outcome) {
	if (!outcome.stopReason || outcome.stopReason === "end_turn") return;
	if (outcome.reason === "completed") return "info";
	return outcome.status === "timeout" ? "warn" : "error";
}
function applyAgentRunAbortMetadata(result, signal) {
	const abortFields = resolveAgentRunAbortLifecycleFields(signal);
	if (abortFields.aborted !== true) return result;
	return {
		...result,
		meta: {
			...result.meta,
			...abortFields
		}
	};
}
function createAgentCommandLifecycle(params) {
	let lifecycleFinishingEmitted = false;
	const resolveResultError = (runResult, includeErrorPayload) => params.state.lifecycleError ?? (includeErrorPayload ? runResult.payloads?.find((payload) => payload.isError === true && typeof payload.text === "string")?.text : void 0) ?? (runResult.meta.error ? runResult.meta.error.message.trim() || "Agent run failed" : void 0);
	const resolveTerminalError = (runResult, fallbackExhausted, terminal) => params.state.lifecycleError ?? (terminal.outcome.status === "timeout" ? terminal.outcome.error : resolveResultError(runResult, fallbackExhausted)) ?? (fallbackExhausted ? "All model fallback candidates failed" : "Agent run failed");
	const emitError = (error, extraData) => {
		if (params.state.lifecycleEnded) return;
		params.state.lifecycleEnded = true;
		emitAgentEvent({
			runId: params.runId,
			lifecycleGeneration: params.lifecycleGeneration(),
			stream: "lifecycle",
			data: {
				phase: "error",
				startedAt: params.startedAt,
				endedAt: Date.now(),
				error: formatLifecycleError(error),
				...extraData,
				executionSettled: true
			}
		});
	};
	const emitTerminalPhase = (phase, terminal, error = terminal.outcome.status === "timeout" ? terminal.outcome.error : void 0) => {
		const { aborted, yielded, replayInvalid, terminalReply } = terminal.metadata;
		const terminalDelivery = normalizeAgentRunTerminalDeliverySnapshot(terminal.metadata.terminalDelivery);
		const terminalReceipt = normalizeAgentRunTerminalReceipt(terminal.metadata.terminalReceipt);
		const { stopReason, livenessState, timeoutPhase, providerStarted } = terminal.outcome;
		const abortFields = resolveAgentRunAbortLifecycleFields(params.abortSignal);
		emitAgentEvent({
			runId: params.runId,
			lifecycleGeneration: params.lifecycleGeneration(),
			stream: "lifecycle",
			data: {
				phase,
				startedAt: params.startedAt,
				endedAt: Date.now(),
				aborted: typeof aborted === "boolean" ? aborted : false,
				stopReason,
				...yielded === true ? { yielded } : {},
				...replayInvalid === true ? { replayInvalid } : {},
				...livenessState ? { livenessState } : {},
				...timeoutPhase ? { timeoutPhase } : {},
				...providerStarted !== void 0 ? { providerStarted } : {},
				...error ? { error: formatErrorMessage(error) } : {},
				...error && params.state.lifecycleErrorObservation ? { errorObservation: params.state.lifecycleErrorObservation } : {},
				...phase !== "finishing" ? { executionSettled: true } : {},
				...terminalDelivery ? { terminalDelivery } : {},
				...terminalReceipt ? { terminalReceipt } : {},
				...terminalReply ? { terminalReply } : {},
				...stopReason === "superseded" ? {
					aborted: true,
					stopReason
				} : abortFields
			}
		});
	};
	return {
		emitBasicError(error, extraData) {
			emitError(error, {
				...params.state.lifecycleErrorObservation ? { errorObservation: params.state.lifecycleErrorObservation } : {},
				...extraData
			});
		},
		emitFinishing(terminal) {
			if (params.state.lifecycleEnded || params.state.lifecycleFinishing || lifecycleFinishingEmitted) return;
			lifecycleFinishingEmitted = true;
			params.state.lifecycleFinishing = true;
			emitTerminalPhase("finishing", terminal);
		},
		emitEnd(terminal) {
			if (params.state.lifecycleEnded) return;
			params.state.lifecycleEnded = true;
			const stopReason = terminal.outcome.stopReason;
			const logLevel = resolveTerminalLogLevel(terminal.outcome);
			if (logLevel) log$6[logLevel](`[agent] run ${params.runId} ended with stopReason=${stopReason}`);
			emitTerminalPhase("end", terminal);
		},
		resolveResultError,
		resolveTerminalError,
		emitResultError(runResult, fallbackExhausted, terminal) {
			if (params.state.lifecycleEnded) return;
			params.state.lifecycleEnded = true;
			const error = resolveTerminalError(runResult, fallbackExhausted, terminal);
			emitTerminalPhase("error", terminal, error);
		},
		emitPostTurnError(error, terminal) {
			if (params.state.lifecycleEnded) return;
			const terminalDelivery = normalizeAgentRunTerminalDeliverySnapshot(terminal.metadata.terminalDelivery);
			emitError(error, {
				...terminalDelivery ? { terminalDelivery } : {},
				...resolveAgentRunErrorLifecycleFields(error, params.abortSignal)
			});
		}
	};
}
//#endregion
//#region src/agents/command/session-helpers.ts
function clearPendingFinalDelivery(entry, updatedAt) {
	return {
		...entry,
		pendingFinalDelivery: void 0,
		restartRecoveryForceSafeTools: void 0,
		restartRecoveryDeliveryMediaUrls: void 0,
		restartRecoveryDisableMessageTool: void 0,
		restartRecoverySuppressTextDelivery: void 0,
		updatedAt
	};
}
async function prepareCurrentRunDelivery(params) {
	const { cfg, opts, sessionEntry } = params;
	if (opts.deliver !== true) return;
	const buildPlan = async (requestedChannel, preparedPlugin) => await resolveAgentDeliveryPlanWithSessionRoute({
		cfg,
		agentId: params.agentId,
		currentSessionKey: params.currentSessionKey,
		sessionEntry,
		requestedChannel,
		explicitTo: opts.replyTo ?? opts.to,
		explicitThreadId: opts.threadId,
		accountId: opts.replyAccountId ?? opts.accountId,
		wantsDelivery: true,
		turnSourceChannel: opts.runContext?.messageChannel ?? opts.messageChannel,
		turnSourceTo: opts.runContext?.currentChannelId ?? opts.to,
		turnSourceAccountId: opts.runContext?.accountId ?? opts.accountId,
		turnSourceThreadId: opts.runContext?.currentThreadTs ?? opts.threadId,
		preparedPlugin
	});
	let deliveryPlan = await buildPlan(opts.replyChannel ?? opts.channel);
	const explicitChannelHint = normalizeOptionalString(opts.replyChannel ?? opts.channel);
	const explicitThreadId = opts.threadId != null && opts.threadId !== "" ? opts.threadId : void 0;
	if (deliveryPlan.resolvedChannel === "webchat" && !explicitChannelHint) {
		const selection = await resolveMessageChannelSelection({ cfg });
		deliveryPlan = await buildPlan(selection.channel, selection.plugin);
	}
	if (deliveryPlan.targetResolutionError) throw deliveryPlan.targetResolutionError;
	if (!isDeliverableMessageChannel(deliveryPlan.resolvedChannel)) throw new Error("delivery channel is required: pass --channel/--reply-channel or use a main session with a previous channel");
	const targetMode = opts.deliveryTargetMode ?? deliveryPlan.deliveryTargetMode ?? (opts.replyTo ?? opts.to ? "explicit" : "implicit");
	const resolved = resolveAgentOutboundTarget({
		cfg,
		plan: deliveryPlan,
		targetMode,
		validateExplicitTarget: true
	});
	if (resolved.resolvedTarget && !resolved.resolvedTarget.ok) throw resolved.resolvedTarget.error;
	const resolvedTo = resolved.resolvedTo;
	if (!resolvedTo) throw new Error(`delivery target is required for ${deliveryPlan.resolvedChannel}`);
	const threadId = targetMode === "explicit" ? explicitThreadId ?? (deliveryPlan.baseDelivery.threadIdSource === "explicit" ? deliveryPlan.resolvedThreadId : void 0) : deliveryPlan.resolvedThreadId;
	const context = normalizeDeliveryContext({
		channel: deliveryPlan.resolvedChannel,
		to: resolvedTo,
		accountId: deliveryPlan.resolvedAccountId,
		threadId
	});
	return context ? {
		context,
		targetMode
	} : void 0;
}
function resolveInternalSessionEffectsSource(params) {
	if (!params.storePath || !params.sessionKey) return;
	return {
		agentId: params.agentId,
		sessionId: params.sessionId,
		sessionKey: params.sessionKey,
		storePath: params.storePath
	};
}
//#endregion
//#region src/agents/command/acp-execution.ts
const log$5 = createSubsystemLogger("agents/agent-command");
async function runAcpAgentCommand(params) {
	if (getInstallationTarget()) throw new Error(LOCAL_INSTALLATION_TARGET_UNSUPPORTED);
	const attemptExecutionRuntime = await loadAttemptExecutionRuntime();
	const acpToolTracker = attemptExecutionRuntime.createAcpToolLifecycleTracker();
	const startedAt = Date.now();
	const lifecycleContext = {
		runId: params.runId,
		agentId: params.sessionAgentId,
		lifecycleGeneration: params.lifecycleGeneration
	};
	const runtimeEventContext = {
		...lifecycleContext,
		toolTracker: acpToolTracker,
		sessionKey: params.sessionKey,
		abortSignal: params.opts.abortSignal
	};
	const coordination = isSubagentCoordinationInputProvenance(params.opts.inputProvenance);
	registerAgentRunContext(params.runId, {
		sessionKey: params.sessionKey,
		sessionId: params.sessionId,
		agentId: params.sessionAgentId,
		lifecycleGeneration: params.lifecycleGeneration,
		projectSessionActive: !params.suppressVisibleSessionEffects && !coordination,
		...params.suppressVisibleSessionEffects || coordination ? { isControlUiVisible: false } : {},
		...coordination ? { projectSessionMessages: false } : {}
	});
	attemptExecutionRuntime.emitAcpLifecycleStart({
		...lifecycleContext,
		startedAt
	});
	const visibleTextAccumulator = attemptExecutionRuntime.createAcpVisibleTextAccumulator();
	let stopReason;
	let resultStatus;
	let terminalOutcome;
	try {
		const { resolveAcpAgentPolicyError, resolveAcpDispatchPolicyError, resolveAcpExplicitTurnPolicyError } = await loadAcpPolicyRuntime();
		const turnPolicyError = params.opts.acpTurnSource === "manual_spawn" ? resolveAcpExplicitTurnPolicyError(params.cfg) : resolveAcpDispatchPolicyError(params.cfg);
		if (turnPolicyError) {
			terminalOutcome = "blocked";
			throw turnPolicyError;
		}
		const acpAgent = normalizeAgentId(params.acpResolution.meta.agent || resolveAgentIdFromSessionKey(params.sessionKey));
		const agentPolicyError = resolveAcpAgentPolicyError(params.cfg, acpAgent);
		if (agentPolicyError) {
			terminalOutcome = "blocked";
			throw agentPolicyError;
		}
		const acpImageAttachments = resolveInlineAgentImageAttachments(params.opts.images);
		assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
		const admittedRunContext = await params.preparedRunAdmission.admit("acp");
		const isElicitationActive = () => {
			if (params.opts.abortSignal?.aborted === true || getAdmittedRunDelegatedAuthority(admittedRunContext) === void 0) return false;
			try {
				assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
				return true;
			} catch {
				return false;
			}
		};
		const onElicitation = createLazyAcpElicitationHandler({
			sourceSessionKey: params.opts.inputProvenance?.sourceSessionKey ?? params.sessionKey,
			targetSessionKey: params.sessionKey,
			outerRequestId: params.runId,
			agentId: params.sessionAgentId,
			runId: params.runId,
			delivery: { deliver: async (_kind, payload) => {
				if (!isElicitationActive()) throw new Error("ACP input request is no longer active.");
				if (payload.text) attemptExecutionRuntime.emitAcpRuntimeEvent({
					...runtimeEventContext,
					event: {
						type: "status",
						text: payload.text,
						tag: "elicitation"
					}
				});
				return true;
			} },
			isActive: isElicitationActive
		});
		await params.acpManager.runTurn({
			admittedRunContext,
			cfg: params.cfg,
			sessionKey: params.sessionKey,
			agentId: params.sessionAgentId,
			provenance: params.provenance,
			text: params.body,
			attachments: acpImageAttachments.length > 0 ? acpImageAttachments : void 0,
			mode: "prompt",
			requestId: params.runId,
			signal: params.opts.abortSignal,
			onElicitation,
			onBeforePrompt: async () => {
				const recorder = params.opts.userTurnTranscriptRecorder;
				if (recorder && !recorder.hasPersisted() && !await recorder.persistApproved()) throw new Error("ACP input could not enter the session transcript");
				await params.opts.onExecutionStarted?.();
				assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
				params.opts.abortSignal?.throwIfAborted();
				if (!getAdmittedRunDelegatedAuthority(admittedRunContext)) throw new Error("ACP run authority is no longer active");
			},
			onLifecycle: (event) => {
				if (event.type === "prompt_submitted") attemptExecutionRuntime.emitAcpPromptSubmitted({
					runId: params.runId,
					sessionKey: params.sessionKey,
					at: event.at
				});
			},
			onEvent: (event) => {
				if (event.type !== "text_delta") attemptExecutionRuntime.emitAcpRuntimeEvent({
					...runtimeEventContext,
					event
				});
				if (event.type === "done") {
					stopReason = event.stopReason;
					resultStatus = event.status;
					return;
				}
				if (event.type !== "text_delta" || event.stream && event.stream !== "output" || !event.text) return;
				const visibleUpdate = visibleTextAccumulator.consume(event.text);
				if (visibleUpdate) attemptExecutionRuntime.emitAcpAssistantDelta({
					runId: params.runId,
					text: visibleUpdate.text,
					delta: visibleUpdate.delta
				});
			}
		});
		if (isAgentRunRestartAbortReason(params.opts.abortSignal?.reason)) throw params.opts.abortSignal?.reason;
	} catch (error) {
		const { toAcpRuntimeError } = await loadAcpRuntimeErrorsRuntime();
		const acpError = toAcpRuntimeError({
			error,
			fallbackCode: "ACP_TURN_FAILED",
			fallbackMessage: "ACP turn failed before completion."
		});
		attemptExecutionRuntime.emitAcpLifecycleError({
			...runtimeEventContext,
			error: acpError,
			...terminalOutcome ? { terminalOutcome } : {}
		});
		throw acpError;
	}
	const endFields = attemptExecutionRuntime.resolveAcpLifecycleEndFields(params.opts.abortSignal, stopReason, resultStatus);
	const finalTextRaw = visibleTextAccumulator.finalizeRaw();
	const finalText = visibleTextAccumulator.finalize();
	const terminalReply = visibleTextAccumulator.finalizeReplySnapshot();
	let sessionEntry = params.sessionEntry;
	try {
		const { resolveAcpSessionCwd } = await loadAcpSessionIdentifiersRuntime();
		const internalSource = params.suppressVisibleSessionEffects ? resolveInternalSessionEffectsSource({
			agentId: params.sessionAgentId,
			sessionId: params.sessionId,
			sessionKey: params.sessionKey,
			storePath: params.storePath
		}) : void 0;
		const internalTarget = params.suppressVisibleSessionEffects ? await prepareInternalSessionEffectsSession({
			agentId: params.sessionAgentId,
			cwd: resolveAcpSessionCwd(params.acpResolution.meta) ?? params.workspaceDir,
			runId: params.runId,
			source: internalSource,
			storePath: params.storePath
		}) : void 0;
		params.trackInternalModelRunTarget(internalTarget);
		const transcriptResult = await attemptExecutionRuntime.persistAcpTurnTranscript({
			body: params.body,
			transcriptBody: params.transcriptBody,
			inputProvenance: params.opts.inputProvenance,
			userTurnTranscriptRecorder: params.opts.userTurnTranscriptRecorder,
			...!params.opts.userTurnTranscriptRecorder && params.opts.suppressPromptPersistence !== true && params.opts.transcriptMedia?.length ? { userInput: {
				text: params.transcriptBody,
				media: params.opts.transcriptMedia
			} } : {},
			finalText: finalTextRaw,
			terminalOutcome: buildAgentRunTerminalOutcomeFromLifecycleEvent({
				phase: "end",
				data: endFields
			}),
			sessionId: internalTarget?.sessionId ?? params.sessionId,
			sessionKey: internalTarget?.sessionKey ?? params.sessionKey,
			sessionEntry: internalTarget?.sessionEntry ?? sessionEntry,
			sessionStore: params.suppressVisibleSessionEffects ? void 0 : params.sessionStore,
			storePath: internalTarget?.storePath ?? params.storePath,
			sessionAgentId: internalTarget?.agentId ?? params.sessionAgentId,
			threadId: params.opts.threadId,
			sessionCwd: resolveAcpSessionCwd(params.acpResolution.meta) ?? params.workspaceDir,
			config: params.cfg,
			runId: params.runId
		});
		if (!internalTarget) sessionEntry = transcriptResult.sessionEntry;
	} catch (error) {
		log$5.warn(`ACP transcript persistence failed for ${params.sessionKey}: ${formatErrorMessage(error)}`);
	}
	const restartAbortReason = params.opts.abortSignal?.reason;
	if (isAgentRunRestartAbortReason(restartAbortReason)) {
		attemptExecutionRuntime.emitAcpLifecycleError({
			...runtimeEventContext,
			error: restartAbortReason
		});
		throw restartAbortReason;
	}
	attemptExecutionRuntime.emitAcpLifecycleEnd({
		...lifecycleContext,
		toolTracker: acpToolTracker,
		endFields,
		terminalReply
	});
	const result = applyAgentRunAbortMetadata(attemptExecutionRuntime.buildAcpResult({
		payloadText: finalText,
		terminalReply,
		startedAt,
		stopReason,
		resultStatus,
		abortSignal: params.opts.abortSignal
	}), params.opts.abortSignal);
	await params.opts.beforeTerminalDelivery?.();
	const { deliverAgentCommandResult } = await loadDeliveryRuntime();
	const deliveryResult = await deliverAgentCommandResult({
		cfg: params.cfg,
		deps: params.deps,
		runtime: params.runtime,
		opts: params.opts,
		outboundSession: params.outboundSession,
		sessionEntry,
		result,
		payloads: result.payloads,
		assertDeliveryCurrent: () => assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration)
	});
	const outcome = buildAgentRunTerminalOutcomeFromLifecycleEvent({
		phase: "end",
		data: {
			status: resultStatus,
			stopReason
		},
		abortSignal: params.opts.abortSignal
	});
	return recordAgentRunTerminalOutcome(deliveryResult, classifyAgentRunTerminalOutcome(outcome) === "success" ? "completed" : "failed");
}
//#endregion
//#region src/agents/command/attempt-execution.shared.ts
/** Shared session persistence for agent attempt execution. */
/** Persists one session entry while keeping the caller's in-memory store aligned. */
async function persistAgentSession(params) {
	let rejectedMissingEntry = false;
	const persisted = await patchSessionEntryCore({
		agentId: params.agentId,
		sessionKey: params.sessionKey,
		storePath: params.storePath
	}, (_entry, context) => {
		const shouldPersistCurrent = params.shouldPersist?.(context.existingEntry);
		if (!context.existingEntry && shouldPersistCurrent !== true) {
			rejectedMissingEntry = true;
			return null;
		}
		if (shouldPersistCurrent === false) {
			rejectedMissingEntry = !context.existingEntry;
			return null;
		}
		if (!context.existingEntry) return {
			...params.entry,
			...params.creation ? buildSessionCreationStamp(params.creation) : {}
		};
		if (context.existingEntry.sessionId !== params.initialEntry.sessionId) return null;
		return mergeSessionSnapshotChanges({
			initial: params.initialEntry,
			next: params.entry,
			current: context.existingEntry
		});
	}, {
		fallbackEntry: params.sessionStore[params.sessionKey] ?? params.entry,
		replaceEntry: true,
		assertCommitAllowed: params.assertCommitAllowed,
		requireWriteSuccess: params.creation !== void 0
	});
	if (rejectedMissingEntry) {
		delete params.sessionStore[params.sessionKey];
		return;
	}
	if (persisted) params.sessionStore[params.sessionKey] = persisted;
	else delete params.sessionStore[params.sessionKey];
	return persisted ?? void 0;
}
//#endregion
//#region src/agents/command/assistant-transcript-repair.ts
const log$4 = createSubsystemLogger("agents/assistant-transcript-repair");
const EMPTY_USAGE = buildUsageWithNoCost({});
/** Records a final whose canonical transcript append failed. */
async function persistAssistantTranscriptRepairRecord(params) {
	const { context, replyText, provider, model, runOwnedSessionId } = params;
	if (!replyText.trim() || !context.sessionStore || !context.sessionKey.trim()) return;
	const now = Date.now();
	const existing = context.sessionStore[context.sessionKey] ?? context.sessionEntry;
	if (!existing) return;
	const nextRepair = {
		id: randomUUID(),
		text: replyText,
		...provider?.trim() ? { provider: provider.trim() } : {},
		...model?.trim() ? { model: model.trim() } : {},
		createdAt: now
	};
	try {
		await persistAgentSession({
			agentId: context.sessionAgentId,
			sessionStore: context.sessionStore,
			sessionKey: context.sessionKey,
			storePath: context.storePath,
			initialEntry: existing,
			entry: {
				...existing,
				pendingTranscriptRepair: [...existing.pendingTranscriptRepair ?? [], nextRepair],
				updatedAt: now
			},
			shouldPersist: (current) => current?.sessionId === runOwnedSessionId && current.abortedLastRun !== true
		});
	} catch (error) {
		log$4.warn(`Failed to persist assistant transcript repair record for ${context.sessionKey}: ${formatErrorMessage(error)}`);
	}
}
/**
* Restores missing assistant finals before another turn can observe or extend
* the transcript. Append failures are an admission barrier: continuing would
* give the model incomplete history and make the eventual append out of order.
*/
async function repairPendingAssistantTranscriptTurns(params) {
	const { context } = params;
	if (!context.sessionStore || !context.sessionKey) return;
	const entry = context.sessionStore[context.sessionKey] ?? context.sessionEntry;
	const backlog = entry?.pendingTranscriptRepair;
	if (!entry || !backlog?.length) return;
	const { appendExactAssistantMessageToSessionTranscript } = await loadTranscriptAppendRuntime();
	const pending = [...backlog];
	for (const item of pending) {
		let result;
		try {
			result = await appendExactAssistantMessageToSessionTranscript({
				agentId: context.sessionAgentId,
				sessionKey: context.sessionKey,
				expectedSessionId: entry.sessionId,
				storePath: context.storePath,
				config: context.config,
				updateMode: "file-only",
				idempotencyKey: `transcript-repair:${item.id}`,
				beforeMessageWrite: runAgentHarnessBeforeMessageWriteHook,
				message: {
					role: "assistant",
					content: [{
						type: "text",
						text: item.text
					}],
					api: "cli",
					provider: item.provider ?? "cli",
					model: item.model ?? "default",
					usage: EMPTY_USAGE,
					stopReason: "stop",
					timestamp: item.createdAt
				}
			});
		} catch (error) {
			log$4.warn(`Assistant transcript repair failed for ${context.sessionKey}: ${formatErrorMessage(error)}`);
			throw new Error("Previous assistant reply is still pending transcript recovery; retry.", { cause: error });
		}
		if (!result.ok && result.code !== "blocked") {
			log$4.warn(`Assistant transcript repair failed for ${context.sessionKey}: ${result.reason}`);
			throw new Error("Previous assistant reply is still pending transcript recovery; retry.");
		}
		if (result.ok) log$4.info(`Re-appended missing assistant transcript turn for ${context.sessionKey}`);
		else log$4.warn(`Dropped blocked assistant transcript repair for ${context.sessionKey}`);
	}
	const current = context.sessionStore[context.sessionKey];
	if (!current || current.sessionId !== entry.sessionId) return;
	try {
		await persistAgentSession({
			agentId: context.sessionAgentId,
			sessionStore: context.sessionStore,
			sessionKey: context.sessionKey,
			storePath: context.storePath,
			initialEntry: current,
			entry: {
				...current,
				pendingTranscriptRepair: void 0,
				updatedAt: Date.now()
			},
			shouldPersist: (latest) => latest?.sessionId === entry.sessionId
		});
	} catch (error) {
		log$4.warn(`Failed to clear assistant transcript repair record for ${context.sessionKey}: ${formatErrorMessage(error)}`);
	}
}
//#endregion
//#region src/agents/pending-final-delivery-marker.ts
/** Persists restart-recoverable final delivery markers for agent runs. */
async function persistPendingFinalDeliveryMarker(params) {
	const sendablePayloads = params.payloads.filter((payload) => normalizePendingFinalDeliveryPayloads([payload]).length > 0);
	const hasSendableFinalPayload = sendablePayloads.length > 0;
	const recoverableText = buildRecoverablePendingFinalDeliveryText(normalizePendingFinalRecoveryPayloads(params.payloads));
	if (!params.deliver || !params.sessionStore || !params.sessionKey || params.suppressVisibleSessionEffects || params.sessionReboundDuringRun || isSubagentSessionKey(params.sessionKey) || !hasSendableFinalPayload || !params.deliveryContext) return {
		sessionEntry: params.sessionEntry,
		pendingFinalDeliveryMarkerPersisted: false,
		hasSendableFinalPayload
	};
	const entry = params.sessionStore[params.sessionKey] ?? params.sessionEntry;
	if (!entry) return {
		sessionEntry: params.sessionEntry,
		pendingFinalDeliveryMarkerPersisted: false,
		hasSendableFinalPayload
	};
	params.assertCurrent?.();
	const sessionKey = resolveSqliteSessionKey(params.sessionKey, params.agentId);
	const now = Date.now();
	const intentId = randomUUID();
	const deliveryId = randomUUID();
	const harnessCompletion = entry.restartRecoveryHarnessCompletion ? structuredClone(entry.restartRecoveryHarnessCompletion) : void 0;
	const persisted = await applySessionEntryExactReplacements({
		agentId: params.agentId,
		sessionKeys: [sessionKey],
		storePath: params.storePath,
		assertCommitAllowed: params.assertCurrent,
		update: (entries) => {
			const current = entries.find((candidate) => candidate.sessionKey === sessionKey)?.entry;
			if (!current || current.sessionId !== params.runOwnedSessionId || current.abortedLastRun === true || harnessCompletion && (harnessCompletion.sessionId !== current.sessionId || harnessCompletion.lifecycleRevision !== current.lifecycleRevision || !isDeepStrictEqual(current.restartRecoveryHarnessCompletion, harnessCompletion))) return { result: current };
			const savedEvidence = harnessCompletion ? getRestartRecoveryTerminalDeliveryEvidence(current, harnessCompletion.sourceRunId) : void 0;
			const next = {
				...current,
				pendingFinalDelivery: {
					...recoverableText && params.commandOwnerReference === void 0 ? {
						kind: "replayable",
						text: recoverableText
					} : { kind: "transport-only" },
					intentId,
					deliveries: [{
						id: deliveryId,
						state: "prepared"
					}],
					createdAt: now,
					context: params.deliveryContext
				},
				...harnessCompletion && !savedEvidence ? { restartRecoveryTerminalDeliveryEvidence: mergeRestartRecoveryTerminalDeliveryEvidence(current.restartRecoveryTerminalDeliveryEvidence, [{
					runId: harnessCompletion.sourceRunId,
					harnessCompletion,
					deliveryContext: params.deliveryContext,
					captured: true
				}]) } : {},
				updatedAt: Math.max(current.updatedAt, now)
			};
			return {
				result: next,
				replacements: [{
					sessionKey,
					entry: next
				}]
			};
		}
	});
	if (persisted) params.sessionStore[params.sessionKey] = persisted;
	else delete params.sessionStore[params.sessionKey];
	const markerPersisted = persisted?.pendingFinalDelivery?.intentId === intentId;
	if (markerPersisted) for (const payload of sendablePayloads) setReplyPayloadMetadata(payload, {
		...harnessCompletion ? { sessionWriterDeliveryAuthority: {
			...getReplyPayloadMetadata(payload)?.sessionWriterDeliveryAuthority,
			agentId: harnessCompletion.requesterAgentId,
			expectedSessionId: params.runOwnedSessionId,
			...harnessCompletion.lifecycleRevision ? { expectedLifecycleRevision: harnessCompletion.lifecycleRevision } : {},
			sessionKey: params.sessionKey,
			storePath: params.storePath,
			harnessCompletion
		} } : {},
		pendingFinalDeliveryCompletion: {
			commandOwnerReference: params.commandOwnerReference,
			agentId: params.agentId,
			deliveryId,
			intentId,
			...entry.restartRecoveryDeliveryRunId ? { recoveryRunId: entry.restartRecoveryDeliveryRunId } : {},
			sessionId: params.runOwnedSessionId,
			sessionKey: params.sessionKey,
			storePath: params.storePath
		}
	});
	return {
		sessionEntry: persisted,
		pendingFinalDeliveryMarkerPersisted: markerPersisted,
		...markerPersisted ? { pendingFinalDeliveryIntentId: intentId } : {},
		hasSendableFinalPayload
	};
}
//#endregion
//#region src/agents/command/maintenance.ts
/** Build a new system-owned request, without retaining foreground callbacks or writer custody. */
function createCommandMaintenanceFollowup(params) {
	const { prepared, sessionEntry } = params;
	return createSessionMaintenanceFollowup({
		run: {
			agentId: prepared.sessionAgentId,
			agentDir: prepared.agentDir,
			workspaceDir: prepared.workspaceDir,
			cwd: prepared.cwd,
			messageProvider: params.embeddedSessionState.runContext.messageChannel,
			agentAccountId: params.embeddedSessionState.runContext.accountId,
			chatType: sessionEntry.chatType,
			groupId: params.embeddedSessionState.runContext.groupId ?? void 0,
			groupChannel: params.embeddedSessionState.runContext.groupChannel ?? void 0,
			groupSpace: params.embeddedSessionState.runContext.groupSpace ?? void 0,
			skillsSnapshot: params.embeddedSessionState.skillsSnapshot,
			thinkLevel: params.thinkLevel,
			verboseLevel: params.embeddedSessionState.resolvedVerboseLevel ?? "off",
			timeoutMs: prepared.timeoutMs,
			senderIsOwner: params.senderIsOwner
		},
		sessionEntry,
		cfg: prepared.cfg,
		sessionKey: prepared.sessionKey,
		provider: params.provider,
		model: params.model,
		auth: params.auth ?? {
			authProfileId: sessionEntry.authProfileOverride?.trim() || void 0,
			authProfileIdSource: resolveCollapsedSessionAuthPinSource(sessionEntry)
		}
	});
}
/** Bind recovery and runtime preparation to the accepted preflight successor. */
async function prepareCommandForegroundRun(params) {
	const budget = createCommandBudget(Date.now(), params.prepared.timeoutMs, params.opts.abortSignal);
	let entry;
	let timeoutMs;
	try {
		entry = params.opts.modelRun === true || params.opts.promptMode === "none" || params.suppressVisibleSessionEffects ? params.sessionEntry : await runCommandPreflightMaintenance({
			...params,
			opts: {
				...params.opts,
				abortSignal: budget.signal
			}
		});
		timeoutMs = budget.remainingMs();
		budget.signal.throwIfAborted();
	} finally {
		budget.dispose();
	}
	const prepared = {
		...params.prepared,
		timeoutMs,
		...entry ? {
			sessionId: entry.sessionId,
			sessionEntry: entry
		} : {}
	};
	if (entry && entry.sessionId !== params.prepared.sessionId) {
		params.modelSelection.sessionEntryForAttempt = {
			...params.modelSelection.sessionEntryForAttempt ?? entry,
			sessionId: entry.sessionId,
			lifecycleRevision: entry.lifecycleRevision
		};
		params.modelSelection.sessionFile = prepared.sessionKey ?? entry.sessionId;
	}
	params.modelSelection.sessionEntry = entry;
	params.embeddedSessionState.sessionEntry = entry;
	return {
		prepared,
		admission: prepareAgentCommandExecutionIdentity({
			opts: params.opts,
			prepared,
			ingress: params.ingress,
			lifecycleGeneration: params.lifecycleGeneration
		})
	};
}
/** Required checkpointing stays with the foreground owner before its first inference. */
async function runCommandPreflightMaintenance(params) {
	const { prepared, opts, sessionEntry, modelSelection } = params;
	const operatorAuthority = opts.operatorAuthority;
	const assertSourceCurrent = opts.assertSourceCurrent;
	if (prepared.isNewSession || !sessionEntry || !prepared.sessionKey || prepared.cfg.agents?.defaults?.compaction?.enabled === false) return sessionEntry;
	const assertActive = () => {
		opts.abortSignal?.throwIfAborted();
		assertSourceCurrent?.();
		operatorAuthority?.assertCurrent();
		assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
	};
	assertActive();
	const preflightAdmission = readPendingUserTurnTranscriptAdmission(opts.userTurnTranscriptRecorder);
	const memory = await loadAgentRunnerMemoryRuntime();
	assertActive();
	const followupRun = createCommandMaintenanceFollowup({
		...params,
		sessionEntry,
		provider: modelSelection.provider,
		model: modelSelection.model,
		thinkLevel: modelSelection.effectiveTurnThinkLevel,
		senderIsOwner: opts.senderIsOwner,
		auth: {
			authProfileId: modelSelection.sessionEntryForAttempt?.authProfileOverride,
			authProfileIdSource: resolveCollapsedSessionAuthPinSource(modelSelection.sessionEntryForAttempt)
		}
	});
	followupRun.operatorAuthority = operatorAuthority;
	followupRun.prompt = prepared.body;
	const maintenanceParams = {
		cfg: prepared.cfg,
		followupRun,
		promptForEstimate: prepared.body,
		defaultModel: modelSelection.defaultModel,
		sessionStore: prepared.sessionStore,
		sessionKey: prepared.sessionKey,
		runtimePolicySessionKey: prepared.sessionKey,
		storePath: prepared.storePath,
		isHeartbeat: opts.bootstrapContextRunKind === "heartbeat",
		abortSignal: opts.abortSignal
	};
	return memory.runSessionCompactionIfNeeded({
		...maintenanceParams,
		pendingUserEntryId: preflightAdmission?.entryId,
		sessionEntry,
		authorize: () => {
			assertActive();
			return true;
		},
		onSessionIdChanged: opts.onSessionIdChanged,
		onCompactionCommitted: (accepted) => params.onCommittedSessionId(accepted.sessionId),
		beforeCompaction: async (entry) => {
			const flushed = await memory.runMemoryFlushIfNeeded({
				...maintenanceParams,
				preflightAdmission,
				resolvedVerboseLevel: params.embeddedSessionState.resolvedVerboseLevel ?? "off",
				sessionEntry: entry
			});
			assertActive();
			return flushed.sessionEntry;
		}
	});
}
//#endregion
//#region src/agents/command/post-run.ts
const log$3 = createSubsystemLogger("agents/agent-command");
async function clearCommandRecoveryClaim(params) {
	const { sessionStore, sessionKey, storePath, runId } = params.prepared;
	if (params.sessionReboundDuringRun || !params.trackedRestartRecoveryDeliveryClaim || !sessionStore || !sessionKey) return;
	try {
		const entry = sessionStore[sessionKey] ?? params.sessionEntry;
		if (entry?.restartRecoveryDeliveryRunId === runId) await persistAgentSession({
			agentId: params.prepared.sessionAgentId,
			sessionStore,
			sessionKey,
			storePath,
			initialEntry: entry,
			entry: {
				...entry,
				...buildRestartRecoveryClaimCleanupPatch({
					entry,
					recordTerminalSource: true,
					terminalRunId: runId,
					terminalDeliveryEvidence: params.terminalDeliveryEvidence
				}),
				...buildMainSessionRecoveryClearPatch(entry),
				updatedAt: Date.now()
			},
			shouldPersist: (current) => shouldPersistRestartRecoveryCleanup(current, params.runOwnedSessionId, runId)
		});
	} catch (error) {
		log$3.warn(`failed to clear restart recovery delivery context for ${sessionKey}: ${coerceErrorMessage(error)}`);
	}
}
function createCompactionSessionIdReporter(sessionId, onSessionIdChanged) {
	let notifiedSessionId = sessionId;
	let pendingCompactionSessionId;
	const notifySessionIdChanged = (nextSessionId) => {
		notifiedSessionId = nextSessionId;
		pendingCompactionSessionId = void 0;
		onSessionIdChanged?.(nextSessionId);
	};
	return {
		onSessionIdChanged: notifySessionIdChanged,
		onCompactionCommitted: (nextSessionId) => {
			if (nextSessionId !== void 0) pendingCompactionSessionId = nextSessionId;
		},
		reportCommitted: () => {
			if (pendingCompactionSessionId !== void 0 && pendingCompactionSessionId !== notifiedSessionId) try {
				notifySessionIdChanged(pendingCompactionSessionId);
			} catch (error) {
				log$3.warn(`failed to report settled session identity: ${coerceErrorMessage(error)}`);
			}
		}
	};
}
async function finalizeEmbeddedAgentCommand(params) {
	const operatorAuthority = params.opts.operatorAuthority;
	const assertSourceCurrent = params.opts.assertSourceCurrent;
	const { cfg, body, transcriptBody, sessionId, sessionKey, sessionStore, storePath, sessionAgentId, workspaceDir, cwd, agentDir, timeoutMs, outboundSession, runId } = params.prepared;
	const { fallbackProvider, fallbackModel, fallbackExhausted, provider, model, effectiveTurnThinkLevel, internalSessionTarget, attemptExecutionRuntime, messageChannel, suppressUserTurnPersistence, userTurnTranscriptRecorder, fallbackTrajectoryRecorder, deferredLifecycle, lifecycle, terminal, lifecycleGeneration } = params.attempt;
	const { skillsSnapshot, runContext } = params.embeddedSessionState;
	const effectiveCwd = cwd ?? workspaceDir;
	const isHeartbeatLifecycleRun = isHeartbeatLifecycleRunKind(params.opts.bootstrapContextRunKind);
	let sessionEntry = params.sessionEntry;
	const terminalReply = normalizeAgentRunTerminalReplySnapshot(terminal.metadata.terminalReply);
	const terminalReceipt = normalizeAgentRunTerminalReceipt(terminal.metadata.terminalReceipt);
	let result = {
		...params.attempt.result,
		meta: {
			...params.attempt.result.meta,
			...terminalReply ? { terminalReply } : {},
			...terminalReceipt && params.attempt.result.meta.agentMeta ? { agentMeta: {
				...params.attempt.result.meta.agentMeta,
				terminalReceipt
			} } : {}
		}
	};
	let deliveryResult;
	let hasResultError;
	let terminalError;
	let maintenanceRequest;
	let { runOwnedSessionId, sessionReboundDuringRun } = params.sessionOwnership;
	const publishSessionOwnership = (committedCompactionSessionId) => {
		params.onSessionOwnershipChanged({
			runOwnedSessionId,
			sessionReboundDuringRun
		}, committedCompactionSessionId);
	};
	try {
		await fallbackTrajectoryRecorder?.flush();
		const finalVisiblePayload = result.payloads?.toReversed().find((payload) => !payload.isError && !payload.isReasoning && payload.text?.trim());
		const assistantTranscriptOwned = finalVisiblePayload !== void 0 && getReplyPayloadMetadata(finalVisiblePayload)?.assistantTranscriptOwned === true;
		if (params.opts.internalDeliveryMediaUrls !== void 0) result = {
			...result,
			payloads: constrainRestartRecoveryDeliveryPayloads(result.payloads, params.opts.internalDeliveryMediaUrls, params.opts.internalDeliverySuppressText === true)
		};
		const resultErrorPayload = result.payloads?.find((payload) => payload.isError === true);
		if (resultErrorPayload) {
			const message = typeof resultErrorPayload.text === "string" && resultErrorPayload.text.trim() ? resultErrorPayload.text : void 0;
			params.opts.onResultErrorPayload?.(message);
		}
		params.onTerminalDeliveryEvidenceChanged(buildRestartRecoveryTerminalDeliveryEvidence(result));
		const compactionFact = params.attempt.compactionAccounting;
		const effectiveSessionId = compactionFact?.target.sessionId ?? internalSessionTarget?.sessionId ?? sessionId;
		if (sessionStore && sessionKey && !params.suppressVisibleSessionEffects) {
			const { updateSessionStoreAfterAgentRun } = await loadSessionStoreRuntime();
			await updateSessionStoreAfterAgentRun({
				agentId: sessionAgentId,
				cfg,
				agentDir,
				sessionId: effectiveSessionId,
				sessionKey,
				storePath,
				sessionStore,
				defaultProvider: provider,
				defaultModel: model,
				fallbackProvider,
				fallbackModel,
				result,
				compactionAccounting: compactionFact,
				touchInteraction: params.opts.bootstrapContextRunKind !== "cron" && !isHeartbeatLifecycleRun && !params.opts.internalEvents?.length,
				touchActivity: !isHeartbeatLifecycleRun && !params.opts.internalEvents?.length,
				preserveRuntimeModel: fallbackExhausted || fallbackProvider !== provider || fallbackModel !== model || isHeartbeatLifecycleRun || params.preserveUserFacingSessionModelState,
				preserveUserFacingSessionModelState: params.preserveUserFacingSessionModelState,
				clearRestartRecoveryForceSafeTools: params.opts.forceRestartSafeTools === true && params.opts.deliver !== true
			});
			sessionEntry = sessionStore[sessionKey] ?? sessionEntry;
		}
		runOwnedSessionId = effectiveSessionId;
		publishSessionOwnership();
		const transcriptPersistenceRunner = result.meta.executionTrace?.runner;
		let persistedCliTurnTranscript = false;
		if (!sessionReboundDuringRun && transcriptPersistenceRunner === "cli") try {
			const transcriptResult = await attemptExecutionRuntime.persistCliTurnTranscript({
				body,
				transcriptBody,
				inputProvenance: params.opts.inputProvenance,
				result,
				sessionId: effectiveSessionId,
				sessionKey: internalSessionTarget?.sessionKey ?? sessionKey ?? effectiveSessionId,
				sessionEntry: internalSessionTarget?.sessionEntry ?? sessionEntry,
				sessionStore: params.suppressVisibleSessionEffects ? void 0 : sessionStore,
				storePath: internalSessionTarget?.storePath ?? storePath,
				sessionAgentId: internalSessionTarget?.agentId ?? sessionAgentId,
				threadId: params.opts.threadId,
				sessionCwd: effectiveCwd,
				config: cfg,
				runId,
				skipAssistantTurn: assistantTranscriptOwned,
				skipUserTurn: suppressUserTurnPersistence || params.opts.userTurnTranscriptRecorder !== void 0 || userTurnTranscriptRecorder.hasPersisted() || userTurnTranscriptRecorder.isBlocked()
			});
			sessionReboundDuringRun = transcriptResult.kind === "session-rebound";
			publishSessionOwnership();
			if (!internalSessionTarget) sessionEntry = transcriptResult.sessionEntry;
			persistedCliTurnTranscript = transcriptResult.kind === "persisted";
		} catch (error) {
			log$3.warn(`Turn transcript persistence failed for ${sessionKey ?? sessionId}: ${coerceErrorMessage(error)}`);
			if (sessionStore && sessionKey && !params.suppressVisibleSessionEffects && !sessionReboundDuringRun && !assistantTranscriptOwned) await persistAssistantTranscriptRepairRecord({
				context: {
					sessionKey: internalSessionTarget?.sessionKey ?? sessionKey ?? effectiveSessionId,
					sessionEntry: internalSessionTarget?.sessionEntry ?? sessionEntry,
					sessionStore,
					storePath: internalSessionTarget?.storePath ?? storePath,
					sessionAgentId: internalSessionTarget?.agentId ?? sessionAgentId,
					config: cfg
				},
				replyText: attemptExecutionRuntime.resolveCliTranscriptReplyText(result),
				provider: result.meta.agentMeta?.provider,
				model: result.meta.agentMeta?.model,
				runOwnedSessionId
			});
		}
		const payloads = result.payloads ?? [];
		const pendingFinalDeliveryMarker = await persistPendingFinalDeliveryMarker({
			assertCurrent: () => {
				assertSourceCurrent?.();
				operatorAuthority?.assertCurrent();
				assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
			},
			commandOwnerReference: params.opts.assertSourceCurrent?.recoveryReference,
			agentId: sessionAgentId,
			deliver: params.opts.deliver === true,
			sessionStore,
			sessionKey,
			sessionEntry,
			storePath,
			suppressVisibleSessionEffects: params.suppressVisibleSessionEffects,
			sessionReboundDuringRun,
			payloads: selectSourceDeliverablePayloads(payloads, params.opts),
			deliveryContext: params.currentRunDeliveryContext,
			runOwnedSessionId
		});
		sessionEntry = pendingFinalDeliveryMarker.sessionEntry;
		const resolveFreshSessionEntryForDelivery = sessionStore && sessionKey && !params.suppressVisibleSessionEffects ? async () => {
			const { loadSessionEntryReadOnly } = await loadSessionStoreRuntime();
			const freshEntry = loadSessionEntryReadOnly({
				agentId: sessionAgentId,
				storePath,
				sessionKey,
				readConsistency: "latest",
				clone: false
			});
			if (!freshEntry || freshEntry.sessionId !== runOwnedSessionId) return;
			sessionStore[sessionKey] = freshEntry;
			return freshEntry;
		} : void 0;
		const agentMeta = result.meta.agentMeta;
		const embeddedMaintenance = transcriptPersistenceRunner === "embedded" && agentMeta?.agentHarnessId === "openclaw" && params.attempt.maintenanceAuthProfile !== void 0 && !fallbackExhausted && terminal.outcome.status === "ok" && !resultErrorPayload && !result.meta.yielded && !result.meta.aborted && (compactionFact?.count ?? 0) === 0 && !params.preserveUserFacingSessionModelState && params.opts.modelRun !== true && params.opts.promptMode !== "none";
		maintenanceRequest = sessionEntry && sessionKey && sessionStore && !params.suppressVisibleSessionEffects && !sessionReboundDuringRun && !isHeartbeatLifecycleRun && cfg.agents?.defaults?.compaction?.enabled !== false && embeddedMaintenance ? {
			prepared: {
				cfg,
				sessionKey,
				storePath,
				timeoutMs
			},
			followupRun: createCommandMaintenanceFollowup({
				prepared: params.prepared,
				sessionEntry,
				embeddedSessionState: params.embeddedSessionState,
				provider: agentMeta?.provider ?? fallbackProvider,
				model: agentMeta?.model ?? fallbackModel,
				thinkLevel: effectiveTurnThinkLevel,
				auth: params.attempt.maintenanceAuthProfile,
				senderIsOwner: params.opts.senderIsOwner
			}),
			sessionId: runOwnedSessionId,
			lifecycleRevision: sessionEntry.lifecycleRevision,
			lifecycleGeneration,
			startedAt: params.attempt.startedAt,
			oneShotCliRun: params.opts.oneShotCliRun,
			agentHarnessId: agentMeta?.agentHarnessId,
			compactionRequestBudget: params.attempt.compactionRequestBudget
		} : void 0;
		if (persistedCliTurnTranscript && !params.suppressVisibleSessionEffects && (params.opts.deliver !== true || !pendingFinalDeliveryMarker.hasSendableFinalPayload || pendingFinalDeliveryMarker.pendingFinalDeliveryMarkerPersisted)) {
			const maintenance = createCommandBudget(params.attempt.startedAt, timeoutMs, params.opts.abortSignal);
			let maintenanceLifecycleRevision = sessionEntry?.lifecycleRevision;
			const authorize = () => {
				throwAgentRunRestartAbortReason(params.opts.abortSignal?.reason);
				assertSourceCurrent?.();
				operatorAuthority?.assertCurrent();
				assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
				return maintenance.remainingMs() > 0 && !maintenance.signal.aborted && !sessionReboundDuringRun;
			};
			const onCommitted = (accepted) => {
				sessionEntry = accepted.entry;
				maintenanceLifecycleRevision = accepted.entry.lifecycleRevision;
				runOwnedSessionId = accepted.sessionId;
				publishSessionOwnership(accepted.previousSessionId === void 0 ? void 0 : accepted.sessionId);
			};
			const assertActive = () => {
				if (!authorize()) throw new Error("Command compaction is no longer active");
			};
			try {
				if (maintenance.remainingMs() > 0) {
					const { runCliTurnCompactionLifecycle } = await loadCliCompactionRuntime();
					sessionEntry = await runCliTurnCompactionLifecycle({
						cfg,
						sessionId: sessionEntry?.sessionId ?? effectiveSessionId,
						sessionKey: sessionKey ?? effectiveSessionId,
						sessionEntry,
						sessionStore,
						storePath,
						sessionAgentId,
						workspaceDir,
						cwd: effectiveCwd,
						agentDir,
						provider: agentMeta?.provider ?? provider,
						model: agentMeta?.model ?? model,
						cliBackendId: result.meta.executionTrace?.winnerProvider,
						skillsSnapshot,
						messageChannel,
						agentAccountId: runContext.accountId,
						senderIsOwner: params.opts.senderIsOwner,
						thinkLevel: effectiveTurnThinkLevel,
						extraSystemPrompt: params.opts.extraSystemPrompt,
						pluginGeneration: params.prepared.commandRuntimeContext?.pluginGeneration,
						abortSignal: maintenance.signal
					}, {
						assertActive,
						sourceAuthority: {
							assertActive,
							operatorAuthority
						},
						onCommitted
					});
					throwAgentRunRestartAbortReason(params.opts.abortSignal?.reason);
					assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
					runOwnedSessionId = sessionEntry?.sessionId ?? runOwnedSessionId;
					publishSessionOwnership();
				}
			} catch (error) {
				throwAgentRunRestartAbortReason(params.opts.abortSignal?.reason);
				throwAgentRunRestartAbortReason(error);
				assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
				if (maintenance.signal.aborted) {
					params.opts.abortSignal?.throwIfAborted();
					const currentEntry = await resolveFreshSessionEntryForDelivery?.();
					params.opts.abortSignal?.throwIfAborted();
					assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
					if (!currentEntry || currentEntry.lifecycleRevision !== maintenanceLifecycleRevision) throw error;
					sessionEntry = currentEntry;
				} else if (params.opts.deliver !== true || !pendingFinalDeliveryMarker.pendingFinalDeliveryMarkerPersisted || !pendingFinalDeliveryMarker.hasSendableFinalPayload) throw error;
				log$3.warn(`Post-turn transcript compaction failed for ${sessionKey ?? sessionId}; continuing final delivery: ${formatErrorMessage(error)}`);
			} finally {
				maintenance.dispose();
			}
		}
		await params.opts.beforeTerminalDelivery?.();
		const { deliverAgentCommandResult } = await loadDeliveryRuntime();
		const deliveryParams = {
			cfg,
			deps: params.deps,
			runtime: params.runtime,
			opts: params.opts,
			outboundSession,
			sessionEntry,
			result,
			payloads,
			assertDeliveryCurrent: () => {
				params.opts.assertSourceCurrent?.();
				params.opts.abortSignal?.throwIfAborted();
				assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
			},
			onDeliveryResult: (delivered) => {
				const deliveryStatus = delivered.deliveryStatus;
				const terminalDelivery = normalizeAgentRunTerminalDeliverySnapshot(deliveryStatus && {
					status: deliveryStatus.status,
					resultCount: deliveryStatus.resultCount ?? 0
				});
				if (terminalDelivery) terminal.metadata.terminalDelivery = terminalDelivery;
				params.onTerminalDeliveryEvidenceChanged(buildRestartRecoveryTerminalDeliveryEvidence(delivered));
			}
		};
		deliveryResult = await deliverAgentCommandResult(resolveFreshSessionEntryForDelivery ? {
			...deliveryParams,
			expectedSessionIdForFreshDelivery: runOwnedSessionId,
			resolveFreshSessionEntryForDelivery
		} : deliveryParams);
		if (sessionStore && sessionKey && !isSubagentSessionKey(sessionKey) && !params.suppressVisibleSessionEffects && !sessionReboundDuringRun) {
			const entry = await resolveFreshSessionEntryForDelivery?.() ?? sessionStore[sessionKey] ?? sessionEntry;
			if (!entry) throw new Error("Cannot clear pending delivery without a session entry");
			const clearStaleTransportOnly = params.opts.deliver === true && !pendingFinalDeliveryMarker.hasSendableFinalPayload && entry.pendingFinalDelivery?.kind === "transport-only" && !entry.pendingFinalDelivery.deliveries?.length;
			const clearOwnedPendingFinal = deliveryResult?.deliverySucceeded === true && pendingFinalDeliveryMarker.pendingFinalDeliveryIntentId !== void 0;
			const recoveryClaimEntry = entry.restartRecoveryDeliveryRunId === runId ? entry : sessionEntry?.restartRecoveryDeliveryRunId === runId ? sessionEntry : params.sessionEntry?.restartRecoveryDeliveryRunId === runId ? params.sessionEntry : void 0;
			const clearsRecoveryCycle = entry.restartRecoveryDeliveryRunId === runId;
			if (clearOwnedPendingFinal || clearStaleTransportOnly || recoveryClaimEntry) {
				const now = Date.now();
				sessionEntry = await persistAgentSession({
					agentId: sessionAgentId,
					sessionStore,
					sessionKey,
					storePath,
					initialEntry: entry,
					entry: {
						...clearOwnedPendingFinal || clearStaleTransportOnly ? clearPendingFinalDelivery(entry, now) : {
							...entry,
							updatedAt: now
						},
						...recoveryClaimEntry ? buildRestartRecoveryClaimCleanupPatch({
							entry: {
								...recoveryClaimEntry,
								restartRecoveryTerminalDeliveryEvidence: entry.restartRecoveryTerminalDeliveryEvidence,
								restartRecoveryTerminalRunIds: entry.restartRecoveryTerminalRunIds
							},
							recordTerminalSource: true,
							terminalDeliveryEvidence: buildRestartRecoveryTerminalDeliveryEvidence(deliveryResult ?? result),
							terminalRunId: runId
						}) : {},
						...clearsRecoveryCycle ? buildMainSessionRecoveryClearPatch(entry) : {}
					},
					shouldPersist: (current) => shouldPersistCurrentRunSessionCleanup(current, runOwnedSessionId) && (!recoveryClaimEntry || current?.restartRecoveryDeliveryRunId === runId || !clearsRecoveryCycle && current?.restartRecoveryDeliveryRunId === void 0) && (!clearOwnedPendingFinal || current?.pendingFinalDelivery?.intentId === pendingFinalDeliveryMarker.pendingFinalDeliveryIntentId) && (!clearStaleTransportOnly || current?.pendingFinalDelivery?.kind === "transport-only" && current.pendingFinalDelivery.intentId === entry.pendingFinalDelivery?.intentId && !current.pendingFinalDelivery.deliveries?.length)
				});
			}
		}
		hasResultError = Boolean(fallbackExhausted || lifecycle.resolveResultError(result, false));
		terminalError = hasResultError ? lifecycle.resolveTerminalError(result, fallbackExhausted, terminal) : terminal.outcome.error;
		if (hasResultError) lifecycle.emitResultError(result, fallbackExhausted, terminal);
		else lifecycle.emitEnd(terminal);
	} catch (error) {
		lifecycle.emitPostTurnError(error, terminal);
		throw error;
	} finally {
		await deferredLifecycle.complete();
	}
	const outcome = deferredLifecycle.signal.aborted ? mergeAgentRunTerminalOutcome(terminal.outcome, buildAgentRunTerminalOutcomeFromLifecycleEvent({
		phase: "end",
		abortSignal: deferredLifecycle.signal
	})) : terminal.outcome;
	return {
		maintenance: classifyAgentRunTerminalOutcome(outcome) === "success" && !hasResultError && (params.opts.deliver !== true || deliveryResult?.deliverySucceeded === true) ? maintenanceRequest : void 0,
		deliveryResult: recordAgentRunTerminalOutcome(deliveryResult, hasResultError || classifyAgentRunTerminalOutcome(outcome) !== "success" ? "failed" : "completed", terminalError ? formatErrorMessage(terminalError) : void 0),
		sessionEntry,
		runOwnedSessionId,
		sessionReboundDuringRun
	};
}
//#endregion
//#region src/agents/command/cleanup.ts
/** Finishes durable cleanup before releasing the command's transient run owners. */
async function finishAgentCommandCleanup(params) {
	try {
		params.reportCommitted();
		await params.preparedRunAdmission?.finish();
		params.sessionWorkAdmission?.release();
		await params.cleanupInternalModelRunTargets();
		await clearCommandRecoveryClaim(params);
	} finally {
		try {
			await params.beforeTerminalDelivery?.();
		} finally {
			clearAgentRunContext(params.prepared.runId, params.lifecycleGeneration);
			params.sessionWorkAdmission?.release();
			params.releaseForeground?.();
		}
	}
}
//#endregion
//#region src/agents/command/ingress-diagnostics.ts
/** Emit the ingress-only model usage diagnostic after a completed agent run. */
function emitIngressModelUsageDiagnostic(result, opts, agentDir) {
	const cfg = getRuntimeConfig();
	if (!isDiagnosticsEnabled(cfg)) return;
	const agentMeta = result.meta?.agentMeta;
	const usage = agentMeta?.diagnosticUsage ?? agentMeta?.usage;
	if (!agentMeta || !hasBillableUsage(usage)) return;
	const providerUsed = agentMeta.provider ?? "";
	const modelUsed = agentMeta.model ?? "";
	const costUsd = estimateAggregateUsageCost({
		usage,
		provider: providerUsed,
		model: modelUsed,
		config: cfg,
		agentDir
	});
	emitTrustedDiagnosticEvent({
		type: "model.usage",
		sessionKey: opts.sessionKey,
		sessionId: agentMeta.sessionId,
		channel: opts.runContext?.messageChannel ?? opts.messageChannel ?? opts.channel ?? "http",
		agentId: opts.agentId,
		provider: providerUsed,
		model: modelUsed,
		usage: toDiagnosticUsage(usage),
		lastCallUsage: agentMeta.lastCallUsage,
		context: {
			limit: agentMeta.contextTokens,
			...agentMeta.promptTokens !== void 0 ? { used: agentMeta.promptTokens } : {}
		},
		costUsd,
		durationMs: result.meta?.durationMs
	});
}
//#endregion
//#region src/agents/command/model-selection-catalog.ts
function resolveDeferredSelection(params) {
	const entry = params.sessionEntry;
	if (!params.pluginsEnabled || !entry || params.hasExplicitRunOverride || !params.metadataSnapshot || entry.modelOverrideSource !== "auto" || !hasSessionAutoModelSelection(entry) || hasSessionActiveAutoModelFallback(entry) || resolveSessionModelOverrideRouteResolution(entry) !== "resolved") return;
	const provider = entry.providerOverride?.trim();
	const model = entry.modelOverride?.trim();
	if (!provider || !model || provider.includes("/") || model.includes("/")) return;
	if (!isModelSelectionLocked(entry) && repairProviderWrappedModelOverride({
		entry: { ...entry },
		defaultProvider: params.defaultProvider,
		defaultModel: params.defaultModel
	}).updated) return;
	const normalizedProvider = normalizeProviderId(provider);
	return [...params.metadataSnapshot.owners.modelCatalogProviders.keys()].some((catalogProvider) => normalizeProviderId(catalogProvider) === normalizedProvider) ? void 0 : {
		provider,
		model
	};
}
function prepareCommandModelCatalog(params) {
	const { cfg, metadataSnapshot, pluginsEnabled, workspaceDir } = params;
	const policyParams = {
		cfg,
		defaultProvider: params.defaultProvider,
		defaultModel: {
			provider: params.defaultProvider,
			model: params.defaultModel
		},
		agentId: params.agentId,
		allowManifestNormalization: true,
		allowPluginNormalization: pluginsEnabled,
		...params.modelManifestContext
	};
	let fullCatalog;
	const loadFullCatalog = () => {
		if (!fullCatalog) {
			const catalog = pluginsEnabled ? loadManifestModelCatalog({
				config: cfg,
				workspaceDir,
				metadataSnapshot,
				fallbackToMetadataScan: false
			}) : [];
			fullCatalog = {
				catalog,
				policy: createModelVisibilityPolicy({
					...policyParams,
					catalog
				})
			};
		}
		return fullCatalog;
	};
	const selection = resolveDeferredSelection(params);
	if (selection) {
		const configuredPolicy = createModelVisibilityPolicy({
			...policyParams,
			catalog: []
		});
		if (!configuredPolicy.hasProviderWildcards && configuredPolicy.exactModelRefs.every((ref) => parseProviderModelRef(ref) !== null) && hasResolvedThinkingCatalogEntry({
			catalog: configuredPolicy.configuredCatalog,
			...selection
		})) return {
			visibilityPolicy: configuredPolicy,
			modelCatalog: [],
			loadDeferredThinkingCatalog: () => loadFullCatalog().policy.catalog
		};
	}
	const loaded = loadFullCatalog();
	return {
		visibilityPolicy: loaded.policy,
		modelCatalog: loaded.catalog
	};
}
//#endregion
//#region src/agents/command/model-selection.ts
async function resolveEmbeddedModelSelection(params) {
	const operatorAuthority = params.opts.operatorAuthority;
	if (operatorAuthority) {
		assertAdmittedRunOperatorAuthority(operatorAuthority);
		operatorAuthority.assertCurrent();
	}
	const configuredDefaultRef = resolveDefaultModelForAgent({
		cfg: params.cfg,
		agentId: params.sessionAgentId,
		allowPluginNormalization: params.pluginsEnabled,
		...params.modelManifestContext
	});
	const configuredDefaultAuthProfileId = splitTrailingAuthProfile(resolveNativeModelPrimary(params.cfg, params.sessionAgentId) ?? "").profile;
	const { provider: defaultProvider, model: defaultModel } = configuredDefaultRef;
	let provider = defaultProvider;
	let model = defaultModel;
	let sessionEntry = params.sessionEntry;
	const initialModelOverrideSource = sessionEntry?.modelOverrideSource;
	const hasStoredOverride = Boolean(initialModelOverrideSource !== "default" && (sessionEntry?.modelOverride || sessionEntry?.providerOverride));
	let storedModelOverrideSource = hasStoredOverride && initialModelOverrideSource !== "default" ? initialModelOverrideSource : void 0;
	let hasStoredAutoFallbackProvenance = hasStoredOverride && hasSessionAutoModelFallbackProvenance(sessionEntry);
	let hasLegacyAutoFallbackOverrideWithoutOrigin = hasStoredOverride && hasLegacyAutoFallbackWithoutOrigin(sessionEntry);
	const explicitProviderOverride = typeof params.opts.provider === "string" ? normalizeExplicitOverrideInput(params.opts.provider, "provider") : void 0;
	const explicitModelOverride = typeof params.opts.model === "string" ? normalizeExplicitOverrideInput(params.opts.model, "model") : void 0;
	const hasExplicitRunOverride = Boolean(explicitProviderOverride || explicitModelOverride);
	if (hasExplicitRunOverride && isModelSelectionLocked(sessionEntry)) throw new ModelSelectionLockedError();
	if (hasExplicitRunOverride && params.opts.allowModelOverride !== true) throw new Error("Model override is not authorized for this caller.");
	const { visibilityPolicy, modelCatalog, loadDeferredThinkingCatalog } = prepareCommandModelCatalog({
		cfg: params.cfg,
		agentId: params.sessionAgentId,
		sessionEntry,
		hasExplicitRunOverride,
		metadataSnapshot: params.manifestMetadataSnapshot,
		pluginsEnabled: params.pluginsEnabled,
		workspaceDir: params.workspaceDir,
		defaultProvider,
		defaultModel,
		modelManifestContext: params.modelManifestContext
	});
	if ((!hasExplicitRunOverride || !operatorAuthority?.modelPolicy) && !isModelSelectionLocked(sessionEntry) && sessionEntry && params.sessionStore && params.sessionKey && hasStoredOverride && !isValidAgentHarnessSessionStoreEntry(params.sessionKey, sessionEntry) && !params.suppressVisibleSessionEffects) {
		const initialEntry = sessionEntry;
		const entry = { ...sessionEntry };
		let entryUpdated = false;
		if (hasLegacyAutoFallbackOverrideWithoutOrigin) {
			const { updated } = applyModelOverrideToSessionEntry({
				entry,
				selection: {
					provider: defaultProvider,
					model: defaultModel,
					isDefault: true
				}
			});
			if (updated) {
				storedModelOverrideSource = void 0;
				entryUpdated = true;
			}
		}
		const repaired = repairProviderWrappedModelOverride({
			entry,
			defaultProvider,
			defaultModel
		});
		entryUpdated ||= repaired.updated;
		const directOverride = resolveDirectStoredModelOverride({
			sessionEntry: entry,
			defaultProvider,
			allowPluginNormalization: params.pluginsEnabled,
			...params.modelManifestContext
		});
		if (directOverride) {
			const normalizedOverride = {
				provider: directOverride.provider ?? defaultProvider,
				model: directOverride.model
			};
			if (!hasSessionAutoModelSelection(entry) && !visibilityPolicy.allows(normalizedOverride)) {
				const { updated } = applyModelOverrideToSessionEntry({
					entry,
					selection: {
						provider: defaultProvider,
						model: defaultModel,
						isDefault: true
					}
				});
				entryUpdated ||= updated;
			}
		}
		if (entryUpdated) {
			sessionEntry = await persistAgentSession({
				agentId: params.sessionAgentId,
				sessionStore: params.sessionStore,
				sessionKey: params.sessionKey,
				storePath: params.storePath,
				initialEntry,
				entry,
				assertCommitAllowed: operatorAuthority?.assertCurrent
			});
			const adoptedModelOverrideSource = sessionEntry?.modelOverrideSource;
			const adoptedHasStoredOverride = adoptedModelOverrideSource !== "default" && Boolean(sessionEntry?.modelOverride || sessionEntry?.providerOverride);
			storedModelOverrideSource = adoptedHasStoredOverride ? adoptedModelOverrideSource : void 0;
			hasStoredAutoFallbackProvenance = adoptedHasStoredOverride && hasSessionAutoModelFallbackProvenance(sessionEntry);
			hasLegacyAutoFallbackOverrideWithoutOrigin = adoptedHasStoredOverride && hasLegacyAutoFallbackWithoutOrigin(sessionEntry);
		}
	}
	if (isModelSelectionLocked(sessionEntry)) hasLegacyAutoFallbackOverrideWithoutOrigin = false;
	const effectiveStoredOverride = hasLegacyAutoFallbackOverrideWithoutOrigin ? null : resolveStoredModelOverrideCore({
		sessionEntry,
		sessionStore: params.sessionStore,
		sessionKey: params.sessionKey,
		parentSessionKey: sessionEntry?.parentSessionKey,
		defaultProvider,
		allowPluginNormalization: params.pluginsEnabled,
		...params.modelManifestContext
	});
	if (effectiveStoredOverride?.source === "parent") {
		storedModelOverrideSource = void 0;
		hasStoredAutoFallbackProvenance = false;
	}
	const canUseStoredOverrideFields = sessionEntry?.modelOverrideSource !== "default";
	const storedProviderOverride = hasLegacyAutoFallbackOverrideWithoutOrigin ? void 0 : effectiveStoredOverride?.provider ?? (canUseStoredOverrideFields ? sessionEntry?.providerOverride?.trim() : void 0);
	const storedModelOverride = hasLegacyAutoFallbackOverrideWithoutOrigin ? void 0 : effectiveStoredOverride?.model ?? (canUseStoredOverrideFields ? sessionEntry?.modelOverride?.trim() : void 0);
	const storedModelOverrideRouteResolution = effectiveStoredOverride?.routeResolution;
	const hasStoredAutomaticSelection = effectiveStoredOverride?.source === "session" && hasSessionAutoModelSelection(sessionEntry);
	const currentRunModelChannel = [
		params.runContext.messageChannel,
		params.opts.replyChannel,
		params.opts.channel
	].find((channel) => Boolean(channel && isDeliverableMessageChannel(channel)));
	const channelOverrideGroupId = currentRunModelChannel ? params.runContext.groupId ?? sessionEntry?.groupId ?? params.runContext.currentChannelId : sessionEntry?.groupId ?? params.runContext.groupId ?? params.runContext.currentChannelId;
	const channelModelOverride = params.cfg.channels?.modelByChannel && !hasExplicitRunOverride ? resolveChannelModelOverride({
		cfg: params.cfg,
		channel: currentRunModelChannel ?? sessionDeliveryChannel(sessionEntry),
		groupId: channelOverrideGroupId,
		groupChatType: sessionEntry?.chatType ?? sessionDeliveryOrigin(sessionEntry)?.chatType,
		groupChannel: params.runContext.groupChannel ?? sessionEntry?.groupChannel,
		groupSubject: sessionEntry?.subject,
		parentSessionKey: sessionEntry?.parentSessionKey ?? params.sessionKey,
		directUserIds: [
			sessionDeliveryOrigin(sessionEntry)?.nativeDirectUserId,
			sessionDeliveryOrigin(sessionEntry)?.from,
			sessionDeliveryOrigin(sessionEntry)?.to
		]
	}) : null;
	const normalizedChannelOverride = channelModelOverride ? parseAgentCommandModelRef(params.cfg, params.sessionAgentId, channelModelOverride.model, defaultProvider, params.modelManifestContext) : null;
	const primaryProvider = normalizedChannelOverride?.provider ?? defaultProvider;
	const primaryModel = normalizedChannelOverride?.model ?? defaultModel;
	if (normalizedChannelOverride && !Boolean(storedProviderOverride || storedModelOverride)) {
		provider = normalizedChannelOverride.provider;
		model = normalizedChannelOverride.model;
	}
	if (storedModelOverride) {
		const candidateProvider = storedProviderOverride || defaultProvider;
		const storedRouteCataloged = modelCatalog.some((entry) => entry.provider === candidateProvider && entry.id === storedModelOverride);
		const normalizedStored = (storedModelOverrideRouteResolution === "raw" && !storedRouteCataloged ? resolveModelAliasFromPair({
			cfg: params.cfg,
			agentId: params.sessionAgentId,
			provider: candidateProvider,
			model: storedModelOverride,
			defaultProvider,
			aliasIndex: visibilityPolicy.selectionAliasIndex,
			allowPluginNormalization: params.pluginsEnabled,
			...params.modelManifestContext
		}) : null) ?? {
			provider: candidateProvider,
			model: storedModelOverride
		};
		if (isModelSelectionLocked(sessionEntry) || hasStoredAutomaticSelection || visibilityPolicy.allows(normalizedStored)) {
			provider = normalizedStored.provider;
			model = normalizedStored.model;
		}
	}
	const autoFallbackPrimaryProbe = !hasExplicitRunOverride && !isModelSelectionLocked(sessionEntry) && (operatorAuthority?.modelPolicy?.allows({
		provider: primaryProvider,
		model: primaryModel
	}) ?? true) ? resolveAutoFallbackPrimaryProbe({
		entry: sessionEntry,
		sessionKey: params.sessionKey,
		primaryProvider,
		primaryModel
	}) : void 0;
	let autoFallbackPrimaryProbeSessionEntry;
	if (autoFallbackPrimaryProbe && sessionEntry) {
		provider = autoFallbackPrimaryProbe.provider;
		model = autoFallbackPrimaryProbe.model;
		autoFallbackPrimaryProbeSessionEntry = { ...sessionEntry };
		clearAutoFallbackPrimaryProbeSelection(autoFallbackPrimaryProbeSessionEntry);
	}
	if (hasExplicitRunOverride) {
		const explicitRef = explicitProviderOverride ? normalizeAgentCommandModelRef(params.cfg, explicitProviderOverride, explicitModelOverride ?? model, params.modelManifestContext) : explicitModelOverride ? parseAgentCommandModelRef(params.cfg, params.sessionAgentId, explicitModelOverride, provider, params.modelManifestContext) : null;
		if (!explicitRef) throw new Error("Invalid model override.");
		assertOperatorModelAllowed(operatorAuthority, explicitRef);
		if (!visibilityPolicy.allows(explicitRef)) {
			const rejectedKey = `${sanitizeForLog(explicitRef.provider)}/${sanitizeForLog(explicitRef.model)}`;
			const policyPath = visibilityPolicy.allowConfigPath ?? "modelPolicy.allow";
			const repairPath = visibilityPolicy.allowRepairConfigPath;
			throw new Error(`Model override "${rejectedKey}" is not allowed for agent "${params.sessionAgentId}" by ${policyPath}. Add "${rejectedKey}" or "${sanitizeForLog(explicitRef.provider)}/*" to ${repairPath}, or remove/empty the list to allow any model.`);
		}
		provider = explicitRef.provider;
		model = explicitRef.model;
	}
	const allowedInitialSelection = isModelSelectionLocked(sessionEntry) || hasStoredAutomaticSelection && !hasExplicitRunOverride && !autoFallbackPrimaryProbe ? {
		provider,
		model
	} : visibilityPolicy.resolveSelection({
		provider,
		model,
		routeResolution: "resolved"
	});
	if (!allowedInitialSelection) {
		const policyPath = visibilityPolicy.allowConfigPath ?? "modelPolicy.allow";
		throw new Error(`Configured default model "${buildModelCatalogRef(provider, model)}" is not allowed by ${policyPath}, and no allowed model is available.`);
	}
	const operatorSelection = hasExplicitRunOverride || isModelSelectionLocked(sessionEntry) ? allowedInitialSelection : resolveOperatorModelDefault({
		cfg: params.cfg,
		agentId: params.sessionAgentId,
		...params.modelManifestContext,
		policy: operatorAuthority?.modelPolicy,
		model: allowedInitialSelection,
		allows: visibilityPolicy.allows
	});
	assertOperatorModelAllowed(operatorAuthority, operatorSelection);
	if (!operatorSelection) throw new Error("No model is available for this operator role and agent.");
	provider = operatorSelection.provider;
	model = operatorSelection.model;
	const operatorModelOverride = provider !== allowedInitialSelection.provider || model !== allowedInitialSelection.model;
	const providerForAuthProfileValidation = provider;
	let sessionEntryForAttempt = autoFallbackPrimaryProbeSessionEntry ?? sessionEntry;
	const initialAgentHarnessRuntimeOverride = resolveSessionRuntimeOverrideForProvider({
		provider,
		entry: sessionEntryForAttempt,
		cfg: params.cfg
	});
	await ensureSelectedAgentHarnessPlugin({
		config: params.cfg,
		provider,
		modelId: model,
		agentId: params.sessionAgentId,
		sessionKey: params.sessionKey,
		agentHarnessRuntimeOverride: initialAgentHarnessRuntimeOverride,
		workspaceDir: params.workspaceDir,
		pluginRegistry: requireActivePluginRegistry()
	});
	assertOperatorModelAllowed(operatorAuthority, {
		provider,
		model
	});
	const authProfileId = sessionEntryForAttempt?.authProfileOverride;
	if (sessionEntryForAttempt && authProfileId) {
		const entry = sessionEntryForAttempt;
		const authConfig = resolveModelProviderAuthConfig({
			config: params.cfg,
			provider: providerForAuthProfileValidation,
			modelId: model,
			workspaceDir: params.workspaceDir,
			metadataSnapshot: params.pluginsEnabled ? params.manifestMetadataSnapshot : { plugins: [] }
		});
		const agentDir = resolveAgentDir(params.cfg, params.sessionAgentId);
		const store = ensureAuthProfileStore(agentDir, {
			profileId: authProfileId,
			config: params.cfg,
			allowKeychainPrompt: false
		});
		const profile = store.profiles[authProfileId];
		const validationHarnessPolicy = resolveAvailableAgentHarnessPolicy({
			provider: providerForAuthProfileValidation,
			modelId: model,
			config: params.cfg,
			agentId: params.sessionAgentId,
			sessionKey: params.sessionKey
		});
		const authAliasLookupParams = {
			config: authConfig,
			workspaceDir: params.workspaceDir,
			...params.pluginsEnabled ? params.manifestMetadataSnapshot ? { metadataSnapshot: params.manifestMetadataSnapshot } : {} : { metadataSnapshot: { plugins: [] } }
		};
		const acceptedAuthProviders = listOpenAIAuthProfileProvidersForAgentRuntime({
			provider: providerForAuthProfileValidation,
			harnessRuntime: validationHarnessPolicy.runtime,
			config: params.cfg
		}).map((candidateProvider) => params.pluginsEnabled ? resolveProviderIdForAuth(candidateProvider, authAliasLookupParams) : candidateProvider);
		const profileMatchesRuntime = profile && acceptedAuthProviders.some((candidateProvider) => isStoredCredentialCompatibleWithAuthProvider({
			cfg: authConfig,
			authAliasLookupParams,
			provider: candidateProvider,
			credential: profile
		}));
		const preserveUnavailableSelection = shouldPreserveUnavailableSessionAuthProfileOverride({
			store,
			cfg: authConfig,
			agentDir,
			entry,
			currentProvider: entry.providerOverride ?? defaultProvider,
			provider: providerForAuthProfileValidation,
			metadataSnapshot: params.pluginsEnabled ? params.manifestMetadataSnapshot : { plugins: [] }
		});
		if (!profileMatchesRuntime && !preserveUnavailableSelection) {
			if (hasExplicitRunOverride || autoFallbackPrimaryProbe || operatorModelOverride) sessionEntryForAttempt = {
				...entry,
				authProfileOverride: void 0,
				authProfileOverrideSource: void 0,
				authProfileOverrideCompactionCount: void 0
			};
			else if (params.sessionStore && params.sessionKey && !params.suppressVisibleSessionEffects) await clearSessionAuthProfileOverride({
				agentId: params.sessionAgentId,
				sessionEntry: entry,
				sessionStore: params.sessionStore,
				sessionKey: params.sessionKey,
				storePath: params.storePath
			});
		}
	}
	const configuredThinkLevel = normalizeThinkLevel(resolveAgentConfig(params.cfg, params.sessionAgentId)?.thinkingDefault);
	const immutableThinkLevel = params.requestedThinkLevel ?? configuredThinkLevel;
	const primaryConfiguredThinkLevel = immutableThinkLevel ?? resolveConfiguredThinkingDefaultCore({
		cfg: params.cfg,
		agentId: params.sessionAgentId,
		provider,
		model
	});
	const thinkingRuntime = resolveEffectiveAgentRuntime({
		cfg: params.cfg,
		provider,
		modelId: model,
		agentId: params.sessionAgentId,
		sessionKey: params.sessionKey,
		sessionEntry: sessionEntryForAttempt
	});
	let catalogForThinking = visibilityPolicy.catalog.length > 0 ? visibilityPolicy.catalog : params.configuredThinkingCatalog;
	if (params.pluginsEnabled && (primaryConfiguredThinkLevel !== "off" || thinkingRuntime !== "openclaw") && needsThinkHydration(catalogForThinking, provider, model, thinkingRuntime)) {
		const { loadProviderScopedThinkingCatalog } = await import("./agents/model-catalog.runtime.js");
		const runtimeCatalog = normalizeThinkingCatalogProviders(await loadProviderScopedThinkingCatalog({
			config: params.cfg,
			provider,
			model,
			agentRuntime: thinkingRuntime,
			...params.sessionAgentId ? { agentId: params.sessionAgentId } : {},
			...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {}
		}));
		const refreshedModel = findModelInCatalog(runtimeCatalog, provider, model);
		if (refreshedModel) catalogForThinking = createModelVisibilityPolicy({
			cfg: params.cfg,
			catalog: dedupeModelCatalogEntries([refreshedModel, ...catalogForThinking]),
			defaultProvider,
			defaultModel: configuredDefaultRef,
			agentId: params.sessionAgentId,
			allowManifestNormalization: true,
			allowPluginNormalization: params.pluginsEnabled,
			...params.modelManifestContext
		}).catalog;
	}
	const thinkingCatalog = catalogForThinking.length > 0 ? catalogForThinking : void 0;
	const primaryThinking = resolveThinkingSelectionCore({
		cfg: params.cfg,
		agentId: params.sessionAgentId,
		provider,
		model,
		level: primaryConfiguredThinkLevel,
		catalog: thinkingCatalog,
		agentRuntime: thinkingRuntime
	});
	if (!primaryThinking.supported) {
		const explicitThink = Boolean(params.thinkOnce || params.thinkOverride);
		const isSubagentSpawnRun = params.isSubagentLane && isSubagentSessionKey(params.sessionKey);
		if (explicitThink && !isSubagentSpawnRun) throw new Error(`Thinking level "${primaryThinking.requestedLevel}" is not supported for ${provider}/${model}. Use one of: ${formatThinkingLevels(provider, model, ", ", thinkingCatalog, thinkingRuntime)}.`);
	}
	if (params.thinkOverride && params.sessionStore && params.sessionKey && !params.suppressVisibleSessionEffects) {
		const now = Date.now();
		const entry = params.sessionStore[params.sessionKey] ?? sessionEntry ?? {
			sessionId: params.sessionId,
			updatedAt: now,
			sessionStartedAt: now
		};
		const next = {
			...entry,
			sessionId: params.sessionId,
			updatedAt: now,
			sessionStartedAt: entry.sessionStartedAt ?? now,
			lastInteractionAt: now,
			thinkingLevel: params.thinkOverride
		};
		sessionEntry = await persistAgentSession({
			agentId: params.sessionAgentId,
			sessionStore: params.sessionStore,
			sessionKey: params.sessionKey,
			storePath: params.storePath,
			initialEntry: entry,
			entry: next,
			assertCommitAllowed: operatorAuthority?.assertCurrent
		}) ?? sessionEntry;
		sessionEntryForAttempt = {
			...sessionEntryForAttempt ?? next,
			thinkingLevel: params.thinkOverride
		};
	}
	const { resolveSessionTranscriptFile } = await loadTranscriptResolveRuntime();
	assertOperatorModelAllowed(operatorAuthority, {
		provider,
		model
	});
	const hasKeyedSessionStore = Boolean(params.sessionStore && params.sessionKey);
	const resolvedSessionFile = await resolveSessionTranscriptFile({
		sessionKey: params.sessionKey ?? params.sessionId,
		sessionStore: hasKeyedSessionStore && !params.suppressVisibleSessionEffects ? params.sessionStore : void 0,
		sessionEntry
	});
	const sessionFile = resolvedSessionFile.sessionFile;
	sessionEntry = resolvedSessionFile.sessionEntry;
	return {
		sessionEntry,
		provider,
		model,
		requestedRouteResolution: "resolved",
		defaultProvider,
		defaultModel,
		configuredDefaultAuthProfileId,
		providerForAuthProfileValidation,
		hasExplicitRunOverride,
		storedProviderOverride,
		storedModelOverride,
		storedModelOverrideSource,
		hasStoredAutoFallbackProvenance,
		autoFallbackPrimaryProbe,
		sessionEntryForAttempt,
		thinkingCatalog,
		...loadDeferredThinkingCatalog ? { loadDeferredThinkingCatalog } : {},
		immutableThinkLevel,
		effectiveTurnThinkLevel: primaryThinking.requestedLevel,
		sessionFile
	};
}
//#endregion
//#region src/agents/command/compaction-accounting.ts
/** Keeps command context observations and completed counts on their original writer. */
function createCommandCompactionAccounting(params) {
	let accounting;
	let requestBudget;
	return {
		get fact() {
			return accounting;
		},
		get requestBudget() {
			return requestBudget;
		},
		beginCandidate(signal) {
			let acceptsRequestBudget = true;
			requestBudget = void 0;
			if (accounting?.currentContextSnapshot) accounting = {
				...accounting,
				currentContextSnapshot: { tokens: void 0 }
			};
			let candidateFact;
			return {
				observeRequestBudget: (budget) => {
					if (acceptsRequestBudget && !signal?.aborted) requestBudget = budget;
				},
				observe: (fact) => {
					if (fact?.kind === "durable" && fact.count === 0 && accounting && !hasSameCompactionWriter(accounting.target, fact.target)) return;
					candidateFact = fact;
					if (fact?.kind === "durable") params.onDurableFact(fact);
				},
				async finish(sessionEntry) {
					acceptsRequestBudget = false;
					const fact = candidateFact;
					if (fact?.kind !== "durable") return;
					const carriedCount = hasSameCompactionWriter(accounting?.target, fact.target) ? accounting?.count ?? 0 : 0;
					accounting = {
						...fact,
						count: carriedCount + fact.count,
						currentContextSnapshot: fact.currentContextSnapshot ?? accounting?.currentContextSnapshot
					};
					if (fact.count > 0 && params.persistCounts) {
						await incrementCompactionCount({
							agentId: fact.target.agentId,
							sessionEntry,
							sessionStore: params.sessionStore,
							sessionKey: fact.target.sessionKey,
							storePath: fact.target.storePath,
							expectedSession: fact.target,
							amount: fact.count,
							tokensAfter: fact.currentContextSnapshot?.tokens
						});
						params.refreshSessionEntry(fact.target.sessionKey);
					}
				}
			};
		}
	};
}
//#endregion
//#region src/agents/command/run-embedded-attempt.ts
const log$2 = createSubsystemLogger("agents/agent-command");
const MAX_LIVE_SWITCH_RETRIES = 5;
async function runEmbeddedAgentAttempt(params) {
	const { cfg, body, transcriptBody, sessionId, sessionKey, sessionStore, storePath, sessionAgentId, workspaceDir, cwd, agentDir, runId, pluginsEnabled, manifestMetadataSnapshot, modelManifestContext, normalizedSpawned, isNewSession, timeoutMs, runTimeoutOverrideMs } = params.prepared;
	const { runContext, skillsSnapshot, resolvedVerboseLevel } = params.embeddedSessionState;
	const { defaultProvider, defaultModel, configuredDefaultAuthProfileId, hasExplicitRunOverride, storedProviderOverride, hasStoredAutoFallbackProvenance, autoFallbackPrimaryProbe, immutableThinkLevel, sessionFile } = params.modelSelection;
	let { provider, model, providerForAuthProfileValidation, sessionEntryForAttempt, storedModelOverride, storedModelOverrideSource, effectiveTurnThinkLevel } = params.modelSelection;
	const thinkingCatalog = params.modelSelection.thinkingCatalog;
	let sessionEntry = params.sessionEntry;
	let lifecycleGeneration = params.lifecycleGeneration;
	const sessionEffectsSource = resolveInternalSessionEffectsSource({
		agentId: sessionAgentId,
		sessionId,
		sessionKey,
		storePath
	});
	const internalSessionTarget = params.suppressVisibleSessionEffects ? await prepareInternalSessionEffectsSession({
		agentId: sessionAgentId,
		cwd: cwd ?? workspaceDir,
		runId,
		source: sessionEffectsSource,
		storePath
	}) : void 0;
	params.trackInternalModelRunTarget(internalSessionTarget);
	let attemptSessionTarget = internalSessionTarget ?? sessionEffectsSource;
	const attemptSessionFile = internalSessionTarget?.sessionFile ?? sessionFile;
	const startedAt = Date.now();
	const attemptLifecycleState = {
		currentTurnUserMessagePersisted: false,
		lifecycleFinishing: false,
		lifecycleEnded: false
	};
	const attemptLifecycleCallbacks = createAgentAttemptLifecycleCallbacks(attemptLifecycleState, params.preparedRunAdmission.onRuntimeTurnStarted);
	const transcriptMedia = params.opts.transcriptMedia ?? [];
	const hasTranscriptMedia = transcriptMedia.length > 0;
	const suppressUserTurnPersistence = params.opts.suppressPromptPersistence === true || params.opts.transcriptMessage === "" && !hasTranscriptMedia;
	const recorderTranscriptText = transcriptBody || void 0;
	const userTurnTranscriptRecorder = (internalSessionTarget ? void 0 : params.opts.userTurnTranscriptRecorder) ?? createUserTurnTranscriptRecorder({
		...!suppressUserTurnPersistence && (recorderTranscriptText || hasTranscriptMedia) ? { input: {
			text: recorderTranscriptText,
			...hasTranscriptMedia ? { media: transcriptMedia } : {},
			senderIsOwner: params.opts.senderIsOwner,
			...params.opts.inputProvenance ? { provenance: params.opts.inputProvenance } : {}
		} } : {},
		target: {
			sessionId: internalSessionTarget?.sessionId ?? sessionId,
			agentId: internalSessionTarget?.agentId ?? sessionAgentId,
			sessionKey: internalSessionTarget?.sessionKey ?? sessionKey ?? sessionId,
			sessionEntry: internalSessionTarget?.sessionEntry ?? sessionEntry,
			sessionStore: params.suppressVisibleSessionEffects ? void 0 : sessionStore,
			storePath: internalSessionTarget?.storePath ?? storePath,
			cwd: cwd ?? workspaceDir,
			config: cfg
		},
		beforeMessageWrite: runAgentHarnessBeforeMessageWriteHook,
		errorContext: "agent command user turn transcript"
	});
	if (suppressUserTurnPersistence) userTurnTranscriptRecorder.markBlocked();
	const lifecycle = createAgentCommandLifecycle({
		runId,
		lifecycleGeneration: () => lifecycleGeneration,
		startedAt,
		abortSignal: params.opts.abortSignal,
		state: attemptLifecycleState
	});
	const attemptExecutionRuntime = await measureAgentStartup("attempt-runtime-import", () => loadAttemptExecutionRuntime(), { config: cfg });
	const messageChannel = resolveMessageChannel(runContext.messageChannel, params.opts.replyChannel ?? params.opts.channel);
	let result;
	const compactionAccounting = createCommandCompactionAccounting({
		sessionStore,
		persistCounts: !params.suppressVisibleSessionEffects && !params.preserveUserFacingSessionModelState,
		onDurableFact: (fact) => {
			attemptSessionTarget = fact.target;
			params.trackInternalModelRunTarget(fact.target);
			params.onCompactionAccounting?.(fact);
		},
		refreshSessionEntry: (key) => {
			sessionEntry = sessionStore?.[key] ?? sessionEntry;
			sessionEntryForAttempt = sessionEntry;
		}
	});
	let maintenanceAuthProfile;
	let fallbackProvider = provider;
	let fallbackModel = model;
	let fallbackExhausted = false;
	let terminal;
	let liveSwitchRetries = 0;
	let autoFallbackPrimaryProbeInterruptedByLiveSwitch = false;
	const fastModeStartedAtMs = Date.now();
	const fallbackTrajectoryRecorder = createTrajectoryRuntimeRecorder({
		cfg,
		runId,
		sessionId,
		sessionKey,
		sessionFile: attemptSessionFile,
		provider,
		modelId: model,
		workspaceDir
	});
	const deferredLifecycle = createDeferredEmbeddedRunLifecycleManager({
		runId,
		agentId: sessionAgentId,
		sessionId,
		sessionKey,
		sessionFile: attemptSessionFile,
		abortSignal: params.opts.abortSignal
	});
	const logicalTurnOpts = {
		...params.opts,
		abortSignal: deferredLifecycle.signal
	};
	let liveSwitchMediaTaskIds = /* @__PURE__ */ new Set();
	for (;;) try {
		liveSwitchMediaTaskIds = sessionKey ? getGeneratedMediaTaskIdsForSessionKey(sessionKey, sessionAgentId) : /* @__PURE__ */ new Set();
		const spawnedBy = normalizedSpawned.spawnedBy ?? sessionEntry?.spawnedBy;
		const effectiveFallbacksOverride = isModelSelectionLocked(sessionEntry) ? [] : params.opts.modelFallbacksOverride ?? resolveEffectiveModelFallbacks({
			cfg,
			agentId: sessionAgentId,
			sessionKey,
			hasSessionModelOverride: hasExplicitRunOverride || Boolean(storedProviderOverride || storedModelOverride),
			modelOverrideSource: hasExplicitRunOverride ? "user" : storedModelOverrideSource,
			subagentSpawnLineage: (sessionEntry?.spawnDepth ?? 0) > 0,
			hasAutoFallbackProvenance: hasExplicitRunOverride ? false : hasStoredAutoFallbackProvenance
		});
		const fallbackRuntimeState = {};
		attemptLifecycleState.currentTurnUserMessagePersisted = false;
		let attemptMediaTaskIds = liveSwitchMediaTaskIds;
		const currentAttemptCommittedCronMedia = () => Boolean(sessionKey && hasNewGeneratedMediaTaskForSessionKey(sessionKey, attemptMediaTaskIds, sessionAgentId));
		const fallbackResult = await runEmbeddedAgentEntry({
			preparedRunAdmission: params.preparedRunAdmission,
			selection: {
				cfg,
				provider,
				model,
				requestedRouteResolution: params.modelSelection.requestedRouteResolution,
				agentDir,
				fallbacksOverride: effectiveFallbacksOverride,
				userLockedAuthProfileId: resolveSessionAuthProfileOverrideSource(sessionEntryForAttempt) === "user" ? sessionEntryForAttempt?.authProfileOverride : void 0,
				...modelManifestContext
			},
			identity: {
				runId,
				agentId: sessionAgentId,
				sessionId,
				sessionKey: sessionKey ?? sessionId
			},
			harness: {
				workspaceDir,
				sessionKey,
				preparation: { kind: "direct" },
				resolveRuntimeOverride: (candidateProvider) => resolveSessionRuntimeOverrideForProvider({
					provider: candidateProvider,
					entry: sessionEntryForAttempt,
					cfg
				})
			},
			behavior: {
				kind: "command-rpc",
				hasCommittedSideEffect: currentAttemptCommittedCronMedia
			},
			sessionOverride: {
				kind: "reconcile-completed",
				reconcile: async ({ provider: winnerProvider, model: winnerModel }) => {
					if (!autoFallbackPrimaryProbe || autoFallbackPrimaryProbeInterruptedByLiveSwitch || !sessionEntry || !sessionStore || !sessionKey || isModelSelectionLocked(sessionEntry) || params.suppressVisibleSessionEffects || params.preserveUserFacingSessionModelState || !entryMatchesAutoFallbackPrimaryProbe(sessionEntry, autoFallbackPrimaryProbe) || winnerProvider !== autoFallbackPrimaryProbe.provider || winnerModel !== autoFallbackPrimaryProbe.model) return;
					const nextSessionEntry = { ...sessionEntry };
					clearAutoFallbackPrimaryProbeSelection(nextSessionEntry);
					sessionEntry = await persistAgentSession({
						agentId: sessionAgentId,
						sessionStore,
						sessionKey,
						storePath,
						initialEntry: sessionEntry,
						entry: nextSessionEntry,
						shouldPersist: (current) => Boolean(current && entryMatchesAutoFallbackPrimaryProbe(current, autoFallbackPrimaryProbe))
					});
				}
			},
			abortSignal: deferredLifecycle.signal,
			onFallbackStep: (step) => {
				emitAgentEvent({
					runId,
					lifecycleGeneration,
					...sessionKey ? { sessionKey } : {},
					stream: "lifecycle",
					data: {
						phase: "fallback_step",
						...step
					}
				});
				fallbackTrajectoryRecorder?.recordEvent("model.fallback_step", step);
			},
			runCandidate: async (providerOverride, modelOverride, runOptions) => {
				clearAgentRunTerminalWriteContext(params.preparedRunAdmission.operationalRunInstance);
				const candidateAccounting = compactionAccounting.beginCandidate(deferredLifecycle.signal);
				maintenanceAuthProfile = void 0;
				attemptMediaTaskIds = sessionKey ? getGeneratedMediaTaskIdsForSessionKey(sessionKey, sessionAgentId) : /* @__PURE__ */ new Set();
				resetAgentAttemptLifecycle(attemptLifecycleState);
				const isAutoFallbackPrimaryProbeCandidate = autoFallbackPrimaryProbe && providerOverride === autoFallbackPrimaryProbe.provider && modelOverride === autoFallbackPrimaryProbe.model;
				const attemptSessionEntry = autoFallbackPrimaryProbe && providerOverride === autoFallbackPrimaryProbe.fallbackProvider && !isAutoFallbackPrimaryProbeCandidate ? sessionEntry : sessionEntryForAttempt;
				if (isAutoFallbackPrimaryProbeCandidate) markAutoFallbackPrimaryProbe({
					probe: autoFallbackPrimaryProbe,
					sessionKey
				});
				await params.opts.onActiveModelSelected?.({
					provider: providerOverride,
					model: modelOverride
				});
				const fastModeState = resolveFastModeState({
					cfg,
					provider: providerOverride,
					model: modelOverride,
					agentId: sessionAgentId,
					sessionEntry
				});
				const fastMode = params.opts.fastMode ?? fastModeState.mode;
				const configuredAuthProfileId = providerOverride === defaultProvider && modelOverride === defaultModel ? configuredDefaultAuthProfileId : void 0;
				const candidateRuntime = runOptions.agentHarnessRuntimeOverride ?? resolveEffectiveAgentRuntime({
					cfg,
					provider: providerOverride,
					modelId: modelOverride,
					agentId: sessionAgentId,
					sessionKey,
					sessionEntry: attemptSessionEntry
				});
				const candidateConfiguredThinkLevel = immutableThinkLevel ?? resolveConfiguredThinkingDefaultCore({
					cfg,
					agentId: sessionAgentId,
					provider: providerOverride,
					model: modelOverride
				});
				let candidateThinkingCatalog = providerOverride !== params.modelSelection.provider || modelOverride !== params.modelSelection.model ? params.modelSelection.loadDeferredThinkingCatalog?.() ?? thinkingCatalog : thinkingCatalog;
				if (pluginsEnabled && (candidateConfiguredThinkLevel !== "off" || candidateRuntime !== "openclaw") && needsThinkHydration(candidateThinkingCatalog, providerOverride, modelOverride, candidateRuntime)) {
					const { loadProviderScopedThinkingCatalog } = await import("./agents/model-catalog.runtime.js");
					const runtimeCatalog = normalizeThinkingCatalogProviders(await loadProviderScopedThinkingCatalog({
						config: cfg,
						provider: providerOverride,
						model: modelOverride,
						agentRuntime: candidateRuntime,
						agentId: sessionAgentId,
						workspaceDir
					}));
					if (findModelInCatalog(runtimeCatalog, providerOverride, modelOverride)) candidateThinkingCatalog = createModelVisibilityPolicy({
						cfg,
						catalog: runtimeCatalog,
						defaultProvider,
						defaultModel: {
							provider: defaultProvider,
							model: defaultModel
						},
						agentId: sessionAgentId,
						allowManifestNormalization: true,
						allowPluginNormalization: true,
						...modelManifestContext
					}).catalog;
				}
				const { level: candidateThinkLevel } = resolveThinkingSelectionCore({
					cfg,
					agentId: sessionAgentId,
					provider: providerOverride,
					model: modelOverride,
					level: candidateConfiguredThinkLevel,
					catalog: candidateThinkingCatalog,
					agentRuntime: candidateRuntime
				});
				effectiveTurnThinkLevel = candidateThinkLevel;
				try {
					return await attemptExecutionRuntime.runAgentAttempt({
						...runOptions,
						preparedRunAdmission: params.preparedRunAdmission,
						providerOverride,
						modelOverride,
						...prepareModelRunCapabilities([candidateThinkingCatalog, params.prepared.configuredThinkingCatalog], [
							providerOverride,
							modelOverride,
							candidateRuntime
						]),
						configuredAuthProfileId,
						modelFallbacksOverride: effectiveFallbacksOverride,
						originalProvider: provider,
						cfg,
						sessionEntry: attemptSessionEntry,
						sessionId: attemptSessionTarget?.sessionId ?? sessionId,
						sessionKey,
						...attemptSessionTarget ? { sessionTarget: attemptSessionTarget } : {},
						sessionAgentId,
						sessionFile: attemptSessionFile,
						workspaceDir,
						cwd,
						body,
						transcriptBody,
						preserveCliSessionBinding: isHeartbeatLifecycleRunKind(logicalTurnOpts.bootstrapContextRunKind) || params.preserveUserFacingSessionModelState,
						resolvedThinkLevel: candidateThinkLevel,
						fastMode,
						fastModeStartedAtMs,
						fastModeAutoOnSeconds: fastMode === "auto" ? params.opts.fastModeAutoOnSeconds ?? fastModeState.fastAutoOnSeconds : fastModeState.fastAutoOnSeconds,
						timeoutMs,
						runTimeoutOverrideMs,
						runId,
						lifecycleGeneration,
						opts: logicalTurnOpts,
						runContext,
						spawnedBy,
						messageChannel,
						skillsSnapshot,
						resolvedVerboseLevel,
						agentDir,
						authProfileProvider: providerForAuthProfileValidation,
						sessionStore: params.suppressVisibleSessionEffects ? void 0 : sessionStore,
						storePath: params.suppressVisibleSessionEffects ? void 0 : storePath,
						pluginsEnabled,
						...manifestMetadataSnapshot ? { metadataSnapshot: manifestMetadataSnapshot } : {},
						pluginGeneration: params.prepared.commandRuntimeContext?.pluginGeneration,
						sessionHasHistory: !isNewSession || await attemptExecutionRuntime.sessionTranscriptHasContent(attemptSessionTarget, deferredLifecycle.signal),
						fallbackRuntimeState,
						suppressPromptPersistenceOnRetry: suppressUserTurnPersistence || userTurnTranscriptRecorder.hasPersisted() || userTurnTranscriptRecorder.isBlocked() || runOptions.isFallbackRetry && attemptLifecycleState.currentTurnUserMessagePersisted,
						userTurnTranscriptRecorder,
						onUserMessagePersisted: attemptLifecycleCallbacks.onUserMessagePersisted,
						onCompactionAccounting: candidateAccounting.observe,
						onCompactionRequestBudget: candidateAccounting.observeRequestBudget,
						onSuccessfulAuthProfile: (selection) => {
							maintenanceAuthProfile = selection;
						},
						onLifecycleGenerationChanged: (nextLifecycleGeneration) => {
							lifecycleGeneration = nextLifecycleGeneration;
							params.onLifecycleGenerationChanged(nextLifecycleGeneration);
						},
						onAgentEvent: attemptLifecycleCallbacks.onAgentEvent,
						deferTerminalLifecycle: true,
						deferredLifecycle
					});
				} finally {
					await candidateAccounting.finish(sessionEntry);
				}
			}
		});
		result = fallbackResult.result;
		terminal = fallbackResult.terminal;
		if (isAgentRunRestartAbortReason(params.opts.abortSignal?.reason)) throw params.opts.abortSignal?.reason;
		if (terminal.outcome.stopReason === "restart") throw createAgentRunRestartAbortError();
		fallbackProvider = fallbackResult.provider;
		fallbackModel = fallbackResult.model;
		fallbackExhausted = fallbackResult.outcome === "exhausted";
		await fallbackResult.settleSessionOverride();
		if (fallbackResult.attempts.length > 0 && result.meta.agentMeta) result = {
			...result,
			meta: {
				...result.meta,
				agentMeta: {
					...result.meta.agentMeta,
					fallbackAttempts: fallbackResult.attempts
				}
			}
		};
		if (!fallbackExhausted) lifecycle.emitFinishing(terminal);
		break;
	} catch (err) {
		if (err instanceof LiveSessionModelSwitchError) {
			if (isModelSelectionLocked(sessionEntry)) {
				lifecycle.emitBasicError(MODEL_SELECTION_LOCKED_MESSAGE);
				await fallbackTrajectoryRecorder?.flush();
				await deferredLifecycle.complete();
				throw new ModelSelectionLockedError();
			}
			if (sessionKey && hasNewGeneratedMediaTaskForSessionKey(sessionKey, liveSwitchMediaTaskIds, sessionAgentId)) {
				await deferredLifecycle.complete();
				throw err;
			}
			liveSwitchRetries += 1;
			if (liveSwitchRetries > MAX_LIVE_SWITCH_RETRIES) {
				const retryLimitMessage = `Exceeded maximum live model switch retries (${MAX_LIVE_SWITCH_RETRIES})`;
				log$2.error(`Live session model switch in subagent run ${runId}: ${retryLimitMessage}`);
				lifecycle.emitBasicError("Agent run failed");
				await fallbackTrajectoryRecorder?.flush();
				await deferredLifecycle.complete();
				throw new Error(retryLimitMessage, { cause: err });
			}
			if (storedModelOverride || err.model !== model || err.provider !== provider) {
				storedModelOverride = err.model;
				storedModelOverrideSource = "user";
			}
			if (autoFallbackPrimaryProbe) autoFallbackPrimaryProbeInterruptedByLiveSwitch = true;
			provider = err.provider;
			model = err.model;
			providerForAuthProfileValidation = err.provider;
			if (sessionEntry) {
				sessionEntry = { ...sessionEntry };
				applyModelRuntimeDirective(sessionEntry, err.agentRuntimeOverride ? {
					kind: "set",
					runtime: err.agentRuntimeOverride
				} : { kind: "clear" });
				sessionEntry.authProfileOverride = err.authProfileId;
				sessionEntry.authProfileOverrideSource = err.authProfileId ? err.authProfileIdSource : void 0;
				sessionEntry.authProfileOverrideCompactionCount = void 0;
				sessionEntryForAttempt = sessionEntry;
			}
			attemptLifecycleState.lifecycleEnded = false;
			log$2.info(`Live session model switch in subagent run ${runId}: switching to ${sanitizeForLog(err.provider)}/${sanitizeForLog(err.model)}`);
			continue;
		}
		const errorLifecycleFields = resolveAgentRunErrorLifecycleFields(err, params.opts.abortSignal);
		lifecycle.emitBasicError(err instanceof Error ? err : /* @__PURE__ */ new Error("Agent run failed"), errorLifecycleFields);
		await fallbackTrajectoryRecorder?.flush();
		await deferredLifecycle.complete();
		throw err;
	}
	return {
		startedAt,
		result,
		fallbackProvider,
		fallbackModel,
		fallbackExhausted,
		provider,
		model,
		sessionEntry,
		lifecycleGeneration,
		effectiveTurnThinkLevel,
		maintenanceAuthProfile,
		compactionAccounting: compactionAccounting.fact,
		compactionRequestBudget: compactionAccounting.requestBudget,
		internalSessionTarget,
		attemptExecutionRuntime,
		messageChannel,
		suppressUserTurnPersistence,
		userTurnTranscriptRecorder,
		fallbackTrajectoryRecorder,
		deferredLifecycle,
		lifecycle,
		terminal
	};
}
//#endregion
//#region src/agents/command/conversation-context.ts
/** Reuse conversation guidance without borrowing the originating sender's authority. */
async function prepareCommandConversationContext(params) {
	const { cfg, opts, runContext, sessionEntry, sessionKey, sessionAgentId } = params;
	const deliveryFormat = (opts.deliver === true || opts.sourceReplyDeliveryMode === "message_tool_only") && buildDeliveryFormatPrompt({
		cfg,
		channel: opts.replyChannel ?? runContext.messageChannel,
		accountId: opts.replyAccountId ?? runContext.accountId,
		agentId: sessionAgentId,
		allowBootstrap: true
	});
	let conversationPrompt;
	if (sessionEntry && !isSubagentSessionKey(sessionKey) && !isCronSessionKey(sessionKey) && isSyntheticSourceReplyTurn(opts)) {
		const conversation = prepareReplyConversation({
			sessionEntry,
			ctx: {
				InternalTurnSource: "event",
				Provider: runContext.messageChannel,
				Surface: runContext.messageChannel,
				ChatType: sessionEntry.delivery?.kind === "internal" ? sessionEntry.chatType : void 0,
				OriginatingChannel: runContext.messageChannel,
				OriginatingTo: runContext.currentChannelId,
				AccountId: runContext.accountId,
				MessageThreadId: runContext.currentThreadTs
			}
		});
		const ctx = {
			...conversation.fields,
			CommandAuthorized: false
		};
		const shared = ctx.ChatType === "group" || ctx.ChatType === "channel";
		const sourceContext = buildSourceConversationContext({
			sessionCtx: ctx,
			sourceReplyDeliveryMode: resolveSessionStableReplyMode({
				cfg,
				ctx,
				sessionEntry,
				sessionAgentId,
				sessionKey
			}),
			silentReplyPolicy: resolveSilentReplySettings({
				cfg,
				sessionKey,
				surface: ctx.Surface ?? ctx.Provider,
				conversationType: shared ? "group" : "direct"
			}).policy,
			silentToken: SILENT_REPLY_TOKEN
		});
		if (sourceContext) {
			const metadata = buildInboundMetaSystemPrompt(ctx, cfg, { includeFormattingHints: false });
			conversationPrompt = [
				deliveryFormat ? `${metadata}\n${deliveryFormat}` : metadata,
				sourceContext,
				shared && buildGroupIntro({
					activation: conversation.activation,
					defaultActivation: defaultGroupActivation(await resolveGroupRequireMention({
						cfg,
						group: conversation.group
					}))
				})
			].filter(Boolean).join("\n\n");
		}
	}
	return conversationPrompt || deliveryFormat ? {
		...opts,
		extraSystemPrompt: [
			conversationPrompt,
			opts.extraSystemPrompt,
			!conversationPrompt && deliveryFormat
		].filter(Boolean).join("\n\n"),
		...conversationPrompt ? { silentReplyPromptMode: "none" } : {}
	} : opts;
}
//#endregion
//#region src/agents/command/run-context.ts
/** Merges explicit run context with command routing options. */
function resolveAgentRunContext(opts) {
	const merged = opts.runContext ? { ...opts.runContext } : {};
	const normalizedChannel = resolveMessageChannel(merged.messageChannel ?? opts.messageChannel, opts.replyChannel ?? opts.channel);
	if (normalizedChannel) merged.messageChannel = normalizedChannel;
	const normalizedAccountId = normalizeOptionalAccountId(merged.accountId ?? opts.accountId);
	if (normalizedAccountId) merged.accountId = normalizedAccountId;
	for (const key of [
		"groupId",
		"groupChannel",
		"groupSpace"
	]) {
		const value = (merged[key] ?? opts[key])?.toString().trim();
		if (value) merged[key] = value;
	}
	if (merged.currentThreadTs == null) {
		const threadId = stringifyRouteThreadId(opts.threadId);
		if (threadId) merged.currentThreadTs = threadId;
	}
	if (!merged.currentChannelId && opts.to) {
		const trimmedTo = opts.to.trim();
		if (trimmedTo) merged.currentChannelId = trimmedTo;
	}
	return merged;
}
//#endregion
//#region src/agents/command/session-preparation.ts
const log$1 = createSubsystemLogger("agents/agent-command");
function prepareCommandSessionRecoveryEntry(params) {
	const { entry, sessionId, runId, opts, now, isSessionRollover } = params;
	const { harnessCompletion, guardedHarnessCompletion, sourceOptions, isCompletionCurrent } = prepareCommandHarnessCompletionRecovery({
		...params,
		hasDeliveryContext: Boolean(params.deliveryContext)
	});
	return {
		guardedHarnessCompletion,
		isCompletionCurrent,
		nextEntry: {
			...entry,
			sessionId,
			updatedAt: now,
			sessionStartedAt: isSessionRollover ? now : entry.sessionStartedAt,
			lastInteractionAt: isSessionRollover ? now : entry.lastInteractionAt,
			...buildCurrentRunRestartRecoveryClaim({
				deliveryContext: params.deliveryContext,
				deliveryMediaUrls: opts.internalDeliveryMediaUrls,
				disableMessageTool: opts.disableMessageTool,
				entry,
				forceRestartSafeTools: opts.forceRestartSafeTools,
				runId,
				harnessCompletion,
				...sourceOptions,
				suppressTextDelivery: opts.internalDeliverySuppressText
			})
		}
	};
}
async function prepareCommandSessionDiffBaseline(params) {
	try {
		const entry = await ensureSessionDiffBaseline(params);
		if (params.sessionStore) params.sessionStore[params.sessionKey] = entry;
		return entry;
	} catch (error) {
		if (isSessionWorkStartInvalidatedError(error)) throw error;
		log$1.warn(`session diff baseline capture failed; continuing without attribution filtering: ${coerceErrorMessage(error)}`);
		return params.entry;
	}
}
async function prepareEmbeddedSessionState(params) {
	const requestedThinkLevel = params.thinkOnce ?? params.thinkOverride ?? params.persistedThinking;
	const resolvedVerboseLevel = params.verboseOverride ?? params.persistedVerbose ?? params.verboseDefault;
	const coordination = isSubagentCoordinationInputProvenance(params.opts.inputProvenance);
	assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
	if (params.sessionKey || params.suppressVisibleSessionEffects) registerAgentRunContext(params.runId, {
		...params.sessionKey ? {
			sessionKey: params.sessionKey,
			sessionId: params.sessionId
		} : {},
		agentId: params.sessionAgentId,
		lifecycleGeneration: params.lifecycleGeneration,
		verboseLevel: resolvedVerboseLevel,
		isControlUiVisible: !params.suppressVisibleSessionEffects && !coordination,
		...coordination ? { projectSessionMessages: false } : {},
		projectSessionActive: !params.suppressVisibleSessionEffects && !coordination
	});
	let sessionEntry = params.sessionEntry;
	const skillFilter = resolveEffectiveAgentSkillFilter(params.cfg, params.sessionAgentId);
	const currentSkillsSnapshot = sessionEntry?.skillsSnapshot;
	const [{ getRemoteSkillEligibility, resolveReusableWorkspaceSkillSnapshot }, { resolveNodeExecEligibility }] = await Promise.all([loadSkillsRuntime(), loadExecDefaultsRuntime()]);
	const nodeSkillsEligibility = resolveNodeExecEligibility({
		cfg: params.cfg,
		sessionEntry,
		sessionKey: params.sessionKey,
		agentId: params.sessionAgentId
	});
	const skillSnapshotState = await resolveReusableWorkspaceSkillSnapshot({
		workspaceDir: resolveAgentWorkspaceDir(params.cfg, params.sessionAgentId),
		...resolveSessionSkillExecutionWorkspace(sessionEntry?.worktree?.canonicalWorkspaceDir, params.executionWorkspaceDir),
		config: params.cfg,
		agentId: params.sessionAgentId,
		existingSnapshot: params.isNewSession ? void 0 : currentSkillsSnapshot,
		librarySelections: sessionEntry?.skillLibrarySelections,
		skillFilter,
		assertCurrent: () => assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration),
		resolveEligibility: () => ({
			nodeSkills: nodeSkillsEligibility,
			remote: getRemoteSkillEligibility({ advertiseExecNode: nodeSkillsEligibility.canExec })
		}),
		watch: params.watchSkills && params.opts.oneShotCliRun !== true,
		...params.pluginMetadataSnapshot ? { pluginMetadataSnapshot: params.pluginMetadataSnapshot } : {}
	});
	const needsSkillsSnapshot = params.isNewSession || !currentSkillsSnapshot || skillSnapshotState.shouldRefresh;
	const skillsSnapshot = skillSnapshotState.snapshot;
	if (skillsSnapshot && params.sessionStore && params.sessionKey && needsSkillsSnapshot && !params.suppressVisibleSessionEffects) {
		const now = Date.now();
		const current = sessionEntry ?? {
			sessionId: params.sessionId,
			updatedAt: now,
			sessionStartedAt: now
		};
		const next = {
			...current,
			sessionId: params.sessionId,
			updatedAt: now,
			sessionStartedAt: current.sessionStartedAt ?? now,
			skillsSnapshot
		};
		sessionEntry = await persistAgentSession({
			agentId: params.sessionAgentId,
			sessionStore: params.sessionStore,
			sessionKey: params.sessionKey,
			storePath: params.storePath,
			initialEntry: current,
			entry: next
		});
	}
	const shouldPersistInitialSessionTouch = params.opts.skipInitialSessionTouch !== true || Boolean(params.verboseOverride);
	if (params.sessionStore && params.sessionKey && !params.suppressVisibleSessionEffects && shouldPersistInitialSessionTouch) {
		const now = Date.now();
		const entry = params.sessionStore[params.sessionKey] ?? sessionEntry ?? {
			sessionId: params.sessionId,
			updatedAt: now,
			sessionStartedAt: now
		};
		const next = {
			...entry,
			sessionId: params.sessionId,
			updatedAt: now,
			sessionStartedAt: entry.sessionStartedAt ?? now,
			lastInteractionAt: now,
			agentStatus: void 0
		};
		applyVerboseOverride(next, params.verboseOverride);
		sessionEntry = await persistAgentSession({
			agentId: params.sessionAgentId,
			sessionStore: params.sessionStore,
			sessionKey: params.sessionKey,
			storePath: params.storePath,
			initialEntry: entry,
			entry: next
		});
	}
	if (params.sessionKey && !params.isSubagentLaneTurn) {
		const assertSignalCurrent = () => {
			assertAgentRunLifecycleGenerationCurrent(params.lifecycleGeneration);
			params.opts.abortSignal?.throwIfAborted();
			params.opts.assertSourceCurrent?.();
			params.opts.operatorAuthority?.assertCurrent();
		};
		await recordSessionHumanDirectMessage({
			sessionKey: params.sessionKey,
			entry: sessionEntry,
			agentId: params.sessionAgentId,
			actor: params.sessionStateActor,
			channel: params.opts.channel,
			runId: params.runId
		}, { assertCurrent: assertSignalCurrent });
		assertSignalCurrent();
	}
	const runContext = resolveAgentRunContext(params.opts);
	return {
		sessionEntry,
		requestedThinkLevel,
		resolvedVerboseLevel,
		skillsSnapshot,
		runContext,
		opts: await prepareCommandConversationContext({
			...params,
			sessionEntry,
			runContext
		})
	};
}
//#endregion
//#region src/agents/agent-command.ts
const log = createSubsystemLogger("agents/agent-command");
async function agentCommandInternal(prepared, initialOpts, admissionIngress, runtime = defaultRuntime, deps, watchSkills = false) {
	const resolvedDeps = await resolveAgentCommandDeps(deps);
	const isRawModelRun = initialOpts.modelRun === true || initialOpts.promptMode === "none";
	const suppressVisibleSessionEffects = initialOpts.sessionEffects === "internal";
	const preserveUserFacingSessionModelState = initialOpts.preserveUserFacingSessionModelState === true;
	const lifecycleAbortController = new AbortController();
	const preparedOpts = resolveCommandRecoveryOptions(prepared);
	const compactionSessionIdReporter = createCompactionSessionIdReporter(prepared.sessionId, preparedOpts.onSessionIdChanged);
	let opts = {
		...preparedOpts,
		onSessionIdChanged: compactionSessionIdReporter.onSessionIdChanged,
		abortSignal: preparedOpts.abortSignal ? AbortSignal.any([preparedOpts.abortSignal, lifecycleAbortController.signal]) : lifecycleAbortController.signal
	};
	const { body, transcriptBody, cfg, configuredThinkingCatalog, agentCfg, thinkOverride, thinkOnce, verboseOverride, sessionId, sessionKey, sessionStore, storePath, isNewSession, persistedThinking, persistedVerbose, sessionAgentId, outboundSession, workspaceDir, cwd, runId, isSubagentLane, acpManager, acpResolution, pluginsEnabled, manifestMetadataSnapshot, modelManifestContext } = prepared;
	const isIncognito = prepared.sessionEntry?.incognito === true || isIncognitoSessionKey(sessionKey);
	const diagnosticError = (error) => formatErrorMessage(isIncognito ? "Incognito agent error." : error);
	let lifecycleGeneration = opts.lifecycleGeneration ?? captureAgentRunLifecycleGeneration(runId);
	let sessionEntry = prepared.sessionEntry, runOwnedSessionId = sessionId;
	const sessionStateActor = classifySessionStateActor({
		inputProvenance: opts.inputProvenance,
		internalEvents: opts.internalEvents,
		sessionEffects: opts.sessionEffects
	});
	const isSubagentLaneTurn = normalizeOptionalString(opts.lane) === AGENT_LANE_SUBAGENT;
	let sessionReboundDuringRun = false;
	let trackedRestartRecoveryDeliveryClaim = false;
	let currentRunDeliveryContext;
	let restartRecoveryTerminalDeliveryEvidence;
	const preparedSessionId = sessionEntry?.sessionId;
	const { track: trackInternalModelRunTarget, cleanup: cleanupInternalModelRunTargets } = createInternalSessionEffectsCleanup({
		enabled: initialOpts.modelRun === true && suppressVisibleSessionEffects,
		agentId: sessionAgentId,
		runId,
		storePath,
		onError: (error) => {
			log.warn(`failed to remove model-run SQLite session: ${diagnosticError(error)}`);
		}
	});
	let sessionWorkAdmission;
	let releaseForeground;
	let maintenanceRequest;
	let preparedRunAdmission;
	try {
		const operatorSession = opts.operatorAuthority && sessionKey ? (await import("./operator-session-run-CMuM3Q_4.mjs")).prepareGatewayOperatorSessionRun({
			authority: opts.operatorAuthority,
			cfg,
			agentId: sessionAgentId,
			sessionKey,
			assertSourceCurrent: () => {
				opts.abortSignal?.throwIfAborted();
				opts.assertSourceCurrent?.();
			}
		}) : void 0;
		if (sessionStateActor.actorType === "human" && !isSubagentLaneTurn && !opts.internalEvents?.length && opts.bootstrapContextRunKind !== "heartbeat" && opts.bootstrapContextRunKind !== "cron") releaseForeground = await beginForegroundSessionMaintenance(sessionKey ?? sessionId);
		assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
		const sessionStoreRuntime = storePath && sessionKey ? await loadSessionStoreRuntime() : void 0;
		sessionWorkAdmission = await beginSessionWorkAdmission({
			scope: storePath ?? `agent:${sessionAgentId}`,
			identities: [sessionKey, sessionId],
			signal: opts.abortSignal,
			onInterrupt: (reason) => lifecycleAbortController.abort(isAgentRunDirectAbortReason(reason) ? reason : createAgentRunRestartAbortError()),
			assertAllowed: () => {
				const currentEntry = sessionStoreRuntime && storePath && sessionKey ? sessionStoreRuntime.loadSessionEntry({
					agentId: sessionAgentId,
					storePath,
					sessionKey,
					readConsistency: "latest"
				}) : sessionEntry;
				if (!currentEntry && preparedSessionId) throw createSessionWorkStartChangedError(sessionKey ?? sessionId);
				const matchesIntentionalRollover = isNewSession && currentEntry?.sessionId === preparedSessionId;
				if (currentEntry && currentEntry.sessionId !== sessionId && !matchesIntentionalRollover) throw createSessionWorkStartChangedError(sessionKey ?? sessionId);
				const archivedSessionError = resolveSessionWorkStartError(sessionKey ?? sessionId, currentEntry);
				if (archivedSessionError) throw new Error(archivedSessionError);
				operatorSession?.assertAuthorized(currentEntry);
				sessionEntry = currentEntry;
				if (sessionStore && sessionKey) {
					if (currentEntry) sessionStore[sessionKey] = currentEntry;
					else delete sessionStore[sessionKey];
				}
			}
		});
		return await sessionWorkAdmission.run(async () => {
			if (sessionStore && sessionKey && !suppressVisibleSessionEffects) try {
				await repairPendingAssistantTranscriptTurns({ context: {
					sessionKey,
					sessionEntry,
					sessionStore,
					storePath,
					sessionAgentId,
					config: cfg
				} });
				sessionEntry = sessionStore[sessionKey] ?? sessionEntry;
			} catch (error) {
				if (!isNewSession) throw error;
				log.warn(`Could not repair predecessor transcript before session reset for ${sessionKey}: ${diagnosticError(error)}`);
			}
			if (opts.deliver === true) {
				if (resolveSendPolicy({
					cfg,
					entry: sessionEntry,
					sessionKey,
					channel: sessionDeliveryChannel(sessionEntry),
					chatType: sessionEntry?.chatType
				}) === "deny") throw new Error("send blocked by session policy");
			}
			if (!isRawModelRun && acpResolution?.kind === "stale") throw acpResolution.error;
			let currentRunDeliveryPrepared = false;
			const prepareDeliveryForRun = async (candidateSessionEntry) => {
				if (currentRunDeliveryPrepared || opts.deliver !== true) return;
				currentRunDeliveryPrepared = true;
				let preparedDelivery;
				try {
					preparedDelivery = await prepareCurrentRunDelivery({
						cfg,
						opts,
						agentId: sessionAgentId,
						currentSessionKey: sessionKey,
						sessionEntry: candidateSessionEntry
					});
				} catch (error) {
					if (opts.bestEffortDeliver !== true) throw error;
					log.warn(`delivery preflight failed; continuing model run with requested delivery intent because bestEffortDeliver is enabled: ${diagnosticError(error)}`);
				}
				assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
				if (preparedDelivery) {
					currentRunDeliveryContext = preparedDelivery.context;
					opts = {
						...opts,
						replyChannel: preparedDelivery.context.channel,
						replyTo: preparedDelivery.context.to,
						replyAccountId: preparedDelivery.context.accountId,
						threadId: preparedDelivery.context.threadId,
						deliveryTargetMode: preparedDelivery.targetMode
					};
				}
			};
			if (sessionStore && sessionKey && !suppressVisibleSessionEffects && !isSubagentSessionKey(sessionKey)) {
				const now = Date.now();
				const currentStoreEntry = sessionStore[sessionKey];
				const allowCreateRestartRecoveryEntry = currentStoreEntry === void 0 && sessionEntry === void 0;
				const initialEntry = currentStoreEntry ?? sessionEntry ?? {
					sessionId,
					updatedAt: now,
					sessionStartedAt: now
				};
				const isSessionRollover = isNewSession && initialEntry.sessionId !== sessionId;
				const entry = isSessionRollover ? clearRotatedSessionMetadata(initialEntry) : initialEntry;
				await prepareDeliveryForRun(entry);
				const { nextEntry, guardedHarnessCompletion, isCompletionCurrent } = prepareCommandSessionRecoveryEntry({
					entry,
					sessionId,
					sessionKey,
					runId,
					agentId: sessionAgentId,
					opts,
					deliveryContext: currentRunDeliveryContext,
					now,
					isSessionRollover
				});
				assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
				const persisted = await persistAgentSession({
					agentId: sessionAgentId,
					sessionStore,
					sessionKey,
					storePath,
					initialEntry,
					entry: nextEntry,
					creation: operatorSession?.creation,
					assertCommitAllowed: operatorSession?.assertCurrent,
					shouldPersist: (current) => {
						operatorSession?.assertAuthorized(current);
						return isCompletionCurrent(current) && (isSessionRollover ? current?.sessionId === initialEntry.sessionId : shouldPersistRestartRecoveryContextClaim(current, sessionId, runId, allowCreateRestartRecoveryEntry));
					}
				});
				sessionEntry = persisted;
				trackedRestartRecoveryDeliveryClaim = persisted?.restartRecoveryDeliveryRunId === runId;
				opts = bindCommandHarnessCompletionAssertion({
					claim: guardedHarnessCompletion,
					persisted,
					sessionKey,
					storePath,
					opts
				});
				if (operatorSession && (!persisted || persisted.sessionId !== sessionId)) throw createSessionWorkStartChangedError(sessionKey);
				operatorSession?.assertAuthorized(persisted);
			}
			if (sessionEntry && sessionKey && !suppressVisibleSessionEffects) sessionEntry = await prepareCommandSessionDiffBaseline({
				agentId: sessionAgentId,
				cwd: cwd ?? workspaceDir,
				entry: sessionEntry,
				isNewSession,
				sessionKey,
				storePath,
				sessionStore
			});
			await prepareDeliveryForRun(sessionEntry);
			if (!isRawModelRun && acpResolution?.kind === "ready" && sessionKey) {
				assertAgentRunLifecycleGenerationCurrent(lifecycleGeneration);
				preparedRunAdmission = prepareAgentCommandExecutionIdentity({
					opts,
					prepared,
					ingress: admissionIngress,
					lifecycleGeneration
				});
				return await runAcpAgentCommand({
					cfg,
					deps: resolvedDeps,
					runtime,
					opts,
					outboundSession,
					sessionEntry,
					sessionStore,
					body,
					transcriptBody,
					suppressVisibleSessionEffects,
					provenance: isSubagentLaneTurn ? "agent" : sessionStateActor.actorType,
					sessionAgentId,
					sessionId,
					sessionKey,
					storePath,
					workspaceDir,
					runId,
					lifecycleGeneration,
					acpManager,
					acpResolution,
					trackInternalModelRunTarget,
					preparedRunAdmission
				});
			}
			const embeddedSessionState = await measureAgentStartup("session-state", () => prepareEmbeddedSessionState({
				cfg,
				opts,
				sessionEntry,
				sessionStore,
				sessionKey,
				sessionId,
				storePath,
				sessionAgentId,
				lifecycleGeneration,
				runId,
				executionWorkspaceDir: cwd ?? workspaceDir,
				watchSkills,
				isNewSession,
				isSubagentLaneTurn,
				suppressVisibleSessionEffects,
				thinkOnce,
				thinkOverride,
				persistedThinking,
				verboseOverride,
				persistedVerbose,
				verboseDefault: agentCfg?.verboseDefault,
				sessionStateActor,
				...manifestMetadataSnapshot ? { pluginMetadataSnapshot: manifestMetadataSnapshot } : {}
			}), { config: cfg });
			({sessionEntry, opts} = embeddedSessionState);
			const { requestedThinkLevel, runContext } = embeddedSessionState;
			const modelSelection = await measureAgentStartup("model-selection", () => resolveEmbeddedModelSelection({
				cfg,
				opts,
				sessionEntry,
				sessionStore,
				sessionKey,
				sessionId,
				storePath,
				sessionAgentId,
				workspaceDir,
				pluginsEnabled,
				manifestMetadataSnapshot,
				modelManifestContext,
				configuredThinkingCatalog,
				requestedThinkLevel,
				thinkOverride,
				thinkOnce,
				isSubagentLane,
				suppressVisibleSessionEffects,
				runContext
			}), { config: cfg });
			sessionEntry = modelSelection.sessionEntry;
			const foreground = await prepareCommandForegroundRun({
				prepared,
				opts,
				sessionEntry,
				embeddedSessionState,
				modelSelection,
				lifecycleGeneration,
				ingress: admissionIngress,
				suppressVisibleSessionEffects,
				onCommittedSessionId: (committedSessionId) => {
					runOwnedSessionId = committedSessionId;
					compactionSessionIdReporter.onCompactionCommitted(committedSessionId);
				}
			});
			const attemptPrepared = foreground.prepared;
			preparedRunAdmission = foreground.admission;
			sessionEntry = attemptPrepared.sessionEntry;
			if (attemptPrepared.sessionId !== runOwnedSessionId) {
				runOwnedSessionId = attemptPrepared.sessionId;
				compactionSessionIdReporter.onCompactionCommitted(runOwnedSessionId);
			}
			const embeddedAttempt = await runEmbeddedAgentAttempt({
				prepared: attemptPrepared,
				opts,
				sessionEntry,
				lifecycleGeneration,
				onLifecycleGenerationChanged: (nextLifecycleGeneration) => {
					lifecycleGeneration = nextLifecycleGeneration;
				},
				onCompactionAccounting: (fact) => {
					if (fact.kind === "durable") {
						runOwnedSessionId = fact.target.sessionId;
						if (fact.previousSessionId !== void 0) compactionSessionIdReporter.onCompactionCommitted(fact.target.sessionId);
					}
				},
				suppressVisibleSessionEffects,
				preserveUserFacingSessionModelState,
				modelSelection,
				embeddedSessionState,
				trackInternalModelRunTarget,
				preparedRunAdmission
			});
			if (embeddedAttempt.fallbackExhausted) opts.onModelFallbackExhausted?.();
			sessionEntry = embeddedAttempt.sessionEntry;
			lifecycleGeneration = embeddedAttempt.lifecycleGeneration;
			const finalized = await finalizeEmbeddedAgentCommand({
				prepared: attemptPrepared,
				opts,
				deps: resolvedDeps,
				runtime,
				sessionEntry,
				attempt: embeddedAttempt,
				embeddedSessionState,
				suppressVisibleSessionEffects,
				preserveUserFacingSessionModelState,
				currentRunDeliveryContext,
				sessionOwnership: {
					runOwnedSessionId,
					sessionReboundDuringRun
				},
				trackInternalModelRunTarget,
				onSessionOwnershipChanged: (ownership, committedCompactionSessionId) => {
					runOwnedSessionId = ownership.runOwnedSessionId;
					sessionReboundDuringRun = ownership.sessionReboundDuringRun;
					compactionSessionIdReporter.onCompactionCommitted(committedCompactionSessionId);
				},
				onTerminalDeliveryEvidenceChanged: (evidence) => {
					restartRecoveryTerminalDeliveryEvidence = evidence;
				}
			});
			sessionEntry = finalized.sessionEntry;
			runOwnedSessionId = finalized.runOwnedSessionId;
			sessionReboundDuringRun = finalized.sessionReboundDuringRun;
			maintenanceRequest = finalized.maintenance;
			return finalized.deliveryResult;
		});
	} finally {
		await finishAgentCommandCleanup({
			prepared,
			sessionEntry,
			runOwnedSessionId,
			sessionReboundDuringRun,
			trackedRestartRecoveryDeliveryClaim,
			terminalDeliveryEvidence: restartRecoveryTerminalDeliveryEvidence,
			lifecycleGeneration,
			beforeTerminalDelivery: opts.beforeTerminalDelivery,
			reportCommitted: compactionSessionIdReporter.reportCommitted,
			preparedRunAdmission,
			sessionWorkAdmission,
			cleanupInternalModelRunTargets,
			releaseForeground
		});
		if (maintenanceRequest) scheduleSessionMaintenance(maintenanceRequest);
	}
}
async function agentCommandWithAdmissionIngress(opts, admissionIngress, runtime = defaultRuntime, deps) {
	return await runLocalAgentCommand({
		opts,
		runtime,
		deps,
		operatorAuthority: admissionIngress.kind === "local-cli",
		run: async (prepared, resolvedDeps) => await agentCommandInternal(prepared, prepared.opts, admissionIngress, runtime, resolvedDeps)
	});
}
async function agentCommand(opts, runtime = defaultRuntime, deps) {
	const { localIngress } = executionIdentity;
	return await agentCommandWithAdmissionIngress(opts, localIngress, runtime, deps);
}
async function agentCommandFromSystem(opts, admission, runtime = defaultRuntime, deps) {
	return await agentCommandWithAdmissionIngress(opts, executionIdentity.systemIngress(admission.boundary), runtime, deps);
}
async function agentCommandFromIngressInternal(opts, runtime = defaultRuntime, deps, recovery, runtimeContext) {
	if (typeof opts.allowModelOverride !== "boolean") throw new Error("allowModelOverride must be explicitly set for ingress agent runs.");
	const lifecycleGeneration = opts.lifecycleGeneration ?? captureAgentRunLifecycleGeneration(opts.runId ?? "");
	const generation = runtimeContext?.pluginGeneration;
	const executeIngress = () => withAgentRunLifecycleGeneration(lifecycleGeneration, async () => {
		let preparedAgentDir;
		const result = await runWithAgentCommandRecoveryOwner({
			lifecycleGeneration,
			mode: "claim",
			opts: {
				...opts,
				lifecycleGeneration,
				senderIsOwner: opts.senderIsOwner === true
			},
			prepare: async (preparedOpts) => await prepareAgentCommandExecution(preparedOpts, runtime, runtimeContext),
			restoreAdmittedRecovery: recovery?.restoreAdmittedRecovery,
			run: async (prepared) => {
				preparedAgentDir = prepared.agentDir;
				const run = async () => await agentCommandInternal(prepared, prepared.opts, {
					kind: "api",
					boundary: "agent-command.from-ingress",
					state: "unknown"
				}, runtime, deps, true);
				return generation ? await run() : await withAgentPluginRegistry({
					config: prepared.cfg,
					workspaceDir: prepared.workspaceDir,
					run
				});
			}
		});
		if (result && preparedAgentDir) emitIngressModelUsageDiagnostic(result, opts, preparedAgentDir);
		return result;
	});
	return generation && runtimeContext ? await withPluginRuntimeGenerationScope({
		metadataSnapshot: generation.pluginMetadataSnapshot,
		pluginRegistry: generation.pluginRegistry
	}, executeIngress) : await executeIngress();
}
/** Runs an agent turn from an inbound channel/gateway ingress context. */
async function agentCommandFromIngress(opts, runtime = defaultRuntime, deps) {
	return await agentCommandFromIngressInternal(sanitizePublicAgentCommandIngressOpts(opts), runtime, deps);
}
/** Internal Gateway entrypoint that restores a rejected restart-recovery admission. */
async function agentCommandFromGatewayIngress(opts, runtime, deps, recovery, runtimeContext) {
	return await agentCommandFromIngressInternal(opts, runtime, deps, recovery, runtimeContext);
}
//#endregion
export { agentCommandFromSystem as i, agentCommandFromGatewayIngress as n, agentCommandFromIngress as r, agentCommand as t };