ymq
|
761052a298
|
feat(pii_guard): PII打码守卫(2026-09-17用户定案合规)——手机/身份证MOD11-2/银行卡Luhn/邮箱确定性侦测→AES密文入Redis db4(24h ephemeral,不进机构密码表)→@@pii:占位符;gateway 0.6门禁+reply/progress用户侧还原+tool事件不还原;v2 run_command env注入$PIPELINE_PII_*+_save_turn落库掩码;人名NER留二期
|
2026-09-17 17:47:48 +08:00 |
|
ymq
|
25c2452647
|
feat(secret_vault): 用户敏感信息管理模块(2026-09-17)
敏感信息入库 + 会话占位符引用 + 入站自动侦测 + 执行边界注入,真值全程不进
模型上下文/不落库/不进命令字符串(根治"用户贴apikey→每轮上行供应商"泄露面)。
核心 secret_vault.py:
- AES 密文入库(appPublic.aes + UTF-8包装 + AES1$版本前缀)。注:ahserver 的
password_encode 实测是 RC4 薄封装(globalEnv.py:61),非 AES,故直接用 aes 模块。
aes.py 第42/43行密文侧 iso-8859-1 必须保留(实测200组密文utf-8解码100%失败),
只在调用方对明文侧做 UTF-8→latin-1 字节保真包装(中文/emoji/私钥 9/9 往返一致)。
- 占位符 @@sec:NAME@@(避开 sqlor ${X}$ 与 ahserver ArgsConvert 同语法冲突,
也避开裸 $VAR 被 bash 就地展开)。
- 侦测三通道:已知前缀16种 / 关键词邻域+熵≥3.5 / 不做裸串侦测(防吞哈希数据)。
中文冒号「apikey:」支持;_JUNK_VALUE_RE 拦占位示例值;低熵弱口令不误吞。
- 执行边界:占位符→$PIPELINE_SEC_NAME,真值走 subprocess env=(不用 bwrap
--setenv——值进argv同机任意用户ps可读;env=落/proc/pid/environ仅属主可读)。
- 越权防护:get_secret_row(own_only=) 读写范围分离 + _assert_own 代码级二次校验
(防任意机构成员覆盖/删除机构共享凭据)。写操作显式 COMMIT(多worker)。
- 审计只记 name/type,禁记值。
三路接入:
- gateway._secret_inbound_gate: run_message Step 0.5(所有上下文解析之前),
progress 事件回显动作(体感不变但告知已自动保存)。
- agent_loop_v2: _t_secret_tool 六工具 + _t_run_command 执行边界(前台/后台分支
之前) + _t_process 出站擦洗 + prompt 铁律(仅有 user_id 时注入)。
- agent_loop(v1角色agent): 只读三件(list/use/detect,无人值守禁自主增删凭据);
身份=项目真人owner(resolve_project_owner,已处理 agent.pm 自动立项反查);
run_shell 执行边界 + 出站擦洗。
- _run_shell/bg_jobs.start_bg_job 加 secret_env 参数(无secret时env=None零改动)。
本地测试 124 断言全绿(含三个挂调实锤陷阱回归:子串碰撞/占位符别名劫持/
未知占位符吞空 + 跨文件工具名同步 + 越权防护)。表定义 m0037(pipeline-app)。
|
2026-09-17 15:44:56 +08:00 |
|
ymq
|
7dda635c9a
|
feat(agent): 五级作用域工具门禁接线+patch_file+原生视觉多模态
1. _init_components 加第8步 _resolve_tool_scopes: 调 core.tool_sources 五级解析,
registry 重建为解析后工具集 + capability 工具合成注册(路由 exec_capability_tool)
2. _execute_tool 加作用域执行门禁: LLM 幻觉调用作用域外工具名(generic喊create_task/
A产线喊B产线工具)直接拒绝并回可行动提示,不只 schema 不给看;解析失败降级不拦截
3. patch_file handler(_t_patch_file): 唯一性校验+replace_all+原子写+越界防护+二进制拒绝
4. 原生视觉: run(image_parts) 构造多模态用户消息; _call_llm 含图失败剥离重试一次
(_degrade_images_if_needed)+注入如实告知说明(绝不假装看过图); _estimate_tokens/
_summarize 兼容 list content(_content_as_text); gateway.run_message 加 image_paths
透传+build_image_parts+超限notes注入
|
2026-09-10 18:36:54 +08:00 |
|
ymq
|
25c9e7cdb3
|
fix(gateway): run_message空输入守卫——空/纯空白消息绝不进LLM(2026-09-07实测:空prompt致LLM幻觉delete_project要确认/直接run_command执行python3 heredoc非危险命令绕过确认门);入口拦截覆盖generic+全通道
|
2026-09-07 18:04:43 +08:00 |
|
ymq
|
763e84681f
|
fix(gateway): 项目模型持久化加对话能力守卫——白名单取pipeline_llm.selection.CHAT_CAPS(未装兜底t2t/i2t/m2t),非对话模型选中即无效走回退链(2026-09-06用户定夺)
|
2026-09-06 19:49:15 +08:00 |
|
ymq
|
f3f82dd448
|
refactor(llm): agent调用收敛到模型治理统一推理API——llm_bridge改HTTP自调用薄客户端(短期token+本进程端口),删旧llm表直查;llm_proxy委托chat_inference;gateway/agent_loop/bug_flow模型解析与缺省模型改走治理链/统一解析,清除写死模型名
|
2026-09-04 17:05:42 +08:00 |
|
ymq
|
eaebca297d
|
fix: 产线隔离——会话项目跨产线时清空,防元景项目劫持商机/投标产线会话
|
2026-08-29 09:21:34 +08:00 |
|
ymq
|
9ec38df6b4
|
feat(gateway): 会话模型选择持久化到项目——设置后持续生效直到再次选择
问题:项目选择模型后不持久化,每次进入会话都回退固定缺省值。
根因:前端模型下拉的 model_id 后端不消费;无项目级模型存储;
会话只读用户全局 default_llm_id,sd_projects.default_model 无写入路径。
修复(通用层,所有产线共用):
- resolve_project 读出 sd_projects.default_model(项目级、跨会话持久)
- run_message 新增 model_id 参数:_resolve_and_persist_model 校验
(兼容 llm.id/llm.model_id 两种取值 + 多租户隔离)后持久化到项目
- 模型优先级:本次显式选择 > 项目已设 > 个人全局 > 产线默认
(个人全局从压过一切降为兜底,项目设置不再被全局覆盖)
|
2026-08-28 12:26:18 +08:00 |
|
ymq
|
09f8b85f66
|
feat(gateway): run_message/AgentExecutor 支持 default_pipeline_id
无当前项目时按入口指定产线装载能力(替代硬回退 sdlc_general)。
投标产线会话入口传 bidding_general 即可复用通用 agent 多 session 界面。
|
2026-08-27 13:12:34 +08:00 |
|
ymq
|
f8fef7a7d5
|
feat(session): 当前项目按会话隔离(session_id),多tab各自项目互不覆盖
- workspace.get_session_project_id: 按 session_id 读 pipeline_session_settings,回退全局
- get_workspace_dir/get_workspace_path 支持 session_id 参数
- gateway.resolve_project 按会话解析 pid(default_llm 仍按用户全局)
- _persist_project: 有 session_id 时写 pipeline_session_settings + 全局兜底
|
2026-08-24 16:40:42 +08:00 |
|
ymq
|
8bc1b4e571
|
feat(session): gateway/executor 支持 session_id 多会话隔离
web 多 tab 独立会话:run_message 加 session_id,会话 key 从 channel:user_id
扩展为 channel:user_id:session_id(空则向后兼容单会话);AgentExecutor 历史
加载/保存按 session_id 隔离,空则回退 project 级隔离。
|
2026-08-20 17:38:18 +08:00 |
|
ymq
|
41232c8295
|
feat: 危险命令确认改为会话级——保留单次确认,新增「全部确认」选项(approve_all)授权后本会话不再询问
|
2026-08-19 14:09:27 +08:00 |
|
ymq
|
7787898456
|
feat(project-space): 项目空间隔离——通用助手('general')与专业产线(pipeline_id)项目空间不共享
- workspace.build_workspace_path: {base}/{org}/{space}/{name},重名追加短ID
- get_workspace_dir 兜底路径加空间段
- AgentExecutor 加 generic 标志派生 self.space;create_project/switch_project 按空间过滤
- gateway 传 generic
|
2026-08-19 11:38:23 +08:00 |
|
ymq
|
6add7ff4fa
|
fix: /task 弹窗 widget url 用 base_url 拼完整绝对路径(前端 absurl 需完整 URL)
|
2026-08-18 12:53:55 +08:00 |
|
ymq
|
bb29d6d634
|
fix(gateway): resolve_project 改两步查询避免 JOIN 触发 collation 冲突
|
2026-08-17 13:33:28 +08:00 |
|
ymq
|
286f0cb4dd
|
feat(llm): 个人选择模型(default_llm_id)接入会话agent+org_id改用户机构优先
|
2026-08-17 13:31:04 +08:00 |
|
ymq
|
0bc3587a75
|
fix: generic模式传generic给load_agent_config(真不装产线能力)
|
2026-08-16 18:04:28 +08:00 |
|
ymq
|
6e61dbbbb9
|
feat: gateway.run_message加generic参数(纯通用模式跳过resolve_project+不装产线能力)
|
2026-08-16 18:02:42 +08:00 |
|
ymq
|
2cdd3cb986
|
feat: gateway服务层(统一消息入口+会话生命周期+通道注册)+AgentIO适配走gateway
|
2026-08-15 10:02:54 +08:00 |
|