[English](../../../releases/v0.1.50.md) | [Tiếng Việt](./v0.1.50.md) | [简体中文](../../../releases/v0.1.50.md) | [한국어](../../../releases/v0.1.50.md)

# clisbot v0.1.50

Phát hành: `2026-04-28`

`v0.1.50` là bản phát hành công khai sau `v0.1.43`. `v0.1.44` được giữ như một nhánh pre-release nội bộ và không được công bố như đích update công khai.

## Tóm tắt

`clisbot` giờ an toàn và thực tế hơn trong công việc thật trên Slack và Telegram: kiểm soát truy cập trên ngữ cảnh chat dùng chung rõ hơn, các bản cài cũ update trực tiếp được, các coding session chạy dài recover trung thực hơn, queued follow-up work đã thành tính năng hạng nhất, và Telegram media cùng ngữ cảnh sender/ngữ cảnh chat giàu hơn giúp việc chat hằng ngày dễ dùng hơn.

## Điểm nhấn

- Bot dùng chung an toàn hơn khi đem vào group thật vì admission của ngữ cảnh chat và sender policy giờ đã tách riêng.
- Bản cài hiện có trước `0.1.50` có thể update trực tiếp; clisbot tự backup và tự cập nhật shape config tương thích.
- Workflow coding chạy dài bình tĩnh hơn khi vận hành: trust prompt đến trễ, các đường capture `/new` nhập nhằng, và các race ở stop-timeout của restart giờ lộ ra hành vi trung thực hơn.
- Queued follow-up work giờ là tính năng hạng nhất thông qua chat `/queue` và `clisbot queues`.
- Scheduled loop đáng tin hơn: lịch theo đồng hồ giữ đúng ý định timezone, và fresh Codex session sẽ chờ prompt sẵn sàng rồi mới submit.
- Agent nhận ngữ cảnh `sender` và `surface` rõ hơn, gồm cả tên đọc được của Slack và Telegram khi có.

## Điểm nhấn theo từng nhóm người dùng

### Người dùng cá nhân

- Bot của bạn dễ giữ chạy hơn trong các coding session thật vì hành vi restart, trust-prompt, và session continuity bớt mong manh hơn.
- `/queue` cho bạn một cách đơn giản để xếp prompt tiếp theo mà không phải ngồi babysit phiên chạy hiện tại.
- File Telegram loại `voice` và `audio` giờ vào workspace như attachment bình thường, giúp workflow mobile và on-the-go hữu ích hơn.

### Owner của shared bot

- Độ an toàn của group dễ suy luận hơn: “group này đã được admit chưa?” giờ là quyết định khác với “những người nào trong đó được phép dùng bot?”
- Bản cài hiện có có thể đi thẳng lên `0.1.50` với backup tự động và config rewrite tự động, thay vì phải manual migration trước.
- Continuity theo topic và thread chặt hơn, nên ngữ cảnh chat dùng chung ít khả năng làm rò output cũ sang cuộc hội thoại sai hơn.

### Operator

- `clisbot queues` cho bạn một luồng queue bền thay vì chỉ trông vào follow-up trong chat.
- `/whoami`, `/status`, và runner debug surfaces giờ lộ session identity trung thực hơn, bao gồm cả việc `sessionId` đã được persist hay chưa.
- Restart và runner recovery dễ tin hơn vì các race quanh stop-timeout, trust prompt đến trễ, và stale-resume mơ hồ giờ được xử lý tường minh hơn.

### Power user chạy các coding run dài

- Ngữ cảnh prompt giàu hơn và dễ đọc hơn trên chat thường, queued work, steering, và loop.
- Streaming và cơ chế cô lập theo ranh giới pane chặt hơn, nên preview đang chạy ít khi lộ ra nội dung cũ từ run khác hơn.
- Session continuity giờ giữ mapping đã lưu khi bằng chứng yếu, thay vì âm thầm drift sang một cuộc hội thoại khác của native tool.

## Tác động với operator

- Những cải thiện dễ thấy nhất với người dùng:
  - mặc định an toàn hơn cho ngữ cảnh chat dùng chung
  - đường nâng cấp trực tiếp từ bản cài cũ
  - queue control hạng nhất
  - truthfulness tốt hơn quanh runner continuity và hành vi restart
