agy-mcp-bridge 0.1.15 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -411,6 +411,8 @@ Lưu ý bảo mật: nội dung yêu cầu và phản hồi được hiển th
411
411
 
412
412
  **Mức token (đèn cảnh báo):** Cài đặt → "Mức token" cho đặt hai mức, mặc định **không giới hạn**: mỗi task và mỗi ngày (theo giờ máy của bạn). Danh sách task hiện số token (`total_tokens` agy báo, hoặc input + output nếu không có) và đánh dấu "vượt mức" task nào quá mức; thẻ "Token hôm nay" ở trang Task đổi sang "Vượt mức" khi tổng ngày chạm mức. Đây **chỉ là đèn báo, không phải hạn mức thật và không dừng task**: `agy` không có lệnh nào cho bridge đọc hạn mức, và token của một task chỉ biết khi nó kết thúc. Mức lưu ở `.bridge-state/budget.json`, đổi không cần khởi động lại.
413
413
 
414
+ **Nhịp tim khi chờ (thử nghiệm):** nếu client gửi kèm `progressToken` (chuẩn MCP), `antigravity_task_wait` gửi một thông báo tiến độ mỗi 10 giây trong lúc giữ lệnh (nội dung là dòng `activity`). Client nào đặt lại đồng hồ timeout khi nhận tiến độ thì có thể chờ lâu hơn `tool_timeout_sec`; client không làm vậy thì bỏ qua và mọi thứ chạy như cũ. **Chưa biết Codex / Claude Code có đặt lại timeout theo tiến độ hay không**: cách thử là để `tool_timeout_sec` ở mức mặc định (60), đặt thời gian chờ 300 giây trong Cài đặt, giao một task chạy quá 1 phút và xem lệnh chờ có bị báo timeout không. Nếu vẫn timeout thì cần đặt `tool_timeout_sec` như trước. Không có token thì không gửi gì.
415
+
414
416
  - **Đây là mức dùng qua bridge, không phải hạn mức.** `agy` không có lệnh xem hạn mức còn lại và bridge không bịa ra con số đó; xem hạn mức trên tài khoản Antigravity của bạn.
415
417
  - Bridge **không biết trước** các trường bên trong `usage` (tên trường do `agy` quyết định): nó cộng mọi giá trị số; một vài tên phổ biến (`input_tokens`, `output_tokens`, `total_tokens`...) được dịch nhãn. Task nào kết quả không có `usage` thì ghi nhận là "không có", không phải 0.
416
418
  - Chỉ thống kê task bắt đầu từ bản có tính năng này trở đi. Số liệu usage không được gửi cho Codex/Claude (không tốn token).
@@ -515,6 +515,8 @@ export class TaskManager {
515
515
  }
516
516
  return this.get(id);
517
517
  }
518
+ /** How often a waiting client that asked for progress hears from the bridge. */
519
+ get progressIntervalMs() { return this.runtime.progressIntervalMs ?? 10000; }
518
520
  async wait(id) {
519
521
  const entry = this.entries.get(id);
520
522
  if (!entry)
@@ -41,8 +41,22 @@ export function createServer(manager, environment) {
41
41
  server.registerTool('antigravity_task_wait', {
42
42
  description: `Wait up to wait_seconds (1-${manager.maxWaitSeconds}, default ${manager.maxWaitSeconds}) for the task to finish, then return its status without logs. Returns early when the task ends; if still running, call again. Does not cancel the task.`,
43
43
  inputSchema: waitSchema, annotations: { readOnlyHint: true, openWorldHint: false }
44
- }, async ({ task_id, wait_seconds }) => guard(async () => {
45
- await manager.waitFor(task_id, manager.nextWaitSeconds(task_id, wait_seconds));
44
+ }, async ({ task_id, wait_seconds }, ctx) => guard(async () => {
45
+ // A client that sent a progress token gets a heartbeat while the wait is held. Clients that reset their tool timeout on progress can then
46
+ // wait far longer than tool_timeout_sec; clients that do not simply ignore it. Never sent without a token, and a failed send never fails the wait.
47
+ const token = ctx.mcpReq._meta?.progressToken;
48
+ let beats = 0;
49
+ const beat = token === undefined ? null : setInterval(() => {
50
+ beats += 1;
51
+ void ctx.mcpReq.notify({ method: 'notifications/progress', params: { progressToken: token, progress: beats, message: manager.activityNote(task_id) ?? 'Antigravity is still working' } }).catch(() => { });
52
+ }, manager.progressIntervalMs);
53
+ try {
54
+ await manager.waitFor(task_id, manager.nextWaitSeconds(task_id, wait_seconds));
55
+ }
56
+ finally {
57
+ if (beat)
58
+ clearInterval(beat);
59
+ }
46
60
  return withNextStep(manager.summary(task_id), manager.activityNote(task_id));
47
61
  }));
48
62
  server.registerTool('antigravity_task_output', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agy-mcp-bridge",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "Local authenticated HTTP MCP bridge that lets Codex and Claude Code delegate bounded coding tasks to the Antigravity CLI (agy)",
5
5
  "license": "MIT",
6
6
  "keywords": [