Skip to content

Commit 6676767

Browse files
committed
release: v0.1.103 [publish-npm]
1 parent 6b41666 commit 6676767

8 files changed

Lines changed: 150 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ The format is based on Keep a Changelog and follows semantic versioning.
88

99
- none.
1010

11+
## [0.1.103] - 2026-04-15
12+
13+
- startup hotfix: prevent startup crash on upgraded legacy SQLite databases where `task_queue.source` is still missing (`ERR_SQLITE_ERROR: no such column: source`).
14+
- migration ordering fix: move `task_queue` indexes that depend on newly introduced columns (`source`, `next_retry_at`) into schema migration flow so column backfill always runs first.
15+
- regression coverage: add state-store test that seeds a legacy `task_queue` schema without `source` and verifies upgrade bootstrap + index creation complete successfully.
16+
1117
## [0.1.102] - 2026-04-14
1218

1319
- API lifecycle completion: ship `/api/tasks` list pagination/filtering, task `cancel`/`retry`, and SSE lifecycle stream (`/api/tasks/:id/events`) with scope enforcement and audit-compatible action fields.

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ Quick feedback:
1515
- Feature request: <https://github.com/biglone/CodeHarbor/issues/new?template=feature_request.yml>
1616
- Release announcements (EN/中文 in one thread): <https://github.com/biglone/CodeHarbor/discussions/3>
1717
- Roadmap poll (EN/中文 in one thread): <https://github.com/biglone/CodeHarbor/discussions/4>
18-
- Latest release notes: [docs/releases/v0.1.102-release-notes.md](docs/releases/v0.1.102-release-notes.md)
19-
- Latest bilingual announcement: [docs/releases/v0.1.102-announcement-bilingual.md](docs/releases/v0.1.102-announcement-bilingual.md)
18+
- Latest release notes: [docs/releases/v0.1.103-release-notes.md](docs/releases/v0.1.103-release-notes.md)
19+
- Latest bilingual announcement: [docs/releases/v0.1.103-announcement-bilingual.md](docs/releases/v0.1.103-announcement-bilingual.md)
2020

2121
## Release Notes Index
2222

23+
- v0.1.103 notes: [docs/releases/v0.1.103-release-notes.md](docs/releases/v0.1.103-release-notes.md)
24+
- v0.1.103 announcement (EN/中文): [docs/releases/v0.1.103-announcement-bilingual.md](docs/releases/v0.1.103-announcement-bilingual.md)
2325
- v0.1.102 notes: [docs/releases/v0.1.102-release-notes.md](docs/releases/v0.1.102-release-notes.md)
2426
- v0.1.102 announcement (EN/中文): [docs/releases/v0.1.102-announcement-bilingual.md](docs/releases/v0.1.102-announcement-bilingual.md)
2527
- v0.1.69 notes: [docs/releases/v0.1.69-release-notes.md](docs/releases/v0.1.69-release-notes.md)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Release v0.1.103 / 发布说明
2+
3+
## English
4+
5+
### Summary
6+
7+
- v0.1.103 is a focused hotfix release for upgrade reliability on legacy SQLite state databases.
8+
9+
### Highlights
10+
11+
- Fixed startup failure after upgrade when `task_queue` schema does not yet contain `source`.
12+
- Corrected migration ordering so column backfill runs before creating indexes that reference migrated columns.
13+
- Added regression coverage for legacy task-queue schema bootstrap.
14+
15+
### Suggested verification (optional)
16+
17+
1. Upgrade: `npm install -g codeharbor@0.1.103`
18+
2. Check version: `codeharbor --version`
19+
3. Restart service and verify no `no such column: source` error appears in logs.
20+
21+
### Feedback links
22+
23+
- Bug report: <https://github.com/biglone/CodeHarbor/issues/new?template=bug_report.yml>
24+
- Feature request: <https://github.com/biglone/CodeHarbor/issues/new?template=feature_request.yml>
25+
- Discussions: <https://github.com/biglone/CodeHarbor/discussions>
26+
27+
---
28+
29+
## 中文
30+
31+
### 摘要
32+
33+
- v0.1.103 是一个面向升级稳定性的热修复版本,重点解决旧 SQLite 状态库升级后的启动兼容问题。
34+
35+
### 重点更新
36+
37+
- 修复升级后在旧 `task_queue` 表缺少 `source` 列时的启动崩溃问题。
38+
- 调整迁移顺序:先完成列补齐,再创建依赖迁移列的索引,避免启动阶段 SQL 错误。
39+
- 新增 legacy `task_queue` 启动迁移回归测试,防止同类问题回归。
40+
41+
### 推荐验证(可选)
42+
43+
1. 升级:`npm install -g codeharbor@0.1.103`
44+
2. 检查版本:`codeharbor --version`
45+
3. 重启服务并确认日志中不再出现 `no such column: source`
46+
47+
### 反馈入口
48+
49+
- Bug 报告:<https://github.com/biglone/CodeHarbor/issues/new?template=bug_report.yml>
50+
- 功能建议:<https://github.com/biglone/CodeHarbor/issues/new?template=feature_request.yml>
51+
- 讨论区:<https://github.com/biglone/CodeHarbor/discussions>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Release v0.1.103
2+
3+
## Highlights
4+
5+
- Hotfix for upgrade stability: fixed startup crash on legacy SQLite databases missing `task_queue.source` (`no such column: source`).
6+
- Migration ordering hardened: `task_queue` indexes that depend on migrated columns are now created after column backfill.
7+
- Added regression test to lock upgrade behavior for pre-`source` task queue schema.
8+
9+
## Upgrade
10+
11+
```bash
12+
npm install -g codeharbor@0.1.103
13+
```
14+
15+
## Verify
16+
17+
```bash
18+
codeharbor --version
19+
```
20+
21+
Expected output:
22+
23+
```text
24+
0.1.103
25+
```
26+
27+
## Notes
28+
29+
- This patch is recommended for any deployment upgraded from older local state databases.
30+
31+
## Community
32+
33+
- Bug report: https://github.com/biglone/CodeHarbor/issues/new?template=bug_report.yml
34+
- Feature request: https://github.com/biglone/CodeHarbor/issues/new?template=feature_request.yml
35+
- Discussions: https://github.com/biglone/CodeHarbor/discussions

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "codeharbor",
3-
"version": "0.1.102",
3+
"version": "0.1.103",
44
"description": "Self-hosted Matrix AI assistant bridge for Codex, Claude Code, and Gemini CLI sessions",
55
"author": "biglone <jjoyceu@gmail.com> (https://github.com/biglone)",
66
"license": "MIT",

