Skip to content

sync: master 同步至 release-v1.3.0(dev 全量并入) - #19

Merged
honlnk merged 119 commits into
masterfrom
honlnk/dev
Sep 28, 2026
Merged

honlnk merged 119 commits into
masterfrom
honlnk/dev

Conversation

@honlnk

@honlnk honlnk commented Sep 28, 2026

Copy link
Copy Markdown
Owner

目的

master 停留在 06-23(PR #18 时代),落后 honlnk/dev 119 个提交。自 6 月底切换「dev 直推 + release tag 发版」流程后 master 不再被喂,而仓库 PR 基线是 master,长期失真。本 PR 将 dev 全量并回,master 恢复为含 v1.3.0 全部内容的最新状态。

master 独有的 20 个提交全部为历史 PR 合并泡泡(无内容提交),本次合并无内容冲突。

主要内容(06-23 → v1.3.0)

  • 内置联网搜索(v1.2.0):WebSearch/WebFetch Agent 工具 + 四档搜索来源(托管绿灯 / linkseek 直连 / Exa / Perplexity)+ 匿名配额身份
  • 生成链路多协议适配:openai / anthropic / gemini / openai-responses 四协议 + 思考流折叠 UI
  • 思考强度选择器与 DeepSeek 思考回传修复(reasoning_content / thinking+signature 回传)
  • 要素园丁 Phase 1:DelegateToGardener 委派工具、/整理要素 命令、ELEMENT.md 要素规范
  • linkseek 直连重设计(v1.3.0):「自部署」档重定位为「linkseek 直连(API Key)」+ 官方地址预填
  • 章节格式切换(chapters/*.txt)、写回面板文件聚合与计数修正、长会话滚动性能、文件树实时刷新、Element 要素体系优化等已完成计划全量
  • CI:deploy-pages 工作流(release-* tag 触发自动部署 GitHub Pages)

后续约定

每次打 release tag 后,将 master 同步至发版线(PR 或直接 merge)。

honlnk added 30 commits June 25, 2026 00:43
新增 chapter-name.ts 作为命名规范单一事实来源,工具层接入格式校验与重号检测,
统一代码内四处打架的命名文案,删除无引用的 writeChapterFile 死代码。

- 新增 chapter-name.ts:规范正则、编号解析、格式化、正文兜底标题、重号检测
- path.ts 的 assertWritableTextFilePath 接入命名格式校验,覆盖 CreateFile/RenameFile.toPath
- edit-file.ts validateInput 对称强制:不规范章节不可编辑内容,必须先整理改名
- create-file.ts / rename-file.ts run 层加重号检测,同编号拒绝、错误回灌模型
- prompt.ts / tools.ts / defaults.ts 统一为 第NNN章-标题.txt,强化先 FindFiles 数编号的指引
- 删除 writeChapterFile / normalizeChapterFileName / writeChapter 死代码(消除时间戳兜底的第四套格式)
- file-tools.test.ts 同步规范命名,新增重号检测与 EditFile 对称强制用例
扫描 chapters/ 下不规范章节,生成建议名(缺标题用正文首行兜底),
用户预览确认后批量改名,接通 ActivityBar 章节整理入口。

- 新增 organize-service:scanChaptersForOrganize 分类扫描(已规范/机械转换/缺标题兜底),
  无编号文件按排序分配连续编号并避开已占用编号;applyChapterOrganize 逐项改名容错
- 新增 OrganizeChaptersModal:预览表展示旧名→建议名,缺标题项高亮可编辑,提交前校验合规与重名
- ActivityBar 章节整理项从「即将推出」灰态转正常态(enabled 标记区分已实现/占位)
- ProjectView 接线 organize modal 的挂载与打开
- 新增 models-client:多协议拉取模型列表(openai / openai-responses /
  anthropic / gemini 端点与鉴权差异、DashScope 原生地址自动改写
  compatible-mode 修复百炼拉列表 404)、按用途过滤、基于列表的测试连接
- 4 个 testConnection 收敛为 models-client 薄壳:拉到列表即成功,
  已填模型名时顺带检查包含性;embedding/rerank 传入 purpose
- 新增 dashscope-models:百炼 embedding/rerank 内置清单(百炼接口
  不返回这两类模型)、isDashScopeBaseUrl 单一实现、builtin 解析
- settings-service 新增 listModels(builtin 分支 + source 标记)与
  testCompletion 转发(原 core 已实现但 service→UI 断链)
- llm.protocol 配置字段(默认 openai,生成链路本期仍仅 OpenAI 兼容)
- shared 导出 appendProxyHeader 供非 Bearer 协议头走 DEV 代理
- 补 models-client.test.ts 18 例与 dashscope-models.test.ts 8 例
- 布局重构:新增 BaseModal(Teleport + 遮罩),SettingsModal 重写为
  三段式骨架 + 左侧竖排 tab 导航(tab 记忆 localStorage),624 行单文件
  拆为 5 个面板组件;新增 ToggleSwitch 开关组件
- 新增 ModelEndpointFields 共享字段组:协议选择(四种,切换联动默认地址,
  非 Chat Completions 协议提示生成链路适配中)、「获取列表」浮层下拉
  (输入过滤 + 用途过滤 + 显示全部切换,手输永远允许)、统一测试连接
- 自动保存替代保存按钮:防抖 600ms 合并落盘、enabled 开关立即 flush、
  关闭前 flush、footer 保存状态指示(保存中/已保存/失败重试)
- 新增 /model-docs 模型说明文档页(新标签页打开):通俗解释
  Embedding/Rerank 的作用与选型建议,展示内置清单模型卡片(ID 可复制),
  数据与下拉共用 dashscope-models 单一来源;embedding/rerank 面板
  提供「模型说明」入口
- settings store 接入 testCompletionConfig;PasswordInput focus 样式
  统一为新设计词汇
- 删除 tool-policy 全链路(正则解析用户指令的工具约束):
  tool-policy.ts 及测试,query/tool-execution/tool-orchestration/
  prompt/session/agent-service/types 中的引用与透传
- 删除死代码:generation-service(已被 Agent Loop 取代)、
  TreeNode.vue(分类面板平铺化后无引用)
- 删除系统提示词读写残留(stores/settings → settings-service →
  project-fs.writeSystemPrompt);FirstTimeGuide 第三步改为指向
  「提示词」分类中编辑 prompts/system.md
- 删除 rerank.mode: 'multimodal' 死枚举,Rerank 固定 text
- 修复默认值漂移:conversationTokenLimit 统一为 12000
- 移除僵尸配置:generationRecentChapters / proofreadDefaultChapters /
  organizeDefaultChapters / enableBackgroundIndexing
- conversationTokenLimit 与 compressionKeepRecentTurns 保留,
  设置面板灰置并标注「即将上线」(Stage 3 兑现)
- query.ts:新增 assistant-delta 事件,streamAgentCompletion 的 delta
  不再丢弃,向上透传(delta 为瞬态渲染态,不落盘)
- session.ts:SessionEvent 新增 message-delta;同一批流式 delta 共享
  稳定 messageId,最终 assistant 落盘消息复用该 id,abort 时
  partialContent 与已显示 delta 一致
- services:AgentUiEvent 新增 message-delta,agent-service 原样转发
- stores/chat.ts:message-delta 累积到占位气泡,完成事件原位替换;
  新增 streamingMessageId 驱动「生成中」光标
- MessageItem.vue:流式中的 assistant 气泡显示脉动光标
- 补单测:query 层 delta 转发/abort 保留 partial、session 层
  messageId 稳定性
- 新增 core/agent/model-view.ts:模型视图维护当前发给 LLM 的消息序列,
  提供 appendUser/appendAssistant/appendToolResults、
  replaceRangeWithSummary(压缩区间替换原语)、setSystemMessage、
  toRequestMessages、estimateTokens
- token 估算对 CJK 分治(中文 1 字 ≈ 1 token,其余 4 字符 ≈ 1 token):
  dsh 的 chars/4 对中文正文低估约 4 倍,小说场景必须修正
- ChatSessionState.agentMessages → modelView;session-store 加载旧会话
  文件时自动迁移并清除旧字段
- runChatTurn 改为操作 ModelView:system prompt hash 刷新落在
  setSystemMessage,query 输入来自 toRequestMessages
- 显示层 ChatMessage[] 一字不动,从此显示层与模型层彻底分离
- refreshSystemMessageContent 并入 setSystemMessage,测试随迁
照抄 dsh compaction 算法语义,存储用 Stage 2 的 ModelView 区间替换:

- 新增 core/agent/compaction.ts:
  - 触发两条路:请求前压力检查(conversationTokenLimit 阈值)+
    provider 报 context 超限时强制压缩一次并重试(上限 1 次)
  - 选区:system 提示永不进压缩区;尾部保留 max(阈值×16%,
    最近 compressionKeepRecentTurns 轮) 原文;工具配对回退保证
    切线不切开 assistant(toolCalls) ↔ tool 结果
  - 摘要调用 KV-cache 友好(系统提示 + 被压区间 + 末尾压缩指令),
    固定八节 Markdown 检查点模板,含 <compacted-summary> 自合并
    规则使多轮压缩收敛
  - 安全阀:空输出/被 max-tokens 截断/摘要不收缩一律不落地
- query.ts 改为视图驱动:直接在 ModelView 上追加/压缩,压力触发
  在每轮模型请求前,溢出重试包裹 streamAgentCompletion
- session.ts:context-compacted 事件在显示层追加 context-summary
  提示并写日志;显示层全量历史不受压缩影响
- 设置面板恢复 conversationTokenLimit / compressionKeepRecentTurns
  为可用,文案改为压缩语义的准确描述
- 单测 25 个:配对回退/系统头/收缩校验/自合并/压力触发/溢出重试
照抄 dsh 的「范围策略替代每次确认」语义(替代已删除的 regex
tool-policy):

- 新增 core/agent/permission.ts:
  - PermissionDecision = allow | {ask, reason};写入路径能规范化为
    项目内相对路径 → 静默放行,越界(绝对路径/../逃逸)→ 弹一次确认
  - decideWriteToolPermission 收集 path/fromPath/toPath 全部字段,
    任一越界整体 ask(最严者胜)
  - ApprovalOutcome 词表(allowed-once/rejected/cancelled/
    unavailable):没有 always-allow,授权永远一次性
- tool-execution.ts:写工具从「无条件确认」改为「先 decide,allow
  跳过确认直接执行,ask 才走现有确认流程」;确认卡片 UI 不变,
  只是极少触发
- 硬安全不变:.novel/ 写保护、novel.config.json 保护、chapters
  命名规范仍在工具校验层
- 决策点采纳计划建议:第一版只做 workspace 默认档,不加 strict
  开关——所有写路径本就被约束在工作区内,strict 的增量价值缺少
  真实需求信号,permission.ts 单点可后续无痛扩展
- 单测:工作区内/外、盘符路径、.. 逃逸、无路径字段兜底、
  授权词表映射;tool-execution 确认流测试随新语义更新
- 新增 core/agent/spill.ts:单次工具结果超过 8192 字符时,
  全文写入 .novel/spill/<id>.txt,进上下文的只有
  头 4096 + 省略标记(含路径引用)+ 尾 1024;落盘失败时原样
  返回全文(宁可不 spill,不能丢内容)
- 集成点:tool-execution 在 run() 成功后、结果进消息流之前
  调用;只对 ReadFile/RagSearch spill——写工具的内容是模型
  自己写的,回灌无增益(采纳计划决策点建议)
- ReadFile 增加 .novel/ 读保护(改用现有 assertMutableDocumentPath):
  spill 文件不可被 Agent 读回,防 read→spill→read 循环
- 与 compaction 互补:spill 管单次太大,compaction 管总量超标
- 单测:超阈值落盘预览替换、未超阈值原样通过、写工具不 spill、
  落盘失败兜底(内存 FSA handle)
- 新增配置项 agentMaxTurns(默认 8):types/project.ts、
  services/types.ts、defaults.ts、设置面板「项目设置」
- query.ts:maxTurns 从 config.settings.agentMaxTurns 读取
  (显式传参仅测试用)
- 超限收尾从硬编码 assistant 话术改为 turn-limit-reached 事件:
  显示层以系统提示告知已达上限、上下文已保留可续接;模型视图
  不再追加死话术,末尾停在最后的工具结果(序列合法),
  用户继续发消息即可让 Agent 接着做
- 单测:轮次从配置读取、模型调用次数 = agentMaxTurns、
  优雅收尾事件而非 assistant 话术、上下文可续接
arrayBuffer() 会等上游响应结束才一次性返回,Agent 的 message-delta
流式(打字机效果)经 /api-proxy 转发时被整体缓冲。改为逐块写出
response.body 并跳过 content-length 头,保持 SSE 增量到达。
- canRebuild 覆盖未初始化/空/过期/异常,ready 保持不可点(避免误触全量重嵌)
- IndexStatusBar 弃用本地 actionable,复用 store 的 canRebuild 作为唯一定义
- 未初始化态悬停提示改为引导点击构建(需先配置 Embedding)
- 新增 RagIndexModal:状态徽标 + 刷新/构建(重建)按钮 + 六格索引详情,
  接 useIndexStore 与底部状态栏共享状态,构建结果走 toast 反馈
- 外观复原 2026-06 设置页索引卡片(187e0b2 重构遗漏),接线换代为共享 store
- ActivityBar 版本管理下方新增「向量索引」按钮(circle-stack 图标)
- query: 压力/溢出两处 runCompaction 调用补 AgentAbortedError 归类,用户停止不再冒泡成 run-error
- compaction: 摘要请求带 SUMMARY_MAX_TOKENS=8192 输出上限(dsh 默认口径)
- compaction: isContextOverflowError 识别百炼 Range of input length should be [1, xxx] 文案
- llm: AgentLlmInput 增加可选 maxTokens,映射 max_tokens
- project-fs: normalizeProjectConfig 收口钳制数值配置(ragCandidateLimit/ragContextMaxItems/
  conversationTokenLimit/compressionKeepRecentTurns/completion.debounceMs/completion.maxTokens/
  rerank.topN),非法值回退默认;agentMaxTurns 按 W6 语义预留不钳
切换会话后旧运行的残留 delta 此前会直接写进当前会话视图;服务层事件本就携带
sessionId,UI 端补上过滤。
文档 1(权限与防护一致性):
- permission.ts 重写为五档判定(仅审阅/章节/素材/章节+素材/完全访问),按「动作+路径」
  双重判定:EditFile=内容修改看路径(chapters/ 走章节档、elements/ 走素材档),
  CreateFile/DeleteFile/RenameFile=结构操作除完全访问档外一律弹卡
- 档位持久化 config.settings.permissionPreset,默认章节+素材;normalizeProjectConfig
  回填旧配置;设置面板新增档位下拉(位置选择:设置模态框「项目设置」,避开 W5 将重构的
  聊天输入区)
- CreateFile/EditFile 补 .novel/ 与 novel.config.json 写防护(校验层直接拒绝,不弹卡);
  连带修复大小写绕过(断言统一小写比较,APFS 变体同拦)

文档 2(spill 重设计,方向反转为可读回):
- ReadFile 照搬 dsh 三道闸:行分页 2000(已有)+ 单行 2000 字符截断 + 50KB 字节封顶
  (UTF-8 字节口径,行粒度累加不切开多字节字符),截断提示带 offset 续读指引
- ReadFile 退出 spill 白名单(三道闸后单次 ≤50KB 天然不需 spill);SPILLABLE_TOOLS 只剩
  RagSearch;spill 路径前缀豁免二次 spill(防御性兜底)
- 新增 assertReadableDocumentPath:.novel/ 仍禁读,唯独 .novel/spill/ 放行(仍禁写/删/改)
- spill 省略标记改取回指引(路径 + ReadFile offset/limit 分段读回)
- sweepExpiredSpillFiles 启动清理(保留期 7 天,best-effort 不阻塞打开),挂 activateProject
- prompt.ts 补 spill 与字节上限说明,模型不再撞墙
照抄 dsh 分层循环(文档 4 的 S1-S3,W2 波次):

- S1 收件箱数据层:QueuedMessage/InboxState 类型,ChatSessionState.inbox
  可选字段(旧会话无此字段视为空队列,不迁移);inbox.ts 纯函数集
  (enqueue/claim/remove/replace/moveToNextStep/clear/hasPending,不可变更新),
  claim 语义照抄 dsh:next-step 整队抽干、next-turn 恰取 1 条 FIFO、
  批次内先 steer 后 followup、抽干不回滚;随会话 JSON 落盘。
- S2 query turn 层:for(maxTurns) → while(true);step 边界新增抽干点
  (先抽干后压缩,与 dsh 一致);steer 续命——无工具结局时 nextStep 非空
  则 turn 不闭合;maxTurns 变可关闭安全阀(0=不限,默认值 8→0,
  照抄 dsh 无内置轮次预算),超限仍发 turn-limit-reached 优雅收尾。
- S3 session driver 化:runChatTurn 入口统一「入队先于唤醒」(next-turn
  入队后再唤醒);runChatDriver 一次唤醒连续跑多 turn 直到收件箱抽干;
  turn 首批 claim 后逐条进显示层(followup 普通气泡=任务组边界,steer
  带 steered 标记零视觉区别)与模型视图(steer 包装为执行中插话);
  每 turn 独立 runId 与两条 context-summary;停止=abort 当前 turn +
  清闩锁,队列保留不自动续跑;活跃 driver 注册表 + stopChatDriver
  供 W4 service 层挂接。

测试:inbox 纯函数全量;query 的 steer 续命/抽干先于压缩/0=不限;
session 的 followup 接续/停止保队列/首批顺序/steering-message 气泡;
session-store 的 inbox 落盘往返与旧会话兼容;session-driver 全链路
集成(真实 query+driver,仅 stub fetch 模拟 SSE)覆盖长任务不被
8 轮打断、流式期间停止保队列、followup 接续三场景。
pnpm test 272 全绿(基线 255 + 新增 17),typecheck 干净。
文档 3 的 S1-S2(W3 波次),修掉两个原始 bug:

- 改动账本:ChatSessionState.changeLedger 可选字段(旧会话视为空数组,
  不迁移),append-only 随会话 JSON 落盘;FileChangeRecord =
  {id, runId, at, change, diff?}。累积点在 driver turn 的 tool-result
  事件分支(事件驱动,与 modelView 无关 → 免疫压缩)。不可变重建数组。
- Bug 1 修复:collectChangedFiles 改读账本,不再翻 modelView(压缩把
  tool 消息换成摘要后清单全丢的旧实现废弃);新增 ChatSessionView
  .changedFileCount 会话级去重数(renamed 取 toPath),重载不丢。
- Bug 2 消解:结尾文字版 action-summary 不再产生,改为结构化
  change-summary 消息(只存 runId,面板数据渲染时按 runId 从账本解析);
  正常结束且有改动 → push 面板占位;纯问答轮 → 不 push(无噪音);
  被停止 → 一律 push aborted:true。action-summary 类型保留只读兼容旧会话。
- diff 数据留存(抄 dsh 写时 before/after):EditFileOutput 增
  oldText/newText(findActualText/preserveQuoteStyle 校正后的实际应用
  文本)、CreateFileOutput 增 content;ToolDefinition 增
  extractChangeDiff 可选钩子(Edit/Create 实现,Rename/Delete 不实现);
  tool-result 事件带 diff 广播;modelView 的 tool 消息不挂 diff(省 token)。
- 删除 lastWrittenPath(被账本完全取代):types/chat.ts、session.ts、
  agent-service 的 toChatSessionView 末参、ChatSessionView.lastChangedFile;
  ChatTurnResult.writtenPath 一并清理(全局搜无消费方)。
- SessionEvent 的 message 事件携带会话引用,供 service 层把
  change-summary 解析成带 records 的 view。

测试:file-tools 的 extractChangeDiff 三件套;agent-service.change-ledger
五例(多文件全列/压缩免疫回归/同文件两次去重/纯问答无噪音/停止轮标记);
session-store 的账本落盘往返与旧会话兼容;session/session-driver 的
停止收尾断言迁移到 change-summary 语义。
pnpm test 281 全绿(基线 272 + 新增 9),typecheck 干净。
- core 事件链:query 转发 reasoning-delta 为 assistant-reasoning-delta;
  session 产出 message-reasoning-delta(与正文共享占位 id,思考先于正文);
  agent-service 原样广播;AssistantTextMessage/ChatMessageView 增可选
  reasoning 字段随会话落盘(只收不发)
- 思考后直接调工具的轮次(content 空)落一条仅带 reasoning 的气泡
- app:ReasoningCollapse 组件——流式「思考中…」呼吸态自动展开、正文
  开始自动收起、「已深度思考(N 字)」点击展开/收起;状态机为 ref 支撑
  composable(手动态优先于自动态);MessageItem 顶部挂载,无 reasoning
  不渲染;store 处理 reasoning 增量占位与追加
- 新增 8 项单测(全链路 2 / store 2 / 状态机 4)
ModelProtocol 与 ProjectConfig.llm.protocol 的注释原表述「仅配置层支
持 anthropic / gemini」已过时,更新为四协议生成链路全部接入、openai
与 anthropic 真机验证、gemini 与 openai-responses 待 key 的现状。
- toOpenAiMessage 在 assistant 历史消息上输出 reasoning_content
  (AgentMessage.reasoning 存在即回传,不产思考的模型天然缺省)
- DeepSeek 思考模式下工具轮不回传会 400:
  The reasoning_content in the thinking mode must be passed back
- session-driver 集成测试「只收不发」断言反转为回传断言
- 真机验证:deepseek-flash 两轮工具循环 200(修复前第二轮必 400)
- 门禁:421 测试全绿 + typecheck 干净
- ReasoningEffort 五档类型(default/off/low/high/max),config.llm.reasoningEffort
  可选字段零迁移,AgentLlmInput.reasoningEffort 四档下发(default 缺省不传)
- openai-chat:DeepSeek 方言(baseUrl 判定)发 thinking 开关 + reasoning_effort
  三档;非方言仅 reasoning_effort(off 不传、max 降级 high)
- anthropic:thinking enabled/disabled + budget 拍定值(2048/8192/16384),
  budget 触顶时抬高 max_tokens;思考块随历史回传(首位 thinking block,
  带落盘 signature);signature_delta 流解析累积
- gemini:thinkingConfig.thinkingBudget(off=0,low/high/max 拍定值)
- openai-responses:reasoning.effort(off 不传、max 降级 high)
- query 读 config 档位下发;压缩摘要/要素提取固定 off 省 token
- D2 映射表逐格 wire 单测 + signature 三层落盘(messages/session/view)
- 门禁:428 测试全绿 + typecheck 干净
- constants/reasoning-efforts.ts:五档表(值/标签/hint)+ 按协议×方言
  过滤(openai 非 DeepSeek 方言与 openai-responses 隐藏 off 档,无法实现
  的档不显示骗人)
- ReasoningEffortPicker.vue:照 PermissionPresetPicker 形态(按钮+上弹
  菜单+当前档带勾+Esc/点外关闭),ChatPanel 工具行与权限选择器并排
- store changeReasoningEffort:updateConfig 写回,default 档写 undefined
  (配置字段消失 = 未配置,零迁移语义);config view/normalize 同步
  reasoningEffort 可选字段 + 非法值回退
- core exports 面新增 services/types re-export isDeepSeekDialect
- 冒烟(browser-use + FS shim 无头项目):五档渲染/菜单交互/选最高档
  落盘 max/切回默认字段消失/视觉并排协调
- 门禁:433 测试全绿 + typecheck 干净
- ReasoningEffort 收为四档(off/low/high/max),AgentReasoningEffort 别名删除,对齐 dsh 无「默认」档
- 四适配器统一缺省按 off 解析:方言发 thinking:disabled(此前不传=DeepSeek 默认思考,行为变化)、
  anthropic 显式 disabled、gemini budget 0、responses/非方言 openai 不传(wire 逐字节不变)
- normalize 对废弃 'default' 字符串按非法值回退;UI 档位表四档、缺省显示「关闭」、store 直写档位
- 不照搬 dsh 单供应商兜底 high:需逐模型能力表,absent→off 是无能力表下唯一跨协议安全解
- 工具行重排:权限档位留左端,思考强度紧贴发送按钮(各家 agent 产品的习惯位)
- 运行中顺序为 停止/插话/思考强度/发送,入口相对发送按钮位置恒定不随运行态跳动
- 弹层 left-0→right-0:入口贴近输入卡右缘后向左展开,288px 菜单不再溢出卡片
- 5173 真机几何核验:入口右缘紧邻发送左缘(1108→1116),弹层右缘与按钮右缘对齐
- UI 验证一律用用户自起的 http://localhost:5173,不自起 dev server、不发明端口
- 页面空白先 curl 探端口(旧会话死端口≠应用故障,防止把端口问题误诊为应用问题)
- 常备测试项目 ~/note/test-novel 模型已配好;key 只允许运行时读取、永不入库
原生 select 无法在选项里展示副文本;改为自研下拉后,每个协议选项下方
直接展示其默认 API 地址,让「切换协议联动替换地址」的行为可预期。
浮层支持点击外部与 Escape 关闭,当前选中项用对勾标识。
该提示加于设置页重构(187e0b2)时,当时生成链路仅有 openai 适配器。
本日 anthropic / gemini / openai-responses(W2–W4)已全部接入
resolveProtocolAdapter 分发,四协议均可用于 Agent 生成,提示不再属实。
档位枚举与配置结构不变(存量零迁移),仅改展示与引导:label/description
更新为 BYOK 直连语义、直连档预填官方托管地址 linkseek.honlnk.com
(applyProviderSwitch 空值/默认值替换、自定义地址不覆盖)、web-fetch
无抓取引导与 provider 缺地址报错文案同步、429 额度文案 mock 对齐
linkseek 新文案。配套《linkseek 直连与 CORS 修复计划》W1。
@honlnk
honlnk merged commit 18dcb2f into master Sep 28, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant