@overdeck/desktop 0.31.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/package.json +1 -1
  2. package/server/public/assets/{chunk-BO2N2NFS-Cwc4lXp8.js → chunk-BO2N2NFS-CW1ZdFdY.js} +4 -4
  3. package/server/public/assets/{diagram-OG6HWLK6-BV1cva-G.js → diagram-OG6HWLK6-Cw_BgPPR.js} +1 -1
  4. package/server/public/assets/{dist-B3-NBXNY.js → dist-913yenhq.js} +1 -1
  5. package/server/public/assets/{dist-9_3cMWAu.js → dist-CGMAxsiA.js} +3 -3
  6. package/server/public/assets/{ganttDiagram-6RSMTGT7-pdYgAHyY.js → ganttDiagram-6RSMTGT7-CUPZhXKC.js} +1 -1
  7. package/server/public/assets/{highlighted-body-OFNGDK62-DmF_yp4o.js → highlighted-body-OFNGDK62-PZCZRTma.js} +1 -1
  8. package/server/public/assets/index-2sJIy1Mo.js +805 -0
  9. package/server/public/assets/index-D_duUQjN.css +1 -0
  10. package/server/public/assets/{linear-DcZ83rN-.js → linear-CaWsupFC.js} +1 -1
  11. package/server/public/assets/mermaid-GHXKKRXX-CD7SbVD6.js +1 -0
  12. package/server/public/assets/{pieDiagram-4H26LBE5-BzCaErrK.js → pieDiagram-4H26LBE5-BhU2fIWh.js} +1 -1
  13. package/server/public/assets/{prod-Dgylk8o0.js → prod-Dk-iWRhQ.js} +4 -4
  14. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BfeRAr-V.js → quadrantDiagram-W4KKPZXB-DGOsJ_nS.js} +1 -1
  15. package/server/public/assets/{sankeyDiagram-5OEKKPKP-DQ6JjCv-.js → sankeyDiagram-5OEKKPKP-CzirInk6.js} +1 -1
  16. package/server/public/assets/{xychartDiagram-2RQKCTM6-B5QvPHe8.js → xychartDiagram-2RQKCTM6-CG8FHgaF.js} +1 -1
  17. package/server/public/index.html +2 -2
  18. package/server/server.js +251 -157
  19. package/server/public/assets/index-CtG7LH4D.css +0 -1
  20. package/server/public/assets/index-DfbVwpxY.js +0 -801
  21. package/server/public/assets/mermaid-GHXKKRXX-CtuRwlIT.js +0 -1
