28 Commits
Author SHA1 Message Date
胡飞 5236415412 fix(terminal): 修复 PROMPT_COMMAND 钩子在子 shell 报「未找到命令」(#217)
bash 分支把 PROMPT_COMMAND 注册成裸函数名。PROMPT_COMMAND 是 shell 局部机制,
但它的值可能被环境导出并被后续 shell(su、tmux、exec bash、嵌套 ssh)继承,
而那些 shell 里没有本文件定义的函数,于是每个提示符都多输出一行
「bash: __onetcli_precmd_bash:未找到命令」,即 issue #217 的现象。

- 钩子改为自带存在性判断的命令串:`command -v` 是内建命令,函数缺失时静默跳过、
  不产生 fork,也不受继承链路影响;
- 退出码必须在钩子里先取好再显式传给函数:钩子里的 `command -v` 会覆盖 `$?`,
  若仍让函数自己去读 `$?`,上报的 exit code 会恒为 0、`133;D` 失效;
- 补两个回归测试:继承钩子但没有函数的 shell 必须静默、主 shell 退出码必须仍上报;
- 设计文档记录该约束,避免以后被简化回裸函数名。

验证:`cargo test -p terminal`(503 lib 测试通过)、
`cargo clippy -p terminal --all-targets`(改动文件零告警);另在真实交互式 bash 中
对比复现:修复前子 shell 输出 2 行 command not found,修复后 0 行,
主 shell 的 `133;D` 退出码上报仍为 `false`→1、`true`→0。
2026-09-18 17:57:46 +08:00
胡飞 7815ce5a28 perf(deps): gpui-component 升级到 resvg 0.46,去掉重复的 usvg/tiny-skia
component fork 的 Windows 原生菜单固定 resvg 0.45.1,gpui-pre 用 0.46.0,
每个下游二进制都链两份 usvg/tiny-skia。fork 侧 6df86ef8 把 resvg 提到 0.46.0,
navop 侧 rev 跟到 6df86ef8(含 rquickjs)。

同时清掉脚本/文档里改名前的 gpui-ce 标识:
- sync-gpui-component.sh 的 -p 包名(原值实跑报 did not match any packages)
- update_gpui_component_revision.py 的包名映射
- gpui-component-external.md 的旧仓库地址与 rev
- gpui-shell-extension-design.md / home-theme-sidebar-refinement.md 的旧包名与 rev

验证:Cargo.lock 里 resvg/usvg/tiny-skia/tiny-skia-path 各只剩 1 个版本;
cargo check -p main 通过;resvg 调用序列探针对 0.46.0 编译通过。
未跑 Windows 构建:唯一调用点是 native_menu/windows.rs(Windows 专用)。
已知遗留:update_gpui_component_revision.py 仍不能跑(依赖行需含
gpui-component.git + version =,SHELL_VERSION_FILES 锚点已不存在)。
2026-09-17 15:51:15 +08:00
胡飞 45a75c5be4 fix(terminal): 修复 Shell Integration 握手无兜底导致 SSH 键盘输入被永久暂存 (#206)
运行时 Shell Integration 的就绪握手期间,actor 会把用户键盘输入压入
deferred_actor_inputs 暂存。四个暂存态(WaitingForFirstOutput / Injecting /
AwaitingPrompt / PlainAwaitingOutput)都只能靠远端输出推进,其中三个没有任何
超时兜底:远端一旦不再产出可解除握手的输出(登录 expect 永不匹配导致
should_inject 不触发、prompt 结束标记缺失等),会话就永久停在暂存态——远端
输出照常刷新、提示符与光标都正常,但按键(含 Enter / Ctrl+C)被静默吞掉,
界面没有任何提示。本地终端走 pty_backend、没有这道门禁,因此表现为
「同窗口本地终端正常、SSH 标签输入全死」。

- RuntimeShellIntegration 新增 phase_name() 与 force_release_input():把上述四个
  暂存态强制推进到 Plain(丢弃注入回显缓冲,此后不再抑制输出、不再注入),
  已可输入的阶段返回 false,不干扰正常会话
- actor 新增 30s 看门狗 SHELL_INTEGRATION_HANDSHAKE_TIMEOUT,到期调用
  force_release_input() 并置 shell_ready = true,下一轮循环按序重放 deferred
  队列;输入被暂存时打 terminal.ssh.runtime 的 debug 日志(含 phase 与队列长度),
  看门狗触发时打 terminal.ssh.setup 的 warn 日志
- 抽出 arm_shell_integration_handshake_watchdog() 供测试直接断言武装条件:
  不能写成 accepts_terminal_input().then(..)——bool::then 是「为真才取」,那样只在
  已可输入的会话里武装,握手态反而是 None,看门狗永不触发(等于没接上),且到期
  那侧 force_release_input() 返回 false 属无害空转,既不报错也不失败。状态机推进
  单向,启动时判定一次即可
- 设计与状态表同步更新到 docs/design/ssh-runtime-shell-integration.md

验证(在本提交所覆盖的工作区执行):

- cargo test -p terminal --lib => 491 passed / 0 failed
- 新增 handshake_watchdog_arms_exactly_when_input_is_deferred:把武装条件改回反向
  写法实测 FAILED,修正后 Green
- cargo clippy -p terminal --all-targets -- -D warnings:terminal 自身干净,剩余报错在
  agent_runtime、crates/ssh/src/host_key.rs 等未触碰文件,属既存 lint

已知限制:兜底只放行输入,不补发 init_commands——其发送判定在输出处理分支内,
远端彻底沉默时仍需再来一段输出才会发出。
2026-09-16 16:16:59 +08:00
user.email e92900b425 fix(terminal): SSH 探测致传输层断连后自动降级单通道重连,修复受限设备无法登录 (#183)
华为 USG 等仅允许单个 SSH 会话的嵌入式设备会在 shell integration 探测的
CHANNEL_OPEN 阶段直接回 SSH_MSG_DISCONNECT 掐断整个传输层(日志表现为
Disconnected),随后在死 transport 上开交互通道报 Channel send error,
且不匹配既有的 channel open 降级重连条件,导致整条连接失败。

- establish_channel 探测后检查传输层存活:被掐断时失效该 transport
  generation,重建连接并以单裸交互通道模式重试(跳过探测);
  探测失败仍只降级不注入,零远端写入的行为不变
- 连接表单高级设置新增「禁用 Shell 集成」开关,针对网络设备/工控主机
  从源头跳过探测(复用既有 disable_shell_integration 字段)
- 降级重试后仍被设备断连时,为 russh Disconnect/SendError 补充
  设备 SSH/VTY 会话限制排查提示
- 更新设计文档补充受限设备探测断连降级章节
2026-09-11 17:03:44 +08:00
胡飞 fd43db5c94 feat(home): 统一首页网格布局、树形视图与克制视觉层次
- 统一网格:card_grid_metrics 由内容区宽度计算列数/列宽,单项组与
  末行不拉宽;最近区容量跟随网格列数
- 主页卡片/列表/树形三视图,视图切换改为带勾选态的下拉菜单
- 树形视图嵌入主页:侧栏实现 Render 并按 home_embedded 输出,修复
  HomePage render 租约内 read(HomePage) 重入 panic;嵌入时隐藏树头部
- 团队标签中性化(muted 底),移入名称行与名称对齐;卡片/列表选中态
  统一为 list_active 语义色,去掉常驻阴影与逐项「最近」角标
- 最近区改用历史语义图标;提示仅在分组筛选生效时显示;计数精简为数字
- 展开/折叠全部归入「分组」菜单;新建连接降为 outline
- 侧栏收窄至 184px,折叠控制移入底部与设置同行;账户行去常驻邮箱
- 常驻连接侧栏仅非主页显示;合并 dev 并完成 universal-plugins 迁移
- 清理死代码:user_avatar 模块、Inline 变体、旧同步按钮状态机、
  冲突对话框等;full test 539 通过、clippy 无告警
2026-09-06 18:19:35 +08:00
胡飞 297c6ebca5 docs(terminal): runtime SSH shell integration design notes
Document the no-remote-write injection design: probe, single-line
ANSI-C eval injection, echo suppression state machine, readiness
handshake, timeout fallback, legacy rc detection/cleanup, and the
verification matrix including the live 181-server test.
2026-08-28 14:23:41 +08:00
胡飞 7a5f16b55b feat(db): SQL editor baseline — viewport scan, execution request, source identity, completion, hover, diagnostics 2026-08-28 10:12:54 +08:00
胡飞 a4f490385b chore: remove archive notice and docs 2026-07-12 13:35:34 +08:00
胡飞 4b19abe79d refactor(connections): 合并连接创建与更新为 save 工具
- 重命名并替换 connections.create 和 connections.update 为 connections.save
- connections.save 根据是否包含 id 字段决定创建或更新操作
- 移除 move_workspace 和 set_sync_enabled 接口及相关测试
- 更新连接工具注册,文档,测试,和协议,全部使用 connections.save
- 调整工具输入输出 schema 支持创建和更新两种格式
- 调整风险等级为 Medium,不再低风险
- 清理 PublicMcp 移除 ssh.list_sessions 工具及支持代码
- 侧边栏调整连接部分面板显示顺序和内容,改善用户体验
2026-07-04 23:54:29 +08:00
胡飞 f54ff51e16 docs: CLI/automation runtime 架构文档 2026-06-24 17:35:07 +08:00
胡飞 14e919838f feat(public_mcp): structured remote ops replacing terminal paste bridge
Replace legacy terminal_snapshot/terminal_write tools with a structured
remote execution channel backed by active SSH sessions.

New tools:
- public_mcp.list_sessions (migrated from terminal provider)
- public_mcp.remote_exec (foreground + background, returns stdout/stderr/exit_code/duration)
- public_mcp.remote_command_poll (background command status)
- public_mcp.remote_command_output (offset-based output reads)
- public_mcp.remote_command_cancel (sigint/sigterm)
- public_mcp.remote_file_write (content + sha256 + overwrite policy)
- public_mcp.session_diagnostics (connection state + recovery hints)

Removed:
- public_mcp.terminal_snapshot
- public_mcp.terminal_write
- TerminalToolProvider and tools/terminal.rs

The structured path avoids terminal paste pitfalls (pager, line wrapping,
heredoc failures, unknown exit code) by running non-interactive SSH exec
through SshSessionManager. Background commands are tracked in a process-level
command store with bounded buffers and cancellation signals.

Approval tests migrated from terminal_write to remote_exec as the carrier.
2026-06-23 19:42:33 +08:00
胡飞 c31d25e6fe docs: unify cli mcp and function tools runtime 2026-06-22 13:50:36 +08:00
胡飞 4f9f961f97 docs: move agent cli design into main package 2026-06-22 13:30:25 +08:00
胡飞 b9abb72dde docs: design agent cli extension architecture 2026-06-22 12:36:00 +08:00
胡飞 8564d3ff8b fix(workflows): 删除重复的上传操作
- 移除upload-r2.yml中重复上传到releases/latest的代码行
- 简化文件上传逻辑,避免不必要的冗余操作
- 保持上传对象调用的唯一性和一致性
2026-06-20 21:52:55 +08:00
胡飞 70c3778775 feat: expose external driver table sql dialect 2026-06-20 19:38:45 +08:00
胡飞 7abf446827 feat: resolve extension downloads via plugin manifests 2026-06-20 08:02:53 +08:00
胡飞 13e6b0d8d3 feat: improve extension driver distribution 2026-06-19 12:50:08 +08:00
胡飞 2e7f0843ed feat(db): route ipc drivers through host ssh tunnel 2026-06-19 10:07:20 +08:00
胡飞 7284ce4e68 feat: support ipc object view metadata 2026-06-18 23:34:26 +08:00
胡飞 47860cae13 chore: remove local duckdb driver 2026-06-18 13:44:56 +08:00
胡飞 6c5f062ddf fix: remove legacy external driver id fallback 2026-06-15 13:41:29 +08:00
胡飞 367b21b777 refactor(db): 重构外部数据库驱动和连接管理逻辑
- DbManager 为每个外部驱动注册独立的 ExternalDatabasePlugin 实例
- 通过 DatabaseType::External { driver_id } 精确路由到对应插件,替代旧有的 extra_params 机制
- 维护 DuckDB 作为内置类型并在可用时路由至 duckdb IPC 驱动,作为兼容性桥接
- 连接表单基于驱动清单,支持 UI 分页、字段条件显示以及本地化标签
- 规范宿主与外部驱动的集成契约及 SQL 方言生成规则,支持异步表设计器调用驱动 DDL 方法
- 优化驱动显示元数据加载,支持内置及自定义图标资源路径映射
- 扩展测试覆盖范围,新增多个相关组件的单元测试和格式检查任务
2026-06-15 12:14:20 +08:00
胡飞 9454f97d34 feat(update): 增加更新下载的GitHub回退支持及相关逻辑完善
- 在发布和上传工作流中新增ONETCLI_EXTENSION_GITHUB_MANIFEST_URL环境变量配置
- 扩展MarketplaceManifest解析逻辑,支持解析并转换相对资源路径为绝对路径
- 增加extension-runtime模块中针对GitHub市场插件清单URL的优先级选择机制
- 在客户端更新API响应中支持fallback_download_url及fallback_downloads字段
- 更新更新对话框逻辑,支持多个下载URL优先从主源下载,失败后尝试回退源
- 实现下载操作从多个源依次尝试,保证在主源失败时可用备用源下载成功
- 补充相应单元测试覆盖新功能,包括GitHub fallback URL选择和下载回退流程
- 更新release分发文档,详细说明fallback下载策略和相对路径资源解析规则
- 在构建脚本中添加对新环境变量的监控,提高构建时配置灵活性和自动化
- 修正并优化若干命名和代码结构,提升代码清晰度和维护便捷性
2026-06-14 19:19:19 +08:00
胡飞 4a147e1e1a feat(extension): 将扩展包构建和发布拆分到独立仓库
- 创建新的 onetcli-extensions 仓库,承载扩展包代码和构建流程
- 保持 onetcli 负责主应用、更新客户端及扩展运行时
- 构建多扩展独立发布及 CI 检测仅变更扩展以优化构建效率
- 新增扩展包打包、校验、变更检测及市场清单生成脚本
- 配置 onetcli-extensions 的 CI、发布及 Cloudflare R2 上传工作流
- 完成首个 DuckDB 扩展包的发布和在线清单验证
- 明确扩展协议和驱动相关 SDK 保持在主仓库依赖特定版本标签
2026-06-14 17:43:23 +08:00
胡飞 9e0d1912e6 fix(release): 优化发布流程及扩展市场多源支持
- 调整发布工作流,移除对 duckdb_driver 的构建,改为仅构建 main 应用
- 发布流程中添加生成并上传 release-metadata.json 文件,包含版本及标签信息
- 更新配置逻辑,新增 ONETCLI_PUBLIC_BASE_URL 环境变量支持,替代旧的更新URL变量
- 重新实现更新 URL 获取逻辑,优先使用 runtime 和构建时的 ONETCLI_PUBLIC_BASE_URL
- 扩展市场 manifest 支持多下载源和目标平台特定资源,通过 asset_urls 和 fallback_asset_urls 区分
- 扩展下载逻辑新增多源尝试,失败时尝试下一个可用链接,强化容错和灵活性
- 扩展清单加载支持带有 fallback 机制的多源配置,默认优先 GitHub,支持自定义环境变量配置
- 调整扩展视图模型,新增 fallback_asset_url 字段以支持备用下载链接
- 更新高亮器初始化逻辑,简化错误处理且增强稳定性
- 新增详细发布分发文档,明确主程序和扩展市场的发布及下载策略
- 清理构建脚本环境变量定义,新增 ONETCLI_EXTENSION_MANIFEST_URL 处理支持
- 修正测试用例以适配新的多资产和多哈希字段,确保覆盖新扩展下载逻辑和 manifest 配置
- 其他小幅代码整理和注释完善,提升代码可维护性和架构清晰度
2026-06-14 16:41:23 +08:00
胡飞 82144cc1d7 feat:IPC机制改造,以及DuckDB实现 2026-06-13 12:57:53 +08:00
胡飞 f77a3dbc94 feat(agent): 实现通用聊天 Agent 及多级调度器功能
- 新增GeneralChatAgent,支持基于流式 LLM 的通用对话处理
- 增加AgentDispatcher,实现三级调度策略(规则匹配、单候选捷径、LLM 意图路由)
- 新增SessionAffinity以支持多轮对话时绑定同一 Agent,提升对话连贯性
- 实现AgentRegistry用于管理及优先级排序所有可用 Agent
- 新增IntentRouter,基于 LLM 判定用户意图并选派合适 Agent
- 在 AI Chat 面板集成 AgentDispatch,替换原始流式接口,统一处理事件流
- 提供完整的 AgentContext、AgentEvent、AgentResult等核心框架接口定义
- 实现数据库模块中纯异步查询方法,支持无GUI环境调用数据库元数据能力
- 扩展 ChatDB Agent 模块,注册SQL工作流和数据库元数据访问能力
- 统一对 Agent 相关代码模块结构,扩展库中全局注册和调用入口
2026-02-15 20:57:17 +08:00