- Độ an toàn khi update: update trực tiếp tự động từ các version trước `0.1.50`.
- Manual action: không có cho các update thông thường từ bản cũ lên `0.1.50`.
- Các config hiện có từ `0.1.43`, các bản legacy cũ hơn, và các pre-release nội bộ `0.1.44` đều được backup rồi update tự động ở lần đọc đầu tiên.
- Ngữ cảnh chat dùng chung của Slack và Telegram giờ tách multi-user admission của ngữ cảnh chat khỏi sender policy bên trong các group đã admit.
- Exact shared route và Telegram topic nên bỏ route-local `policy` khi chúng muốn kế thừa `group:*`.
- Wall-clock loop giờ đóng băng resolved timezone và hiện chi tiết schedule/cancel rõ hơn.
- Startup của Codex trong scheduled-loop và preview streaming an toàn hơn, gồm cả cô lập prompt-boundary tốt hơn và giữ lại native `Working...` timer.
- Việc tạo và inspect queue giờ đã là công cụ hạng nhất cho operator thông qua `clisbot queues`, gồm cả giới hạn pending theo từng session.
- `clisbot restart` giờ trung thực hơn trong lúc update khi cảnh báo stop-timeout đua với một worker đã thoát.
- Hướng dẫn cập nhật: [hướng dẫn update](../updates/update-guide.md).

## Thay đổi chức năng

### Channels

#### Thêm mới

- Thêm khả năng tải xuống Telegram attachment loại `voice` và `audio` vào workspace của agent, rồi chuyển cho CLI đa phương thức như file mention bình thường.
- Thêm prompt `Message context` gọn với `time`, `sender`, và `surface` cho các đường chat thường, steering, queue, và loop.
- Thêm làm giàu cách hiển thị sender và surface trên Slack thông qua `users.info` và `conversations.info`, với fallback về id ổn định khi lookup không có.
- Thêm làm giàu tên hiển thị của Telegram topic từ metadata lúc tạo topic và bản ghi surface-directory khi payload hiện tại không mang topic name.
- Thêm đăng ký native command-menu của Telegram cho `/new` với mô tả rõ hơn là `Start new session`.

#### Thay đổi

- Cập nhật Slack app manifest và setup docs để thêm các scope lookup cần cho sender/ngữ cảnh chat dễ đọc hơn: `users:read`, `channels:read`, `groups:read`, `im:read`, và `mpim:read`.
- Giữ lại display name và handle đã biết trong surface-directory ngay cả khi các event từ provider về sau chỉ còn stable id.
- Dựng lại prompt envelope cho queued work, steering, và loop ở thời điểm deliver để công việc bị trễ không tái sử dụng sender/ngữ cảnh chat cũ.

#### Sửa lỗi

- Sửa Telegram topic routing để coi `message_thread_id` là nguồn sự thật ngay cả khi Telegram bỏ `chat.is_forum`.
- Sửa rendering guard để runner update và final không bị gửi tới nhầm tương tác trên channel khi `sessionKey` khác nhau.
- Sửa việc trích streaming để ưu tiên prompt boundary CLI mới nhất đang nhìn thấy trước khi diff với baseline, ngăn nội dung pane cũ rò vào preview hiện tại.
- Sửa running preview để giữ lại các dòng timer native kiểu `Working...` thay vì thay bằng status text chung chung.
- Sửa render live preview khi Codex để lại một input prompt rỗng ở dưới một timer đang hoạt động.

### Auth

#### Thêm mới

- Thêm enforce `allowUsers` và `blockUsers` cho shared group route trước khi message chạm vào runner.
- Thêm wildcard ngữ cảnh chat dùng chung user control thông qua `group:*`, để operator allow hoặc block một principal trên mọi admitted group của một bot.
- Thêm giải thích effective permission trong `clisbot auth get-permissions --sender <principal> --agent <id> --json`, bao gồm `runShellSlashCommand`.

#### Thay đổi

- Tách multi-user admission của ngữ cảnh chat (`groupPolicy` và Slack `channelPolicy`) khỏi sender policy bên trong các group đã admit (`groups["*"].policy` và policy trên exact route).
- Làm rõ rằng `disabled` nghĩa là im lặng hoàn toàn trong ngữ cảnh chat đó, gồm cả owner/admin lẫn pairing guidance.
- Giữ invariant rằng owner/admin chỉ bypass sender allowlist sau khi group đã được admit; `blockUsers` vẫn luôn thắng.

### Agents

#### Thêm mới

- Thêm chat `/new` để chủ động mở cuộc hội thoại runner mới cho routed session hiện tại; Codex và Claude nhận `/new`, Gemini nhận `/clear`, rồi clisbot chạy `/status` và lưu `sessionId` mới.
- Thêm queue item bền theo từng session trong `StoredSessionEntry.queues`, được dùng chung cho chat `/queue`, route `additionalMessageMode: "queue"`, và `clisbot queues`.

#### Thay đổi

- Lưu creator metadata trên các loop được tạo từ CLI để prompt theo lịch về sau có thể render sender context trung thực.
- `/whoami` và `/status` giờ hiện `sessionName`, `sessionId`, và chú thích về persistence thay vì chỉ đưa `storedSessionId` đã lưu như sự thật về danh tính.

