feat: complete all to-be-completed features (Phase 0-7, +95 tests)#1
Merged
Conversation
…ggestions - Add CacheControl record (ephemeral / ephemeral1h) to ContentBlock - Extend TextBlock and ToolResultBlock with Optional<CacheControl> - Backward-compatible 2-arg constructors preserved (151 existing tests green) - Extend PermissionResult.Ask with List<PermissionSuggestion> - Add PermissionSuggestion record (rule/destination/behavior) with allowLocal factory - Add ask(message, suggestions) and Ask.withSuggestion factories - Add 12 new tests (ContentBlockCacheControlTest)
- New ClaudeCodeRequestAdvisor (BaseAdvisor impl): injects system prompt from SystemPromptBuilder + history from CompactingChatMemory into request; captures usage in after(); bridges com.ccj Message <-> Spring AI Message - New AgentInvoker: replaces bare Function<String,String> lambda in ClaudeCodeJavaApplication; builds structured Prompt, returns InvocationResult (text + usage + error) - ChatClientFactory.createChatClientWithAdvisor: registers advisor chain on ChatClient bean (fulfills the 'advisor chain assembled by ccc-app' comment) - AppConfiguration.chatClient bean now wires advisor with session context - All 163 tests green (151 existing + 12 from Phase 0.1)
- New DenialTracking (3 consecutive / 20 total -> fallback to ask, not hard deny) Fixes the MAX_CONSECUTIVE_DENIALS=10 hard-deny bug in RuleBasedYoloClassifier - Update RuleBasedYoloClassifier to use DenialTracking; ask on limit exceeded - New PermissionCheckerImpl: bridges ToolExecutionPipeline.PermissionChecker with PermissionChain (inner 7-layer) + PermissionModeStrategy (outer mode transform) - Update StreamingToolExecutor: now runs permission check before tool.call; blocks on PermissionCallback (REPL-provided) when Ask; fail-closed Deny otherwise - Add PermissionCallback interface (Phase 3 PermissionDialog will implement) - Wire PermissionCheckerImpl + DenialTracking beans in AppConfiguration - Add 9 new tests (DenialTrackingTest) - All 172 tests green (163 + 9 new)
… ExitPlanMode auto-approve, fix LSP publishDiagnostics Phase 1.1 - Tool registration gap: - Register LspTool, EnterPlanModeTool, ExitPlanModeTool, CronTools.all() in AppConfiguration - Define missing beans: LspServerManager, LspDiagnosticRegistry, LspTool, PlanMode, PlanFileStore, CronTaskStore, CronTasksLock, CronScheduler - Add ccc-lsp/ccc-plan/ccc-cron dependencies to ccc-app and ccc-test poms - Unblocks 3 previously-dead modules Phase 1.2 - ExitPlanMode auto-approve bug: - Remove synchronous planMode.approve(session) in call(); set AWAITING_APPROVAL instead - Add PlanApprovalOption enum (8 options: bypass/acceptEdits/default/auto + keep/clear context) - Add validateInput override: reject if not in PLAN mode or blank plan - Add applyApproval() method for REPL dialog to call on user approval - Add PlanMode.awaitApproval() + approveWithMode() methods Phase 1.3 - LSP publishDiagnostics dead discard: - LspClientImpl now takes (registry, serverName) and calls registry.register() instead of just log.debug (fixes dead passive-feedback loop) - LspServerInstance: add diagnosticRegistry field + 3-arg constructor - LspServerManager: add setDiagnosticRegistry + pass to LspServerInstance Tests: +15 new (ExitPlanModeApprovalFlowTest 9, LspDiagnosticRegistrationTest 6) All 187 tests green
…kedAgent/AgentSummary + Hook enum fix Phase 2.1 - LSP completions: - LspServerInstance.sendRequestWithRetry: ContentModified (-32801) retry with exponential backoff (500ms * 2^attempt, 3 retries) - LspTool.filterGitIgnoredLocations: git check-ignore in batches of 50, 5s timeout; applied to findReferences/goToDefinition/goToImplementation/workspaceSymbol - extractLocations helper handles Either<List<Location>, Location> Phase 2.2 - Cron completions: - CronTask: add agentId (runtime-only, stripped on persistence) + permanent fields - CronTaskStore: add(cron,prompt,recurring,durable,agentId), getTasksFile(), reload() - persist agentId via forPersistence() stripping; load permanent from disk - CronScheduler: WatchService on scheduled_tasks.json (ENTRY_MODIFY/DELETE -> reload) - CronScheduler: onFireTask callback for per-task routing by agentId - CronScheduler: BooleanSupplier isKilled killswitch + lock takeover probe - CronTools: isKairosCronEnabled/isDurableCronEnabled gates (env-based) - CronCreateTool.isEnabled() gates; force durable=false when gate off Phase 2.3 - ForkedAgent + AgentSummary: - ForkedAgentRunner.runForked(): returns ForkedAgentResult(text, usage) not bare String - accumulateUsage() static helper + AggregatedUsage record - New AgentSummary class: 30s scheduled fork, deny-all canUseTool, buildSummaryPrompt, previousSummary tracking, SummarizationHandle Phase 2.4 - Hook enum reconciliation: - HookConfig.Event: add 12 missing events (FILE_CHANGED, CWD_CHANGED, CONFIG_CHANGE, INSTRUCTIONS_LOADED, ELICITATION, ELICITATION_RESULT, TEAMMATE_IDLE, TASK_CREATED, TASK_COMPLETED, WORKTREE_CREATE, WORKTREE_REMOVE) - Now matches HookEvent (executor pkg) 28 events Tests: +7 new (CronTaskFieldsTest) All 194 tests green
…r + Vim REPL binding Phase 2b - Hook infrastructure + Vim integration: - New FileChangedWatcher (ccc-hooks/watcher): WatchService loop on FileChanged hook matchers + dynamic watchPaths; executeFileChangedHooks/executeCwdChangedHooks; idempotent initialize; dispose - New SessionHooks (ccc-hooks/session): session-scoped hook registry with once-removal callback; addSessionHook/removeSessionHook/getSessionHooks/ notifyHookSuccess/clearSessionHooks - New SkillHookRegistrar (ccc-skills): registerSkillHooks/registerFrontmatterHooks (Stop->SubagentStop for agents); parseHooksFrontmatter helper; once:auto-remove - Add ccc-hooks dependency to ccc-skills pom - New ReplVimContext (ccc-repl/vim): production OperatorContext impl over JLine LineReader buffer + cursor; register/lastFind/lastChange fields; enterInsert - Add ccc-vim dependency to ccc-repl pom All 194 tests green
Phase 3.1 - Permission dialog: - New PermissionDialog (ccc-repl/dialog): BlockingQueue-based permission prompt; renders tool/input/message; reads y/n/a/e response; implements StreamingToolExecutor.PermissionCallback; 5min timeout - Provides the missing interactive permission flow (tools returning Ask can now surface to the user) Phase 3.2 - Background task registry: - New BackgroundTaskRegistry (ccc-tasks/registry): unified registry for all background tasks (LocalAgentTask/DreamTask/InProcessTeammateTask/ShellTask); register/get/all/update/kill/cleanupTerminated; sealed BackgroundTaskState - Replaces AgentTool's static backgroundTasks map pattern Tests: +8 new (BackgroundTaskRegistryTest) All 202 tests green
…ormalization - McpServerConfig: expand Transport enum (8 types: stdio/sse/sse-ide/http/ws/ ws-ide/sdk/claudeai-proxy); add headers/oauth/headersHelper/type/disabled fields; add parseTransport() static parser - McpConnectionManager: add connect(name, config) with per-transport creation (stdio/http/sse/ws/sdk/claudeai-proxy); reconnect(); toggleEnabled(); fetchToolsForServer() with mcp__norm__tool name; isConnected(); getServerConfig() - New McpToolNameNormalizer: normalizeNameForMCP/buildMcpToolName/parseMcpToolName/ isMcpToolName (mcp__server__tool format) - New McpPolicyFilter: filterByPolicy (allowed/denied lists, SDK exempt, disabled blocked); isMcpServerDisabled Tests: +10 new (McpToolsTest) All 212 tests green
…t paths) - New ApiMicrocompact: server-side ContextManagementConfig with clear_tool_uses_20250919 + clear_thinking_20251015 strategies; TOOLS_CLEARABLE_RESULTS/USES sets; DEFAULT_MAX/TARGET tokens; Keep.ALL / Keep(thinking_turns,1) for clearAllThinking - New CachedMicrocompact: cache_edits path (does NOT mutate local messages, generates cache_edits block for server-side cache deletion); registerToolResult/Message, getToolResultsToDelete (keep recent 5), createCacheEditsBlock (dedup via seenDeleteRefs), pinCacheEdits, consumePendingCacheEdits, markToolsSentToAPI, reset; isCachedMicrocompactEnabled/isModelSupportedForCacheEditing gates - CacheEditsBlock(type, edits[DeleteEdit(type, cacheReference)]) records Tests: +14 new (MicrocompactTest) All 226 tests green
…mary)
- New autodream package:
- AutoDream: gate chain (isGateOpen -> 24h time -> 10min scan throttle ->
>=5 sessions -> lock); forked agent 4-phase consolidation; rollback on failure
- ConsolidationLock: .consolidate-lock file (mtime=lastConsolidatedAt, body=PID);
HOLDER_STALE_MS=1h; tryAcquireConsolidationLock/rollback/recordConsolidation/
release; listSessionsTouchedSince
- AutoDreamConfig: minHours(24)/minSessions(5)/enabled (env-based)
- ConsolidationPrompt: 4-phase Orient/Gather/Consolidate/Prune-and-index
- New sessionmemory package:
- SessionMemory: shouldExtractMemory (init 10000/update 5000/3 toolCalls);
extractSessionMemory via forked agent (FileEdit on memoryPath only);
path {projectDir}/{sessionId}/session-memory/summary.md
- SessionMemoryConfig: thresholds + hasMetInitializationThreshold/hasMetUpdateThreshold
- SessionMemoryPrompts: DEFAULT_SESSION_MEMORY_TEMPLATE (10 sections) +
buildSessionMemoryUpdatePrompt
- New awaysummary package:
- AwaySummary: generateAwaySummary (RECENT_MESSAGE_WINDOW=30; prepends session
memory as broader context; 1-3 sentence summary; inProgress guard)
Tests: +11 new (MemorySubsystemTest)
All 237 tests green
…Messages) - EnterPlanModeTool: add isPlanModeInterviewPhaseEnabled() gate (env-based, default false matching GrowthBook tengu_plan_mode_interview_phase); branch tool_result instructions on gate (interview vs direct propose) - PlanFileStore.recoverPlanFromMessages: scan backwards for ExitPlanMode tool_use input.plan, user message planContent, plan_file_reference; returns most recent plan found - PlanFileStore.copyPlanForResume: try source file snapshot first, then message recovery, write to target session plan file Tests: +9 new (PlanModeCompletionTest) All 246 tests green
- Move all 10 'to-be-completed' items to 'completed' status with details - Add Phase 0 infrastructure improvements section (Advisor, AgentInvoker, CacheControl, PermissionSuggestion) - Update test count: 19 -> 246 (95 new tests across Phase 0-7) - Update build section test count reference All 246 tests green
- Update test badge 151 -> 246 - Add Phase 0-7 complete badge - Update test table with 10 new test classes (+95 tests) - Replace 'to-be-completed' table with 'Phase 0-7 completed' table - Update module count references and ccc-test description
There was a problem hiding this comment.
Pull request overview
This PR completes the remaining “to-be-completed” gaps across Phase 0–7, bringing major subsystems (permissions, plan mode, cron, MCP transport/config, microcompact, memory, LSP diagnostics, REPL UX) closer to Claude Code parity and expanding integration test coverage to 246 tests.
Changes:
- Adds/finishes core runtime implementations: permission checking in streaming tool execution, plan-mode approval flow + plan recovery, cron routing/watch/gates, MCP name/policy/transport scaffolding, microcompact + memory subsystems, LSP diagnostic forwarding + gitignore filtering.
- Introduces multiple new supporting components (advisor/request builder, agent invoker, background task registry, hook registrars/watchers, vim operator context bridge).
- Adds extensive new integration tests (+95) and updates documentation to reflect completion status.
Reviewed changes
Copilot reviewed 62 out of 62 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Updates badges, test counts, and completed feature list. |
| IMPLEMENTATION_REPORT.md | Marks prior “to-be-completed” items as completed and expands phase details. |
| ccc-tools/src/main/java/com/ccj/tools/execution/StreamingToolExecutor.java | Adds permission-checking + callback handling before tool execution. |
| ccc-tools/src/main/java/com/ccj/tools/execution/PermissionCheckerImpl.java | Bridges tool execution permission checks to permission chain + mode strategy. |
| ccc-test/src/test/java/com/ccj/test/PlanModeCompletionTest.java | Adds Phase 7 plan mode completion tests. |
| ccc-test/src/test/java/com/ccj/test/MicrocompactTest.java | Adds Phase 5 microcompact tests. |
| ccc-test/src/test/java/com/ccj/test/MemorySubsystemTest.java | Adds Phase 6 memory subsystem tests. |
| ccc-test/src/test/java/com/ccj/test/McpToolsTest.java | Adds Phase 4 MCP name/policy/transport parsing tests. |
| ccc-test/src/test/java/com/ccj/test/LspDiagnosticRegistrationTest.java | Tests LSP diagnostic forwarding + registry behavior. |
| ccc-test/src/test/java/com/ccj/test/ExitPlanModeApprovalFlowTest.java | Tests fixed ExitPlanMode approval flow + options mapping. |
| ccc-test/src/test/java/com/ccj/test/DenialTrackingTest.java | Tests denial tracking semantics and classifier fallback behavior. |
| ccc-test/src/test/java/com/ccj/test/CronTaskFieldsTest.java | Tests cron task new fields + gating behavior. |
| ccc-test/src/test/java/com/ccj/test/ContentBlockCacheControlTest.java | Tests cache_control blocks and Ask suggestions compatibility. |
| ccc-test/src/test/java/com/ccj/test/BackgroundTaskRegistryTest.java | Tests background task registry lifecycle operations. |
| ccc-test/pom.xml | Adds module dependencies needed by new test coverage. |
| ccc-tasks/src/main/java/com/ccj/tasks/registry/BackgroundTaskRegistry.java | Introduces a unified background task registry with sealed task types. |
| ccc-skills/src/main/java/com/ccj/skills/SkillHookRegistrar.java | Adds session hook registration for skill/agent frontmatter hooks. |
| ccc-skills/pom.xml | Adds hooks module dependency. |
| ccc-repl/src/main/java/com/ccj/repl/vim/ReplVimContext.java | Adds REPL-backed vim OperatorContext implementation using JLine buffer. |
| ccc-repl/src/main/java/com/ccj/repl/dialog/PermissionDialog.java | Implements blocking permission dialog for REPL permission prompts. |
| ccc-repl/pom.xml | Adds vim module dependency. |
| ccc-plan/src/main/java/com/ccj/plan/PlanMode.java | Adds explicit awaiting-approval phase and approve-with-mode support. |
| ccc-plan/src/main/java/com/ccj/plan/PlanFileStore.java | Adds plan recovery from messages and copy-for-resume behavior. |
| ccc-plan/src/main/java/com/ccj/plan/PlanApprovalOption.java | Adds 8-option plan approval enum + restore/clear-context logic. |
| ccc-plan/src/main/java/com/ccj/plan/ExitPlanModeTool.java | Fixes auto-approve bug; introduces validate + applyApproval path. |
| ccc-plan/src/main/java/com/ccj/plan/EnterPlanModeTool.java | Adds interview-phase gate and updated entry messaging. |
| ccc-permission/src/main/java/com/ccj/permission/chain/DenialTracking.java | Implements 3-consecutive / 20-total denial tracking fallback semantics. |
| ccc-permission/src/main/java/com/ccj/permission/bash/RuleBasedYoloClassifier.java | Integrates denial tracking and changes fallback to Ask after limits. |
| ccc-models/src/main/java/com/ccj/models/ForkedAgentRunner.java | Extends forked runner to return usage and adds accumulateUsage helpers. |
| ccc-models/src/main/java/com/ccj/models/factory/ChatClientFactory.java | Adds ChatClient construction with an advisor chain. |
| ccc-models/src/main/java/com/ccj/models/agentsummary/AgentSummary.java | Adds scheduled agent progress summarization via forked agent. |
| ccc-memory/src/main/java/com/ccj/memory/sessionmemory/SessionMemoryPrompts.java | Adds 10-section session-memory template + update prompt builder. |
| ccc-memory/src/main/java/com/ccj/memory/sessionmemory/SessionMemoryConfig.java | Adds token/tool-call threshold config utilities. |
| ccc-memory/src/main/java/com/ccj/memory/sessionmemory/SessionMemory.java | Adds session memory extraction/update manager (async). |
| ccc-memory/src/main/java/com/ccj/memory/awaysummary/AwaySummary.java | Adds away-summary generation over recent message window. |
| ccc-memory/src/main/java/com/ccj/memory/autodream/ConsolidationPrompt.java | Adds 4-phase autoDream consolidation prompt builder. |
| ccc-memory/src/main/java/com/ccj/memory/autodream/ConsolidationLock.java | Adds consolidation lock with PID + mtime semantics and session scanning. |
| ccc-memory/src/main/java/com/ccj/memory/autodream/AutoDreamConfig.java | Adds env-driven autoDream configuration. |
| ccc-memory/src/main/java/com/ccj/memory/autodream/AutoDream.java | Adds gated, throttled autoDream consolidation execution flow. |
| ccc-mcp/src/main/java/com/ccj/mcp/McpToolNameNormalizer.java | Adds MCP tool name normalization/build/parse helpers. |
| ccc-mcp/src/main/java/com/ccj/mcp/McpPolicyFilter.java | Adds allow/deny/disabled filtering rules with SDK exemption. |
| ccc-mcp/src/main/java/com/ccj/mcp/McpConnectionManager.java | Adds connection/reconnect/toggle scaffolding + tool name normalization. |
| ccc-lsp/src/main/java/com/ccj/lsp/LspTool.java | Adds gitignore filtering + result extraction for LSP locations/symbols. |
| ccc-lsp/src/main/java/com/ccj/lsp/LspServerManager.java | Injects diagnostic registry into created server instances. |
| ccc-lsp/src/main/java/com/ccj/lsp/LspServerInstance.java | Adds ContentModified retry + forwards publishDiagnostics to registry. |
| ccc-hooks/src/main/java/com/ccj/hooks/watcher/FileChangedWatcher.java | Adds WatchService-based file/cwd change hook dispatcher. |
| ccc-hooks/src/main/java/com/ccj/hooks/session/SessionHooks.java | Adds session-scoped hook registry with once-hook auto-removal. |
| ccc-cron/src/main/java/com/ccj/cron/CronTools.java | Adds cron/durable gates + agentId routing support in create tool. |
| ccc-cron/src/main/java/com/ccj/cron/CronTaskStore.java | Extends task persistence and reload hooks; strips runtime-only fields. |
| ccc-cron/src/main/java/com/ccj/cron/CronTask.java | Adds agentId/permanent fields + persistence-stripped variant. |
| ccc-cron/src/main/java/com/ccj/cron/CronScheduler.java | Adds file watching, lock takeover probing, routing callback, killswitch. |
| ccc-core/src/main/java/com/ccj/core/tool/PermissionResult.java | Adds Ask suggestions and helper factories for backward compatibility. |
| ccc-core/src/main/java/com/ccj/core/message/ContentBlock.java | Adds cache_control support to text/tool_result blocks (backward compatible). |
| ccc-context/src/main/java/com/ccj/context/CachedMicrocompact.java | Adds cached microcompact state + cache_edits block creation/pinning. |
| ccc-context/src/main/java/com/ccj/context/ApiMicrocompact.java | Adds server-side context management config builder (microcompact). |
| ccc-config/src/main/java/com/ccj/config/McpServerConfig.java | Expands MCP transport types and adds headers/oauth/disabled fields. |
| ccc-config/src/main/java/com/ccj/config/HookConfig.java | Adds missing hook event enum values to align to 28 events. |
| ccc-app/src/main/java/com/ccj/app/invoker/AgentInvoker.java | Adds a structured agent invocation wrapper returning usage/error info. |
| ccc-app/src/main/java/com/ccj/app/ClaudeCodeJavaApplication.java | Switches REPL invocation from raw lambda to AgentInvoker. |
| ccc-app/src/main/java/com/ccj/app/AppConfiguration.java | Wires advisor-based ChatClient and registers missing LSP/Plan/Cron tools + permission beans. |
| ccc-app/src/main/java/com/ccj/app/advisor/ClaudeCodeRequestAdvisor.java | Adds advisor to inject system prompt + history + usage capture + memory writeback. |
| ccc-app/pom.xml | Adds missing module dependencies (lsp/plan/cron). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+115
to
+127
| // Phase 2.2: 按 agentId 路由 | ||
| if (onFireTask != null) { | ||
| onFireTask.accept(task); | ||
| } else { | ||
| onFire.accept(task.prompt()); | ||
| } | ||
| // 同时通知 lead 队列(teammate 任务也通知 lead,便于感知) | ||
| if (task.isTeammateTask()) { | ||
| // teammate 任务:onFireTask 负责路由到 teammate 队列 | ||
| // 此处不再调 onFire(避免重复入队) | ||
| } else { | ||
| onFire.accept(task.prompt()); | ||
| } |
Comment on lines
+127
to
+135
| List<SystemPromptBlock> blocks = systemPromptProvider.buildSystemPrompt(sessionContext); | ||
| StringBuilder sb = new StringBuilder(); | ||
| for (SystemPromptBlock block : blocks) { | ||
| if (block.text() != null && !block.text().isEmpty()) { | ||
| if (!sb.isEmpty()) sb.append("\n\n"); | ||
| sb.append(block.text()); | ||
| } | ||
| } | ||
| return sb.toString(); |
Comment on lines
+78
to
+81
| public ForkedAgentResult runForked(String taskPrompt, List<Message> parentHistory) { | ||
| log.debug("ForkedAgent running task ({} parent messages)", parentHistory.size()); | ||
| try { | ||
| var spec = parentClient.prompt(); |
Comment on lines
+134
to
+140
| private void handleFileEvent(Path filePath, String eventKind) { | ||
| // 检查是否匹配任一监听路径 | ||
| boolean matched = watchedPaths.stream() | ||
| .anyMatch(wp -> wp.getFileName() != null | ||
| && wp.getFileName().toString().equals( | ||
| filePath.getFileName() != null ? filePath.getFileName().toString() : "")); | ||
| if (!matched) return; |
Comment on lines
+46
to
+63
| @Override | ||
| public PermissionResult resolve(ContentBlock.ToolUseBlock block, Tool tool, | ||
| PermissionResult.Ask askResult) { | ||
| // 渲染提示 | ||
| renderPermissionRequest(block, tool, askResult); | ||
|
|
||
| // 等待用户响应(REPL 主线程会调用 provideResponse) | ||
| try { | ||
| PermissionResponse response = responseQueue.poll(5, TimeUnit.MINUTES); | ||
| if (response == null) { | ||
| return PermissionResult.deny("Permission request timed out"); | ||
| } | ||
| return applyResponse(response, askResult); | ||
| } catch (InterruptedException e) { | ||
| Thread.currentThread().interrupt(); | ||
| return PermissionResult.deny("Permission request interrupted"); | ||
| } | ||
| } |
Comment on lines
+86
to
+88
| public void provideResponse(PermissionResponse response) { | ||
| responseQueue.offer(response); | ||
| } |
Comment on lines
+116
to
121
| if (durable && !isDurableCronEnabled()) { | ||
| durable = false; | ||
| } | ||
| String agentId = (String) input.get("agentId"); | ||
| CronTask task = store.add(cron, prompt, recurring, durable, agentId); | ||
| if (!scheduler.isRunning()) scheduler.start(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Completes all 12 "to-be-completed" areas from
IMPLEMENTATION_REPORT.mdplus 6 structural gaps discovered during planning. 246 tests pass (151 baseline + 95 new).Changes by Phase
Phase 0 - Foundation (prerequisite for everything)
ContentBlock.CacheControl+PermissionResult.Asksuggestions (backward-compatible)ClaudeCodeRequestAdvisor(Spring AI Advisor chain: system prompt + history + cache_control) +AgentInvoker(replaces bareFunction<String,String>lambda)PermissionCheckerImpl(bridgesTool.checkPermissions+PermissionChain+PermissionModeStrategy) +StreamingToolExecutorpermission check (was bypassed) +DenialTrackingfix (3/20 -> ask, not hard deny)Phase 1 - Critical bug fixes (unblocks 3 dead modules)
AppConfiguration(3 modules were completely unusable)ExitPlanModeToolauto-approve bug +PlanApprovalOptionenum (8 options)LspClientImpl.publishDiagnosticsdead discard (entire passive-feedback loop was dead)Phase 2 - Medium completions
sendRequestWithRetry(ContentModified -32801) +filterGitIgnoredLocations(git check-ignore)WatchService+onFireTaskrouting (by agentId) + killswitch + gates +agentId/permanentfieldsrunForked()returnsForkedAgentResult(text, usage)+AgentSummary(30s scheduled fork)HookConfig.Eventreconciled to 28 events +FileChangedWatcher+SessionHooks+SkillHookRegistrarReplVimContext(productionOperatorContextover JLine buffer)Phase 3 - REPL rebuild
PermissionDialog(BlockingQueue + y/n/a/e + per-tool rendering)BackgroundTaskRegistry(sealed 4 types: LocalAgent/Dream/Teammate/Shell)Phase 4 - MCP full transport layer
connect/reconnect/toggleEnabledMcpToolNameNormalizer(mcp__server__tool) +McpPolicyFilter(allowed/denied + SDK exempt)headers/oauth/headersHelperfields onMcpServerConfigPhase 5 - Microcompact (both paths)
ApiMicrocompact(server-sideContextManagementConfig+ ClearToolUses/ClearThinking)CachedMicrocompact(cache_edits block + pin/consume/markTools + dedup)Phase 6 - Memory (all three subsystems)
AutoDream(gate chain +ConsolidationLock+ 4-phase consolidation prompt)SessionMemory(10-section template + threshold triggers + forked agent)AwaySummary(haiku + 30-msg window + session memory prepend)Phase 7 - Plan Mode completion
isPlanModeInterviewPhaseEnabled)recoverPlanFromMessages(backward scan for ExitPlanMode tool_use / user planContent)copyPlanForResumeTest Results
Documentation
IMPLEMENTATION_REPORT.md: all 10 "to-be-completed" items moved to "completed"README.md: badges, test table, module descriptions updatedChecklist
mvn -pl ccc-test test)mvn clean install -DskipTests)