package/server/server.js CHANGED
@@ -1,93 +1,90 @@
1
- import { a as __toCommonJS, i as __require, o as __toESM, t as __commonJSMin } from "./chunk-HkwdBwDg.js";
2
- import { C as isDevMode, E as sessionFilePath, S as init_paths, T as resolveOhmypiExtensionPath, _ as SYNC_SOURCES, l as LOGS_DIR, o as CLAUDE_DIR, t as AGENTS_DIR, u as OVERDECK_HOME, w as packageRoot, x as getOverdeckHome, y as encodeClaudeProjectDir } from "./paths-CC7BDxY0.js";
3
- import { a as FsError, d as ProcessSpawnError, h as init_errors, p as TrackerError, s as GitHubApiError } from "./errors-LhRGtRIA.js";
4
- import { A as getAgentJsonlMtime, B as isTrustedOriginForHost, C as resolveAgentHarness, D as resolvePiSessionPath, E as resolveJsonlPath, F as init_agent_input_detection, G as init_codex_auth, H as validateOrigin$1, I as parseCodexApprovalPrompt, K as httpHandler, L as getHeaderFromMap, M as scanPendingInputsPromise, N as detectAwaitingInputForAgent, O as computeAgentEnrichment, P as detectAwaitingInputFromPaneSync, S as readLauncherPinnedSessionId, T as resolveCodexRolloutPath, U as validateOriginHeaders, W as checkCodexAuthStatus, X as init_http_helpers, Z as jsonResponse, _ as getRuntimeForAgent, a as init_agent_projection, b as init_health, c as init_git_info, d as getSystemHealthSnapshot, f as init_system_health_service, g as init_service, h as getCloisterService, j as init_agent_enrichment, n as init_agents, o as saveAgentStateAndEmitEvent, q as init_http_handler, s as saveAgentStateAndEmitEventProgram, t as agentsRouteLayer, u as resolveConversationGitInfo, v as init_runtimes, w as resolveClaudeSessionId, x as init_jsonl_resolver, y as getAgentHealth, z as init_origin_validation } from "./agents-DCDyboA-.js";
5
- import { a as init_activity_logger, i as emitDashboardLifecycleSync, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-U396zbXm.js";
6
- import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, d as getOverdeckDatabaseSync, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-BUUcHyyN.js";
7
- import { n as openDatabase, t as init_driver } from "./driver-CmBD8_I7.js";
8
- import { t as require_dist$1 } from "./dist-CChAhNVv.js";
9
- import { a as parseIssueIdSync, n as extractPrefixSync, r as init_issue_id } from "./issue-id-ChfDs-cT.js";
10
- import { E as registerProjectSync, N as setProjectAutoMergeDefaultSync, O as resolveProjectFromIssue, _ as init_projects, b as listProjects, d as getProjectSync, k as resolveProjectFromIssueSync, l as getIssuePrefix, r as extractTeamPrefix, s as findProjectByTeamSync, x as listProjectsSync } from "./projects-DF5T4DAb.js";
11
- import { A as mergeTtsDaemonConfigs, C as isTldrEnabledSync, D as mergeConfigs, E as loadConfigSync, F as defaultBackgroundAiFeatures, I as init_registry, L as init_js_yaml, P as updateConversationsConfig, R as jsYaml, T as loadConfigNoMigration, a as PARENT_MODEL_REF, b as init_config_yaml, c as clearConfigCache, d as getConversationsConfig, g as getGlobalConfigPath, h as getDefaultTtsDaemonConfig, i as DEFAULT_WORKHORSES, o as ROLE_EFFORTS, r as DEFAULT_ROLES, t as COMPLIANCE_MODES, u as getConversationSearchConfigSync, x as isClaudeCodeChannelsEnabled } from "./config-yaml-DUGsL46H.js";
12
- import { a as hasModelCapabilitySync, c as resolveModelIdSync, i as getModelEffortLevelsSync, n as MODEL_DEPRECATIONS, o as init_model_capabilities, s as modelSupportsImagesSync, t as MODEL_CAPABILITIES } from "./model-capabilities-DzrmNh9F.js";
13
- import { B as init_ui_theme, D as listSessionNames, F as sessionExists, G as init_child_env, H as BLANKED_PROVIDER_ENV, L as setOption, N as sendKeys, P as sendRawKeystroke, S as isHarnessProcessAlive, U as buildChildEnvSync, V as setUiTheme, W as buildChildEnvWithoutTmuxSync, b as getWindowDimensions, c as ensureManagedTmuxContextOnce, d as exactPaneTarget, i as capturePane, j as resizeWindow, k as listSessionsSync, n as buildTmuxArgs, o as createSession, p as findManagedServerPidSync, w as killSession, x as init_tmux } from "./tmux-C0RZWQ5S.js";
14
- import { a as init_event_store, i as initEventStore, n as getEventStore, r as getSharedDb } from "./event-store-DaXPWThb.js";
15
- import { _ as MemoryObservation, d as PanRpcGroup, f as WS_METHODS, h as EDITORS, i as FlywheelStats, m as FlywheelStatus, n as ContextLayerSaveRequest, p as FlywheelRunId, r as ContextPreviewRequest, t as init_src, u as PanRpcError } from "./src-xz0_FrSc.js";
16
- import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-_gBwIK-o.js";
17
- import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services } from "./issue-lifecycle-DQNY7Voi.js";
18
- import { n as AgentsResolverLive, o as init_agents$1 } from "./agents-C2UPLUyP.js";
19
- import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-C4a4MFTH.js";
20
- import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-Dxq9Ki0z.js";
21
- import { a as diffAgainstMainFiles, c as diffFilesAgainstHead, d as findCommitAtTime, i as diffAgainstMain, l as diffPatchFilesAgainstHead, m as listCheckpoints, o as diffCheckpointFiles, p as init_checkpoint_manager, s as diffCheckpoints, t as captureCheckpoint, u as diffPatchSinceCommit } from "./checkpoint-manager-CyxF3jLY.js";
22
- import { _ as init_cost, a as init_costs, c as init_reconciler, d as migrateAllSessionsSync, f as getCostsForIssueSync, g as CostResolverLive, h as CostResolver, i as resolveIssueHeadlineCost, l as reconcile, m as syncCacheSync, n as init_running_agents_cache, o as init_sync_wal, p as rebuildCacheSync, r as init_issue_cost_resolver, s as syncWalFromAllProjects, t as getCachedRunningAgents, u as reconcilePiTranscripts } from "./running-agents-cache-CYw5Xnmw.js";
23
- import { i as init_agent_state_service, n as AgentStateServiceLive } from "./agent-state-service-r2kuZLya.js";
24
- import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-C0oOKrs5.js";
25
- import { d as init_typed_errors, l as WorkspaceCreateError, n as AgentStartError, r as BeadsNotInitialized, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-DG3nrArx.js";
26
- import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-LhrJ-6UJ.js";
27
- import { i as init_github_client, r as GitHubClientOptionalLive } from "./github-client-CqmZy-AQ.js";
28
- import { i as init_rally_client, r as RallyClientOptionalLive } from "./rally-client-DfPdFRtS.js";
29
- import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CdTEubvB.js";
30
- import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-Cemym5sC.js";
31
- import { i as ensureInternalTokenSync, s as init_internal_token } from "./internal-token-V1t_XVES.js";
32
- import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-yfbLZ66F.js";
33
- import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates, r as getAllReviewStatusesFromDb } from "./review-status-sync-DlQCDXOn.js";
34
- import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as init_cost_sync } from "./cost-sync-zTeJiiWF.js";
35
- import { C as transitionToMerging, _ as markFailed, c as isFlywheelGloballyPaused, d as listDuePendingAutoMerges, f as listProblemAutoMerges, g as markBlocked, n as getActionableAutoMerge, o as init_merge_sync, t as cancelPending, u as listActiveAutoMerges, v as markMerged, x as scheduleAutoMergeWithResult, y as requeueToPending } from "./merge-sync-C1ojtBCQ.js";
36
- import { _ as setReviewStatus, a as fixStuckCommentedReviews, c as getReviewStatusSync, l as init_review_status, n as clearReviewStatus, o as fixStuckReadyForMerge, r as clearStuckMergeStatuses, s as getReviewStatus, u as loadReviewStatuses } from "./review-status-DlZpTmJb.js";
37
- import { A as PAN_CONTINUE_FILENAME, I as init_types, _ as findSpecByIssue, a as init_io, j as PAN_DIRNAME, l as readWorkspacePlan, n as findPlan, s as readPlan, y as init_specs } from "./io-Z4rUYasM.js";
38
- import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-DSHuOfBZ.js";
39
- import { f as init_config, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-CxoqEywB.js";
40
- import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-M91UIf3c.js";
41
- import { $ as updateSpawnError, A as listConversations, B as setClearedToConvId, C as getStuckForks, E as init_conversations, G as setForkRequest, H as setConversationHarness, J as updateConversationDeliveryMethod, K as unarchiveConversation, L as recordConversationHandoff, M as markConversationActive, N as markConversationEnded, O as listActiveConversations, P as markConversationRunning, Q as updateLastAttached, R as removeFavorite, S as getConversationByTmuxSession, T as incrementForkRetryCount, U as setConversationModel, V as setConversationClaudeSessionId, W as setFavorite, X as updateConversationTitle, Y as updateConversationForkFallbackReason, Z as updateForkStatus, _ as canReplaceTitle, b as getConversationById, g as backfillConversationModel, h as archiveConversation, j as listFavoritedIds, k as listArchivedConversationsWithEnrichment, q as updateConversationCost, v as createConversation, w as hasOtherActiveConversationOnTmuxSession, x as getConversationByName, y as getConversationByClaudeSessionId } from "./conversations-DLvWHK2i.js";
42
- import { _ as init_codex_conversation_parser, a as init_conversation_service, c as parseFromLastCompactBoundary, d as init_ohmypi_conversation_parser, f as isOhmypiSessionFile, g as parsePiConversationMessages, h as isPiSessionFile, i as gateSnapshotEmission, l as summarizeConversationActivity, m as init_pi_conversation_parser, n as contextUsageFromParseResult, o as parseConversationMessages, p as parseOhmypiConversationMessages, t as computeContextUsage, u as watchConversation, v as parseCodexConversationMessages } from "./conversation-service-BLnGgpGK.js";
43
- import { i as getClaudePermissionFlagsStringSync, o as init_claude_permissions, s as resolvePermissionModeSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-BHhkuJLN.js";
44
- import { l as init_codex, s as findRolloutPath } from "./codex-CAqD-NbA.js";
45
- import { $t as init_claude_auth, A as getAgentStateFilePath, At as init_operator_interventions, B as init_agents$2, Bt as init_pty_token, C as dismissDevChannelsDialog, D as getAgentRuntimeState, Dt as captureTranscriptUserRecordSnapshot, E as getAgentRuntimeBaseCommand, Et as writeChannelsBridgeMcpConfig, F as getProviderEnvForModel, G as listAgentStates, Ht as init_bridge_token, I as getProviderExportsForModel, K as listRunningAgents, O as getAgentRuntimeStateSync, Ot as init_transcript_landing, P as getProviderAuthMode, Qt as getClaudeAuthStatus, Rt as init_pi_fifo, St as waitForReadySignal, T as getAgentDir, Ut as writeBridgeTokenSync, V as injectPiConversationMemory, Vt as writePtyToken, Z as messageAgent, en as getOpenAIAuthStatus, h as clearReadySignal, j as getAgentStateSync, jt as operatorInterventionEvent, k as getAgentState, kt as probeTranscriptSince, tn as init_openai_auth, v as deliverAgentMessage, zt as piFifoPaths } from "./agents-hLt-Rr4P.js";
46
- import { a as getBuiltInDefaultHarness, c as getProviderForModelSync, l as init_providers, o as getKimiAnthropicBaseUrl, u as piProviderForModel } from "./providers-CA5H_tiu.js";
47
- import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-C69va1rT.js";
48
- import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-D_0oOxVa.js";
49
- import { t as init_pan_dir } from "./pan-dir-8hycoLIn.js";
50
- import { n as init_launcher_generator, t as generateLauncherScriptSync } from "./launcher-generator-CQI4Wi8N.js";
51
- import { a as globalContextFile$1, d as workspaceContextFile, l as projectContextFile, n as codexGlobalContextFile, o as init_layers, r as ensureProjectLayer, s as piGlobalContextFile } from "./layers-BhmZ9Xjw.js";
52
- import { i as init_harness_policy, n as resolveHarness, r as canUseHarnessSync, t as init_harness_resolve } from "./harness-resolve-zjwwqUyX.js";
53
- import { c as init_docker_stats } from "./stack-health-qc0DMiOU.js";
54
- import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health$1, t as init_providers$1 } from "./providers-BVXfagAf.js";
55
- import { a as getSetting, b as setSetting, c as isDeaconGloballyPausedSync, d as isFlywheelRequireUatBeforeMerge, f as isMergeTrainEnabled, g as setFlywheelAutoPickupBacklog, l as isFlywheelAutoPickupBacklog, m as setDeaconGloballyPausedSync, o as init_control_settings, u as isFlywheelGloballyPaused$1, v as setFlywheelRequireUatBeforeMerge, y as setMergeTrainEnabled } from "./control-settings-nrCd7a15.js";
56
- import { a as parseRelativeTime, n as CostThresholdError, s as embed } from "./scanner-nBZUh3Z-.js";
57
- import { n as deduplicateEventsSync, o as readEventsSync, s as tailEventsSync } from "./events-DlidSJfB.js";
58
- import { n as recordBackgroundAiCost, t as init_cost$1 } from "./cost-CshfLVLS.js";
59
- import { a as startUatTrainReconciler, c as openFlywheelRunReportForDashboard, d as resumeFlywheelRunForDashboard, f as startFlywheelRunForDashboard, l as pauseFlywheelRunForDashboard, o as stopUatTrainReconciler, p as runDashboardDbJob, s as abortFlywheelRunForDashboard, u as readCurrentFlywheelStatusForDashboard } from "./uat-train-iwQ7DuuA.js";
60
- import { S as subscribeLatestFlywheelStatus, _ as listFlywheelRuns, g as isFlywheelRunId, h as init_flywheel_run_state, l as buildClassifyLookups, p as getFlywheelRunDetail, u as init_lookups, w as writeLatestFlywheelStatus, x as resolveLiveFlywheelRunId, y as readCurrentLatestFlywheelStatus } from "./flywheel-B5jy_sgt.js";
61
- import { f as workspacesRouteLayer, g as getWorkspacePathForIssue, h as processPendingFeedbackDeliveries, m as resumeQueuedMerges, p as enrichReviewStatus } from "./workspaces-CXng3UsG.js";
62
- import { _ as init_platform, g as detectPlatform } from "./workspace-manager-CDuomoTM.js";
63
- import { a as getShadowState, s as init_shadow_state } from "./shadow-state-CVp1QwER.js";
64
- import { C as init_dashboard_auth, D as init_review_status$1, E as rejectUnsafeDashboardMutationRequest, S as hasDashboardInternalToken, T as rejectUnauthorizedDashboardSessionMintRequest, _ as groupResourceAllocatedIssuesByProject, b as dashboardCsrfToken, g as getCachedResourceAllocatedIssues, m as issuesRouteLayer, p as init_issues, v as init_resource_discovery, w as rejectUnauthorizedDashboardRequest, x as dashboardSessionCookieHeader, y as sanitizeResourceAllocatedIssues } from "./issues-CaZ8H94W.js";
65
- import { a as loadCloisterConfigSync, i as loadCloisterConfig, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-DHYPHDxW.js";
66
- import { O as init_specialists, b as getReviewerSessionName } from "./specialists-B3b3zCCR.js";
67
- import { H as init_deacon, _t as init_concurrency, ct as setMergeReadyNotifier, gt as emergencyBrake, ht as withConcurrencyLimit, i as autoResumeStoppedWorkAgents, mt as init_concurrency$1, ot as setAgentStatusChangedNotifier, st as setAgentStoppedNotifier } from "./deacon-BE8F3tlB.js";
68
- import { n as getNoResumeMode, r as init_no_resume_mode, t as disableNoResumeMode } from "./no-resume-mode-DeRX_RrX.js";
69
- import { c as init_prd_locations, s as findPrdAtStatusSync } from "./archive-planning-Bn8NdLWB.js";
70
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-M6ArcFFB.js";
71
- import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-JIDLRyzK.js";
72
- import { _ as init_pickup, c as BLOCKS_MAIN_LABEL, d as VETOED_LABEL, f as classifyIssue, g as computeWaves, h as computeStats, l as PARKED_LABEL, m as computeLanes, p as computeCohort, u as READY_LABEL, v as normalizeGate } from "./flywheel-merge-order-CEIqRtni.js";
73
- import { _ as sendToRemoteAgent, a as getRemoteAgentOutput, n as checkRemoteSpendCap, o as init_remote_agents, p as loadRemoteAgentState, u as killRemoteAgent, v as spawnRemoteAgent } from "./remote-agents-CxrbmI9_.js";
74
- import { _ as init_git_activity, v as listGitOperationsSync } from "./merge-agent-Dpkezdnp.js";
75
- import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-G1HK5zsr.js";
76
- import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-DYsLK5RG.js";
77
- import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-D8AxgJpA.js";
78
- import { r as specialistsRouteLayer } from "./specialists-q3ihCaib.js";
79
- import { t as getAgentCommandSync } from "./settings-BAejBGHF.js";
80
- import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-B_OxVPgn.js";
81
- import { i as isRemoteAvailable, r as init_remote, t as createFlyProviderFromConfig } from "./remote-DD99dxJA.js";
82
- import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-DdI3J1rj.js";
83
- import { a as init_query_expansion, i as clearQueryExpansionCache, n as init_injection, o as buildMatchQuery, r as injectPromptTimeMemory, s as init_search } from "./injection-DEXsy0T8.js";
84
- import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-CRstXkJ_.js";
85
- import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-BMeD-rqy.js";
86
- import { a as init_render, d as validateTemplate, i as hasManagedRegion, l as init_harness, o as userContentOutsideRegion, t as init_context_layers, u as renderForHarness } from "./context-layers-CDdkuSCl.js";
87
- import { c as init_github_app, s as getPullRequestState } from "./github-app-DAbOi7t-.js";
88
- import { i as parseArtifactRef, r as init_forge } from "./forge-DGbYPb6g.js";
89
- import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-JLfhLLC6.js";
90
- import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-CHIwn3hr.js";
1
+ import { a as __toCommonJS, i as __require, o as __toESM, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
2
+ import { C as isDevMode, E as sessionFilePath, S as init_paths, T as resolveOhmypiExtensionPath, _ as SYNC_SOURCES, l as LOGS_DIR, o as CLAUDE_DIR, t as AGENTS_DIR, u as OVERDECK_HOME, w as packageRoot, x as getOverdeckHome, y as encodeClaudeProjectDir } from "./paths-jZvjmiV6.js";
3
+ import { A as init_model_capabilities, B as FsError, C as defaultBackgroundAiFeatures, E as MODEL_DEPRECATIONS, F as require_dist$1, H as GitHubApiError, J as TrackerError, K as ProcessSpawnError, M as resolveModelIdSync, N as init_js_yaml, O as getModelEffortLevelsSync, P as jsYaml, S as updateConversationsConfig, T as MODEL_CAPABILITIES, X as init_errors, _ as loadConfigNoMigration, a as ROLE_EFFORTS, b as mergeTtsDaemonConfigs, c as getConversationSearchConfigSync, d as getDefaultTtsDaemonConfig, f as getGlobalConfigPath, g as isTldrEnabledSync, i as PARENT_MODEL_REF, j as modelSupportsImagesSync, k as hasModelCapabilitySync, l as getConversationsConfig, m as isClaudeCodeChannelsEnabled, n as DEFAULT_ROLES, o as clearConfigCache, p as init_config_yaml, r as DEFAULT_WORKHORSES, s as computeModelOrigin, t as COMPLIANCE_MODES, v as loadConfigSync, w as init_registry, x as resolveModel, y as mergeConfigs } from "./config-yaml-DKmldcyb.js";
4
+ import { A as getAgentJsonlMtime, B as isTrustedOriginForHost, C as resolveAgentHarness, D as resolvePiSessionPath, E as resolveJsonlPath, F as init_agent_input_detection, G as init_codex_auth, H as validateOrigin$1, I as parseCodexApprovalPrompt, K as httpHandler, L as getHeaderFromMap, M as scanPendingInputsPromise, N as detectAwaitingInputForAgent, O as computeAgentEnrichment, P as detectAwaitingInputFromPaneSync, S as readLauncherPinnedSessionId, T as resolveCodexRolloutPath, U as validateOriginHeaders, W as checkCodexAuthStatus, X as init_http_helpers, Z as jsonResponse, _ as getRuntimeForAgent, a as init_agent_projection, b as init_health, c as init_git_info, d as getSystemHealthSnapshot, f as init_system_health_service, g as init_service, h as getCloisterService, j as init_agent_enrichment, n as init_agents, o as saveAgentStateAndEmitEvent, q as init_http_handler, s as saveAgentStateAndEmitEventProgram, t as agentsRouteLayer, u as resolveConversationGitInfo, v as init_runtimes, w as resolveClaudeSessionId, x as init_jsonl_resolver, y as getAgentHealth, z as init_origin_validation } from "./agents-L3yA6mO7.js";
5
+ import { a as init_activity_logger, i as emitDashboardLifecycleSync, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DW1XjyNu.js";
6
+ import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, d as getOverdeckDatabaseSync, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-V576nNrp.js";
7
+ import { n as openDatabase, t as init_driver } from "./driver-CYPr28GN.js";
8
+ import { a as parseIssueIdSync, n as extractPrefixSync, r as init_issue_id } from "./issue-id-9iS2dwrp.js";
9
+ import { E as registerProjectSync, N as setProjectAutoMergeDefaultSync, O as resolveProjectFromIssue, _ as init_projects, b as listProjects, d as getProjectSync, k as resolveProjectFromIssueSync, l as getIssuePrefix, r as extractTeamPrefix, s as findProjectByTeamSync, x as listProjectsSync } from "./projects-BpstKN1Q.js";
10
+ import { B as init_ui_theme, D as listSessionNames, F as sessionExists, G as init_child_env, H as BLANKED_PROVIDER_ENV, L as setOption, N as sendKeys, P as sendRawKeystroke, S as isHarnessProcessAlive, U as buildChildEnvSync, V as setUiTheme, W as buildChildEnvWithoutTmuxSync, b as getWindowDimensions, c as ensureManagedTmuxContextOnce, d as exactPaneTarget, i as capturePane, j as resizeWindow, k as listSessionsSync, n as buildTmuxArgs, o as createSession, p as findManagedServerPidSync, w as killSession, x as init_tmux } from "./tmux-DuzZlrCh.js";
11
+ import { a as init_event_store, i as initEventStore, n as getEventStore, r as getSharedDb } from "./event-store-hdZZ-JnB.js";
12
+ import { _ as MemoryObservation, d as PanRpcGroup, f as WS_METHODS, h as EDITORS, i as FlywheelStats, m as FlywheelStatus, n as ContextLayerSaveRequest, p as FlywheelRunId, r as ContextPreviewRequest, t as init_src, u as PanRpcError } from "./src-wyzx0Z0w.js";
13
+ import { _ as setReviewStatus, a as fixStuckCommentedReviews, c as getReviewStatusSync, l as init_review_status, n as clearReviewStatus, o as fixStuckReadyForMerge, r as clearStuckMergeStatuses, s as getReviewStatus, u as loadReviewStatuses } from "./review-status-D_w3kLBb.js";
14
+ import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services } from "./issue-lifecycle-D4DcNPZ-.js";
15
+ import { n as AgentsResolverLive, o as init_agents$1 } from "./agents-BOX5w2kT.js";
16
+ import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-zPOV7_VB.js";
17
+ import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness--_mHhmzI.js";
18
+ import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-5mIu-zwl.js";
19
+ import { a as diffAgainstMainFiles, c as diffFilesAgainstHead, d as findCommitAtTime, i as diffAgainstMain, l as diffPatchFilesAgainstHead, m as listCheckpoints, o as diffCheckpointFiles, p as init_checkpoint_manager, s as diffCheckpoints, t as captureCheckpoint, u as diffPatchSinceCommit } from "./checkpoint-manager-B8USYP2J.js";
20
+ import { _ as init_cost, a as init_costs, c as init_reconciler, d as migrateAllSessionsSync, f as getCostsForIssueSync, g as CostResolverLive, h as CostResolver, i as resolveIssueHeadlineCost, l as reconcile, m as syncCacheSync, n as init_running_agents_cache, o as init_sync_wal, p as rebuildCacheSync, r as init_issue_cost_resolver, s as syncWalFromAllProjects, t as getCachedRunningAgents, u as reconcilePiTranscripts } from "./running-agents-cache-CoFoCGgg.js";
21
+ import { i as init_agent_state_service, n as AgentStateServiceLive } from "./agent-state-service-CoVk44dM.js";
22
+ import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-Clt5yfo6.js";
23
+ import { d as init_typed_errors, l as WorkspaceCreateError, n as AgentStartError, r as BeadsNotInitialized, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-BRDFMoss.js";
24
+ import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-DCCtUBEM.js";
25
+ import { i as init_github_client, r as GitHubClientOptionalLive } from "./github-client-Dxt2nXAf.js";
26
+ import { i as init_rally_client, r as RallyClientOptionalLive } from "./rally-client-CFxmPAi2.js";
27
+ import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-k1WKm_mu.js";
28
+ import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-0AVb8ADy.js";
29
+ import { i as ensureInternalTokenSync, s as init_internal_token } from "./internal-token-R4gY8z44.js";
30
+ import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-C5ZCbH9K.js";
31
+ import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates, r as getAllReviewStatusesFromDb } from "./review-status-sync-DGaMxP95.js";
32
+ import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as init_cost_sync } from "./cost-sync-CI1Gfwnb.js";
33
+ import { C as transitionToMerging, _ as markFailed, c as isFlywheelGloballyPaused, d as listDuePendingAutoMerges, f as listProblemAutoMerges, g as markBlocked, n as getActionableAutoMerge, o as init_merge_sync, t as cancelPending, u as listActiveAutoMerges, v as markMerged, x as scheduleAutoMergeWithResult, y as requeueToPending } from "./merge-sync-CKUHrPQl.js";
34
+ import { A as PAN_CONTINUE_FILENAME, I as init_types, _ as findSpecByIssue, a as init_io, j as PAN_DIRNAME, l as readWorkspacePlan, n as findPlan, s as readPlan, y as init_specs } from "./io-cnr9mD4B.js";
35
+ import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-O755gANb.js";
36
+ import { f as init_config, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-B8QT8B9M.js";
37
+ import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-CROoF5ic.js";
38
+ import { $ as updateSpawnError, A as listConversations, B as setClearedToConvId, C as getStuckForks, E as init_conversations, G as setForkRequest, H as setConversationHarness, J as updateConversationDeliveryMethod, K as unarchiveConversation, L as recordConversationHandoff, M as markConversationActive, N as markConversationEnded, O as listActiveConversations, P as markConversationRunning, Q as updateLastAttached, R as removeFavorite, S as getConversationByTmuxSession, T as incrementForkRetryCount, U as setConversationModel, V as setConversationClaudeSessionId, W as setFavorite, X as updateConversationTitle, Y as updateConversationForkFallbackReason, Z as updateForkStatus, _ as canReplaceTitle, b as getConversationById, g as backfillConversationModel, h as archiveConversation, j as listFavoritedIds, k as listArchivedConversationsWithEnrichment, q as updateConversationCost, v as createConversation, w as hasOtherActiveConversationOnTmuxSession, x as getConversationByName, y as getConversationByClaudeSessionId } from "./conversations-_HbvcXw1.js";
39
+ import { _ as init_codex_conversation_parser, a as init_conversation_service, c as parseFromLastCompactBoundary, d as init_ohmypi_conversation_parser, f as isOhmypiSessionFile, g as parsePiConversationMessages, h as isPiSessionFile, i as gateSnapshotEmission, l as summarizeConversationActivity, m as init_pi_conversation_parser, n as contextUsageFromParseResult, o as parseConversationMessages, p as parseOhmypiConversationMessages, t as computeContextUsage, u as watchConversation, v as parseCodexConversationMessages } from "./conversation-service-CJimCSkV.js";
40
+ import { i as getClaudePermissionFlagsStringSync, o as init_claude_permissions, s as resolvePermissionModeSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-BqmkURDk.js";
41
+ import { l as init_codex, s as findRolloutPath } from "./codex-B8fyHBID.js";
42
+ import { $t as init_claude_auth, A as getAgentStateFilePath, At as init_operator_interventions, B as init_agents$2, Bt as init_pty_token, C as dismissDevChannelsDialog, D as getAgentRuntimeState, Dt as captureTranscriptUserRecordSnapshot, E as getAgentRuntimeBaseCommand, Et as writeChannelsBridgeMcpConfig, F as getProviderEnvForModel, G as listAgentStates, Ht as init_bridge_token, I as getProviderExportsForModel, K as listRunningAgents, O as getAgentRuntimeStateSync, Ot as init_transcript_landing, P as getProviderAuthMode, Qt as getClaudeAuthStatus, Rt as init_pi_fifo, St as waitForReadySignal, T as getAgentDir, Ut as writeBridgeTokenSync, V as injectPiConversationMemory, Vt as writePtyToken, Xt as init_agent_record_sync, Z as messageAgent, Zt as readAgentHarnessModelRecordSync, en as getOpenAIAuthStatus, h as clearReadySignal, j as getAgentStateSync, jt as operatorInterventionEvent, k as getAgentState, kt as probeTranscriptSince, tn as init_openai_auth, v as deliverAgentMessage, zt as piFifoPaths } from "./agents-qDfx6gda.js";
43
+ import { a as getBuiltInDefaultHarness, c as getProviderForModelSync, l as init_providers, o as getKimiAnthropicBaseUrl, u as piProviderForModel } from "./providers-Cju7HorZ.js";
44
+ import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-BsiM65ZI.js";
45
+ import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-s_9BJkQW.js";
46
+ import { t as init_pan_dir } from "./pan-dir-BfyAUgin.js";
47
+ import { n as init_launcher_generator, t as generateLauncherScriptSync } from "./launcher-generator-CZaEkOZW.js";
48
+ import { a as globalContextFile$1, d as workspaceContextFile, l as projectContextFile, n as codexGlobalContextFile, o as init_layers, r as ensureProjectLayer, s as piGlobalContextFile } from "./layers-CoMbLSYY.js";
49
+ import { i as init_harness_policy, n as resolveHarness, r as canUseHarnessSync, t as init_harness_resolve } from "./harness-resolve-CMrgPv1e.js";
50
+ import { c as init_docker_stats } from "./stack-health-KI4ZA4dt.js";
51
+ import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health$1, t as init_providers$1 } from "./providers-0791nfjR.js";
52
+ import { a as getSetting, b as setSetting, c as isDeaconGloballyPausedSync, d as isFlywheelRequireUatBeforeMerge, f as isMergeTrainEnabled, g as setFlywheelAutoPickupBacklog, l as isFlywheelAutoPickupBacklog, m as setDeaconGloballyPausedSync, o as init_control_settings, u as isFlywheelGloballyPaused$1, v as setFlywheelRequireUatBeforeMerge, y as setMergeTrainEnabled } from "./control-settings-BaPQ0U5p.js";
53
+ import { a as parseRelativeTime, n as CostThresholdError, s as embed } from "./scanner-DYR1QDik.js";
54
+ import { n as deduplicateEventsSync, o as readEventsSync, s as tailEventsSync } from "./events-C0JbknXU.js";
55
+ import { n as recordBackgroundAiCost, t as init_cost$1 } from "./cost-CBa8loyG.js";
56
+ import { a as startUatTrainReconciler, c as openFlywheelRunReportForDashboard, d as resumeFlywheelRunForDashboard, f as startFlywheelRunForDashboard, l as pauseFlywheelRunForDashboard, o as stopUatTrainReconciler, p as runDashboardDbJob, s as abortFlywheelRunForDashboard, u as readCurrentFlywheelStatusForDashboard } from "./uat-train-BF905HkK.js";
57
+ import { S as subscribeLatestFlywheelStatus, _ as listFlywheelRuns, g as isFlywheelRunId, h as init_flywheel_run_state, l as buildClassifyLookups, p as getFlywheelRunDetail, u as init_lookups, w as writeLatestFlywheelStatus, x as resolveLiveFlywheelRunId, y as readCurrentLatestFlywheelStatus } from "./flywheel-rQwXVZR5.js";
58
+ import { f as workspacesRouteLayer, g as getWorkspacePathForIssue, h as processPendingFeedbackDeliveries, m as resumeQueuedMerges, p as enrichReviewStatus } from "./workspaces-CvQySqp3.js";
59
+ import { _ as init_platform, g as detectPlatform } from "./workspace-manager-oMP5s9VY.js";
60
+ import { a as getShadowState, s as init_shadow_state } from "./shadow-state-xPxOHguz.js";
61
+ import { C as init_dashboard_auth, D as init_review_status$1, E as rejectUnsafeDashboardMutationRequest, S as hasDashboardInternalToken, T as rejectUnauthorizedDashboardSessionMintRequest, _ as groupResourceAllocatedIssuesByProject, b as dashboardCsrfToken, g as getCachedResourceAllocatedIssues, m as issuesRouteLayer, p as init_issues, v as init_resource_discovery, w as rejectUnauthorizedDashboardRequest, x as dashboardSessionCookieHeader, y as sanitizeResourceAllocatedIssues } from "./issues-D909CPHX.js";
62
+ import { a as loadCloisterConfigSync, i as loadCloisterConfig, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-wf_W38L3.js";
63
+ import { O as init_specialists, b as getReviewerSessionName } from "./specialists-C5uBTD_g.js";
64
+ import { H as init_deacon, _t as emergencyBrake, ct as setAgentStoppedNotifier, gt as withConcurrencyLimit, ht as init_concurrency$1, i as autoResumeStoppedWorkAgents, lt as setMergeReadyNotifier, rt as resetPatrolHeartbeatForStartup, st as setAgentStatusChangedNotifier, vt as init_concurrency } from "./deacon-BJOrAeJn.js";
65
+ import { n as getNoResumeMode, r as init_no_resume_mode, t as disableNoResumeMode } from "./no-resume-mode-DlMPigWY.js";
66
+ import { c as init_prd_locations, s as findPrdAtStatusSync } from "./archive-planning-O-QKXVWX.js";
67
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-D5GpgTWq.js";
68
+ import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-CMiS9KMK.js";
69
+ import { _ as computeStats, b as normalizeGate, c as BLOCKS_MAIN_LABEL, d as READY_LABEL, f as RELEASED_LABEL, g as computeLanes, h as computeCohort, l as OBJECTION_LABEL, m as classifyIssue, p as VETOED_LABEL, u as PARKED_LABEL, v as computeWaves, y as init_pickup } from "./flywheel-merge-order-bSoDRUVw.js";
70
+ import { _ as sendToRemoteAgent, a as getRemoteAgentOutput, n as checkRemoteSpendCap, o as init_remote_agents, p as loadRemoteAgentState, u as killRemoteAgent, v as spawnRemoteAgent } from "./remote-agents-DQRd2At2.js";
71
+ import { _ as init_git_activity, v as listGitOperationsSync } from "./merge-agent-BsELKm49.js";
72
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-C4f0Cv5Z.js";
73
+ import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-DH6pFiOa.js";
74
+ import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-_dL7JXdO.js";
75
+ import { r as specialistsRouteLayer } from "./specialists-DFDg83jj.js";
76
+ import { t as getAgentCommandSync } from "./settings-DVFIQrHs.js";
77
+ import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-GjWZBuhW.js";
78
+ import { i as isRemoteAvailable, r as init_remote, t as createFlyProviderFromConfig } from "./remote-br-7Zy2V.js";
79
+ import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-Ck8qNezZ.js";
80
+ import { a as init_query_expansion, i as clearQueryExpansionCache, n as init_injection, o as buildMatchQuery, r as injectPromptTimeMemory, s as init_search } from "./injection-CcJERZro.js";
81
+ import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-znoS388v.js";
82
+ import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-DfmqrfYi.js";
83
+ import { a as init_render, d as validateTemplate, i as hasManagedRegion, l as init_harness, o as userContentOutsideRegion, t as init_context_layers, u as renderForHarness } from "./context-layers-CIMR-y8_.js";
84
+ import { c as init_github_app, s as getPullRequestState } from "./github-app-DgISqJqI.js";
85
+ import { i as parseArtifactRef, r as init_forge } from "./forge-mcRx-ba-.js";
86
+ import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-CFrrqU0M.js";
87
+ import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-9h0pTZ5k.js";
91
88
  import { createRequire } from "node:module";
92
89
  import { Cause, Context, Data, Effect, Exit, Fiber, FileSystem, Layer, Option, Path, Queue, Result, Schedule, Schema, Stream } from "effect";
93
90
  import { createReadStream, createWriteStream, existsSync, fstatSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
@@ -102,7 +99,7 @@ import { createHash, randomUUID } from "crypto";
102
99
  import * as sp from "node:path";
103
100
  import { basename as basename$1, delimiter, dirname as dirname$1, extname as extname$1, isAbsolute as isAbsolute$1, join as join$1, normalize, relative as relative$1, resolve as resolve$1, sep as sep$1 } from "node:path";
104
101
  import { chmod as chmod$1, mkdir as mkdir$1, open as open$1, readFile as readFile$1, readdir as readdir$1, rename as rename$1, stat as stat$2, unlink as unlink$1, writeFile as writeFile$1 } from "fs/promises";
105
- import { createHmac, randomBytes as randomBytes$1, randomUUID as randomUUID$1, timingSafeEqual } from "node:crypto";
102
+ import { createHmac, randomBytes, randomUUID as randomUUID$1, timingSafeEqual } from "node:crypto";
106
103
  import { exec, execFile, execFileSync, execSync, spawn } from "node:child_process";
107
104
  import { promisify } from "node:util";
108
105
  import * as pty from "@homebridge/node-pty-prebuilt-multiarch";
@@ -631,7 +628,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
631
628
  const beadsDir = join$1(workspacePath, ".beads");
632
629
  const projectBeadsDir = join$1(workspacePath, "..", "..", ".beads");
633
630
  if (!(existsSync$1(beadsDir) || existsSync$1(projectBeadsDir))) throw new BeadsNotInitialized({ workspace: workspacePath });
634
- const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-DdvrDsH42.js");
631
+ const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-DsFz3A8y.js");
635
632
  const normalizedId = normalizeAgentId(issueId);
636
633
  if ((await Effect.runPromise(getAgentState(normalizedId)))?.status === "running") throw new AgentAlreadyRunning({ id: issueId });
637
634
  return {
@@ -662,7 +659,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
662
659
  const { workspacePath, projectPath, issue } = opts;
663
660
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
664
661
  const sessionName = opts.sessionName ?? `planning-${issueId.toLowerCase()}`;
665
- const { spawnPlanningSession } = await import("./spawn-planning-session-caXjx8yu.js");
662
+ const { spawnPlanningSession } = await import("./spawn-planning-session-DnUv0hSH.js");
666
663
  const result = await spawnPlanningSession({
667
664
  issue: {
668
665
  id: issue.id,
@@ -695,14 +692,14 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
695
692
  }),
696
693
  kill: (agentId) => Effect.tryPromise({
697
694
  try: async () => {
698
- const { stopAgent } = await import("./agents-DdvrDsH42.js");
695
+ const { stopAgent } = await import("./agents-DsFz3A8y.js");
699
696
  await Effect.runPromise(stopAgent(agentId));
700
697
  },
701
698
  catch: () => void 0
702
699
  }).pipe(Effect.ignore),
703
700
  message: (agentId, msg) => Effect.tryPromise({
704
701
  try: async () => {
705
- const { messageAgent } = await import("./agents-DdvrDsH42.js");
702
+ const { messageAgent } = await import("./agents-DsFz3A8y.js");
706
703
  await messageAgent(agentId, msg);
707
704
  },
708
705
  catch: (err) => new AgentStartError({
@@ -713,8 +710,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
713
710
  }),
714
711
  deepWipe: (issueId, opts) => Effect.tryPromise({
715
712
  try: async () => {
716
- const { deepWipe } = await import("./workflows-D6j_6rZF.js");
717
- const { resolveProjectFromIssueSync } = await import("./projects-LkdoL5F9.js");
713
+ const { deepWipe } = await import("./workflows-LNUGDzVu.js");
714
+ const { resolveProjectFromIssueSync } = await import("./projects-DWBDcB6V.js");
718
715
  const project = resolveProjectFromIssueSync(issueId);
719
716
  const projectPath = project?.projectPath ?? process.cwd();
720
717
  await Effect.runPromise(deepWipe({
@@ -770,8 +767,8 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
770
767
  const { workspacePath, branch } = getWorkspacePath(issueId);
771
768
  const issueLower = issueId.toLowerCase();
772
769
  if (existsSync$1(workspacePath)) return workspacePath;
773
- const { createWorkspace } = await import("./workspace-manager-C1Ocyoqn.js");
774
- const { loadProjectsConfigSync } = await import("./projects-LkdoL5F9.js");
770
+ const { createWorkspace } = await import("./workspace-manager-XDNuCCXG.js");
771
+ const { loadProjectsConfigSync } = await import("./projects-DWBDcB6V.js");
775
772
  const { projects } = loadProjectsConfigSync();
776
773
  const project = resolveProjectFromIssueSync(issueId);
777
774
  if (!project) throw new WorkspaceCreateError({
@@ -806,7 +803,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
806
803
  const { workspacePath } = getWorkspacePath(issueId);
807
804
  const issueLower = issueId.toLowerCase();
808
805
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
809
- const { removeWorkspace } = await import("./workspace-manager-C1Ocyoqn.js");
806
+ const { removeWorkspace } = await import("./workspace-manager-XDNuCCXG.js");
810
807
  const project = resolveProjectFromIssueSync(issueId);
811
808
  if (!project) throw new WorkspaceCreateError({
812
809
  id: issueId,
@@ -837,7 +834,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
837
834
  try: async () => {
838
835
  const { workspacePath } = getWorkspacePath(issueId);
839
836
  const issueLower = issueId.toLowerCase();
840
- const { stopWorkspaceDocker } = await import("./workspace-manager-C1Ocyoqn.js");
837
+ const { stopWorkspaceDocker } = await import("./workspace-manager-XDNuCCXG.js");
841
838
  await Effect.runPromise(stopWorkspaceDocker(workspacePath, issueLower));
842
839
  },
843
840
  catch: () => void 0
@@ -906,7 +903,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
906
903
  join$1(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
907
904
  ];
908
905
  if (!composePaths.find((p) => existsSync$1(p))) {
909
- const { ensureDevcontainerSync } = await import("./ensure-devcontainer-C1oOwQUK.js");
906
+ const { ensureDevcontainerSync } = await import("./ensure-devcontainer-Uu-fGqwo.js");
910
907
  const ensure = ensureDevcontainerSync({
911
908
  workspacePath,
912
909
  issueId
@@ -3176,7 +3173,7 @@ var require_websocket = /* @__PURE__ */ __commonJSMin(((exports, module) => {
3176
3173
  const http$1 = __require("http");
3177
3174
  const net = __require("net");
3178
3175
  const tls = __require("tls");
3179
- const { randomBytes: randomBytes$2, createHash: createHash$3 } = __require("crypto");
3176
+ const { randomBytes: randomBytes$1, createHash: createHash$3 } = __require("crypto");
3180
3177
  const { Duplex: Duplex$2, Readable: Readable$1 } = __require("stream");
3181
3178
  const { URL: URL$1 } = __require("url");
3182
3179
  const PerMessageDeflate = require_permessage_deflate();
@@ -3731,7 +3728,7 @@ var require_websocket = /* @__PURE__ */ __commonJSMin(((exports, module) => {
3731
3728
  }
3732
3729
  }
3733
3730
  const defaultPort = isSecure ? 443 : 80;
3734
- const key = randomBytes$2(16).toString("base64");
3731
+ const key = randomBytes$1(16).toString("base64");
3735
3732
  const request = isSecure ? https.request : http$1.request;
3736
3733
  const protocolSet = /* @__PURE__ */ new Set();
3737
3734
  let perMessageDeflate;
@@ -15928,7 +15925,7 @@ var require_get_vercel_oidc_token = /* @__PURE__ */ __commonJSMin(((exports, mod
15928
15925
  err = error;
15929
15926
  }
15930
15927
  try {
15931
- const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-DpHQzShA.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-DDSrzs5Z.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
15928
+ const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-xNaV-00f.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-mVJcOeCq.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
15932
15929
  if (!token || isExpired(getTokenPayload(token), options?.expirationBufferMs)) {
15933
15930
  await refreshToken(options);
15934
15931
  token = getVercelOidcTokenSync();
@@ -28245,7 +28242,7 @@ var GoogleCloudTranscription = class {
28245
28242
  }
28246
28243
  async start(apiKey, model) {
28247
28244
  try {
28248
- const { SpeechClient } = await import("./src-DXazRIFk.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
28245
+ const { SpeechClient } = await import("./src-BuEHMMFm.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
28249
28246
  if (this.closed) return;
28250
28247
  const stream = new SpeechClient({ apiKey }).streamingRecognize({
28251
28248
  config: {
@@ -28932,6 +28929,7 @@ init_providers();
28932
28929
  init_openai_auth();
28933
28930
  init_claude_auth();
28934
28931
  init_launcher_generator();
28932
+ init_agent_record_sync();
28935
28933
  init_layers();
28936
28934
  init_bridge_token();
28937
28935
  init_pty_token();
@@ -29677,11 +29675,13 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
29677
29675
  if (!conv && /^(agent-|planning-|specialist-)/.test(input.conversationName)) {
29678
29676
  const harness = yield* Effect.promise(() => resolveAgentHarness(input.conversationName));
29679
29677
  if (harness === "ohmypi") return streamResolvedFullParseSnapshots(() => resolvePiSessionPath(input.conversationName), parseOhmypiConversationMessages, null);
29678
+ if (harness === "pi") return streamResolvedFullParseSnapshots(() => resolvePiSessionPath(input.conversationName), parsePiConversationMessages, null);
29680
29679
  if (harness === "codex") return streamResolvedFullParseSnapshots(() => resolveCodexRolloutPath(input.conversationName), parseCodexConversationMessages, null);
29681
29680
  return conversationDiscoveringStream();
29682
29681
  }
29683
29682
  if (!conv) return conversationDiscoveringStream();
29684
29683
  if (conv.harness === "ohmypi") return streamResolvedFullParseSnapshots(() => resolvePiSessionPath(conv.tmuxSession), parseOhmypiConversationMessages, conv.model ?? null, true);
29684
+ if (conv.harness === "pi") return streamResolvedFullParseSnapshots(() => resolvePiSessionPath(conv.tmuxSession), parsePiConversationMessages, conv.model ?? null, true);
29685
29685
  if (conv.harness === "codex") return streamResolvedFullParseSnapshots(() => resolveCodexRolloutPath(conv.tmuxSession), parseCodexConversationMessages, conv.model ?? null, true);
29686
29686
  if (conv.harness !== "claude-code" && conv.harness != null) return conversationDiscoveringStream();
29687
29687
  const launcherTmuxSession = conv.tmuxSession;
@@ -30609,6 +30609,47 @@ const getContainerLogsRoute = HttpRouter.add("GET", "/api/resources/docker/conta
30609
30609
  })));
30610
30610
  const resourcesRouteLayer = Layer.mergeAll(getResourcesRoute, getContainerHistoryRoute, getContainerDetailsRoute, deleteDockerContainerRoute, postPruneContainersRoute, deleteDockerNetworkRoute, deleteDockerVolumeRoute, postPruneVolumesRoute, postRestartContainerRoute, postStartContainerRoute, getContainerLogsRoute);
30611
30611
  //#endregion
30612
+ //#region services/model-origin-enrich.ts
30613
+ init_agents$2();
30614
+ init_config_yaml();
30615
+ /**
30616
+ * Map a session-node type to the pipeline Role whose model distribution it draws
30617
+ * from. Returns null for types that never sample a top-level weighted role
30618
+ * distribution: 'reviewer' (sub-role convoy — resolves via a sub-role scalar),
30619
+ * 'legacy', and anything unrecognized.
30620
+ */
30621
+ function sessionTypeToModelRole(type) {
30622
+ switch (type) {
30623
+ case "work": return "work";
30624
+ case "review": return "review";
30625
+ case "test": return "test";
30626
+ case "ship":
30627
+ case "merge": return "ship";
30628
+ case "planning": return "plan";
30629
+ case "strike": return "strike";
30630
+ default: return null;
30631
+ }
30632
+ }
30633
+ /**
30634
+ * Mutate `sections` in place, attaching `modelOrigin` to each node whose role uses
30635
+ * a weighted distribution. Scalar roles are left untouched (the client renders the
30636
+ * resolved model with no bars/hash). Reconstructs the spawn key from the agent's
30637
+ * persisted `modelSpawnKey` (exact) or, for pre-PAN-2053 agents, `${role}:${issueId}`.
30638
+ * Wrapped so a config/state error can never break the tree.
30639
+ */
30640
+ function enrichSessionsWithModelOrigin(sections, fallbackIssueId) {
30641
+ try {
30642
+ const { config } = loadConfigSync();
30643
+ for (const section of sections) {
30644
+ const role = sessionTypeToModelRole(section.type);
30645
+ if (!role) continue;
30646
+ const state = getAgentStateSync(section.sessionId);
30647
+ const origin = computeModelOrigin(role, state?.modelSpawnKey ?? `${role}:${state?.issueId ?? fallbackIssueId}`, config);
30648
+ if (origin) section.modelOrigin = origin;
30649
+ }
30650
+ } catch {}
30651
+ }
30652
+ //#endregion
30612
30653
  //#region services/session-presence.ts
30613
30654
  /**
30614
30655
  * Derive session presence from runtime state, tmux session existence, and recent activity.
@@ -30817,7 +30858,27 @@ function normalizeRolesConfig(roles) {
30817
30858
  for (const [role, roleConfig] of Object.entries(roles)) normalized[role] = normalizeRoleConfig(roleConfig);
30818
30859
  return normalized;
30819
30860
  }
30820
- function validateModelRef(fieldPath, ref, effectiveWorkhorses, errors, warnings, allowWorkhorseRef, allowParentRef = false) {
30861
+ function validateModelRef(fieldPath, ref, effectiveWorkhorses, errors, warnings, allowWorkhorseRef, allowParentRef = false, allowDistribution = false) {
30862
+ if (Array.isArray(ref)) {
30863
+ if (!allowDistribution) {
30864
+ errors.push(`${fieldPath} distribution not allowed here; must be a scalar model reference`);
30865
+ return;
30866
+ }
30867
+ if (ref.length === 0) {
30868
+ errors.push(`${fieldPath} distribution must be a non-empty array`);
30869
+ return;
30870
+ }
30871
+ for (let i = 0; i < ref.length; i++) {
30872
+ const entry = ref[i];
30873
+ if (!isRecord$3(entry)) {
30874
+ errors.push(`${fieldPath}[${i}] must be an object with model and weight`);
30875
+ continue;
30876
+ }
30877
+ if (!Number.isInteger(entry.weight) || entry.weight <= 0) errors.push(`${fieldPath}[${i}].weight must be a positive integer`);
30878
+ validateModelRef(`${fieldPath}[${i}].model`, entry.model, effectiveWorkhorses, errors, warnings, allowWorkhorseRef);
30879
+ }
30880
+ return;
30881
+ }
30821
30882
  if (typeof ref !== "string" || ref.trim() === "") {
30822
30883
  errors.push(`${fieldPath} must be a non-empty model reference`);
30823
30884
  return;
@@ -30887,14 +30948,24 @@ function validateWorkhorsesAndRoles(settings, errors, warnings) {
30887
30948
  errors.push(`roles.${role}.model must be a non-empty model reference`);
30888
30949
  continue;
30889
30950
  }
30890
- validateModelRef(`roles.${role}.model`, rawRoleConfig.model, effectiveWorkhorses, errors, warnings, true);
30951
+ validateModelRef(`roles.${role}.model`, rawRoleConfig.model, effectiveWorkhorses, errors, warnings, true, false, true);
30891
30952
  validateRoleFields(`roles.${role}`, rawRoleConfig, errors);
30892
30953
  const effort = rawRoleConfig.effort;
30893
30954
  if (typeof effort === "string" && ROLE_EFFORTS.includes(effort)) {
30894
- const resolvedModel = resolveModelRefToId(rawRoleConfig.model ?? DEFAULT_ROLES[role]?.model, effectiveWorkhorses);
30895
- if (resolvedModel) {
30896
- const supported = getModelEffortLevelsSync(resolvedModel);
30897
- if (supported !== void 0 && !supported.includes(effort)) errors.push(`roles.${role}.effort '${effort}' is not supported by ${resolvedModel} (supported: ${supported.join(", ")})`);
30955
+ const modelRef = rawRoleConfig.model ?? DEFAULT_ROLES[role]?.model;
30956
+ if (Array.isArray(modelRef)) for (const entry of modelRef) {
30957
+ const resolvedModel = resolveModelRefToId(entry.model, effectiveWorkhorses);
30958
+ if (resolvedModel) {
30959
+ const supported = getModelEffortLevelsSync(resolvedModel);
30960
+ if (supported !== void 0 && !supported.includes(effort)) errors.push(`roles.${role}.effort '${effort}' is not supported by ${resolvedModel} (supported: ${supported.join(", ")})`);
30961
+ }
30962
+ }
30963
+ else {
30964
+ const resolvedModel = resolveModelRefToId(modelRef, effectiveWorkhorses);
30965
+ if (resolvedModel) {
30966
+ const supported = getModelEffortLevelsSync(resolvedModel);
30967
+ if (supported !== void 0 && !supported.includes(effort)) errors.push(`roles.${role}.effort '${effort}' is not supported by ${resolvedModel} (supported: ${supported.join(", ")})`);
30968
+ }
30898
30969
  }
30899
30970
  }
30900
30971
  if (rawRoleConfig.sub !== void 0) if (!isRecord$3(rawRoleConfig.sub)) errors.push(`roles.${role}.sub must be an object`);
@@ -31768,6 +31839,7 @@ init_agents$2();
31768
31839
  init_costs();
31769
31840
  init_tmux();
31770
31841
  init_projects();
31842
+ init_config_yaml();
31771
31843
  init_http_handler();
31772
31844
  init_jsonl_resolver();
31773
31845
  const execAsync$5 = promisify(exec);
@@ -32104,6 +32176,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
32104
32176
  if (!b.startedAt) return -1;
32105
32177
  return a.startedAt.localeCompare(b.startedAt);
32106
32178
  });
32179
+ enrichSessionsWithModelOrigin(sections, issueId);
32107
32180
  let costByStage = {};
32108
32181
  let totalCost = null;
32109
32182
  try {
@@ -32497,13 +32570,12 @@ Be specific: reference actual file names, function names, requirement text, disc
32497
32570
  const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
32498
32571
  const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
32499
32572
  const promptFile = join$1(planningDir, ".status-review-prompt.tmp");
32500
- const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-WToYbUwa.js");
32501
- const { loadConfigSync: loadYamlConfig } = await import("./config-yaml-DR4CnMG4.js");
32573
+ const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-Dre9thog.js");
32502
32574
  let providerEnvStr = "";
32503
32575
  let providerEnv = {};
32504
32576
  const statusProvider = getProviderForModelSync(statusModelId);
32505
32577
  if (statusProvider.name !== "anthropic") {
32506
- const { config } = loadYamlConfig();
32578
+ const { config } = loadConfigSync();
32507
32579
  const apiKey = config.apiKeys[statusProvider.name];
32508
32580
  if (apiKey) {
32509
32581
  providerEnv = getProviderEnvSync(statusProvider, apiKey);
@@ -32581,7 +32653,7 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
32581
32653
  let safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "-");
32582
32654
  let processedContent = content;
32583
32655
  if (safeName.endsWith(".vtt")) {
32584
- const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-DsT8ov3-.js"));
32656
+ const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-Dik5Bh9h.js"));
32585
32657
  processedContent = vttToMarkdown(content);
32586
32658
  safeName = safeName.replace(/\.vtt$/, ".md");
32587
32659
  }
@@ -33175,7 +33247,7 @@ async function getTtsDaemonAuthTokenPromise() {
33175
33247
  return existing;
33176
33248
  }
33177
33249
  } catch {}
33178
- const token = randomBytes$1(32).toString("base64url");
33250
+ const token = randomBytes(32).toString("base64url");
33179
33251
  await mkdir(dirname$1(QWEN_TTS_AUTH_TOKEN_PATH), {
33180
33252
  recursive: true,
33181
33253
  mode: 448
@@ -36826,7 +36898,7 @@ let conversationReindexProgress = {
36826
36898
  chunksIndexed: 0
36827
36899
  };
36828
36900
  function createReindexConfirmationNonce(estimatedUsd) {
36829
- const nonce = randomBytes$1(24).toString("base64url");
36901
+ const nonce = randomBytes(24).toString("base64url");
36830
36902
  const now = Date.now();
36831
36903
  for (const [key, entry] of reindexConfirmationNonces) if (entry.expiresAt <= now) reindexConfirmationNonces.delete(key);
36832
36904
  reindexConfirmationNonces.set(nonce, {
@@ -38342,7 +38414,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
38342
38414
  }, { status: 400 });
38343
38415
  return yield* Effect.promise(async () => {
38344
38416
  try {
38345
- const { RallyRestApi } = await import("./rally-api-D9MqLzbe.js");
38417
+ const { RallyRestApi } = await import("./rally-api-CKayMhOp.js");
38346
38418
  const api = new RallyRestApi({
38347
38419
  apiKey,
38348
38420
  server: server || "https://rally1.rallydev.com"
@@ -38469,7 +38541,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
38469
38541
  const version = await getOverdeckVersion();
38470
38542
  let supervisorUrl = null;
38471
38543
  try {
38472
- const { getSupervisorUrlSync } = await import("./supervisor-DHuyC90H.js");
38544
+ const { getSupervisorUrlSync } = await import("./supervisor-ti-xrTNH.js");
38473
38545
  supervisorUrl = getSupervisorUrlSync();
38474
38546
  } catch {}
38475
38547
  return jsonResponse({
@@ -38565,7 +38637,7 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
38565
38637
  const remoteState = loadRemoteAgentState(sessionName);
38566
38638
  const isRemote = !!remoteState;
38567
38639
  const vmName = remoteState?.vmName ?? "";
38568
- const { getAgentStateSync } = await import("./agents-DdvrDsH42.js");
38640
+ const { getAgentStateSync } = await import("./agents-DsFz3A8y.js");
38569
38641
  const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
38570
38642
  let tmuxSessionAlive = false;
38571
38643
  if (!isRemote) try {
@@ -38708,10 +38780,9 @@ Continue the PLANNING session. Do NOT implement anything.
38708
38780
  `);
38709
38781
  const agentCwd = workspacePath;
38710
38782
  if (existsSync$1(outputFile)) await rename(outputFile, join$1(planningDir, `output-${Date.now()}.jsonl`));
38711
- const { getAgentCommandSync } = await import("./settings-2rcV0DoQ.js");
38783
+ const { getAgentCommandSync } = await import("./settings-oOlkt2wY.js");
38712
38784
  let msgPlanningModel = "claude-sonnet-4-6";
38713
38785
  try {
38714
- const { loadConfigSync, resolveModel } = await import("./config-yaml-DR4CnMG4.js");
38715
38786
  msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
38716
38787
  } catch {}
38717
38788
  const msgAgentCmd = getAgentCommandSync(msgPlanningModel);
@@ -38771,7 +38842,7 @@ const deletePlanningSessionRoute = HttpRouter.add("DELETE", "/api/planning/:issu
38771
38842
  }));
38772
38843
  const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
38773
38844
  try {
38774
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DANmNff5.js");
38845
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CdfMe3Oe.js");
38775
38846
  const projectRoot = process.cwd();
38776
38847
  const venvPath = join$1(projectRoot, ".venv");
38777
38848
  const results = [];
@@ -38816,7 +38887,7 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
38816
38887
  }));
38817
38888
  const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
38818
38889
  try {
38819
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DANmNff5.js");
38890
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CdfMe3Oe.js");
38820
38891
  const projectRoot = process.cwd();
38821
38892
  const venvPath = join$1(projectRoot, ".venv");
38822
38893
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -38833,7 +38904,7 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
38833
38904
  }));
38834
38905
  const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
38835
38906
  try {
38836
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DANmNff5.js");
38907
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CdfMe3Oe.js");
38837
38908
  const projectRoot = process.cwd();
38838
38909
  const venvPath = join$1(projectRoot, ".venv");
38839
38910
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -38850,7 +38921,7 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
38850
38921
  }));
38851
38922
  const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
38852
38923
  try {
38853
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DANmNff5.js");
38924
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CdfMe3Oe.js");
38854
38925
  const enabled = isTldrEnabledSync();
38855
38926
  const projectRoot = process.cwd();
38856
38927
  const targets = [];
@@ -38975,7 +39046,7 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
38975
39046
  const projectPath = await getProjectPath(issuePrefix);
38976
39047
  const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
38977
39048
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
38978
- const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-DcZh0oHj.js");
39049
+ const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-eRFcHl7F.js");
38979
39050
  const config = {
38980
39051
  issueId,
38981
39052
  workspacePath,
@@ -39005,7 +39076,7 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
39005
39076
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
39006
39077
  const ghConfig = getGitHubConfig();
39007
39078
  if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
39008
- const { runObserverCycle } = await import("./shadow-engineering-DcZh0oHj.js");
39079
+ const { runObserverCycle } = await import("./shadow-engineering-eRFcHl7F.js");
39009
39080
  const firstRepo = ghConfig.repos[0];
39010
39081
  const config = {
39011
39082
  issueId,
@@ -40345,7 +40416,7 @@ async function cleanupConversationAttachments(name) {
40345
40416
  * sessions that the lifecycle poller missed. */
40346
40417
  async function cleanupOrphanedConversationAttachments() {
40347
40418
  try {
40348
- const { listConversations } = await import("./conversations-BC6lrn4U.js");
40419
+ const { listConversations } = await import("./conversations-BtRONkWR.js");
40349
40420
  const convNames = new Set(listConversations().map((c) => c.name));
40350
40421
  const root = getConversationAttachmentsRoot();
40351
40422
  await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join$1(root, entry.name)), 10, (path) => rm(path, {
@@ -40892,7 +40963,7 @@ async function waitForPiTuiReady(tmuxSession, timeoutMs = 3e4) {
40892
40963
  return false;
40893
40964
  }
40894
40965
  async function resolveSessionFile(conv) {
40895
- if (conv.harness === "ohmypi") {
40966
+ if (conv.harness === "ohmypi" || conv.harness === "pi") {
40896
40967
  const piPath = await resolvePiSessionPath(conv.tmuxSession);
40897
40968
  if (piPath) return piPath;
40898
40969
  }
@@ -41049,6 +41120,7 @@ async function handleConversationImageUpload(name, filename, bytes, mimeType) {
41049
41120
  async function handleConversationMessage(name, body) {
41050
41121
  const conv = getConversationByName(name);
41051
41122
  if (!conv) return jsonResponse({ error: "Conversation not found" }, { status: 404 });
41123
+ if (conv.status === "ended") return jsonResponse({ error: "Session has ended — start a new run to interact" }, { status: 422 });
41052
41124
  const message = typeof body["message"] === "string" ? body["message"].trim() : "";
41053
41125
  if (!message) return jsonResponse({ error: "Message is required" }, { status: 400 });
41054
41126
  if (message.length > MAX_MESSAGE_LENGTH) return jsonResponse({ error: `Message exceeds maximum length of ${MAX_MESSAGE_LENGTH} characters` }, { status: 400 });
@@ -41396,7 +41468,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
41396
41468
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
41397
41469
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
41398
41470
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
41399
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-Bt9WjVrk.js");
41471
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-sd8uk-U3.js");
41400
41472
  initCodexHome(codexHome, {
41401
41473
  trustedDir: cwd,
41402
41474
  approvalPolicy: codexApprovalPolicy,
@@ -41466,7 +41538,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
41466
41538
  } catch {}
41467
41539
  console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
41468
41540
  try {
41469
- const { preTrustDirectory } = await import("./workspace-manager-C1Ocyoqn.js");
41541
+ const { preTrustDirectory } = await import("./workspace-manager-XDNuCCXG.js");
41470
41542
  preTrustDirectory(cwd);
41471
41543
  } catch {}
41472
41544
  try {
@@ -41483,7 +41555,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
41483
41555
  const codexHomeDir = codexFields.codexHome;
41484
41556
  (async () => {
41485
41557
  try {
41486
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-Bt9WjVrk.js");
41558
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-sd8uk-U3.js");
41487
41559
  const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
41488
41560
  if (rollout) {
41489
41561
  const threadId = extractThreadIdFromRollout(rollout);
@@ -43665,7 +43737,7 @@ async function registerProjectFromPath(opts) {
43665
43737
  registerProjectSync(key, projectConfig);
43666
43738
  const seededContextLayer = ensureProjectLayer(fullPath);
43667
43739
  try {
43668
- const { preTrustDirectorySync } = await import("./workspace-manager-C1Ocyoqn.js");
43740
+ const { preTrustDirectorySync } = await import("./workspace-manager-XDNuCCXG.js");
43669
43741
  preTrustDirectorySync(fullPath);
43670
43742
  } catch {}
43671
43743
  let hooksInstalled = 0;
@@ -43706,7 +43778,7 @@ init_jsonl_resolver();
43706
43778
  init_paths();
43707
43779
  const execAsync$2 = promisify(exec);
43708
43780
  async function getIssueDataService() {
43709
- const { getSharedIssueService } = await import("./issue-service-singleton-p8pVr1YM.js");
43781
+ const { getSharedIssueService } = await import("./issue-service-singleton-DfRSzdFO.js");
43710
43782
  return getSharedIssueService();
43711
43783
  }
43712
43784
  /** Returns true if the path exists (any type). */
@@ -43956,6 +44028,7 @@ async function collectSessionTreeNodes(issueId, workspacePath, projectPath, cont
43956
44028
  });
43957
44029
  }
43958
44030
  }
44031
+ enrichSessionsWithModelOrigin(sections, issueId);
43959
44032
  return sections.filter((s) => !isStaleLegacySession(s));
43960
44033
  }
43961
44034
  async function resolveFeatureTitle(issueId, issueLower, issueTitles, project) {
@@ -45722,8 +45795,8 @@ async function handlePullRequestPromise(payload) {
45722
45795
  if (!issueId) return;
45723
45796
  const repo = payload.repository.full_name;
45724
45797
  if (payload.action === "closed" && pr.merged === true) try {
45725
- const { postMergeLifecycle } = await import("./merge-agent-Dhw22tcB.js");
45726
- const { resolveProjectFromIssueSync } = await import("./projects-LkdoL5F9.js");
45798
+ const { postMergeLifecycle } = await import("./merge-agent-CdxCcqFv.js");
45799
+ const { resolveProjectFromIssueSync } = await import("./projects-DWBDcB6V.js");
45727
45800
  const project = resolveProjectFromIssueSync(issueId);
45728
45801
  if (project) {
45729
45802
  const branchName = pr.head.ref;
@@ -46184,7 +46257,7 @@ function getCheckpointWorker() {
46184
46257
  return worker;
46185
46258
  }
46186
46259
  async function runInline(operation, payload) {
46187
- const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-xdJ_1zqi.js");
46260
+ const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-BRNSJDyI.js");
46188
46261
  switch (operation) {
46189
46262
  case "claimTranscriptRange": return claimTranscriptRange(payload);
46190
46263
  case "commitTranscriptRange": return commitTranscriptRange(payload);
@@ -47338,7 +47411,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
47338
47411
  };
47339
47412
  }
47340
47413
  async function emitMemoryObservationCreated(observation, timestamp) {
47341
- const { initEventStore } = await import("./event-store-CltcAmHd.js");
47414
+ const { initEventStore } = await import("./event-store-D_9DeP8Y.js");
47342
47415
  await (await initEventStore()).appendAsync({
47343
47416
  type: "memory.observation_created",
47344
47417
  timestamp,
@@ -50266,7 +50339,7 @@ async function getFlywheelConversationPayload() {
50266
50339
  };
50267
50340
  }
50268
50341
  async function postFlywheelReportPayload() {
50269
- const { flywheelReportCommand } = await import("./flywheel-B600poCU.js");
50342
+ const { flywheelReportCommand } = await import("./flywheel-NZJyASRc.js");
50270
50343
  await flywheelReportCommand({ cwd: process.cwd() });
50271
50344
  return {
50272
50345
  status: 200,
@@ -50455,11 +50528,11 @@ const getMergeBlockersRoute = HttpRouter.add("GET", "/api/flywheel/merge-blocker
50455
50528
  async function defaultGetOrderedIssueIds() {
50456
50529
  const status = await readCurrentFlywheelStatusForDashboard();
50457
50530
  if (!status) return [];
50458
- const { computeMergeQueue } = await import("./flywheel-merge-order-CxtnH0iT.js");
50531
+ const { computeMergeQueue } = await import("./flywheel-merge-order-BkA6937p.js");
50459
50532
  return (await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd()).pipe(Effect.provide(layer)))).map((i) => i.issueId);
50460
50533
  }
50461
50534
  async function defaultMergeOne(issueId) {
50462
- const { triggerMerge } = await import("./workspaces-u5uok4gi.js");
50535
+ const { triggerMerge } = await import("./workspaces-DL8hfuDT.js");
50463
50536
  const r = await triggerMerge(issueId);
50464
50537
  return r.success ? { ok: true } : {
50465
50538
  ok: false,
@@ -50479,7 +50552,7 @@ async function postFlywheelMergeNextPayload(payload, deps = {}) {
50479
50552
  body: { error: "n must be a positive integer" }
50480
50553
  };
50481
50554
  const issueIds = (await (deps.getOrderedIssueIds ?? defaultGetOrderedIssueIds)()).slice(0, n);
50482
- const { shipMergeBatch } = await import("./merge-batch-BrWZSfeO.js");
50555
+ const { shipMergeBatch } = await import("./merge-batch-CaSP7OL6.js");
50483
50556
  return {
50484
50557
  status: 200,
50485
50558
  body: { outcomes: await shipMergeBatch(issueIds, { merge: deps.merge ?? defaultMergeOne }) }
@@ -50636,7 +50709,7 @@ const getFlywheelMergeQueueRoute = HttpRouter.add("GET", "/api/flywheel/merge-qu
50636
50709
  return yield* Effect.promise(async () => {
50637
50710
  const status = await readCurrentFlywheelStatusForDashboard();
50638
50711
  if (!status) return jsonResponse([]);
50639
- const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CxtnH0iT.js");
50712
+ const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-BkA6937p.js");
50640
50713
  return jsonResponse(await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd(), { getPrUrl: resolveMergeQueuePrUrl }).pipe(Effect.provide(layer))));
50641
50714
  });
50642
50715
  })));
@@ -50650,14 +50723,14 @@ function uatGenerationNameFromParam(param) {
50650
50723
  return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
50651
50724
  }
50652
50725
  const getUatGenerationsRoute = HttpRouter.add("GET", "/api/flywheel/uat-generations", httpHandler(Effect.gen(function* () {
50653
- const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-BlWjkHk7.js"));
50726
+ const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-C6_NdOfR.js"));
50654
50727
  return jsonResponse(yield* Effect.promise(() => getUatGenerationsPayload()));
50655
50728
  })));
50656
50729
  const postUatGenerationStackRoute = HttpRouter.add("POST", "/api/flywheel/uat-generations/:name/stack", httpHandler(Effect.gen(function* () {
50657
50730
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
50658
50731
  if (authError) return authError;
50659
50732
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
50660
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-BlWjkHk7.js"));
50733
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-C6_NdOfR.js"));
50661
50734
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
50662
50735
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
50663
50736
  return jsonResponse({
@@ -50669,8 +50742,8 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
50669
50742
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
50670
50743
  if (authError) return authError;
50671
50744
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
50672
- const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-BlWjkHk7.js"));
50673
- const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-OyXhszCe.js"));
50745
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-C6_NdOfR.js"));
50746
+ const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-Bbj7bCwh.js"));
50674
50747
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
50675
50748
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
50676
50749
  return jsonResponse(result);
@@ -50683,7 +50756,7 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
50683
50756
  const postFlywheelAssembleUatRoute = HttpRouter.add("POST", "/api/flywheel/assemble-uat", httpHandler(Effect.gen(function* () {
50684
50757
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
50685
50758
  if (authError) return authError;
50686
- const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-BlWjkHk7.js"));
50759
+ const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-C6_NdOfR.js"));
50687
50760
  return jsonResponse(yield* Effect.promise(() => runUatTrainReconcile({ force: true })));
50688
50761
  })));
50689
50762
  const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
@@ -51131,6 +51204,10 @@ const applyIssueBlocksMainLabel = (id) => addIssueLabel(id, BLOCKS_MAIN_LABEL);
51131
51204
  const removeIssueBlocksMainLabel = (id) => removeIssueLabel(id, BLOCKS_MAIN_LABEL);
51132
51205
  const applyIssueReadyLabel = (id) => addIssueLabel(id, READY_LABEL);
51133
51206
  const removeIssueReadyLabel = (id) => removeIssueLabel(id, READY_LABEL);
51207
+ const applyIssueReleasedLabel = (id) => addIssueLabel(id, RELEASED_LABEL);
51208
+ const removeIssueReleasedLabel = (id) => removeIssueLabel(id, RELEASED_LABEL);
51209
+ const applyIssueObjectionLabel = (id) => addIssueLabel(id, OBJECTION_LABEL);
51210
+ const removeIssueObjectionLabel = (id) => removeIssueLabel(id, OBJECTION_LABEL);
51134
51211
  //#endregion
51135
51212
  //#region ../../lib/database/agent-mappers.ts
51136
51213
  init_lookups();
@@ -51308,6 +51385,7 @@ function buildNamedParams(row) {
51308
51385
  function backfillAgentsFromStateJsonSync(db, options) {
51309
51386
  const agentsDir = join$1(getOverdeckHome(), "agents");
51310
51387
  const liveSessions = options?.listLiveSessions?.() ?? listLiveTmuxSessionNames();
51388
+ const readHarnessModel = options?.readHarnessModel ?? readAgentHarnessModelRecordSync;
51311
51389
  let processed = 0;
51312
51390
  let skipped = 0;
51313
51391
  let markedStopped = 0;
@@ -51348,7 +51426,16 @@ function backfillAgentsFromStateJsonSync(db, options) {
51348
51426
  }
51349
51427
  const reconciled = reconcileAgentStatus(state, liveSessions);
51350
51428
  if (reconciled.status === "stopped" && state.status !== "stopped") markedStopped++;
51351
- const row = agentStateToDbAgent(reconciled);
51429
+ let effective = reconciled;
51430
+ if (reconciled.issueId) {
51431
+ const rec = readHarnessModel(reconciled.issueId);
51432
+ if (rec?.harness || rec?.model) {
51433
+ effective = { ...reconciled };
51434
+ if (rec.harness) effective.harness = rec.harness;
51435
+ if (rec.model) effective.model = rec.model;
51436
+ }
51437
+ }
51438
+ const row = agentStateToDbAgent(effective);
51352
51439
  upsert.run(buildNamedParams(row));
51353
51440
  processed++;
51354
51441
  if (options?.verbose) console.log(`[backfill] ${row.id} -> ${row.status}`);
@@ -53229,6 +53316,8 @@ const postBacklogLabelsRoute = HttpRouter.add("POST", "/api/backlog/sequence/lab
53229
53316
  if (typeof body["ready"] === "boolean") await (body["ready"] ? applyIssueReadyLabel : removeIssueReadyLabel)(issueId);
53230
53317
  if (typeof body["parked"] === "boolean") await (body["parked"] ? applyIssueParkedLabel : removeIssueParkedLabel)(issueId);
53231
53318
  if (typeof body["blocksMain"] === "boolean") await (body["blocksMain"] ? applyIssueBlocksMainLabel : removeIssueBlocksMainLabel)(issueId);
53319
+ if (typeof body["released"] === "boolean") await (body["released"] ? applyIssueReleasedLabel : removeIssueReleasedLabel)(issueId);
53320
+ if (typeof body["objection"] === "boolean") await (body["objection"] ? applyIssueObjectionLabel : removeIssueObjectionLabel)(issueId);
53232
53321
  return jsonResponse({
53233
53322
  status: "ok",
53234
53323
  issueId
@@ -53838,7 +53927,7 @@ async function pollOnce(state) {
53838
53927
  try {
53839
53928
  const remoteState = await readFile(join$1(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
53840
53929
  if (remoteState?.location === "remote" && remoteState?.vmName) {
53841
- const { getRemoteAgentOutput } = await import("./remote-agents-B_xysqhd.js");
53930
+ const { getRemoteAgentOutput } = await import("./remote-agents-DQ2gRI6m.js");
53842
53931
  stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
53843
53932
  } else stdout = await Effect.runPromise(capturePane(agentId, 50));
53844
53933
  } catch {
@@ -54504,7 +54593,7 @@ function createSubstrateBugPoller(options = {}) {
54504
54593
  }
54505
54594
  async function scanIssueCandidates(config, store) {
54506
54595
  const since = isoLookback(now(), lookbackMs);
54507
- for (const repo of config.repos) {
54596
+ for (const repo of config.repos) try {
54508
54597
  const repoQualifier = `repo:${repo.owner}/${repo.repo}`;
54509
54598
  const authorResults = await fetchSearch(config.token, searchQuery([
54510
54599
  repoQualifier,
@@ -54541,11 +54630,13 @@ function createSubstrateBugPoller(options = {}) {
54541
54630
  });
54542
54631
  if (!existing) await appendSubstrateBugFiledEvent(store, bug);
54543
54632
  }
54633
+ } catch (err) {
54634
+ log.warn(`[substrate-bug-poller] skipping ${repo.owner}/${repo.repo}:`, err instanceof Error ? err.message : err);
54544
54635
  }
54545
54636
  }
54546
54637
  async function scanMergedPullRequests(config) {
54547
54638
  const since = isoLookback(now(), lookbackMs);
54548
- for (const repo of config.repos) {
54639
+ for (const repo of config.repos) try {
54549
54640
  const repoQualifier = `repo:${repo.owner}/${repo.repo}`;
54550
54641
  const pullResults = await fetchSearch(config.token, searchQuery([
54551
54642
  repoQualifier,
@@ -54573,6 +54664,8 @@ function createSubstrateBugPoller(options = {}) {
54573
54664
  repository.markFixed(issueId, commitSha, fixedAt);
54574
54665
  }
54575
54666
  }
54667
+ } catch (err) {
54668
+ log.warn(`[substrate-bug-poller] skipping ${repo.owner}/${repo.repo}:`, err instanceof Error ? err.message : err);
54576
54669
  }
54577
54670
  }
54578
54671
  async function pollOnce() {
@@ -54787,7 +54880,7 @@ const RESTART_MARKER = join(homedir(), ".overdeck", "dashboard-restarting.json")
54787
54880
  * loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
54788
54881
  */
54789
54882
  async function defaultLifecycleRunner(pending) {
54790
- const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-Dhw22tcB.js");
54883
+ const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-CdxCcqFv.js");
54791
54884
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
54792
54885
  if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
54793
54886
  }
@@ -55108,7 +55201,7 @@ function failureReason(result) {
55108
55201
  return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
55109
55202
  }
55110
55203
  async function defaultMergeIssue(issueId) {
55111
- const { triggerMerge } = await import("./workspaces-u5uok4gi.js");
55204
+ const { triggerMerge } = await import("./workspaces-DL8hfuDT.js");
55112
55205
  return triggerMerge(issueId);
55113
55206
  }
55114
55207
  function defaultAnnounceFailure(issueId, reason) {
@@ -55719,7 +55812,7 @@ reconcileStaleGitHubBlockers().then((n) => {
55719
55812
  }
55720
55813
  }).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
55721
55814
  try {
55722
- const { resetProcessingToQueued } = await import("./merge-sync-N6oGrZi7.js");
55815
+ const { resetProcessingToQueued } = await import("./merge-sync-CmpwVmNH.js");
55723
55816
  const resetCount = resetProcessingToQueued();
55724
55817
  if (resetCount > 0) {
55725
55818
  console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
@@ -55748,6 +55841,7 @@ if (process.env.OVERDECK_DISABLE_DEACON === "1") {
55748
55841
  message: "Cloister auto-start skipped via OVERDECK_DISABLE_DEACON — deacon is not running"
55749
55842
  });
55750
55843
  } else if (shouldAutoStart()) {
55844
+ resetPatrolHeartbeatForStartup();
55751
55845
  getCloisterService().start().catch((err) => {
55752
55846
  console.error("[overdeck] Cloister auto-start failed:", err);
55753
55847
  emitActivityEntrySync({