#### Sửa lỗi

- Sửa loop run chạy bằng Codex để prompt theo lịch đầu tiên chờ đúng interactive prompt marker rồi mới submit.
- Sửa việc tái dùng live tmux session hiện có khi CLI `sessionId` đã lưu bị thiếu: clisbot giờ capture runner conversation id trước prompt kế tiếp của người dùng thay vì để session đó thành non-resumable vĩnh viễn.
- Sửa status-command session-id capture để chỉ đọc delta mới từ tương tác `/status`, bỏ qua UUID cũ trong transcript history.
- Sửa status-command session-id capture của Codex cho output `/status` dạng box, để `storedSessionId` được persist sau stale runner sunset và prompt sau có thể resume cùng CLI session.
- Sửa đường automatic runner retry và recovery để chúng giữ được `sessionKey -> sessionId`; chỉ các flow explicit fresh-session hoặc `/new` mới xóa hoặc xoay stored runner conversation id.
- Sửa hành vi mơ hồ ở stale-resume startup và `/new` capture failure để clisbot giữ stored session id thay vì xóa nó khi bằng chứng yếu.
- Sửa khả năng hiển thị của fresh-runner startup để khi runner đã dùng được nhưng durable session-id capture vẫn còn trễ, ngữ cảnh chat đang hoạt động sẽ nhận cảnh báo rõ rằng session đang chạy nhưng chưa resume được.

### Runners

#### Thay đổi

- Cắt bớt các default startup của runner từng do release sở hữu ra khỏi persisted config để Codex, Claude, Gemini, và runtime monitor defaults có thể kế thừa hành vi của release hiện tại.
- Chỉnh trạng thái tương thích của Gemini thành fully compatible cho routed Slack và Telegram workflow.

#### Sửa lỗi

- Sửa nhận diện timer native của runner cho các dòng timer có dấu chấm lửng như `Working... (2m 4s ...)`.
- Sửa recovery của runner và xử lý prompt-boundary quanh pane content cũ cùng các active-run preview.

### Control

#### Thêm mới

- Thêm `clisbot queues list|status|create|clear` cho việc inspect durable queue ở mức app hoặc theo scope, tạo queue theo route một cách tường minh, và clear phần pending mà thôi.
- Thêm `routes clear-policy` cho các exact shared route nên kế thừa wildcard shared policy.
- Thêm route CLI help rõ hơn cho canonical shared route id, ví dụ allow/block, và hành vi route policy.
- Thêm shortcut cho runner debug: `clisbot inspect` và `clisbot watch` giờ map sang `clisbot runner inspect` và `clisbot runner watch`.
- Thêm `runner inspect --latest`, cùng với chọn `--index <n>` cho cả `runner inspect` lẫn `runner watch` theo thứ tự in ra bởi `runner list`.

#### Thay đổi

- Việc tạo wall-clock loop từ CLI giờ xác nhận lịch đầu tiên trước khi persist, và hiện resolved timezone, next run, cùng câu lệnh retry đúng với `--confirm`.
- `routes get-timezone` giờ in ra route override, effective timezone, và local time hiện tại của ngữ cảnh chat đó.
- `runner inspect` giờ mặc định dùng 100 dòng khi bỏ `--lines`.
- `clisbot queues create` giờ gửi một acknowledgement rằng queue đã được tạo ngay trên target surface sau khi persist, gồm vị trí trong queue và prompt đã submit.
- `clisbot runner list` giờ giữ vai trò là inventory tmux nhẹ và không còn capture mọi live pane chỉ để đoán session id nữa.

### Configuration

#### Thêm mới

- Thêm backup config tự động, migration, validation, và stage logging cho update từ các bản cài cũ lên `0.1.50`.
- Thêm hỗ trợ update từ pre-release nội bộ `0.1.44 -> 0.1.50`.
- Thêm `clisbot timezone get|set|clear|doctor` cho timezone mặc định ở mức app.
- Thêm các lệnh timezone theo scope cho agent, route, và từng bot cụ thể.
- Thêm `control.queue.maxPendingItemsPerSession` dạng tùy chọn; nếu bỏ qua, default hiện tại vẫn là `20`.

#### Thay đổi

