c76431a8f1
feat(tools): 网页提取白名单直提 + recall 记忆纳入已读文件
...
- extract_webpage/save_webpage 命中白名单域名时本机直提:GitHub 代码页走
jsDelivr CDN 直链(备 GitHub API),其余白名单页用 trafilatura 正文识别,
失败自动回退 Tavily;内置白名单 github.com,个人空间可关闭/追加域名
- trafilatura 进 requirements(可选依赖,缺失时静默降级全走 Tavily)
- recall_project_memory 返回记忆全文后标记为已读,可直接 edit_file
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-12 11:30:38 +08:00
281be248c2
fix(server): 移除 web_server 兼容入口与验收脚本的 socketio 残留引用
...
Socket.IO 整体移除后,web_server.py 仍从 server.app 导入已不存在的
socketio 导致兼容入口启动即 ImportError;test/runtime_standalone_checks.py
中 ext.socketio 断言同样失效,一并清理。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-12 08:42:41 +08:00
5459d82637
feat(cli): 面板与状态栏接真实数据,/new 对齐草稿语义;host 设置面双通道化
...
CLI(bun 跑源码即生效):
- boot:loadBootData 一次性加载模型清单(含 context_window)/个性化默认
(含压缩设置)/path 授权/会话列表;新会话 unshift 标 current
- /session:Enter 真实加载(timeline.reset + getSessionHistory 渲染历史文本)
- /new:对齐 web /new 页面语义——空对话草稿不立即建会话,首条消息
createTask 不带 cid 由服务端惰性创建,响应回 id 后插入列表标 current
- /context + 状态栏:token_update 事件(运行期事件流)+ 打开面板时查询
新端点 GET /api/runtime/sessions/<cid>/token-stats;百分比算法对齐 web
InputComposer(自动压缩阈值优先于模型窗口)
- /model:Enter = 本地生效 + createTask 带 model_key/run_mode/thinking_mode
覆盖(会话级即时)+ savePersonalization patch 存默认(effort default 存 null)
- /path:增删后 savePathAuths 全量提交两组(服务端 deny 校验保留)
- /agents /tasks /workflow /rewind:打开时拉真实列表(sub_agents/
background_commands/workflows/versioning-checkpoints)
- 发送链路统一 sendWithSettings 携带 /model 生效值(含排队队列)
后端:
- 8 端点装饰器 api_login_required → api_login_or_host_token_required
(personalization×2 / path-authorization×2 / sub_agents / background_commands
/ workflows / versioning-checkpoints),web session 行为不变
- headless_app 用 add_url_rule 共享上述视图函数(URL 与 full 一致);
sub_agents/background_commands 支持 query 显式传 conversation_id
(Bearer 装配的 terminal 无当前对话概念)
- RuntimeService 新增 get_session_token_stats;gateway_api 挂 token-stats 路由
- headless 404 兜底:非 /api/ 的 GET 路径回落告知页(对齐 SPA fallback)
验证:tsc ✅ py_compile ✅ 冒烟 6/6 ✅ headless 装配 54 路由 ✅
localconfig 无头实测读到真实配置 ✅ ;真实服务端到端待用户重启 8091 实机验收
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-11 21:20:58 +08:00
66fa90d6cc
feat(server): headless 启动入口(Gateway 专用路由面)+ approval 拆独立蓝图
...
- 新增 server/headless_app.py:仅挂 gateway/tasks/status/approval/usage 五件蓝图,
无 web 站点路由面(/login、会话管理、静态页全砍),根路径返回 HTML 告知页;
供 CLI 探测无服务时 spawn(同 RuntimeService 单例/数据目录/端口 8091,
与 full 形态互斥不并存)
- server/chat/approval.py 拆出 approval_bp(tool/plan/question 6 条路由 URL 不变),
解除对 chat_bp 的 import 循环,full/headless 双形态共用
- cli/src/gateway.ts:spawn 切 server.headless_app;python 解释器改 pickPython
依赖探测(import yaml/flask 逐个试 .venv → homebrew 3.12/3.11 → python3),
修本机 .venv 缺 pyyaml 导致的自启动即崩
- 修复 socket 移除残留雷:make_terminal_callback 定义随 broadcast.py 被删,
workflow_runtime_api 模块级 import 即炸;resources.py 补兼容空操作(恒返 None)
- AGENTS.md §2 补 headless 启动命令、§12.5 补兼容空操作与 headless 形态说明
验证:tsc ✅ py_compile ✅ 冒烟 6/6 ✅ headless 装配 47 路由 ✅
8093 真实冒烟(health/Bearer/404 面/告知页)✅
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-11 19:00:22 +08:00
e5808ea5be
refactor(server,web): remove Socket.IO entirely, unify on REST polling
...
- task event stream (_append_event) is now the sole realtime channel for web and CLI
- status snapshots: idle 5s polling of /api/status (was status_update push); operation initiator gets state from REST responses
- terminal panel: REST polling (list 5s, output 1.5s, prefix-matched incremental xterm writes)
- multi-tab passive sync deliberately degrades to polling-based perception
- delete socket_handlers/broadcast/useLegacySocket (2103-line dead file); extensions.py keeps only run_background
- remove socket token chain (/api/socket-token, prune/consume_socket_token, pending_socket_tokens)
- app.run(threaded=True) replaces socketio.run; reapers switched to plain threading
- drop flask-socketio/socket.io-client/websockets dependencies
- docs: AGENTS.md section 12.5 (replacement map + hard constraints), plus CLI rewrite companion doc updates
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-11 17:28:47 +08:00
d97c1423b1
feat(cli): rewrite CLI on opentui with Gateway host Bearer channel
...
- replace Ink implementation with opentui + React 19 (old version kept at cli/legacy-ink-src/ for field reference)
- all traffic goes through Gateway host Bearer token; workspace bound via X-Astrion-Workspace-Id header
- auto-spawn server only when no instance is alive (never kill/restart running ones); stale server without token is detected
- astrion launcher (bin/astrion, symlink-aware, --version/--help fast-exit)
- slash menu panels (session/model/mode/permission/path/context/approvals...) with shared selector component
- backend: host workspace list/create dual-channel endpoints, host token generated at startup
- i18n reads OS locale at startup (zh/en)
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-11 17:27:53 +08:00
cd23bb36a6
fix(personalization): 修复按需加载工具勾选区脚本侧未解包 Ref 导致的崩溃
...
ToolsTab 的 isCategoryFullyDeferred/toggleDeferredTool/toggleDeferredCategory
在脚本侧直接访问 form.tool_loading_deferred,而 form 是 Drawer 经
storeToRefs + provide 传入的 Ref,脚本侧不会自动解包,得到 undefined
后调 .includes 即抛 TypeError。统一改为 unref 后读取并保留防御判断。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-10 20:06:50 +08:00
f78fd7442c
feat(tools): edit_file old_string 不足3行升级为硬拒绝
...
- 单条/多组替换路径统一:old_string 少于3行直接报错拒绝执行,不再仅提示后放行
- 移除 replace_all 批量替换场景的单行豁免,工具描述同步改为硬性表述
- i18n 文案更新(中英):replace_short_old_notice -> replace_old_text_too_short,清理失效的 many_short_notice
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-10 19:14:36 +08:00
a997c04cda
fix(utils): atomic_write_json 穿透符号链接,修复设置保存后回退
...
os.replace 目标是符号链接时会替换链接本身,产生与共享文件脱钩的普通文件
(分叉)。docker/web 模式工作区的 personalization.json 是指向用户级共享
文件的符号链接,保存后分叉被 user_manager 的链接校准丢弃,导致个人空间
设置(如 external_session_header)保存成功却立刻回退。修复为写入前先
resolve 符号链接到真实文件再原子替换;普通文件路径行为不变。
2026-09-10 18:38:13 +08:00
70e16fccfb
feat(tools): 工具动态加载——低频工具按需注入,对话文件快照为准
...
- 新增 core/tool_loading.py:可延迟注册表(8 类目 18 工具:工作流/子智能体/
对话回顾/记忆写入/个性化/技能/MCP/彩蛋)、快照与状态迁移、目录渲染、守门判定
- 常驻 load_tools 工具:按名在 tool result 返回完整 JSON 定义后直接调用;
执行守门拦截未加载的延迟工具并引导先加载;只读/计划模式放行
- 对话创建时快照 metadata.tool_loading(enabled/deferred_set/initial_exposed/
loaded/pending),创建即钉死,个人空间设置只影响新建对话;老对话无字段
不生效(全量工具,零迁移);多智能体对话 v1 不启用
- prompt 目录走现有冻结机制(frozen_tool_loading_prompt,skills 段之后),
创建即冻结终身不变,不破坏前缀缓存;tools 数组恒为「构建集−deferred_set」
- 压缩三钩子(深度/浅度/手动)重置 loaded→空、pending→deferred_set,
frozen_tool_loading_prompt 纳入 REBUILD_FROZEN_KEYS
- 个人空间新增「按需加载的工具」设置区(总开关默认开+类目分组勾选,
双语 i18n),GET /api/personalization 下发注册表
- load_tools 上下文 formatter 保留完整 JSON 定义(定义靠 tool result 存续);
前端渲染名称+状态徽章;新增 19 个单元测试
- AGENTS.md 新增 §13(硬约束与新增可延迟工具 checklist)
2026-09-10 17:07:15 +08:00
f6a46b5b0a
refactor(tools): remove zombie close_sub_agent tool
...
该工具自 2025-11-15 引入起即为 terminate_sub_agent 的别名(两提交相隔
19 分钟),main_terminal 拆分为 main_terminal_parts 时执行分支丢失,
仅剩定义残留——模型调用必落 unknown_tool,且与 terminate_sub_agent
命名近似干扰工具选择。本次彻底移除定义、分组集合、tool_config 分类、
formatter 注册、i18n 键与前端三处图标映射,并在原定义位置留注释
防止误恢复。终止子智能体统一使用 terminate_sub_agent。
2026-09-10 13:41:12 +08:00
d574159f82
chore(repo): 根目录杂项归档 _experiments,完善 .gitignore
...
- 停止追踪 study.md、3 个沙箱调研 md、2 张无引用散图及 cache_research/(25 个文件),实体全部移入 _experiments/
- .gitignore 补全:cli-redesign-demo/、_packaging/、.pytest_cache/、.runtime/、.upload_quarantine/、opencode_key_fix_output/、cache_research/;去除重复的 sub_agent_results/
- 同步修正 test/utils 注释与本地文档中的调研资料路径引用
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-09 21:11:58 +08:00
a50a793306
feat(chat): markdown 表格改横线风格并按宽度智能换行/滚动
...
- 表格去除外框/圆角/底色/竖线,仅保留横线(表头 1.5px --border-strong、行 1px --border-default),首列与正文对齐
- 新增 utils/tableLayout.ts:测量表格内容自然宽度,≤ 容器×1.35 时换行显示,超出退化为整表横向滚动;ResizeObserver 随容器宽度变化重判
- MarkdownRenderer 渲染后挂载判定(onMounted/onUpdated/watch content)
- 多智能体气泡表格同步同一风格;dark/light 变体移除表格背景/边框补偿
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-09 19:42:33 +08:00
1135afd654
docs(AGENTS): 构建/lint 等命令沙箱失败时须申请权限,禁止绕过
2026-09-09 18:56:49 +08:00
f2676caa80
fix(frontend): 快捷菜单翻转动画与详情面板修复,md 文件链接统一下载通道
...
- QuickDock ⋯ 菜单:下方空间不足时翻转到按钮上方展开;进出动画按
翻转状态分方向(下方展开从上到下、翻转到上方时从下到上),补离开动画
- 子智能体详情面板:补 CloseButton 导入修复关闭按钮缺失;right 定位
改为实时跟随快捷栏实际位置(右侧开预览/终端面板时不再盖住按钮)
- md 相对路径链接识别为工作区文件链接,与 download:// 统一走
/api/download/file 下载(web blob / Android 原生桥接);修复中文路径
因 micromark 规范化编码未解码导致的双重编码 404
- 文件链接样式重构:文件图标 + 中性文字 + 虚线下划线(对齐 ChatGPT),
图标跟随文字色、下缘对齐虚线,行高 2.5;下载失败改弹 toast 不再跳转错误页
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-09 18:09:10 +08:00
aa50a72d86
fix(chat): /new页面切换工作模式被运行中对话误拦
...
- 运行中判定改基于请求显式携带的 conversation_id,不再用工作区级
terminal 的残留焦点(_ensure_conversation 自动加载最近对话);
/new 页面无 cid 直接放行(新对话默认模式与运行中对话无关)
- /new 路径切换改 persist=False,避免误写残留焦点对话的 metadata
(plan 联动权限曾一并污染),与 _sync_workspace_terminal_mode 同策略
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-09 02:19:30 +08:00
e5a988f00f
fix(frontend): status快照模式字段按对话来源隔离,修复跨terminal广播污染
...
status_update 是用户级房间广播,工作区级/其他对话/其他标签页的 terminal
触发时都会携带各自的模式值;applyStatusSnapshot 此前对 work_mode/
permission_mode/execution_mode/network_permission 无条件覆盖,plan 锁对话的
UI 会被其他 terminal 的广播误解锁,用户点击切换被后端 plan 锁拒绝(500)。
现仅当快照 conversation.current_id 与当前查看对话匹配(含双空:/new 页面
↔ 工作区级 terminal)时才应用模式字段;对话权威值仍由进入对话时的
fetchWorkMode 等对话级 fetch 保证。
2026-09-09 00:33:01 +08:00
944cef0587
fix(runtime): 审批/提问等待的停止检查改为两级判定——修复弹窗被运行期常驻 entry 误触发
...
stop_flags[task_id] 在任务运行期常驻 {'stop': False, ...} entry(chat_flow 启动时写入),
entry 存在 ≠ 停止请求。新增 _make_interaction_stop_check(entry 存在且 stop 字段为真才判定),
替换 tool 审批/ask_user/submit_plan 共 5 处调用点;修复前三个 _wait_* 一律秒触 stopped 分支,
三类弹窗(提问/计划批准/工具审批)不弹直接返回。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-08 11:38:14 +08:00
aa9bf377a3
feat(runtime): Gateway 收尾——session 传输暴露、host Bearer 通道、flask 依赖拆解、审批链路收口
...
- session.* 传输暴露:新增 gateway_api 蓝图(list/create/history),RuntimeService 补 create_session
- host Bearer 通道:gateway_auth 双通道认证(host 模式+回环限定,token 存 DATA_DIR/host_api_token),tasks/approval 路由接入
- api_v1 会话路由转调公共入口消双轨,会话索引/列表补齐 run_mode/model_key/custom_prompt_name/personalization_name
- flask 包依赖拆解:_flask_bridge 延迟桥接 + context 子包 PEP 562 懒加载,import server.tasks/runtime 不再拉起 flask
- 审批链路:mark_expired 终态回写(超时/软停止/取消三路径)+ 终态 TTL 惰性清理(3600s)
- 测试 patch 点随迁;全量 75 测试失败恰为 4 项存量,独立启动验收 4/4 全绿
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-08 11:37:51 +08:00
0381557fe9
feat(runtime): 客户端事件窗口缺口处理——Web 快照对账 + CLI 窗口对齐
...
- Web stores/task.ts:检测 offset < window_start 发合成事件
event_window_gap(复用 runtime_queue_sync 解耦模式)
- lifecycle.ts 新增 case:fetchAndDisplayHistory({force:true})
会话 JSON 权威重读对账(协议 §5.4)+ toast 提示
- i18n:stores.eventWindowGap / eventWindowGapReload(zh/en)
- CLI api.ts TaskPollResult 补 window_start;App.tsx pollTask
检测后提示用户并对齐窗口续读
- 协议文档 §5.2 标注客户端兑现状态
验证:i18n 栏杆通过;CLI typecheck+build 通过;改动文件
eslint 0 errors;前端 vite build 受沙箱读边界限制未跑
(PostCSS 搜索 /Users/jojo/package.json EPERM,环境问题)
2026-09-08 08:59:01 +08:00
f43b03484d
refactor(runtime): 拆除 session_data 兼容桥,任务上下文三层结构化直传
...
- TaskRecord 去 session_data dict,直存 principal/task_params/directives
+ 可变 goal_progress 字段(__slots__)
- create_chat_task 签名改为收 RuntimeContext 必填,TaskRecord.__init__
同步精简(身份/消息/模式等全部从 ctx 派生)
- _run_chat_task 身份还原/门闸认领/事件注入/terminal 属性设置
全部改为三层属性访问;goal_progress 回写改独立可变字段
- RuntimeService.create_task 原样透传 ctx;to_session_data() 删除
- task_public_payload / api.py 单任务载荷改三层读取
- 契约/注释/i18n 文案同步去 session_data 化;测试重写为三层断言
验证:75 测试全量回归,失败恰为 4 项存量(host_workspace_manager /
skills_manager / token_usage_extractor / conversation_workspace_storage)
2026-09-08 02:08:33 +08:00
f77f1d67a8
refactor(runtime): 审核 F1-F4 收口——发现入口、范围校验、入口统一转调、验收加固
...
- F1: RuntimeService.list_runs 公共 Run 发现(工作区/会话/状态筛选);
task_public_payload 序列化收敛至 models.py 核心层单一实现(Web/公共入口同构,
helpers.py 旧实现删除,无新旧双轨)
- F2: tasks/api.py 7 处、api_v1.py 3 处、chat/approval.py 6 处全部转调
runtime_service;HTTP 轮询透传 window_start 缺口水位;死导入清零
- F3: _resources_for_query 补 principal workspace_id 一致性校验
(跨工作区查询必须重新认证)
- F4: config 新增 ASTRION_IGNORE_DOTENV 逃生门(.env 对 ASTRION_DATA_ROOT 的
优先覆盖是刻意设计,保留);验收测试自包含(假模型 127.0.0.1:9 快失败)+
隔离生效断言;lifecycle 改 api_request_start 装配证据断言;
新增审批等待链验收(approval 档真实工具循环:等待→公共入口批准→继续);
chain 首段改双客户端场景(B 经 list_runs 发现 A 的 Run 并观察/取消)
- execution_plane/base.py 注释修正:命令校验/路径授权仍在旧链路(审核 §4)
- 全量 75 测试:失败恰为 4 项存量,与改造无关
2026-09-08 01:29:43 +08:00
d7cb854f0c
feat(runtime): 审批/提问纳入公共入口,①②③链路收口
...
- RuntimeService 新增 list_pending_approvals(三类分桶)与 resolve_approval
(kind 路由 tool/plan/question,透传 manager 单次裁决/越权/参数校验语义)
- 协议能力 run.*/approval.*/session.* 全部有 RuntimeService 公共方法
- 现状文档记录本轮收口决策:①②③贯通为终点,③↔④全量贯通后置(§7.5-补四件事)
- 全量回归:失败恰为 4 项存量,与改造无关
2026-09-07 23:34:42 +08:00
4378eb6a46
feat(runtime): 会话查询公共入口与就绪度收口(改造第 5 步收窄)
...
- RuntimeService 新增 list_sessions / get_session_history(会话列表/磁盘权威历史),
CLI 等非 Web 调用方不再依赖 Web 路由;principal 与目标用户一致性校验防身份伪造
- chain 验收补会话查询断言(列表含会话/历史含消息/越权抛 PermissionError)
- gateway_current_state.md:§6.1/§7 实施状态速览(第 0-5 步完成度与遗留清单)
- 全量 74 测试失败恰为 4 项存量,与改造无关
2026-09-07 23:07:32 +08:00
27aeed70ca
feat(execution-plane): Execution Contract 与替身执行器(改造第 4 步)
...
- modules/execution_plane:ExecutionBackend 协议(E1-E4 首版接口面)+
FakeExecutionBackend 内存替身(零真实副作用)
- 接入:MainTerminal.execution_backend 属性(默认 None=真实链路),
handle_tool_call 的 run_command 前台/后台、write_file、edit_file 四分支注入
- 替身路径自动跳过浅版本备份(不触真实磁盘)
- 契约文档 docs/execution_contract.md(本地文档目录,不入库):
E1-E10 接口面归纳、权限分工、Host/Docker 后端映射
- 验收:ExecutionPlaneFakeBackendTest 全绿(替身接收 E1-E4 调用、
结果结构同构消费、零磁盘写入、默认路径回归)
2026-09-07 23:00:31 +08:00
d9bd599c1c
feat(runtime): Gateway 独立启动与公共协议落地(改造第 0-3 步)
...
- 闭环修复:审批 task_id 显式化(N2)、通知回退路径门闸 finally 释放(N1)、
personalization 原子写(S10,公共 atomic_write_json)
- server.tasks 拆解:__init__ 轻量化、Blueprint/路由移至 blueprint.py/web.py,
app_legacy 装配点惰性挂载;models.py 循环依赖死导入移除
- 执行链 Web 解耦:emit_event/run_background 安全包装(socketio 未绑定静默),
清除 4 处裸 socketio.emit(含 task_stopped 先写事件流再推送的顺序修复)
- RuntimeService 补建对话下沉:chat 任务无 conversation_id 时服务层装配,
客户端无需复制 Web 两步流程
- 事件协议:get_task_events 返回 meta.window_start 缺口检测水位
- 验收:test_runtime_standalone_lifecycle 子进程隔离(config import 固化问题),
独立启动 + 协议全链路 + 审批语义全绿;全量 74 测试失败恰为 4 项存量
2026-09-07 23:00:15 +08:00
b4deee0f43
fix(sandbox): 修复 macOS 白名单沙箱致 /usr/bin xcselect 垫片全灭
...
8-30 白名单读模型改革后,/usr/bin 下的 python3/git/clang 等 xcselect 垫片
在沙箱内全部报错退出:垫片启动即拉起 xcodebuild 读
/Library/Preferences/com.apple.dt.Xcode.plist 校验 license(被白名单拒绝),
且经 mach 服务 com.apple.bsd.dirhelper 解析 DARWIN_USER_TEMP_DIR
(profile 无 mach-lookup 放行,confstr 失败回退 /tmp)。
- MACOS_MINIMAL_READABLE_PATHS 增加 /Library/Preferences
- 新增 MACOS_BASE_MACH_RULES 放行 dirhelper,只读/可写 profile 共用注入
- 可写 profile 额外放行 $TMPDIR 父目录,容纳垫片 xcrun_db 缓存写入
(只读 profile 不放行,缓存写失败仅噪音、非致命)
AGENTS.md §10.8 同步补充垫片兼容说明
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-07 19:17:12 +08:00
c80bc4fbb4
feat(api): 支持 x-opencode-session 会话头与 Astrion User-Agent
...
- OpenCode Go/Zen 自 2026-09-05 起要求每个对话携带稳定的 x-opencode-session 头,用于会话亲和路由与 prompt 缓存优化
- 个人空间「模型与思考」新增「外部会话标识」开关(默认关闭,opt-in)
- 开启后按对话惰性生成随机 ID(uuid4 hex)并持久化到对话 metadata,深压缩后重置
- 覆盖主对话/传统与多智能体子智能体/三个审核智能体(一次性 ID)/标题生成(复用主对话 ID)
- 仅对 opencode.ai 域名下发,不向其他 provider 泄露对话标识
- 所有对外模型请求统一携带 User-Agent: Astrion/1.0(新增 config/version.py)
2026-09-07 18:50:29 +08:00
9a17b38153
fix(context): 补拆包遗漏的 get_current_user_role 导入,修复 host 策略静默失效
...
拆包时 resources.py 独立 import 头漏了 get_current_user_role:host 模式 + 非显式身份 + 存在 host 用户记录时触发 NameError,被 except 吞掉后工具分类限制与禁用模型等管理员策略静默不应用(默认无 host 记录不触发)。
- resources.py/usage.py 顺带补 TYPE_CHECKING 导入净化字符串类型注解,server/context/ 与 server/runtime/ pyflakes F821 清零
- 新增回归测试:host 模式 + HTTP 请求上下文 + host 记录存在,断言策略真正应用到 terminal;红绿验证通过(回退导入测试即红)
测试:25/25 全绿(24 + 新增 1)
2026-09-07 17:40:49 +08:00
652c160640
feat(runtime): 抽出 RuntimeService 公共任务入口,任务线程拆除 Flask 隐式上下文
...
Gateway 化阶段一/二实施(公共任务入口),计划与验收记录见 cache_research/gateway/phase12_implementation_plan.md;契约文档 docs/runtime_contract.md 为本地文档按仓库惯例不入库
- 新增 server/runtime/:RuntimeContext 三层模型(TrustedPrincipal/TaskParams/InternalDirectives)+ RuntimeService(create_task/cancel/guidance/queue/get_task_events)
- create_chat_task 强制显式 session_data(缺失 ValueError,i18n key tasks.missing_session_data);6 处调用点迁移至 runtime_service.create_task()(tasks/api、api_v1、workflow_runtime_api x2、chat_flow_task_main x2),门闸 token 移交与 notice 互斥豁免语义保留
- _run_chat_task 拆除 test_request_context 桥,任务线程全程 RuntimeIdentity 驱动
- 审批超时经 terminal._approval_timeout_seconds 透传至工具循环 4 个 _wait_* 调用点(默认 3600s 语义不变)
- 附带:config/_load_dotenv 容忍沙箱禁读 .env;AGENTS.md 同步结构
测试:改造相关 24/24 全绿(冒烟 6 + runtime_service 10 + model_persistence 4 + identity 路由 4);真实环境验证已由用户人工完成
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
Co-authored-by: Codex powered by ChatGPT-6-Astra <codex@example.com>
2026-09-07 16:16:12 +08:00
7d290d1790
refactor(context): server/context.py 拆分为子包,get_user_resources 参数化
...
- 989 行单文件拆为 server/context/ 9 模块(identity/broadcast/personalization/usage/upload/conversation/resources/decorators/reaper)+ __init__.py 兼容 re-export,外部 import 路径不变
- 新增 RuntimeIdentity 显式身份快照(identity.py),get_user_resources 支持参数化身份驱动,为任务线程拆除 Flask 隐式上下文做准备
- 测试 patch 目标随迁至 server.context.personalization;新增 test_runtime_identity_resources 覆盖 web/host/api 身份路由矩阵
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
Co-authored-by: Codex powered by ChatGPT-6-Astra <codex@example.com>
2026-09-07 16:14:53 +08:00
6e043389b9
docs(research): Gateway 化改造工作计划与范围复杂度评估
...
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
Co-authored-by: Codex powered by ChatGPT-6-Astra <codex@example.com>
2026-09-07 12:27:59 +08:00
b9ea6584dd
fix(approval): 审批 transcript 调试落盘默认关闭,防敏感信息泄漏
2026-09-07 12:27:58 +08:00
aa71204ece
docs: README 同步默认权限模式为批准的说明
2026-09-07 12:27:58 +08:00
e4f8f91ff9
docs: 沙箱平台口径更新——macOS/Windows 已实测,Linux 未测试未适配暂不可用
...
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-04 10:57:04 +08:00
1e3e6e2f6c
chore: 官网内容移出本仓库(website-design/、website-content/ 停止追踪)
...
官网已独立为 astrion-website 仓库(git.cyjai.com/JOJO/astrion-website),
线上 https://astrion.cyjai.com。本仓库不再维护官网内容 。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-04 08:50:07 +08:00
fe7896e29f
feat(settings): 默认权限模式改为批准、消息流默认极简模式
...
- personalization_manager:default_permission_mode 默认与 sanitize 兜底 → approval;block_display_mode → minimal
- stores/personalization.ts:同步默认值、缓存加载兜底与一次性迁移条件
- 快速模式描述「低思考」→「无思考」(中英 appCore 同步)
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-04 03:02:31 +08:00
a1c9ac565b
fix(config): 补导出 MAX_MESSAGE_CHARS,修复创建任务 ImportError
...
1a4e5baa 新增该常量及两处 from config import 引用,但漏加入
config/limits.py 的 __all__,而 config/__init__.py 以 import * 聚合,
导致 /api/tasks 与 api_v1 发消息时惰性 import 必炸。
2026-09-02 23:58:19 +08:00
08f7adb0fd
fix(containers): 配额只统计 docker 句柄,修复 host 模式工作区列表 503
...
- ensure_container 的全局/每用户配额闸门仅在创建 docker 句柄时执行,
host 句柄(会话标识,不占容器池)不再计入任何配额,修复 host 模式
下第 4 个工作区起 GET /api/conversations 返回 503 的问题
- _has_capacity / has_capacity 全局上限计数同步只统计 docker 句柄
- MAX_ACTIVE_CONTAINERS_PER_USER 默认值 3 -> 8
- admin 面板 available_slots 展示对齐为 docker 句柄计数
2026-09-02 23:39:42 +08:00
0522414a6c
fix(security): 第二轮全量 API 审计修复(角色穿越/宿主 GUI/限流收口)
...
背景:对全部 206 个 HTTP 路由 + SocketIO 事件逐个排查(主审 + 2 个子
智能体初筛后复核),另按用户要求专项审计前端渲染面(无新发现)。
完整报告见 _experiments/security_audit_2026-09-02/REPORT.md 第八章。
新漏洞修复:
- 多智能体角色 role_id 路径穿越(高):save_custom_role 直接拼接
"{role_id}.md",POST body 的 role_id 无任何校验,可 ../ 穿越覆盖
其他用户角色文件(跨用户提示词注入),本地已复现写入成功。
修复:新增 validate_role_id 白名单(^[a-z0-9][a-z0-9_-]{0,63}$),
role_store 存储层 + multi_agent API 层(POST/PUT/DELETE)双保险
- open-in-file-manager 漏 _is_host_mode_request 检查(同文件其余三个
端点都有):docker 模式下任意登录用户可触发宿主 GUI 弹窗+探测路径。
修复:补 host 检查,docker 下 403
- /api/admin/secondary/verify 无限流且 CSRF 豁免:admin 会话前提下
可在线爆破二级密码(纵深防御缺失)。修复:5 次/300s 用户维度限流
- WS client_chunk_log / client_stream_debug_log 无连接认证检查且
无限流(日志写盘放大面)。修复:必须已认证连接 + 30 次/60s 滑窗
+ 桶表万级上限回收
- _get_conversation_file_path 直接拼 "{id}.json"(conv_ 前缀恰好阻碍
直接穿越,属防御深度缺失)。修复:^conv_[A-Za-z0-9_-]+$ 白名单,
已核验全部 5 个调用点与 temp_ 前缀排除路径不受影响
- /api/conversations/media/<id> 采信 entry mime_type 并 inline 返回。
修复:text/html、image/svg+xml、xhtml 强制 octet-stream + attachment
(与 file/content 的 SVG 策略对齐,防存储型 XSS 一致性收口)
- /api/status 每次心跳返回宿主绝对 project_path(泄露系统用户名与
目录布局)。修复:docker 模式脱敏为容器视角 /workspace,host 不变
LLM 成本攻击止血(第一轮发现 5 的端点级落地):
- POST /api/tasks(GUI 发消息主入口):30 次/60s/user
- POST /api/conversations/<id>/compress(调 api_client.chat 做摘要):
5 次/300s/user
- 注:对话回顾 review 端点实为纯本地 Markdown 生成(不调 LLM),
其「发送给模型」模式走 /api/tasks,已被上述限流覆盖;
按 token 计费的完整配额方案仍遗留待产品决策
验证:全部 py_compile 通过;冒烟测试 6/6;validate_role_id 8 个恶意
样本全拒 + 3 个合法样本放行 + 穿越写入拦截回归通过;conv_id 白名单
4 组样本符合预期。端点级行为待服务重启后实测。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-02 19:37:34 +08:00
bc46250ef4
feat(admin): admin 独立入口安装 i18n
...
apiMain / customToolsMain / customToolsGuideMain / main / policyMain
五个 admin 独立入口统一 installI18n,使管理后台页面接入前端多语言体系。
(存量改动随安全修复一同入库,与安全审计无关)
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-02 18:31:10 +08:00
1a4e5baa23
fix(security): Docker 多用户模式全面安全加固(安全审计修复)
...
威胁模型:拥有普通账号的已登录用户攻击服务器。完整审计报告见
_experiments/security_audit_2026-09-02/(不入库),含实测复现记录。
严重/高危修复:
- 彻底移除文件夹打包下载(/api/download/folder 端点删除,gui/api_v1
目录下载分支改 410):文件型符号链接会被宿主进程解析,实测可读宿主
任意文件(含 settings.json 全部 LLM 密钥),删除比补校验更彻底
- XFF 伪造防护:get_client_ip 仅信任 ASTRION_TRUSTED_PROXIES
(默认空=不信 XFF);登录新增账号维度锁定(5 次失败锁 300s);
注册邀请码加爆破锁定;限流桶/失败表加 2 万键上限+GC 回收
- auth_debug.log 接入大小轮转;/api/client_debug_log 加限流+长度截断
- /host-login 增加 LINUX_SAFETY 检查且仅回环地址可用
容器加固:
- 默认 cpus=1 / memory=1g,新增 pids-limit=512、memory-swap、
no-new-privileges
- 新增每用户容器配额 MAX_ACTIVE_CONTAINERS_PER_USER(默认 3),
防止单用户占满全局容器池
api_v1:
- prompts/personalizations 的 name 加白名单校验(^[A-Za-z0-9_-]{1,64}$),
修复路径穿越写入;对话元数据中的引用名同步加白名单
- workspaces/conversations/messages/upload 四端点加用户维度限流
- 消息体加 MAX_MESSAGE_CHARS 上限(默认 200000,/api/tasks 同步)
- _path_within 加分隔符边界(修复 startswith 前缀碰撞)
其他:
- SVG 预览强制 application/octet-stream(修存储型 XSS 漏网)
- monitor_snapshot 缓存键加 username 维度(修跨用户快照读取)
- ensure/delete_workspace 加 workspace_id 白名单+父目录二次核验
- delete_folder 拒绝删除工作区根(crud_mixin 与容器代理同步修)
- GuiFileManager 死代码加名称校验防复活
- admin_dashboard 静态壳非 admin 访问一律 404
- /api/app/apk/latest 加登录校验+限流(原未认证可拉 133MB)
有意未修(见报告 7.3 遗留清单):容器 egress 过滤(部署层)、
--cap-drop ALL(怕破坏容器内工作流,已先上 no-new-privileges)、
API 用户/子智能体 LLM 按 token 计费(待产品决策)、str(exc) 收口、
WebSocket 限流、network_permission=restricted 容器语义。
验证:全部文件 py_compile 通过;冒烟测试 6/6 通过;关键新逻辑
(名称校验/路径边界/容器代理删除防护/限流回收)已单测级验证;
端点级行为待服务重启后实测复核(清单见报告 7.5)。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-02 18:31:00 +08:00
93628f49fc
chore(website): 归档官网文档内容与设计素材
...
- website-content/:官网 10 篇文档内容 + README
- website-design/:官网设计稿、动画实验、预览图与资源
- 根目录官网截图两张
- .gitignore 忽略 website-design/exp/static/dist 构建产物(7.1MB)
2026-09-02 14:38:51 +08:00
97b066d1cc
docs: 添加大模型应用开发学习笔记
2026-09-02 14:37:40 +08:00
f26e633611
fix(overlay): 路径授权弹窗标题补主题色,避免深色模式下不可见
2026-09-02 14:37:40 +08:00
e2ba0bdda0
feat(chat): 引用弹层多来源改为分页卡片,头部点击可打开文件
...
- 多引用不再显示列表,统一为单卡片渲染(标题/URL/摘要/图片/底部操作)
- 顶部右侧左右箭头+页码切换(箭头沿用个人空间展开菜单 chevron 画法)
- 打开弹层即并发预取全部文件条目摘要,切换不闪烁(in-flight 去重)
- 多引用头部点击可在侧边栏打开当前文件
2026-09-02 14:35:39 +08:00
4496726009
fix(chat): citation 图标改为字母兜底+多源竞速,修复国内网络空白
...
favicon 源原仅 google s2,国内被墙时请求挂起、onerror 兜底不触发,
图标长期空白。改为:
- 立即渲染域名首字母兜底,任何网络环境不留空白
- google / yandex / icon.horse 三源 2s 窗口并行探测,按可信度决策:
icon.horse 对无图标站返回 200+灰色字母占位图(不可信),仅在
可信源(google 404 / yandex 1x1 可识别)佐证成功时才采纳其高清图;
无可信源成功则保持字母
- 域名级缓存,同一域名全局只探测一次
- 移除内联 onerror 字符串拼接,顺带删除 popover 死代码 escapeText
2026-09-02 10:53:03 +08:00
9220f3a3e7
fix(personalization): 修复手机版下拉菜单不可见(transform 导致 fixed 包含块偏移)
...
手机端(≤760px)进入个人空间子页后,.settings-redesign-layout 的
transform: translateX(-50%) 使其成为 position:fixed 浮动菜单的包含块,
JS 按视口坐标定位的菜单被整体左移出屏幕。改为 position:relative;
left:-100% 实现等价平移,不创建 fixed 包含块,菜单恢复视口定位。
Co-authored-by: Astrion powered by DeepSeek-V4-flash <astrion-agent@users.noreply.github.com>
2026-09-02 08:55:48 +08:00
84c40e505e
feat(android): 恢复 app 源码追踪——域名构建期注入脱敏 + 应用更名 Astrion
...
- HOME_URL 改为构建期注入(BuildConfig):-P 参数 > local.properties > 环境变量 > 占位符
- network_security_config.xml 删除冗余 domain-config(base-config 已全局禁明文)
- README 重写:移除真实域名,补充注入方式说明
- app_name 更名为 Astrion;链接外跳系统浏览器(1.0.42)+ 1.0.43 版本
- AGENTS.md §8 补充版本检测链路说明;.gitignore 解除 android-webview-app 排除
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-02 07:48:36 +08:00
92e4931408
fix(server): 修正宿主机免登录模式文件服务路由的工作区解析
...
/user_upload/ 与 /workspace/ 路由此前误用 user_manager 的
users/<user>/projects/<id> 结构,宿主机免登录模式下解析到空工作区,
导致已上传文件 404(show_image 引用上传目录图片加载失败)。
改为与 get_user_resources 同源的 host_workspaces.json 解析。
Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
2026-09-02 01:08:31 +08:00