merge: integrate origin/dev into modular-enforcement branch

Resolves all merge conflicts, preserving our split module structure
while integrating all dev changes:
- Custom agent summaries support (parseRegisteredAgentSummaries)
- Background notification queue (enqueueNotificationForParent)
- Atlas shared git-worktree module (collectGitDiffStats, formatFileChanges)
- Ralph-loop withTimeout + DEFAULT_API_TIMEOUT=5000
- Session recovery assistant_prefill_unsupported error type
- Atlas agentOverrides forwarding
- Config handler plan model demotion (buildPlanDemoteConfig)
- Delegate-task agentOverrides, promptSyncWithModelSuggestionRetry, variant
- LSP init timeout + stale init detection
- isPlanFamily function + task-continuation-enforcer hook
- Handoff command
This commit is contained in:
YeonGyu-Kim
2026-02-08 17:34:47 +09:00
74 changed files with 4016 additions and 654 deletions
+36 -3
View File
@@ -4,6 +4,7 @@ import type { PluginContext } from "../types"
import {
createTodoContinuationEnforcer,
createTaskContinuationEnforcer,
createBackgroundNotificationHook,
createStopContinuationGuardHook,
createCompactionContextInjector,
@@ -18,6 +19,7 @@ export type ContinuationHooks = {
compactionContextInjector: ReturnType<typeof createCompactionContextInjector> | null
compactionTodoPreserver: ReturnType<typeof createCompactionTodoPreserverHook> | null
todoContinuationEnforcer: ReturnType<typeof createTodoContinuationEnforcer> | null
taskContinuationEnforcer: ReturnType<typeof createTaskContinuationEnforcer> | null
unstableAgentBabysitter: ReturnType<typeof createUnstableAgentBabysitter> | null
backgroundNotificationHook: ReturnType<typeof createBackgroundNotificationHook> | null
atlasHook: ReturnType<typeof createAtlasHook> | null
@@ -68,14 +70,43 @@ export function createContinuationHooks(args: {
}))
: null
const taskContinuationEnforcer = isHookEnabled("task-continuation-enforcer")
? safeHook("task-continuation-enforcer", () =>
createTaskContinuationEnforcer(ctx, pluginConfig, {
backgroundManager,
isContinuationStopped: stopContinuationGuard?.isStopped,
}))
: null
const unstableAgentBabysitter = isHookEnabled("unstable-agent-babysitter")
? safeHook("unstable-agent-babysitter", () =>
createUnstableAgentBabysitter({ ctx, backgroundManager, pluginConfig }))
: null
if (sessionRecovery && todoContinuationEnforcer) {
sessionRecovery.setOnAbortCallback(todoContinuationEnforcer.markRecovering)
sessionRecovery.setOnRecoveryCompleteCallback(todoContinuationEnforcer.markRecoveryComplete)
if (sessionRecovery) {
const onAbortCallbacks: Array<(sessionID: string) => void> = []
const onRecoveryCompleteCallbacks: Array<(sessionID: string) => void> = []
if (todoContinuationEnforcer) {
onAbortCallbacks.push(todoContinuationEnforcer.markRecovering)
onRecoveryCompleteCallbacks.push(todoContinuationEnforcer.markRecoveryComplete)
}
if (taskContinuationEnforcer) {
onAbortCallbacks.push(taskContinuationEnforcer.markRecovering)
onRecoveryCompleteCallbacks.push(taskContinuationEnforcer.markRecoveryComplete)
}
if (onAbortCallbacks.length > 0) {
sessionRecovery.setOnAbortCallback((sessionID: string) => {
for (const callback of onAbortCallbacks) callback(sessionID)
})
}
if (onRecoveryCompleteCallbacks.length > 0) {
sessionRecovery.setOnRecoveryCompleteCallback((sessionID: string) => {
for (const callback of onRecoveryCompleteCallbacks) callback(sessionID)
})
}
}
const backgroundNotificationHook = isHookEnabled("background-notification")
@@ -89,6 +120,7 @@ export function createContinuationHooks(args: {
backgroundManager,
isContinuationStopped: (sessionID: string) =>
stopContinuationGuard?.isStopped(sessionID) ?? false,
agentOverrides: pluginConfig.agents,
}))
: null
@@ -97,6 +129,7 @@ export function createContinuationHooks(args: {
compactionContextInjector,
compactionTodoPreserver,
todoContinuationEnforcer,
taskContinuationEnforcer,
unstableAgentBabysitter,
backgroundNotificationHook,
atlasHook,