src/store/state-store.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2458,9 +2458,6 @@ export class StateStore {
24582458
24592459
CREATE INDEX IF NOT EXISTS idx_task_queue_status_id ON task_queue(status, id);
24602460
CREATE INDEX IF NOT EXISTS idx_task_queue_session_status_id ON task_queue(session_key, status, id);
2461-
CREATE INDEX IF NOT EXISTS idx_task_queue_status_retry_id ON task_queue(status, next_retry_at, id);
2462-
CREATE INDEX IF NOT EXISTS idx_task_queue_session_status_retry_id ON task_queue(session_key, status, next_retry_at, id);
2463-
CREATE INDEX IF NOT EXISTS idx_task_queue_source_status_id ON task_queue(source, status, id);
24642461
24652462
CREATE TABLE IF NOT EXISTS task_failure_archive (
24662463
id INTEGER PRIMARY KEY AUTOINCREMENT,

test/state-store.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,57 @@ describe("StateStore", () => {
4040
expect(store.hasProcessedEvent("s1", "e1")).toBe(true);
4141
});
4242

43+
it("migrates legacy task_queue schema before creating source-dependent indexes", () => {
44+
const { db, legacy } = createPaths();
45+
const { DatabaseSync } = require("node:sqlite") as { DatabaseSync: any };
46+
const seed = new DatabaseSync(db);
47+
48+
seed.exec(`
49+
CREATE TABLE sessions (
50+
session_key TEXT PRIMARY KEY,
51+
codex_session_id TEXT,
52+
active_until INTEGER,
53+
updated_at INTEGER NOT NULL
54+
);
55+
`);
56+
seed.exec(`
57+
CREATE TABLE task_queue (
58+
id INTEGER PRIMARY KEY AUTOINCREMENT,
59+
session_key TEXT NOT NULL,
60+
event_id TEXT NOT NULL,
61+
request_id TEXT NOT NULL,
62+
payload_json TEXT NOT NULL,
63+
status TEXT NOT NULL CHECK (status IN ('pending', 'running', 'succeeded', 'failed')),
64+
attempt INTEGER NOT NULL DEFAULT 0,
65+
enqueued_at INTEGER NOT NULL,
66+
next_retry_at INTEGER,
67+
started_at INTEGER,
68+
finished_at INTEGER,
69+
error TEXT,
70+
last_error TEXT,
71+
UNIQUE(session_key, event_id),
72+
FOREIGN KEY (session_key) REFERENCES sessions(session_key) ON DELETE CASCADE
73+
);
74+
CREATE INDEX IF NOT EXISTS idx_task_queue_status_id ON task_queue(status, id);
75+
CREATE INDEX IF NOT EXISTS idx_task_queue_session_status_id ON task_queue(session_key, status, id);
76+
`);
77+
seed.close();
78+
79+
expect(() => new StateStore(db, legacy, 10, 30, 100)).not.toThrow();
80+
81+
const verify = new DatabaseSync(db);
82+
const columns = new Set(
83+
(verify.prepare("PRAGMA table_info(task_queue)").all() as Array<{ name: string }>).map((row) => row.name),
84+
);
85+
expect(columns.has("source")).toBe(true);
86+
87+
const indexNames = (verify
88+
.prepare("SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'task_queue'")
89+
.all() as Array<{ name: string }>).map((row) => row.name);
90+
expect(indexNames).toContain("idx_task_queue_source_status_id");
91+
verify.close();
92+
});
93+
4394
it("imports legacy state.json into sqlite on first boot", () => {
4495
const { db, legacy } = createPaths();
4596

0 commit comments

Comments
 (0)