mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 21:05:51 +00:00
This PR consolidates a coordinated batch of fixes around autonomy run/flow lifecycle, scheduled task deduplication, provider-boundary state finalization, and matching memory-bound treatments for adjacent long-running subsystems (REPL fullscreen scrollback, skill-search/skill-learning runtime activation). All changes were developed and reviewed together because they touched the same lifecycle invariants and were uncovered by the same long-running session reproductions.
## Lifecycle correctness
- Queued autonomy prompts are not injected unless the persisted run was successfully claimed; queued run claiming is now terminal-safe so a once-consumed/cancelled/failed run can not slip back into `queued`.
- Autonomy run/flow finalization happens on completion, provider error, generator close, and cancellation — not just the happy path. New `src/__tests__/queryAutonomyProviderBoundary.test.ts` covers these provider-boundary transitions.
- `requestManagedAutonomyFlowCancel` and `resumeManagedAutonomyFlowPrompt` carry `rootDir` and `currentDir` explicitly across detached async boundaries (proactive-tick, cron, daemon restart) instead of inferring from process state.
- Active runs/flows are protected from janitor pruning so a running step can not be garbage-collected mid-flight (`src/utils/autonomyAuthority.ts`).
- Heartbeat parser now ignores fenced code blocks; the two-phase commit window for autonomy state transitions is documented in `docs/internals/autonomy-jira.md`.
## Ownership and dedup
- `src/utils/autonomyRuns.ts`: ownership stamping (run id + rootDir carried end-to-end), source-based dedup against active runs.
- `src/hooks/useScheduledTasks.ts`: scheduled ticks deduplicate against runs already active on the same source label.
- `src/utils/processUserInput/processSlashCommand.tsx`: forked slash commands now thread the autonomy `runId` so completion finalizers can find the originating run for deferred completion.
- New `src/utils/autonomyQueueLifecycle.ts` and tests collect the queue-side lifecycle invariants in one place.
## Memory bounds (related, same review pass)
- `src/screens/REPL.tsx`: caps fullscreen scrollback after the compact boundary and updates trailing progress rows in place. Long-running fullscreen sessions could otherwise retain thousands of post-compaction messages and duplicate progress rows, keeping Ink trees alive long after their useful context had moved on.
- `src/services/skillSearch/*` and `src/services/skillLearning/*`: runtime activation is strictly opt-in via existing env toggles; session caches are capped so long-running processes can not grow them forever. Build presence is preserved so operators can still discover and opt into the slash commands.
## CI / test contract
- `tests/integration/dependency-overrides.test.ts`: smoke test no longer drives Mermaid's browser renderer; it validates the package-resolution contract directly so CI does not regress on unrelated browser timing.
- New `tests/integration/autonomy-lifecycle-user-flow.test.ts`: end-to-end CLI subprocess flow exercising `status --deep`, `flows`, `flow <id>`, `flow resume`, `flow cancel` against persisted state.
- `src/entrypoints/cli.tsx`: `claude autonomy …` routes through an entrypoint fast path that reuses the slash-command formatter without booting the full interactive CLI. Stdout is flushed before forced exit so coverage subprocesses do not terminate with empty stdout.
- `packages/builtin-tools/src/tools/RemoteTriggerTool/__tests__/RemoteTriggerTool.test.ts`: stabilized to prevent audit flake under coverage.
## Tests added
- `src/__tests__/queryAutonomyProviderBoundary.test.ts`
- `src/hooks/__tests__/useScheduledTasks.test.ts`
- `src/utils/__tests__/autonomyAuthority.test.ts`
- `src/utils/__tests__/autonomyFlows.test.ts` (extended)
- `src/utils/__tests__/autonomyPersistence.test.ts` (extended)
- `src/utils/__tests__/autonomyQueueLifecycle.test.ts`
- `src/utils/__tests__/autonomyRuns.test.ts` (extended)
- `src/utils/processUserInput/__tests__/processSlashCommand.test.ts`
- `tests/integration/autonomy-lifecycle-user-flow.test.ts`
## Docs
- `docs/agent/sur-loop-scheduled-oom.md`: System Understanding Report covering the scheduled/loop OOM problem, the call graphs investigated, and the lifecycle invariants this PR establishes.
- `docs/agent/sur-skill-overflow-bugs.md`: SUR for the related skill-overflow context.
- `docs/internals/autonomy-jira.md`: documents the two-phase commit window and ownership stamping invariants.
- `docs/memory-leak-audit.md`: audit notes covering the REPL/scrollback and skill-search bounds.
## Invariants this PR establishes
1. Queued autonomy prompts are not injected unless the persisted run was successfully claimed.
2. Terminal run/flow states are terminal — completion, failure, and cancellation all finalize state regardless of which provider/error path triggered them.
3. Autonomy run/flow `rootDir` is carried explicitly across detached async boundaries instead of inferred from a shared singleton.
4. State-only CLI subcommands (`autonomy status|runs|flows|flow …`) bypass full interactive bootstrap so they do not hold unrelated handles open.
5. REPL fullscreen scrollback and skill-search/skill-learning session caches are explicitly bounded.
## Validation
```bash
bun run typecheck
CI=true GITHUB_ACTIONS=true bun test # 3996 pass / 0 fail across 305 files
bun test src/__tests__/queryAutonomyProviderBoundary.test.ts \
src/hooks/__tests__/useScheduledTasks.test.ts \
src/utils/__tests__/autonomy{Runs,Flows,Authority,QueueLifecycle,Persistence}.test.ts \
src/utils/processUserInput/__tests__/processSlashCommand.test.ts \
tests/integration/autonomy-lifecycle-user-flow.test.ts
```
## Origin
This PR is the consolidated, upstream-targeted version of two fork-side review PRs (fix/loop-scheduled-autonomy-oom and fix/autonomy-lifecycle). The fork-side review history is preserved at https://github.com/amDosion/claude-code-bast/pull/7 . The fork's own internal `chore: keep fork current with upstream` sync commits and the `docs: update contributors` automation are intentionally not included in this PR.
The autonomy CLI handler `rootDir` threading that the fork added (78f64d8a, 98d04ddb) is intentionally omitted here because upstream `a2cfaf91` (fix: 修复 RemoteTriggerTool 和 autonomy 测试的全量运行失败) already performed the equivalent change with an additional `currentDir` option. Keeping the upstream version avoids regressing that improvement.
86 lines
5.1 KiB
TypeScript
86 lines
5.1 KiB
TypeScript
/**
|
||
* Shared MACRO define map used by both dev.ts (runtime -d flags)
|
||
* and build.ts (Bun.build define option).
|
||
*
|
||
* Each value is a JSON-stringified expression that replaces the
|
||
* corresponding MACRO.* identifier at transpile / bundle time.
|
||
*/
|
||
export function getMacroDefines(): Record<string, string> {
|
||
return {
|
||
"MACRO.VERSION": JSON.stringify("2.1.888"),
|
||
"MACRO.BUILD_TIME": JSON.stringify(new Date().toISOString()),
|
||
"MACRO.FEEDBACK_CHANNEL": JSON.stringify(""),
|
||
"MACRO.ISSUES_EXPLAINER": JSON.stringify(""),
|
||
"MACRO.NATIVE_PACKAGE_URL": JSON.stringify(""),
|
||
"MACRO.PACKAGE_URL": JSON.stringify(""),
|
||
"MACRO.VERSION_CHANGELOG": JSON.stringify(""),
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Default feature flags enabled in both Bun.build and Vite builds.
|
||
* Additional features can be enabled via FEATURE_<NAME>=1 env vars.
|
||
*
|
||
* Used by:
|
||
* - build.ts (Bun.build)
|
||
* - scripts/vite-plugin-feature-flags.ts (Vite/Rollup)
|
||
* - scripts/dev.ts (bun run dev)
|
||
*/
|
||
export const DEFAULT_BUILD_FEATURES = [
|
||
'BUDDY', // 陪伴宠物角色(Squirtle Waddles)
|
||
'TRANSCRIPT_CLASSIFIER', // 对话分类器,用于标注会话类型
|
||
'BRIDGE_MODE', // Remote Control / Bridge 模式,远程控制会话
|
||
'AGENT_TRIGGERS_REMOTE', // sessionIngress 模块级 Map 累积(非 GB 级主因)
|
||
'CHICAGO_MCP', // Chicago MCP 集成(内部代号)
|
||
'VOICE_MODE', // Push-to-Talk 语音输入模式
|
||
'SHOT_STATS', // 单次请求统计信息收集
|
||
'PROMPT_CACHE_BREAK_DETECTION', // 检测 prompt cache 是否被打破(有 10 条上限,可控)
|
||
'TOKEN_BUDGET', // Token 预算管理与控制
|
||
// P0: local features
|
||
'AGENT_TRIGGERS', // 本地 Agent 触发器(工具调用时启动子代理)
|
||
'ULTRATHINK', // 超深度思考模式,增加推理链长度
|
||
'BUILTIN_EXPLORE_PLAN_AGENTS', // 内置 Explore/Plan 子代理类型
|
||
'LODESTONE', // 上下文锚点,优化长对话的相关性检索
|
||
'EXTRACT_MEMORIES', // 每次 turn 结束 fork 完整消息历史(非 GB 级主因)
|
||
'VERIFICATION_AGENT', // 任务完成后 fork 完整消息(非 GB 级主因)
|
||
'KAIROS_BRIEF', // Kairos 定时摘要(定时汇报当前状态)
|
||
'AWAY_SUMMARY', // 离线摘要(用户离开后生成总结)
|
||
'ULTRAPLAN', // 超级规划模式,深度分析后生成实施计划
|
||
'DAEMON', // 守护进程模式,长驻 supervisor 管理后台 worker(非 GB 级主因)
|
||
'ACP', // ACP 代理协议,支持外部 agent 接入
|
||
'WORKFLOW_SCRIPTS', // 工作流脚本(.claude/workflows/ 中的 YAML/MD)
|
||
'HISTORY_SNIP', // 历史消息裁剪,压缩上下文窗口
|
||
'CONTEXT_COLLAPSE', // 上下文折叠,自动压缩旧消息
|
||
'MONITOR_TOOL', // Monitor 工具,流式监控后台进程输出
|
||
'FORK_SUBAGENT', // Fork 子代理,在隔离上下文中并行执行任务
|
||
// 'UDS_INBOX', // inbox 数组只增不减(非 GB 级主因)
|
||
'KAIROS', // Kairos 定时任务系统核心
|
||
// 'COORDINATOR_MODE', // 已禁用:AgentSummary 30s fork 循环,GB 级泄露主因
|
||
// 'LAN_PIPES', // 依赖 UDS_INBOX(已随 UDS_INBOX 恢复)
|
||
'BG_SESSIONS', // 后台会话管理(ps/logs/attach/kill)
|
||
'TEMPLATES', // 模板任务(new/list/reply 子命令)
|
||
// 'REVIEW_ARTIFACT', // 代码审查产物(API 请求无响应,待排查 schema 兼容性)
|
||
// API content block types
|
||
'CONNECTOR_TEXT', // Connector 文本块类型,扩展 API 内容格式
|
||
// Attribution tracking
|
||
'COMMIT_ATTRIBUTION', // Git 提交归属追踪(记录 AI 辅助贡献)
|
||
// Server mode (claude server / claude open)
|
||
'DIRECT_CONNECT', // 直连模式(claude server / claude open)
|
||
// Skill search & learning — feature flags compiled in (so the slash
|
||
// commands /skill-* etc. exist), but the runtime "enabled" toggle
|
||
// defaults to OFF (see featureCheck.ts). Operators turn on via the
|
||
// slash-command toggle or env vars (SKILL_SEARCH_ENABLED=1,
|
||
// SKILL_LEARNING_ENABLED=1). Rationale: bounded caches added on
|
||
// this branch (see docs/agent/sur-skill-overflow-bugs.md) close the
|
||
// overflow risk, but Haiku-on-first-Chinese-query and disk-side
|
||
// observation accumulation remain operator-discretion concerns.
|
||
'EXPERIMENTAL_SKILL_SEARCH',
|
||
'SKILL_LEARNING',
|
||
// P3: poor mode
|
||
'POOR', // 穷鬼模式,跳过 extract_memories/prompt_suggestion 减少消耗
|
||
// Team Memory
|
||
// 'TEAMMEM', // 已禁用:依赖 COORDINATOR_MODE,邮箱文件无限增长
|
||
// SSH Remote
|
||
'SSH_REMOTE', // SSH 远程连接,本地 REPL + 远端工具执行
|
||
]as const;
|