Commit Graph
100 Commits
Author SHA1 Message Date
openqj a13762cfbe Merge pull request #126 from openqj/feat-chat-history
chat: 持久化继续消息,chat-history 交替历史
2026-10-29 07:07:34 +08:00
openqj 811912c841 Merge pull request #125 from openqj/feat-console-muse-style
console: 按 Muse 网页端/桌面端视觉重做
2026-10-29 06:58:11 +08:00
openqj 5ca5cc91cc Merge pull request #124 from openqj/feat-console-react
console: React 生产级重写(左列表 + 中对话 + 右详情)
2026-10-29 06:38:35 +08:00
openqj 3f4e849a93 Merge pull request #122 from openqj/feat-pm-wait-deadlock
worker: always start capacity pool threads in run_all
2026-10-29 05:47:32 +08:00
openqj ab0aaf4a5e Merge pull request #121 from openqj/feat-child-model
feat: 子任务默认模型/强度(child_model/child_effort)
2026-10-29 05:35:51 +08:00
openqj f99e667222 Merge pull request #120 from openqj/feat-marker-wait-heartbeat
worker: heartbeat parent task during marker poll/wait loops
2026-10-29 04:47:33 +08:00
openqj fd2309686e Merge pull request #119 from openqj/feat-git-pull-deploy
deploy: add git-pull source for host deployment
2026-10-29 03:45:27 +08:00
openqj 630d14fe07 Merge pull request #118 from openqj/feat-coord-running-leak
worker: release running slot after coordinator completes
2026-10-29 03:07:35 +08:00
openqj a367da3ed0 Merge pull request #117 from openqj/feat-autoscaler-coord-guard
autoscaler: guard scale-down against live coordinators and busy victims
2026-10-29 00:37:44 +08:00
openqj 4cf5888f94 Merge pull request #116 from openqj/feat-automem-pg-replace
fix(db): register auto-memory tables in _OR_REPLACE_PK
2026-10-28 23:01:16 +08:00
openqj ce83dcf586 Merge pull request #114 from openqj/feat-websearch-docker-env
fix: pass search env into Docker task containers (SEARXNG_URL was lost)
2026-10-28 22:22:55 +08:00
openqj ffeed25f50 Merge pull request #115 from openqj/feat-rate-limit-retry-after
429 限流加 Retry-After 头
2026-10-28 20:22:11 +08:00
openqj 7279d0a81c Merge pull request #110 from openqj/feat-marker-tools
任务内标记工具:task-create/task-poll/task-read、wait-threads、task-cancel/task-retry
2026-10-28 20:19:39 +08:00
openqj eae9884b13 Merge pull request #111 from openqj/feat-coord-row-vanished
协调员行消失按中断处理:本体行消失即放槽,子任务行消失按 interrupted 合流
2026-10-28 17:46:23 +08:00
openqj a0b6333f0c Merge pull request #113 from openqj/feat-websearch-worker
feat: websearch MCP worker wiring + egress (public SearXNG route)
2026-10-28 17:36:22 +08:00
openqj 075908fe58 Merge pull request #112 from openqj/feat-websearch-mcp
feat: web search MCP v1 (oh-my-pi pattern, Python stdlib)
2026-10-28 17:21:19 +08:00
openqj 5026e75b2c Merge pull request #109 from openqj/feat-goal-fail-resume
goal 异常退出记 interrupted,可断点续跑
2026-10-28 15:53:35 +08:00
openqj d129f7bf8c Merge pull request #108 from openqj/feat-auto-memory
云端身份记忆 + 自动提取注入:官方 memories 对齐(确定性 v1)
2026-10-28 12:19:17 +08:00
openqj ea5ab6207c Merge pull request #93 from openqj/feat-cost-notify-3
成本预算与失败通知第三批:G7 分层、G8 Docker 轮询掐断、G9 worker 忽略 host 预算、G13/G14 归属
2026-10-28 11:49:44 +08:00
openqj ac553509ea Merge pull request #107 from openqj/feat-thread-unarchive-noresume
fix: thread/unarchive 不再预 resume
2026-10-28 09:46:57 +08:00
openqj 5c9beb8a6d Merge pull request #106 from openqj/feat-thread-unarchive
fix: thread/unarchive 走已归档解析(--archived 列表)
2026-10-28 06:30:17 +08:00
openqj f5d6d6b9f0 Merge pull request #105 from openqj/feat-thread-resolve
fix: 线程解析按 home×provider 穷尽回退(共享 home + sub2api)
2026-10-28 05:45:43 +08:00
openqj 86eb43f1ca Merge pull request #104 from openqj/feat-thread-lifecycle
feat: 线程生命周期对齐 15 项(bindings/refs/快照/心跳绑定/移交落点)
2026-10-28 05:04:53 +08:00
openqj aee60fcb7d Merge pull request #103 from openqj/feat-thread-wait-ops
feat: 线程等待与状态读取 8 项(wait/read/message/handoff/worktree/pr-checks/automation/sleep)
2026-10-28 04:43:02 +08:00
openqj 38c0797cb3 Merge pull request #100 from openqj/feat-residual-a
残留批次A:成员删除、PR needs_local_worker 落库、推送 DNS TOCTOU
2026-10-28 03:27:59 +08:00
openqj 6e3eb7ba11 Merge pull request #99 from openqj/feat-p2
feat: P2 控制台与运维批(成员管理、任务筛选、链路下载、线程操作与 skills/MCP、迁移对齐、monitor 告警、备份回滚、Caddy 选项)
2026-10-28 00:52:55 +08:00
openqj 97f019d1dd Merge pull request #98 from openqj/feat-p1-security
feat: P1 安全批(执行中配额检查、成本实账、goal/协调员语义、PR 通道、孤儿签名、控制面与控制台加固)
2026-10-28 00:36:54 +08:00
openqj d254240d84 Merge pull request #96 from openqj/feat-p0-security
feat: P0 安全批(真全局管理员、双人配额门、默认配额、fix-review 收紧、App 配置限管理员、取消真杀任务)
2026-10-28 00:17:37 +08:00
openqj d0ca1f7f60 Merge pull request #97 from openqj/feat-login-retry
登录限流下开通突发不再硬失败(节流 + 429 重试)
2026-10-27 23:34:41 +08:00
openqj 494c3847d4 Merge pull request #94 from openqj/feat-regperf
perf: 注册开通复用进程内管理员会话
2026-10-27 22:46:50 +08:00
openqj cc0c707ccd Merge pull request #90 from openqj/feat-cost-notify-1
成本预算与失败通知第一批(G1/G2/G5/G6/无价上报)
2026-10-27 21:58:55 +08:00
openqj c2f82da5e0 Merge pull request #92 from openqj/feat-sub2api-hotfix
fix: docker 默认 runner 支持 env + 并发开通竞态复用
2026-10-27 18:10:50 +08:00
openqj 99efa93bd3 Merge pull request #88 from openqj/feat-sub2api
sub2api 网关接入:每用户独立账号 + 任务注入 + 网关可配置
2026-10-27 17:30:14 +08:00
openqj 437684902a Merge pull request #86 from openqj/feat-multiuser-hardening
多用户生产级缺口批:sweep 鉴权、默认配额、默认 executor、 无价 token 上限
2026-10-27 17:22:40 +08:00
openqj c1f9313c10 Merge pull request #87 from openqj/feat-coordinator
feat: 协调员任务(并行子任务、等齐、合流汇总)
2026-10-27 16:25:32 +08:00
openqj e786e1f85d Merge pull request #89 from openqj/feat-p1
P1 补齐:自动评审队列、自动化+分诊、并发 caps、运行时审批队列
2026-10-27 16:00:53 +08:00
openqj 29efc6c61f Merge pull request #85 from openqj/feat-task-turn-ids
feat: 任务列表显示 turn_id 与 root_turn_id
2026-10-27 15:44:33 +08:00
openqj 559a7dcb9f Merge pull request #84 from openqj/feat-peer-messages
feat: 任务间互发消息(API + agent 标记块,不中断任务)
2026-10-27 14:30:14 +08:00
openqj 4901a1090b Merge pull request #83 from openqj/feat-tenant-trace
fix: 租户 Docker 任务链路可见(租户目录优先、共享目录兜底)
2026-10-27 13:01:35 +08:00
openqj 79a1d56856 Merge pull request #82 from openqj/feat-subagent-chain
feat: 命令台子代理链路(主任务/模型子代理/委派子任务 + 过程调用实时同步)
2026-10-27 11:54:41 +08:00
openqj 34cd0eeba7 Merge pull request #81 from openqj/feat-orphan-worker
fix: worker 代码变化自退 + 部署时清孤儿 worker
2026-10-27 11:26:47 +08:00
openqj c007fafcc7 Merge pull request #78 from openqj/feat-quota-hardening
worker: enforce quotas during execution
2026-10-27 11:13:49 +08:00
openqj c189df4a20 Merge pull request #76 from openqj/fix-handler-500
fix: 请求处理未捕获异常回 500 JSON,不再断连变 nginx 502
2026-10-27 11:01:31 +08:00
openqj ad8bf280d0 Merge pull request #77 from openqj/feat-staging-cleanup
fix: 提前失败路也清附件暂存
2026-10-27 11:00:27 +08:00
openqj b0772d0eac Merge pull request #75 from openqj/feat-deploy-key
feat: deploy 无密码时走密钥直连
2026-10-27 05:50:52 +08:00
openqj 0a862c11f7 Merge pull request #74 from openqj/feat-repo-picker2
GitHub 仓库选择菜单:安装仓库列表 + PATCH 补仓库 + 控制台下拉
2026-10-27 05:48:08 +08:00
openqj d91e5134f5 Merge pull request #73 from openqj/fix-rate-limit-deadlock
fix: 限流清理移出请求路径,根治 rate_limit_hits 死锁
2026-10-27 05:45:18 +08:00
openqj 5ba4d35839 Merge pull request #72 from openqj/feat-goal-marker
fix: goal 宣告检测容忍行尾句号
2026-10-27 05:32:11 +08:00
openqj 43748804d3 Merge pull request #71 from openqj/feat-quotas
租户配额与计费:按用户月度 USD 上限 + 建任务/分支/重试准入 402
2026-10-27 05:28:25 +08:00
openqj 2a7cdd582f Merge pull request #70 from openqj/feat-continue
feat: 旧任务继续会话——终端任务带新消息 + 全部选项同一会话续跑
2026-10-27 04:46:06 +08:00
openqj cf293914d9 Merge pull request #69 from openqj/feat-attachments
feat: 任务附件——文件/文件夹/图片进任务工作区
2026-10-27 04:39:05 +08:00
openqj c102327040 Merge pull request #68 from openqj/env-console
feat: 命令台云端环境——选、建、管 + 任务绑定环境
2026-10-27 04:13:11 +08:00
openqjandhost c86b450851 feat: goal 模式新语义——prompt 即目标,无验收命令,不限轮次,模型宣告完成 (#67)
console 打勾 goal 模式时不再有专用 goal 文本、验收命令、轮次
三个输入(已移除,换成说明行),只发 goal_mode=1;server 侧
goal_mode=1 时 goal 存 prompt、验收命令空、轮次存 0,带验收
命令或与计划模式同用时 400,旧的带验收命令任务照原样可用。

host.py goal 循环:verify 为空时不跑验测,轮次提示里写明
标记约定;模型在完整跑完的回合末尾单独一行输出“目标已
达成”即达标(超时回合的部分文本含标记也不算);--max-rounds
0 为不限轮次,goal-resume 续跑按 0 处理(不用 or 兜底成 3)。
刹车只有取消与预算耗尽(后者记 interrupted、可续跑)。

迁移与 worker:tasks 加 goal_mode 列(server 迁移、worker 列
补齐、PG schema 三处同步);worker 按 goal_mode 或
verify_command 判定 goal 路径,重试与后续消息排空对新语义
同样只跑一次/不排空;Local/Docker goal_task 的 --verify 可选、
--max-rounds 0 原样传。

Co-authored-by: host <host@test.local>
2026-10-27 03:54:48 +08:00
openqjandhost 4179fb1a0a fix: 命令台初始化有 key 即加载模型列表 (#66)
回访用户 key 已在 localStorage 里:此前模型列表只在点“保存”
时加载一次,重开页面下拉永远只有默认项(2026-10-27 实测)。
初始化序列补 if (getKey()) loadRelayModels();单测补初始化
序列含该调用的标记断言。

另:公网 /relay/models 曾因 nginx 缺 /relay/ 代理返回 404,
与本修无关,nginx 侧另行补 location。

Co-authored-by: host <host@test.local>
2026-10-27 03:33:35 +08:00
openqjandhost f4443dca4f feat: 计划模式 + 后续消息 + 会话分支接云端 (#65)
- 计划模式:tasks 加 plan 列;plan 与 approval=full / goal 冲突时
  400;执行器在 approval 参数后追加 --sandbox read-only(本地
  dispatch/run/goal/popen 与 Docker 内层命令全覆盖),host 任务
  存下 sandbox 后续轮次自动继承只读。
- 后续消息:新表 task_followups;POST/GET /tasks/{id}/followups
  (仅 queued/running 的非 goal 任务;direct 立即往链路追加
  phase=followup-direct 条目,本轮跑完后优先于排队执行;排队
  按 direct 优先、队内先来先服务逐条再跑一轮,同一 thread;
  一条失败即停、剩余 pending 留给重试入口;取消时回 pending)。
- 会话分支:POST /tasks/{id}/fork(仅终态任务;继承 executor/
  模型/强度/权限/计划,goal 字段置空);worker 先 fork 再跑首轮,
  首轮失败不自动重试、不重复分叉,失败后走重试入口重跑首轮。
- 修任务级模型被覆盖:worker 此前无条件写成主模型,控制台
  选的模型实际不生效;现为任务级 > worker 主模型 > 配置。
- Docker 租户准备抽成 _docker_task_context,供普通尝试与 fork 共用。
- console:新建任务计划勾选(含冲突拦截)、详情计划徽标与
  分支来源、分支按钮与表单、后续消息区、列表 [计划]/[分支] 标记。
- 测试:cloud/tests/test_task_links.py 17 个(server 校验与继承、
  worker 模型优先、只读命令、排空顺序与停排、goal 不排空、
  fork 单次性);全量 cloud 542、host 49、deploy 14。

Co-authored-by: host <host@test.local>
2026-10-27 03:17:51 +08:00
openqj 6da3745127 Merge pull request #64 from openqj/goal-align-2
CI verify pass 2m2s,合并后走新链路推生产。
2026-10-27 03:08:49 +08:00
openqj 028ef02a86 Merge pull request #63 from openqj/goal-long-task
CI verify pass 2m10s,合并后走新链路推生产。
2026-10-27 02:49:13 +08:00
openqjandhost fc016fd459 style: 命令台 GUI 美化 (#62)
只改样式与布局骨架,不动 JS 逻辑与接口:
- 卡片化分区(API Key / 健康 / 项目+Workers 两栏 / 新建任务 / 任务列表 / 任务详情),柔和底色 + 圆角 + 细阴影
- 按钮分主次:保存 key 与提交任务为主按钮(蓝),取消为红色弱化按钮;输入框获焦有蓝圈
- 任务状态改圆点 + 彩色文字(running 蓝、completed 绿、failed 红、merged 紫、interrupted 橙),行悬停高亮
- 表格去网格线、表头浅灰,详情/链路区改浅灰圆角框;窄屏单栏自适应
- 验证:HTML 标签平衡、全部 41 个 JS 用 id 齐全、接口标记齐全、零外部引用、JS 经 node --check、test_console 4/4

Co-authored-by: host <host@test.local>
2026-10-27 02:45:08 +08:00
openqjandhost 799f7c3edb feat: 任务实时链路 SSE (#61)
host.py:回合通知摘要成链路条目,增量追加到 <state>/host-traces/<task>.jsonl(上限 5000 行);dispatch/run/goal/delegate 设链路文件
cloud/server.py:GET /tasks/{id}/trace 快照 + /trace/stream SSE(snapshot → entry → done;worktree 在别机时空链路 + 说明)
console:详情链路区,运行中 fetch 流式渲染(EventSource 不能带 X-API-Key 头),终态走快照;DOM 上限 1000 条
单测:test_host_trace 7 + test_task_trace 6;host 49、cloud 525、deploy 14 全过

Co-authored-by: host <host@test.local>
2026-10-27 02:27:15 +08:00
openqjandhost 6022f1dada chore: default model gpt-6.1-sol -> gpt-5.6-terra (#60)
Co-authored-by: host <host@test.local>
2026-10-27 02:00:09 +08:00
openqjandhost 8b2f3968dc feat: per-task model/effort/approval + relay models endpoint (#59)
Co-authored-by: host <host@test.local>
2026-10-27 01:44:53 +08:00
openqjandhost cff152c5a2 fix: console reloads data right after saving key (#58)
Co-authored-by: host <host@test.local>
2026-10-27 01:26:19 +08:00
openqjandhost e40c2c33bb feat: web command console v1 (GET /console) (#57)
Co-authored-by: host <host@test.local>
2026-10-27 01:02:24 +08:00
openqjandhost c6e633d162 fix: host_deploy stops/starts and health-checks server-2 too (#56)
Co-authored-by: host <host@test.local>
2026-10-27 00:50:33 +08:00
openqjandhost 84ff968111 fix: deploy verify parsing must ignore ssh warning lines (#55)
Co-authored-by: host <host@test.local>
2026-10-27 00:41:40 +08:00
openqjandhost 32125f7a98 docs: new-host onboarding checklist (HA stage 4) (#54)
Co-authored-by: host <host@test.local>
2026-10-27 00:30:32 +08:00
openqjandhost de81b1643f docs: Postgres fast-rebuild runbook (HA stage 3, option 1) (#53)
Co-authored-by: host <host@test.local>
2026-10-27 00:22:31 +08:00
openqjandhost 06b9fd12fd HA stage 2: DB-shared rate limiting + second server unit + monitor both-servers check (#52)
Co-authored-by: host <host@test.local>
2026-10-27 00:15:16 +08:00
openqjandhost fc8e337d0f HA 阶段 1:worktree_host + 跨主机 /pr 队列化 (#50)
* 部署自动化:唯一发布链路 deploy.py + host_deploy.sh,sha/commit 双重验真,失败回滚

旧链路三次栽过的坑:通用 tar 路径导致旧包误部署、传输不验 sha、
主机脚本多份漂移、health 通过不等于新代码上线。本单把四点变硬门禁:
- 产物唯一命名 codex-app-server-<commit>.tar.gz + .sha256,远端唯一路径
- git archive 产物 + DEPLOYED_COMMIT 清单,默认拒绝脏工作区
- 传输链 scp -> scp_run -> chunk 分片,每路传完远端验 sha,不符删掉重来
- 主机侧唯一脚本:先验 sha/清单,staging 解包 + 编译检查,换目录上线,
  work/ 原样保留,health + 上线 commit 不符即回滚并退出非零
- deploy.py 成功后独立 ssh 再读一次 live 清单二次核对
- CI:host-verify 加 deploy/tests;release.yml 只在手动/tag + production
  environment 审批时部署,主干推送绝不自动部署生产
- deploy.sh 标记为旧链路弃用
- health 的 commit 字段已在父提交 HA 阶段 0 里随 server.py 落地,
  本分支整体包含它;commit 为空时只靠文件核对,门禁同样成立
测试:host 32、cloud 487(4 跳过)、deploy 9,全部通过;
host_deploy.sh 仿真覆盖成功/坏 sha/清单不符/health commit 不符回滚。
生产实机部署未做,等确认后再用新链路推。

* HA stage 1: worktree_host + queued cross-host PR jobs

---------

Co-authored-by: host <host@test.local>
2026-10-27 00:05:18 +08:00
openqjandhost 455513dd33 HA stage 0: health reads workers registry, daily pg_dump timer, backup freshness in monitor (#48)
Co-authored-by: host <host@test.local>
2026-10-26 23:51:54 +08:00
openqjandhost 275de39148 docs: multi-machine HA design (phased, grounded in current single-host facts) (#47)
Co-authored-by: host <host@test.local>
2026-10-26 23:41:38 +08:00
openqj 4c6b6ad039 Merge pull request #46 from openqj/pg-decimal-cost
修项目成本按天接口在 Postgres 上的 Decimal 序列化崩溃
2026-10-26 23:19:54 +08:00
openqj 70177989f2 Merge pull request #45 from openqj/real-cost
逐任务真实成本:上游用量事件 + 价目表计价
2026-10-26 18:44:09 +08:00
openqj 353d6c1aa8 Merge pull request #43 from openqj/goal-cloud
云端 goal/merge/review 三事件:goal 循环 + PR 事件通知
2026-10-26 18:14:17 +08:00
openqj 26e73124fb Merge pull request #42 from openqj/push-notify
推送真发送:webhook/slack 内置发送端 + worker 终态通知
2026-10-26 17:34:14 +08:00
openqj b7dace55b9 Merge pull request #41 from openqj/pr-timeout
pr 超时:git/gh 子进程默认 120 秒超时
2026-10-26 17:03:33 +08:00
openqj 37d049d6b7 Merge pull request #39 from openqj/app-token
App-token:推分支建 PR 改走 GitHub App
2026-10-26 16:49:46 +08:00
openqj ee4b01c8f6 Merge pull request #37 from openqj/multi-key
多 key:OAuth 登录不再轮换
2026-10-26 16:30:15 +08:00
openqj aa5ad41eba Merge pull request #36 from openqj/github-app-pg-dialect
修 GitHub App 安装在 Postgres 上崩
2026-10-26 16:13:58 +08:00
openqj f07b3ccc7c Merge pull request #35 from openqj/github-app-install
GitHub App 一键安装
2026-10-26 16:05:08 +08:00
openqj ecf4b5c715 Merge pull request #34 from openqj/bind-external-identity
oauth: bind existing accounts to external identities
2026-10-26 15:50:12 +08:00
openqj 5735ea16d6 Merge pull request #32 from openqj/pr-commit-before-push
pr: commit worktree changes before push
2026-10-26 15:22:57 +08:00
openqj b984171f27 Merge pull request #30 from openqj/monitor-autoscaler-check
monitor.sh: worker check accepts autoscaler (static worker retired)
2026-10-26 11:03:49 +08:00
openqj 7c0e9366f8 Merge pull request #29 from openqj/docker-runtime-prod
Production docker tasks: --docker-runtime runsc in autoscaler unit
2026-10-26 10:38:36 +08:00
openqj 54834c3744 Merge pull request #28 from openqj/docker-runtime-runsc
Docker tasks: --docker-runtime option (runsc support, default off)
2026-10-26 10:29:14 +08:00
openqj b31e9365de Merge pull request #27 from openqj/host-profile-fixes
Fix codex-host profile (capability + netlink for bwrap)
2026-10-26 08:41:53 +08:00
openqj bfe3521ef7 Merge pull request #26 from openqj/host-sandbox
Host-level sandbox tasks (LocalExecutor + bwrap)
2026-10-26 08:26:53 +08:00
openqj 67acddaf7c Merge pull request #25 from openqj/egress-fixes
Fix egress/AppArmor configs found during host install
2026-10-26 08:03:13 +08:00
openqj 7859d5dd8c Merge pull request #24 from openqj/outer-hardening
Outer hardening: AppArmor, pids limit, egress allowlist
2026-10-26 07:43:57 +08:00
openqj 4f7c7eb13e Merge pull request #23 from openqj/tenant-isolation
Multi-tenant isolation for Docker tasks
2026-10-26 07:26:33 +08:00
openqj c5d245a7fb Merge pull request #22 from openqj/autoscaler
Autoscale workers by queue depth
2026-10-26 06:58:42 +08:00
openqj 67e1d3eb24 Merge pull request #21 from openqj/worker-concurrency-and-retry
Worker concurrency, survival (heartbeat/sweep/drain), retry endpoint
2026-10-26 06:48:48 +08:00
openqj 341f4a83e1 Merge pull request #20 from openqj/worker-poll-perf
Perf: light worker poll query + tasks(status) index
2026-10-26 06:21:30 +08:00
openqj a1e492657a Merge pull request #19 from openqj/host-error-surfacing
Surface failed-turn reason from thread_history in dispatch output
2026-10-26 06:15:03 +08:00
openqj 6a857e06bd Merge pull request #18 from openqj/fallback-real-turn-token-and-codex-home
Fallback: extract HTTP code from failed-turn JSON; Docker codex_home points at real relay home
2026-10-26 06:09:37 +08:00
openqj edc187bb70 Merge pull request #17 from openqj/docker-config-codex-home
Docker config: writable codex_home under /app/work
2026-10-26 05:59:27 +08:00
openqj 0f2e427d93 Merge pull request #16 from openqj/docker-config-repo-and-stderr
Docker default repo + keep stderr in worker error_text
2026-10-26 05:48:17 +08:00
openqj 3acf0d7b8c Merge pull request #15 from openqj/docker-config-state-path
Fix Docker config state path to work/host-state.json
2026-10-26 05:41:33 +08:00
openqj f49ccfd9bf Merge pull request #14 from openqj/docker-config-in-repo
Commit host-config-docker.json to the repo
2026-10-26 05:37:22 +08:00
openqj 1e33b6b3e0 Merge pull request #13 from openqj/fallback-thread-start-crash
Fallback also triggers on thread/start crash with explicit HTTP code
2026-10-26 05:31:34 +08:00