Autumn-27
|
12541a6dec
|
feat(llm): 支持 OpenAI Responses API 格式的 LLM 配置
依赖升级到 norma v0.3.1(新增 FormatOpenAIResponses + reasoning_content 回传
修复)。每个 LLM profile 现在可选第三种格式 openai-responses,打
POST /v1/responses,与 Chat Completions / Anthropic 并列。
- agent.Config:ConfigFrom / FromEnv / Provider() 支持 openai-responses
(BaseURL 归一化去 /responses 尾巴,默认 model gpt-5)
- server:saveLLMConfig 放开二元 format 归一;模型列表端点复用 OpenAI
/models(Responses 模型列表仍在 /v1/models)
- db: llm_profiles 的 format CHECK 约束加入 openai-responses,并幂等迁移
(DROP + ADD CONSTRAINT)补旧库
- web: 格式下拉新增「OpenAI (Responses API)」,类型与回显同步
流式/非流式两条路都走新 adapter;输出、token 统计、操作统计、LLM 录制
四条链路复用中性层,无需改动。
|
2026-08-25 11:39:24 -04:00 |
|
Autumn-27
|
587ba422b4
|
feat(llm): 每个 LLM 配置支持流式/非流式切换(默认流式)
依赖 norma v0.3.0 的 Provider.Complete。为每个 llm_profile 增加 streaming
开关:开(默认)走流式 SSE;关走真·非流式(stream:false、一次性返回完整
JSON),可绕开部分网关糟糕的 SSE 实现(空帧、思考字段丢帧),代价是失去
运行中的实时进度与实时 token 计数。
- agent.Config.Stream → agentcore.Options.NonStreaming = !Stream;worker /
planner / mainagent / chat / goals 经 SetNonStreaming resolver 注入,任务
路由按当前激活 profile 动态取值
- llmpool.Pool / llmrec.Recorder / taskLLMRuntime 三个 Provider 包装均实现
Complete(分别带故障转移 / 录制 / 同 provider 重试与额度 failover),使
输出、token 统计、操作统计、LLM 录制四条链路在非流式下保持兼容
- db: llm_profiles 新增 streaming 列 + ALTER 补旧库(默认 true,旧配置无感)
- 系统 → LLM 配置表单增加「流式输出」开关
|
2026-08-25 10:49:47 -04:00 |
|
Autumn-27
|
19a7206d12
|
feat(llmrec): 录制 LLM 请求/响应 HTTP 原文
归一化视图(request_body/response_body)会丢弃工具 schema、tool_use 块,
且看不到原始 SSE 帧,排查 provider 侧问题时信息不足。新增在 HTTP transport
层捕获真实 wire body 的能力:
- llmrec: 新增 Capture,Recorder 挂到 ctx,quotaAwareTransport 填充。
请求取 GetBody 副本(不消费原 body),响应用 tee 保持流式;norma 内部重试
的多次尝试逐次保留(旧代码会读掉丢弃),单次时为字节级原文。
- db: llm_records 增加 raw_request/raw_response 两列,含旧库 ALTER 迁移。
- web: 录制页详情面板增加「原文」视图切换,及请求/响应内容复制按钮
(兼容非安全上下文的 execCommand 回退)。
- 测试: 单元(capture)、端到端(逐字节比对捕获=服务器实际收到)、
迁移(真实 PG 事务回滚)、全链路(Recorder→provider→PG 落库)。
|
2026-08-25 09:40:05 -04:00 |
|
Autumn-27
|
4d9580ebfa
|
feat(ops): 新增管理员密码重置脚本 reset-password.sh
登录用户名固定 ARTEX,密码以 bcrypt 存于 settings 表 auth.password_hash。
脚本连库后用 pgcrypto 在库内生成 bcrypt(gen_salt('bf',10)),与后端
golang.org/x/crypto/bcrypt 校验兼容,写回该键,重置后无需重启。
- 两种部署:local(宿主机 psql)与 docker(compose/exec 在 postgres 容器内跑,
因 compose 默认不暴露 5432)。
- 连接信息优先级:命令行 > --dsn/$ARTEX_PG_DSN > config.json 的 database.*
(python3 解析,缺则 grep 后备)。
- 安全:新密码经环境变量 + psql \getenv 传入,不进 argv;SQL 用 :'newpw'
自动转义防注入;DB 密码走 PGPASSWORD;docker 用 -e 名字继承、不带值。
验证: 临时库实测三条路径(显式 dsn / config.json / 含 ';DROP TABLE' 特殊
字符密码),写回的 hash 均能被 Go bcrypt 接受、错误密码被拒、注入未生效;
bash -n 通过。全程未触碰真实 artex 库。
|
2026-08-25 08:47:34 -04:00 |
|
Autumn
|
49f6c23b21
|
Merge pull request #57 from neouks/main
feat: 增强任务管理、会话操作与流量查看体验
|
2026-08-25 20:45:50 +08:00 |
|
pphua
|
3675bd815c
|
修改缩紧
|
2026-08-25 16:48:20 +08:00 |
|
pphua
|
86eb67ea0a
|
1、将排序做到border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted里,无需单独做个button 2、指定重命名使用ICO,无需使用菜单
|
2026-08-25 14:56:15 +08:00 |
|
pphua
|
48e85b33d6
|
Merge tag 'v0.3.4'
|
2026-08-25 12:18:24 +08:00 |
|
pphua
|
d968727460
|
抽屉优化
|
2026-08-25 12:05:26 +08:00 |
|
Autumn-27
|
6e40f41051
|
docs(changelog): 发布 0.3.4
|
2026-08-24 12:41:47 -04:00 |
|
pphua
|
7234874797
|
取消mock
|
2026-08-25 00:36:02 +08:00 |
|
pphua
|
5301a4fe04
|
test(mock): add worker domain and IP asset fixtures
|
2026-08-25 00:33:36 +08:00 |
|
pphua
|
6dd4d70f08
|
fix(ui): handle empty worker asset labels
|
2026-08-25 00:29:12 +08:00 |
|
pphua
|
08ff46525e
|
fix(ui): limit worker asset badge to domains and IPs
|
2026-08-25 00:28:21 +08:00 |
|
Autumn
|
54af3a54b9
|
Merge pull request #54 from Autumn-27/feat/goalless-intent-execution
feat(tasks): 目标完成后支持主 agent 直投意图执行(goalless)
|
2026-08-25 00:22:28 +08:00 |
|
Autumn-27
|
01018a2161
|
feat(tasks): 目标完成后支持主 agent 直投意图执行(goalless)
所有目标达成后,主 agent 经 add_intent 下发的意图可被 worker 直接执行、跑完
即止;planner 在任务无 open 目标时不再运行,避免其重判目标达成而 cancelExec
杀掉直投意图;frontier 抽干后任务回到 done。
- db: 新增 HasOpenGoal 谓词(零迁移,读现有 goal 状态)
- engine: plannerLoop 加 goalless 门(无 open 目标则不进 planner,抽干则收尾)
- tools: add_intent 成功后调 resumeTask 复活任务(仅主 agent 生效,planner 为 nil)
- mainagent: 提示加入「目标达成后反问是否登记为正式目标」引导
- orchestration: reseedMainAgentPrompt 让旧库收到新提示(一次性,同构 reseedGoalsPrompt)
已知边角问题(paused/exhausted 意图的收官判据、零 goal 窗口、TOCTOU 等)
待后续讨论后再修。
|
2026-08-24 11:58:02 -04:00 |
|
Autumn-27
|
43edb86720
|
revert(tasks): 从 main 移除误并入 4cf36c7 的 goalless 直投意图改动
这几处 goalless(目标完成后主 agent 直投意图执行)改动被打包进了「任务列表
按 id 降序」提交(4cf36c7),与该提交主题无关,且尚在评审阶段不应留在 main。
此处仅做正向移除,不改写历史;功能改由独立分支 feat/goalless-intent-execution
承载,评审通过后再合入。
|
2026-08-24 11:57:28 -04:00 |
|
Autumn-27
|
7299150cfa
|
fix(chat): 会话已选 LLM 时不再被「全局未激活」误拦,提示按状态细分
发送消息的前置检查只看全局激活配置(chatAgentRef),而真正执行的
runConversationSync 会优先用会话所选/Agent 绑定的配置——两处解析分叉,导致
「会话已选一个有效配置、但全局没有激活配置」时,消息在预检查阶段就被 503
「LLM 未配置」拦下,根本走不到能用所选配置的执行阶段。
- 抽出 resolveChatAgent(conversation) 作为唯一解析入口(会话/Agent 绑定优先、
全局兜底),send 预检查与后台执行都用它,消除分叉。
- 提示按实际状态细分(chatUnavailableReason):无任何配置→提示添加;有配置但
未激活→提示激活或为本会话指定一个;而非一律「未配置」。
相邻的 StartTriggeredRun 仍用全局 gate(触发器场景,本次不动)。
验证: 新增两个测试——三态提示区分、会话所选配置在全局无激活时仍能解析出
ChatAgent(回归防护);连本地 PG 实跑通过,server 全量无回归。
|
2026-08-24 11:55:50 -04:00 |
|
Autumn-27
|
412a993c25
|
feat(agent): get_worker_trace 的 step_ids 超限改为降级返回而非报错
原先 step_ids 超过 5 个直接报错,逼 Agent 重新组织调用、白跑一轮。改为优雅
降级:先去重、剔除非法 id,超出 5 个则返回前 5 步的完整内容,并在结果里用
returned_step_ids / omitted_step_ids / notice 告知本次取了哪些、还有哪些没取,
并提示「若已足够则无需再取剩余」。Agent 立刻拿到数据,是否再取由它自行判断。
保留数量上限的原因不变:detail 是完整原文、不截断,上限用于兜住单个 tool
result 的大小。get_task_worker_trace 经 delegateToTask 复用同一实现,一并生效;
两处工具描述同步更新。
验证: 新增 TestGetWorkerTraceStepIDsDegradeGracefully(含去重/非法 id/前5/
omitted/notice/在限内不加提示),连本地 PG 实跑通过;agent 全量无回归。
|
2026-08-24 11:35:49 -04:00 |
|
Autumn-27
|
6a8e13fcbd
|
feat(tasks): 新建任务的分类选择器改为可搜索、可即时新建
原先是普通下拉,只能从已有分类里选。改成可搜索的输入框(复用 base-ui
Combobox):输入即过滤已有分类,库里没有的名称回车(或点下拉里的「创建」)会
即时调 createTaskCategory 新建并选中,选中项以可移除的 tag 展示。仍限单个
分类——multiple 仅用于 chip 视觉,onValueChange 只保留最新选中的一个。
- 新建的分类要等父层重新拉取才回流到 categories,组件内先本地留一份
(localExtra),避免选中 chip 和下拉在这段窗口显示成「未知分类」。
- 回车创建仅在完全无匹配时触发,有匹配项时保留 base-ui 的「回车选中高亮项」;
精确同名已存在则直接选中不重复创建。
- 新建成功通过 onCategoriesChanged 通知父层刷新,分类在筛选器等处随即可见。
- 任务列表筛选和批量改分类仍用下拉(选已有分类,无需创建),保持不变。
验证: tsc / biome / next build 均通过。
|
2026-08-24 11:24:17 -04:00 |
|
Autumn-27
|
4cf36c7896
|
fix(tasks): 任务列表改按 id 降序,消除同刻创建任务的抖动
原先按 created_at 降序排,但没有二级排序键。同一时刻创建的多个任务时间戳
相同,排序不稳定;叠加前端每 10 秒轮询、以及 Manager 用内存 map 存任务
(遍历顺序随机、每次 List 都要重排),这些任务就会在列表里频繁互换位置。
改用 id 降序:id 由 BIGSERIAL 单调递增分配,即插入顺序,唯一且稳定,最新
创建的在最前。db.ListTasks 的 ORDER BY 与 Manager.List 的内存排序同步改。
验证: 新增 TestListTasksOrderByIDDesc 连本地 PG 实跑通过;db/server 全量
无新增失败(仅剩既有的 TestCompanyScopeInvalid)。
|
2026-08-24 11:08:10 -04:00 |
|
Autumn-27
|
dfbbb33069
|
fix(assets): ip 字段拒收主机名,并告诉调用方该怎么改
上一次修复让非法 ip 不再打挂企业归属重算,但脏数据仍在持续产生。这次从源头
拦住:assets.ip 会被转成 inet 参与网段归属,存主机名的资产对所有 IP/CIDR
范围规则都是隐形的。
- db 层新增 ValidateAssetIP + ErrAssetIPInvalid,在 UpsertIP /
UpsertHTTPService / UpsertOtherService / UpsertEndpoint 四个入口校验。
放在 db 层是因为 Agent 工具和资产 API 都经由它们,不必写两遍;内部调用方
(enrich 的解析结果、task_assets 的 ParseCIDR 输出、RecordValue 已 ParseIP
过滤的分支)传的本就是合法地址,不受影响。
- 错误信息给的是改法而不只是「非法」:带上收到的原值,并指出主机名应改用
type=subdomain 填 domain,或先解析 A/AAAA 记录再填 ip。insert_assets 的
错误是逐条返回的({index, error}),同批其余资产照常入库,Agent 拿到后能
定位到具体那条并在下一轮自行修正。
- 同步收紧 insert_assets 的工具描述与 ip 字段说明,在提示层先挡一道。
- 空 ip 仍然合法:service / endpoint 的 ip 是可选字段。
验证: 新增 db 层四类型拒收测试与 agent 层「一批混入一条非法、其余照常入库」
测试,均连 PG 实跑通过;干净库 go test -p 1 ./... 无新增失败(仅剩既有的
TestCompanyScopeInvalid)。
|
2026-08-24 10:32:10 -04:00 |
|
Autumn-27
|
9e98407528
|
fix(assets): 企业归属重算不再被单行非法 ip 打挂,并明确告知是哪些资产
assets.ip 是自由文本(Agent 的 insert_assets 和资产 API 都可能写进主机名),
而 db/companies.go 的 IP/CIDR 归属匹配裸转 a.ip::inet。只要表里有一行不是
合法 IP,PostgreSQL 就抛 22P02 中断整条语句,连带同事务的新增/修改企业资产
范围、删除企业全部失败回滚。这个裸转从项目初始化提交就存在。
- schema.sql 新增 try_inet(text):非法值返回 NULL 而不是抛错。没用
pg_input_is_valid 是因为那要 PG16+,这里要兼容更老的存量库。
- 四处 IP/CIDR 匹配统一改用 try_inet。原先 task_scope.go 和
task_assets_context.go 用的正则 a.ip !~ '[^0-9a-fA-F:.]' 只检查字符集,
abc.def 这类全 hex 字母的主机名照样漏过去后炸,一并换掉。
- 跳过不能是静默的:重算会统计并抽样列出这些资产(id + 取值),说明它们不会
被网段规则归属。信息通过企业范围接口新增的 warnings 字段返回并在前端以
长停留 toast 展示,同时无条件写入服务端日志,覆盖没有前端响应的路径
(删除企业、scopesentry 同步、Agent 写入)。
- warnings 与 errors 分开:errors 仍只表示本次提交里不合法的行,既有数据
问题不该被记到用户这次输入头上。
验证: 干净库上 go test -p 1 ./... 仅剩 1 个既有失败(TestCompanyScopeInvalid,
与本改动无关,stash 后同样失败);改动前在含真实数据的库上有 14 个失败,现已
全部通过。go build / vet / gofmt / tsc / biome 均通过。
|
2026-08-24 10:16:17 -04:00 |
|
Autumn-27
|
fea78b2d6f
|
feat(tasks): 任务列表支持批量修改分类
勾选多个任务后可一次性移动到目标分类,或选「未分类」把它们移出当前分类。
- db: 新增 SetTasksCategory,在单个事务里校验分类存在性并 UPDATE ... WHERE
id=ANY(...),返回真正被更新的 id 和刷新后的分类(含 task_count)。分类检查
放在事务内,避免并发删除把 UPDATE 变成外键冲突。单批上限 100。
- server: 新增 POST /api/tasks/category/batch。写入原子,响应里的逐任务失败
只可能是勾选后又被删掉的任务;顺带把 category_id 的解析(必填但可为 null)
抽成 parseCategoryIDField 与单任务接口共用。
- server: 把批量 id 的 trim/归一/去重逻辑从 controlTasksBatch 抽成
normalizeBatchTaskIDs,两个批量端点共用同一套重复判定。
- manager: SetTasksCategory 在 taskStateMu 内完成 DB 写入与运行中任务 DTO
刷新,防止与单任务更新交错后留下过期的 category_name。
- web: 选中工具栏新增「修改分类」对话框(需确认目标,避免误点批量改动);
「未分类」哨兵值统一提取为 UNCATEGORIZED_VALUE。
验证: go build / vet / gofmt、db 与 server 新增测试连本地 PG 实跑通过、
tsc --noEmit、biome check、next build 均通过。
|
2026-08-24 09:16:44 -04:00 |
|
Autumn-27
|
3eca390089
|
style(db): 对齐 ICP 范围匹配 SQL 缩进,并注明手工挂载资产的语句顺序依赖
#53 引入 icp 范围匹配时,三处覆盖度 CTE 里新增的 OR 分支混进了 tab 缩进,
与同一 JOIN 条件内其它分支(纯空格)不一致。统一改回空格,SQL 语义未变
(git diff -w 无差异)。
AttachAssetsToTask 里 UPDATE assets 会先触发 trg_assets_task_links 写入
source='system',随后的显式 INSERT 才把来源改成 'manual'。加注释说明这层
顺序依赖,避免后续调换两条语句导致人工挂载的来源静默退化成 system。
|
2026-08-24 08:55:55 -04:00 |
|
Autumn-27
|
6b44a94ec7
|
Merge pull request #53 from neouks/main
feat: 同步 0.3.3 并增强任务、资产与 LLM 运行时
冲突解决说明:
main 此前已合入同源分支(#42/#31)的大部分内容,与本 PR 形成大量重复历史,
git 报出 18 个文件 104 处冲突。逐块核对后确认 PR 树已完整包含 main 的全部
内容(net diff 无任何纯删除,adc8e35/476a445/9fad543/9d8e0ba 等 main 侧修复
均已在内),故统一取 PR 侧。
另修正 db/assets.go 的静默错误自动合并: git 未报冲突但把 CountByTask /
CountsByTypeForTask / DeleteByTaskID 等 166 行重复插入两遍,会导致方法重复
定义编译失败。
相对 main 的净新增功能:
- 任务分类: task_categories 表 + tasks.category_id,分类增删改查与筛选,
改名时同步刷新运行中任务的 DTO
- 任务测试资产: task_asset_links 表记录关联来源(agent/manual/api/task/
anchor/system/legacy),支持实时挂载与移出;移出仅解绑,保留全局资产
- 测试范围新增 icp / keyword 两种 kind,ICP 按去空格小写匹配 icp/app_icp
- Worker 会话标题旁展示当前测试资产及来源摘要,继承任务仅暴露终态意图
- 前端抽出公共 ScopeTextEditor,补齐上述接口的 mock 契约
验证: go build / go vet / go test / tsc --noEmit 均通过。
|
2026-08-24 08:36:34 -04:00 |
|
pphua
|
43cd6b072c
|
docs: align changelog with implemented features
|
2026-08-24 19:59:55 +08:00 |
|
pphua
|
ec971c63d2
|
feat(api): integrate task workflows and mock contracts
|
2026-08-24 19:31:16 +08:00 |
|
pphua
|
ef57f3f196
|
fix(ui): harden pagination and selection controls
|
2026-08-24 19:31:09 +08:00 |
|
pphua
|
32d872ed9c
|
fix(ui): normalize displayed version label
|
2026-08-24 19:30:55 +08:00 |
|
pphua
|
5863c12886
|
feat(tasks): enhance detail sessions and runtime status
|
2026-08-24 19:30:44 +08:00 |
|
pphua
|
af3149901e
|
feat(ui): add traffic and tool detail drawers
|
2026-08-24 19:30:35 +08:00 |
|
pphua
|
fd2ddbc9d7
|
feat(skills): track usage and missing dependencies
|
2026-08-24 19:30:14 +08:00 |
|
pphua
|
8dca38c4b9
|
feat(metrics): add persistent LLM usage analytics
|
2026-08-24 19:30:07 +08:00 |
|
pphua
|
04fda4cd01
|
feat(tasks): add categories templates and batch controls
|
2026-08-24 19:29:46 +08:00 |
|
pphua
|
3bedbdc669
|
feat(chat): add conversation pinning and rename controls
|
2026-08-24 19:29:38 +08:00 |
|
pphua
|
27dc6d8bad
|
feat(findings): group findings and add deepen workflows
|
2026-08-24 19:29:24 +08:00 |
|
pphua
|
31dc9e7446
|
feat(assets): add editable company and task scopes
|
2026-08-24 19:29:14 +08:00 |
|
pphua
|
4392b4fee1
|
feat(tasks): add runtime controls and inherited context
|
2026-08-24 19:29:00 +08:00 |
|
pphua
|
18926c129f
|
feat(llm): add profile failover and pool health
|
2026-08-24 19:28:18 +08:00 |
|
pphua
|
d4b21f0bdb
|
build: improve release packaging and updater
|
2026-08-24 19:27:39 +08:00 |
|
pphua
|
58f23a2773
|
同步
|
2026-08-24 14:14:15 +08:00 |
|
Autumn-27
|
9ab9fe2327
|
docs(changelog): 定版 0.3.3(补齐 v0.3.2 之后的新增/修改/修复)
|
2026-08-23 13:32:44 -04:00 |
|
Autumn
|
734c7b21cf
|
Merge pull request #49 from Autumn-27/fix/prompt-var-duplicate-now
fix(prompt-vars): 消除变量目录与全局变量撞名导致的前端 key 重复
|
2026-08-24 01:16:29 +08:00 |
|
Autumn-27
|
9fad543168
|
fix(prompt-vars): 消除变量目录里与全局变量撞名导致的前端 key 重复
goals 内置 agent 的变量目录里定义了 Now,seed 进 agent_prompt_vars 后,
withGlobalVars 又追加了同名的全局 runtime 变量,getAgent 返回两条 Now →
前端 variables.map 的 key={v.name} 重复,React 报错并可能丢/重渲子节点。
- withGlobalVars: 追加全局变量前剔除同名的库内条目,全局(权威 runtime 定义)
胜出,保证返回列表名字唯一。对所有现存库立即生效,无需迁移。
- db.go: 从 goals 内置目录删掉冗余的 Now(已是全局变量);扩展既有清理 DELETE
一并清掉旧库残留的 'Now' 行(已发版→DB 改动带迁移)。
- 新增 withGlobalVars 去重回归测试。
go build / go vet / go test ./server 全绿。
|
2026-08-23 13:14:28 -04:00 |
|
Autumn
|
1de7a383cc
|
Merge pull request #48 from Autumn-27/fix/llm-precommit-safe-retry
fix(llm): 提交前安全窗口内对同一 provider 重试,减少 model_error
|
2026-08-24 01:06:00 +08:00 |
|
Autumn-27
|
9d8e0ba988
|
fix(llm): 提交前安全窗口内对同一 provider 重试,减少 model_error
SDK 的 doStream 只重试建连阶段(拿到 200 之前);流一旦开始,中途断流 /
overloaded / 流内 429 等瞬时故障会直接冒泡成 model_error,零重试。表现为
worker 常出现「无总结,终态 model_error」,甚至只跑了一两个工具就中断。
在 streamTaskLLM(所有任务 agent 的统一出口)里补一层同 provider 退避重试:
- 仅在 committed 之前(还没向调用方交付任何输出)触发,重放相同请求不会
重复模型输出或工具副作用,绝对安全
- 最多 2 次,退避 0.5s→1s(封顶 4s),ctx 取消立即让位
- 只重试瞬时故障(传输 reset/EOF/timeout、408/429/5xx、流内 overloaded);
额度耗尽交给 profile 故障转移、上下文过长交给 harness reactive 压缩、
4xx 确定性拒绝一律不重试
- 给不上时原样落到既有透传/故障转移逻辑,行为不变
新增 3 个回归测试(重试到成功 / 重试耗尽如实上报 / 4xx 不重试),退避以
变量暴露便于测试置零。go test -race 全绿。
|
2026-08-23 13:02:54 -04:00 |
|
Autumn
|
5574624984
|
Merge pull request #47 from Autumn-27/fix/capture-usage-yield
fix(test): capture_usage 遵守迭代器协议,消除 yield 告警
|
2026-08-24 00:53:38 +08:00 |
|
Autumn-27
|
5f39391594
|
fix(test): capture_usage 遵守迭代器协议,yield 返回 false 即停止
消除 vet 的 "yield may be called again after returning false" 告警:
每次 yield 后判断返回值,false 则 return,不再继续调用 yield。
|
2026-08-23 12:52:32 -04:00 |
|
Autumn
|
2a07893f64
|
Merge pull request #46 from Autumn-27/feat/operation-constraints
feat(constraints): 操作约束(抽取→注入 planner/worker 提示→总览管理)
|
2026-08-24 00:49:09 +08:00 |
|