Conversation
Squashed from PR #217-#230: guard editor/clipboard/notifications/task launches, ignore stale async results (OAuth, login, discovery, connection tests, session clipboard), recover prompt preparation and external editor failures, cancel in-flight requests on unmount, and stabilize view transitions with e2e coverage.
Squashed perf(cli) and perf(web) work: bound live stream preview rendering, throttle status line usage updates, skip hidden selector measurements, memoize running task panel, limit background task refreshes, streamline completion scans and transcript tool state, and smooth streamed transcript interaction.
Squashed AI/client fixes: sync OpenAI stream mirror, accept growing streamed snapshots, bound provider retry delays, and clarify bounded daemon errors.
Squashed parallel work: secret handling hardening across CLI and server, quality gate enforcement, lint cleanup, and CI workflow updates.
Verification gate: only passed checks count as terminal evidence, and auto-compact no longer discards in-flight mutation receipts. Sync snapshot deduplication into the ai adapter. Harden WebFetch against 0.0.0.0/8 SSRF, bound zip decompression with a byte budget, log silent model deactivations, fix lock ownership in project learning and goal storage, add polling timeouts, LSP module resolution fallbacks, and external editor fallback with tilde expansion.
Compact the project learning event log and trim context snapshots so long sessions cannot grow disk usage and replay cost without bound, treat Skill use as a potential workspace write, and detect case-only path collisions on case-folding file systems.
Drop the completion gate that required a passed test, typecheck, lint, build, or check receipt after workspace mutations, along with the verification recovery prompt, receipt generation, evidence collection, and goal-level verification enforcement. Behavior now matches standard agent workflows without forced verification.
# Conflicts: # apps/cli/src/ui/components/LoginScreen.tsx # apps/cli/src/ui/screens/REPL/AssistantStreamPreview.test.tsx # apps/cli/src/ui/screens/REPL/AssistantStreamPreview.tsx # apps/cli/src/ui/screens/REPL/useReplController.tsx # apps/cli/src/ui/screens/overlays/TasksScreen.tsx # packages/ai/src/llm/openai/stream.ts # packages/core/src/ai/llm/openai/stream.ts # packages/core/src/constants/prompts.ts # packages/core/src/goals/goals.test.ts # packages/core/src/goals/service.ts # packages/core/src/test/e2e/tui-interactions.login.test.tsx # packages/core/src/test/e2e/tui-interactions.tasksScreen.test.tsx # packages/core/src/test/unit/goal-run-engine.test.ts # packages/core/src/test/unit/openai-stream-snapshot-dedupe.test.ts # packages/engine/src/message-pipeline.ts # packages/engine/src/pipeline/tool-call.ts # packages/engine/src/pipeline/tool-call.verification.test.ts # packages/engine/src/verification/completion-gate.test.ts # packages/engine/src/verification/evidence.test.ts # packages/engine/src/verification/evidence.ts # packages/engine/src/verification/receipt.test.ts # packages/engine/src/verification/receipt.ts
…-key shortcuts Input efficiency: - Slash commands: fuzzy abbreviation/subsequence matching (e.g. /aprv -> approved-tools) with prefix priority and single-char guard - File paths: fuzzy fallback behind prefix matches when typing 2+ chars - History search (Ctrl+R): substring matches ranked first, fuzzy matches fill in Permission UX: - Queue pending permission requests instead of clobbering the single dialog slot (pure transition helper with tests) - Batch action bar when requests queue up: Ctrl+A allow all, Ctrl+D deny all - Single-key accelerators in every select-based dialog: y allow once, a always allow, n deny - Dialog footers document the new shortcuts All guarded by unit tests (queue transitions, shortcut resolution, fuzzy matching).
Keep the most recent completed messages in the bottom-anchored transient frame instead of freezing them into the top <Static> scrollback. Long conversations no longer push finished output above the visible viewport while new work streams in below; output now grows bottom-up like a chat. Tiny viewports (<=4 rows) keep the previous all-static behavior.
The completed transient messages kept in the bottom-anchored frame could consume the whole preview budget, pushing the live streamed output out of the viewport so the answer appeared only after completion. Reserve the live preview's own height at the bottom of the frame and give the completed-message region the remaining budget, with a zero budget when nothing is streaming.
MiMo + Write/Edit tools forced the whole request to the non-streaming endpoint, so every reply (even plain chat) appeared at once. Stream is now always enabled; if the stream degrades mid-flight (MiMo's SSE can terminate during large tool-call arguments), the retry loop re-issues the request through the non-streaming endpoint instead, preserving completion integrity without sacrificing the interactive stream.
DuckDuckGo is unreachable or returns empty in some networks, which made every web search report zero results. Search now runs DuckDuckGo, Bing, and Baidu in parallel (6s timeout each), merges de-duplicated hits from every reachable provider, and reports which providers contributed in the progress line. Protocol-relative DuckDuckGo redirect links are also unwrapped to their real destinations.
DNS under Clash/Surge fake-ip returns 198.18.0.0/15 (RFC 2544 benchmarking) addresses for every hostname. The guard rejected that range, so all web fetches failed with 'non-public network address' even for legitimate sites. The range is never routed on the public internet and cannot reach internal networks; proxy stacks forward traffic to the already-validated hostname, so it is now explicitly allowed.
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.
概览
本 PR 将 beta 的 105 个提交推广到 main。相对 main,共涉及 809 个文件(47,457 行新增、5,860 行删除;207 新增、451 修改、8 删除、143 重命名)。这不是一次机械合并:它同时完成 core 拆包阶段、可恢复的 Agent/Goal 工作流、模型与语音能力、CLI/桌面交互稳定性、工具安全边界,以及 CI/性能门禁的收敛。
功能实现总览
/voice、F10 快捷入口、MiMo ASR/TTS、转写确认与播放控制语音会话:从录音到受控执行
KODE_EXPERIMENTAL_VOICE=1 kode显式开启,避免在未确认麦克风、网络和模型成本前默认暴露设备能力;CLI 同时提供/voice与 F10 入口。/voice采用明确的 push-to-talk 流程:本地录制短 WAV(私有临时目录)→ MiMo ASR SSE 渐进转写 → 可编辑的 Review 页面 → 用户明确 Send 后才作为普通 REPL 消息提交。录音、转写和 Review 阶段均可取消;音频请求结束或失败后不保留。/voice stop可以中断当前播放。对不保留 SSE 的兼容 API 仍有有界 WAV 回退。/voice config管理,API Key 仅允许粘贴到 owner-only 凭据存储;环境变量(例如MIMO_API_KEY)可供托管/CI 场景优先使用,密钥不接受命令参数,也不会写入普通配置或 shell 历史。/voice guide可向运行中的 Agent 提交经确认的指导;/voice message可将经确认的转写交给跨会话消息中心。二者不改变原有权限、消息持久化和投递语义。Goal、任务与 Agent 协作
/session-message(/sm)提供会话发现、发送、回复、收件箱、历史/全文检索、未读状态、发送前取消和状态查询;消息按同一 canonical Git workspace 隔离并持久化,使不同时在线的本地会话也可协作。SessionMessage工具继续使用正常权限流,Task 子代理不能使用它,避免隐藏消息扇出。模型、认证与交互体验
HOME或 Windows 路径形式的场景可正确解析编辑器路径和恢复终端状态。工具、安全与协议能力
架构与可维护性
@kode/*的领域包入口。packages/core内部路径的直接耦合。性能与交付质量
本地验证
bun install --frozen-lockfilebun run format:checkbun run lintbun run typecheckCI=true KODE_TEST_CONCURRENCY=3 bun run test:548/548 通过,56.3 秒bun run build