- Chuẩn hóa stored bot config quanh `directMessages` và `groups` với raw provider-local id cộng `*`.
- Chuẩn hóa CLI route id quanh `dm:<id>`, `dm:*`, `group:<id>`, `group:*`, và `topic:<chatId>:<topicId>`.
- Giữ `channel:<id>` của Slack, `groups:*`, và các wildcard form cũ như input tương thích cho config đã phát hành từ `0.1.43` và các thói quen CLI cũ hơn.
- Di chuyển timezone default cũ vào `app.timezone` và loại bỏ các trường timezone default cũ.
- Tách workspace bootstrap mặc định ra khỏi các template tham chiếu OpenClaw bằng cách chuyển việc đọc bootstrap runtime sang `templates/default`.
- Giữ exact shared route không có sender policy tường minh sẽ kế thừa `groups["*"].policy` thay vì đóng dấu `policy: open` khắp nơi.

#### Sửa lỗi

- Sửa migration của exact shared route kiểu cũ vốn trước đây có thể thành `policy: disabled` trong lúc normalize.
- Sửa thứ tự của wildcard `directMessages["*"]` và `groups["*"]` để các default policy node tiếp tục đứng trước.
- Sửa tạo exact DM route sau khi wildcard bị reorder.
- Sửa persistence của mode ở Telegram topic để các override như streaming, response-mode, hoặc additional-message ở mức topic vẫn giữ được admission flag của parent route thay vì reset chúng trong lần rewrite config kế tiếp.

### DX

#### Thêm mới

- Thêm prompt guidance để AI có thể tự khám phá, bảo agent inspect `clisbot loops --help` khi gặp yêu cầu về lịch, loop, hay reminder.
- Thêm bootstrap guidance mặc định bảo agent xác nhận timezone và local time trước khi ghi chú liên quan tới timezone.

#### Thay đổi

- Cập nhật README, setup docs, release docs, task docs, và CLI help để route id, ví dụ policy, hành vi timezone, và trạng thái Gemini khớp với runtime hiện tại.

## Thay đổi phi chức năng

### Stability

#### Thay đổi

- Nới cách xử lý timeout lúc channel startup cho các lần bắt tay Slack Socket Mode chậm hơn.
- Đóng băng effective timezone đã được resolve trên record loop theo lịch, để việc đổi timezone config về sau không âm thầm làm dời lịch hiện có.

#### Sửa lỗi

- Sửa prompt đầu tiên của loop trong fresh Codex tmux pane.
- Tăng default startup window của Codex và Claude lên bằng mặc định 15 giây của Gemini, để các CLI chạy chậm không làm scheduled loop kẹt ngay sau start notification.
- Sửa một regression ở stale-runner resume, nơi `/status` của Codex hiển thị session id nhưng đường làm sạch transcript lại bỏ hàng boxed status trước khi persist.
- Sửa regression ở stale-runner startup retry, nơi clisbot xóa stored native session id khi restart tmux, dù mapping logic của session lẽ ra phải sống qua việc dọn tiến trình runner.
- Sửa cô lập cross-topic/session cho Telegram topic.
- Sửa render running preview để nội dung stream giữ được active timer mới nhất.
- Sửa việc trích pane content cũ của tmux trong snapshot lúc đang chạy và lúc hoàn tất.
- Sửa xử lý workspace-trust bị trễ để tmux runner chấp nhận lại trust prompt đang hoạt động của Codex, Claude, hoặc Gemini trước prompt đầu tiên theo route hoặc về sau nếu màn hình đó xuất hiện sau startup.
- Sửa false failure của `clisbot restart` trong lúc update hoặc restart khi `stop` hết timeout nhưng monitor thoát ngay sau đó; restart giờ recheck runtime status ngắn rồi mới tiếp tục `start` khi service thực sự đã dừng.
- Sửa hành vi retry của `/new` trên live-runner để clisbot retry capture session-id mà không submit mù `/new` lần nữa, và đưa ra một phản hồi lỗi nhìn thấy được cho người dùng khi capture hoặc persistence vẫn thất bại.
- Sửa việc reconcile active-run và queue cho operator để các projection `running` cũ bị xóa khi tmux session đã mất hoặc session thực sự idle.

### Security

#### Security

- Làm cứng việc enforce ngữ cảnh chat dùng chung policy để message của topic bị disabled không rơi về routing của parent group.
- Làm cứng prompt guidance bằng một bước kiểm tra quyền read-only trước các hành động nhạy cảm hoặc thay đổi cấu hình clisbot.
- Giữ `blockUsers` luôn ưu tiên hơn việc owner/admin bypass allowlist trong các group đã admit.

### Architecture Conformance

#### Thay đổi

- Giữ identity của topic, sender/ngữ cảnh chat prompt context, route policy, và loop delivery khớp với ranh giới tách lớp giữa channel/configuration/agents.
- Giữ các bản ghi surface-directory đã được persist dưới dạng structured id và display metadata, không phải text đã render cho prompt.

## Ghi chú cập nhật

```text
Update path: direct
```
