ai-task-board-bridge 1.0.0 → 1.1.0

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.
Files changed (71) hide show
  1. package/README.md +59 -20
  2. package/dist/antigravity-runtime/agy-client.d.ts +117 -0
  3. package/dist/antigravity-runtime/agy-client.d.ts.map +1 -0
  4. package/dist/antigravity-runtime/agy-client.js +437 -0
  5. package/dist/antigravity-runtime/agy-client.js.map +1 -0
  6. package/dist/antigravity-runtime/board-client.d.ts +88 -0
  7. package/dist/antigravity-runtime/board-client.d.ts.map +1 -0
  8. package/dist/antigravity-runtime/board-client.js +274 -0
  9. package/dist/antigravity-runtime/board-client.js.map +1 -0
  10. package/dist/antigravity-runtime/bridge.d.ts +63 -0
  11. package/dist/antigravity-runtime/bridge.d.ts.map +1 -0
  12. package/dist/antigravity-runtime/bridge.js +739 -0
  13. package/dist/antigravity-runtime/bridge.js.map +1 -0
  14. package/dist/antigravity-runtime/cli.d.ts +3 -0
  15. package/dist/antigravity-runtime/cli.d.ts.map +1 -0
  16. package/dist/antigravity-runtime/cli.js +84 -0
  17. package/dist/antigravity-runtime/cli.js.map +1 -0
  18. package/dist/antigravity-runtime/config.d.ts +33 -0
  19. package/dist/antigravity-runtime/config.d.ts.map +1 -0
  20. package/dist/antigravity-runtime/config.js +155 -0
  21. package/dist/antigravity-runtime/config.js.map +1 -0
  22. package/dist/antigravity-runtime/index.d.ts +8 -0
  23. package/dist/antigravity-runtime/index.d.ts.map +1 -0
  24. package/dist/antigravity-runtime/index.js +8 -0
  25. package/dist/antigravity-runtime/index.js.map +1 -0
  26. package/dist/antigravity-runtime/registry.d.ts +27 -0
  27. package/dist/antigravity-runtime/registry.d.ts.map +1 -0
  28. package/dist/antigravity-runtime/registry.js +115 -0
  29. package/dist/antigravity-runtime/registry.js.map +1 -0
  30. package/dist/antigravity-runtime/setup.d.ts +23 -0
  31. package/dist/antigravity-runtime/setup.d.ts.map +1 -0
  32. package/dist/antigravity-runtime/setup.js +493 -0
  33. package/dist/antigravity-runtime/setup.js.map +1 -0
  34. package/dist/antigravity-runtime/utils.d.ts +14 -0
  35. package/dist/antigravity-runtime/utils.d.ts.map +1 -0
  36. package/dist/antigravity-runtime/utils.js +118 -0
  37. package/dist/antigravity-runtime/utils.js.map +1 -0
  38. package/dist/app-server-client.d.ts +42 -0
  39. package/dist/app-server-client.d.ts.map +1 -1
  40. package/dist/app-server-client.js +10 -1
  41. package/dist/app-server-client.js.map +1 -1
  42. package/dist/bridge.d.ts.map +1 -1
  43. package/dist/bridge.js +13 -1
  44. package/dist/bridge.js.map +1 -1
  45. package/dist/cli.js +17 -3
  46. package/dist/cli.js.map +1 -1
  47. package/dist/installer.d.ts +2 -2
  48. package/dist/installer.d.ts.map +1 -1
  49. package/dist/installer.js +40 -8
  50. package/dist/installer.js.map +1 -1
  51. package/dist/kimi-runtime/board-client.d.ts +1 -0
  52. package/dist/kimi-runtime/board-client.d.ts.map +1 -1
  53. package/dist/kimi-runtime/board-client.js.map +1 -1
  54. package/dist/kimi-runtime/bridge.d.ts.map +1 -1
  55. package/dist/kimi-runtime/bridge.js +43 -2
  56. package/dist/kimi-runtime/bridge.js.map +1 -1
  57. package/dist/kimi-runtime/config.d.ts +2 -0
  58. package/dist/kimi-runtime/config.d.ts.map +1 -1
  59. package/dist/kimi-runtime/config.js +2 -0
  60. package/dist/kimi-runtime/config.js.map +1 -1
  61. package/dist/kimi-runtime/setup.d.ts.map +1 -1
  62. package/dist/kimi-runtime/setup.js +5 -7
  63. package/dist/kimi-runtime/setup.js.map +1 -1
  64. package/dist/kimi-runtime/web-goal-client.d.ts +32 -0
  65. package/dist/kimi-runtime/web-goal-client.d.ts.map +1 -0
  66. package/dist/kimi-runtime/web-goal-client.js +142 -0
  67. package/dist/kimi-runtime/web-goal-client.js.map +1 -0
  68. package/dist/setup.d.ts.map +1 -1
  69. package/dist/setup.js +5 -7
  70. package/dist/setup.js.map +1 -1
  71. package/package.json +2 -2
package/README.md CHANGED
@@ -2,15 +2,18 @@
2
2
 
3
3
  `ai-task-board-bridge` is the single public npm package for AI Task Board's
4
4
  device companions. Its interactive installer asks whether to install Codex
5
- Bridge, Kimi Bridge, or both. The two runtimes remain separate processes with
6
- separate Board Connections, tokens, working-directory allowlists, and systemd
7
- services.
5
+ Bridge, Kimi Bridge, Antigravity Bridge, or a combination. The three runtimes
6
+ remain separate processes with separate Board Connections, tokens,
7
+ working-directory allowlists, and systemd services.
8
8
 
9
9
  Codex Bridge starts the local `codex app-server` over stdio, discovers
10
10
  non-archived top-level Codex threads, maps each thread to a Board Session,
11
11
  receives reserved work, and streams supported progress back to the Board. Kimi
12
12
  Bridge starts the logged-in Kimi Code ACP server and manages real Kimi Sessions;
13
- it does not expose Kimi as a fake Codex model.
13
+ it does not expose Kimi as a fake Codex model. Antigravity Bridge drives the
14
+ logged-in Google Antigravity CLI (`agy`) through its official headless
15
+ `stream-json` interface and keeps per-Thread conversation continuity; it never
16
+ reads Google's private conversation databases.
14
17
 
15
18
  The Bridge uses the Board REST API and authenticated SSE directly. The Board
16
19
  MCP server is optional and is not required for Bridge operation.
@@ -21,22 +24,25 @@ Node.js 18 or newer is required. Run setup as the same OS user that owns the
21
24
  selected agent login and workspaces:
22
25
 
23
26
  ```bash
24
- npx --yes ai-task-board-bridge@1.0.0 setup
27
+ npx --yes ai-task-board-bridge@1.1.0 setup
25
28
  ```
26
29
 
27
- The first prompt offers `Codex Bridge`, `Kimi Bridge`, and `both`. Automation or
28
- repeat installs can bypass that first prompt:
30
+ The first prompt offers `Codex Bridge`, `Kimi Bridge`, `Antigravity Bridge`,
31
+ `both`, and `all`. Automation or repeat installs can bypass that first prompt:
29
32
 
30
33
  ```bash
31
- npx --yes ai-task-board-bridge@1.0.0 setup codex
32
- npx --yes ai-task-board-bridge@1.0.0 setup kimi
33
- npx --yes ai-task-board-bridge@1.0.0 setup both
34
+ npx --yes ai-task-board-bridge@1.1.0 setup codex
35
+ npx --yes ai-task-board-bridge@1.1.0 setup kimi
36
+ npx --yes ai-task-board-bridge@1.1.0 setup antigravity
37
+ npx --yes ai-task-board-bridge@1.1.0 setup both
38
+ npx --yes ai-task-board-bridge@1.1.0 setup all
34
39
  ```
35
40
 
36
- Installing both runs the two setup flows in sequence. Create a separate Board
37
- Connection with the matching platform for each runtime; a Codex token must not
38
- be reused for Kimi or vice versa. The public tarball embeds the private Kimi ACP
39
- runtime, so no second npm package needs to be published or installed.
41
+ Installing a combination runs the selected setup flows in sequence. Create a
42
+ separate Board Connection with the matching platform for each runtime; a token
43
+ for one runtime must not be reused for another. The public tarball embeds the
44
+ private Kimi and Antigravity runtimes, so no second npm package needs to be
45
+ published or installed.
40
46
 
41
47
  ### Codex setup
42
48
 
@@ -75,7 +81,7 @@ install a service:
75
81
  AI_TASK_BOARD_URL='https://board.example.com' \
76
82
  AI_TASK_BOARD_CONNECTION_TOKEN='atb_REPLACE_ME' \
77
83
  CODEX_WORKING_DIRECTORY='/path/to/a/safe/start-directory' \
78
- npx --yes ai-task-board-bridge@1.0.0 run codex
84
+ npx --yes ai-task-board-bridge@1.1.0 run codex
79
85
  ```
80
86
 
81
87
  > **High-risk foreground defaults:** when these values are omitted, the Bridge uses
@@ -93,7 +99,7 @@ scope with one exact existing-thread compatibility filter:
93
99
 
94
100
  ```bash
95
101
  CODEX_THREAD_ID='REPLACE_WITH_LOCAL_THREAD_ID' \
96
- npx --yes ai-task-board-bridge@1.0.0
102
+ npx --yes ai-task-board-bridge@1.1.0
97
103
  ```
98
104
 
99
105
  Bridge 0.7 and later can manage several exact working directories in one process:
@@ -101,7 +107,7 @@ Bridge 0.7 and later can manage several exact working directories in one process
101
107
  ```bash
102
108
  CODEX_WORKING_DIRECTORIES='[{"key":"main","name":"Main App","path":"/srv/main"},{"key":"docs","name":"Docs","path":"/srv/docs"}]' \
103
109
  CODEX_THREAD_SCOPE='cwd' \
104
- npx --yes ai-task-board-bridge@1.0.0
110
+ npx --yes ai-task-board-bridge@1.1.0
105
111
  ```
106
112
 
107
113
  The JSON array accepts 1 to 100 unique `{key,name?,path}` entries. Its first
@@ -266,12 +272,12 @@ strong token-isolation boundary. Use a separate UID and/or a token proxy when
266
272
  strong isolation is required. Board schema and `/api/ai/sessions/sync` must be
267
273
  upgraded before starting 0.8; there is no 404 fallback to the old registration
268
274
  API. On Linux, use `setup` for a pinned local runtime and systemd user service.
269
- On other platforms, pin version `1.0.0` in launchd or another process manager.
275
+ On other platforms, pin version `1.0.1` in launchd or another process manager.
270
276
  Run only one Bridge for the same device/Connection, and
271
277
  do not let another TUI, IDE, or automation writer submit turns to a managed
272
278
  thread at the same time.
273
279
 
274
- Use `npx --yes ai-task-board-bridge@1.0.0 --help` for the complete
280
+ Use `npx --yes ai-task-board-bridge@1.1.0 --help` for the complete
275
281
  environment-variable list.
276
282
 
277
283
  ## Kimi Bridge
@@ -290,7 +296,7 @@ AI_TASK_BOARD_CONNECTION_TOKEN='atb_REPLACE_ME' \
290
296
  KIMI_WORKING_DIRECTORY='/absolute/path/to/project' \
291
297
  KIMI_BRIDGE_MODE='auto' \
292
298
  KIMI_BRIDGE_APPROVAL_MODE='accept' \
293
- npx --yes ai-task-board-bridge@1.0.0 run kimi
299
+ npx --yes ai-task-board-bridge@1.1.0 run kimi
294
300
  ```
295
301
 
296
302
  `KIMI_WORKING_DIRECTORIES` accepts 1 to 100 unique exact
@@ -302,3 +308,36 @@ environment, and only final replies plus bounded completion metadata are
302
308
  uploaded. Interactive setup defaults to declining extra ACP permissions;
303
309
  `KIMI_BRIDGE_MODE=yolo` and `KIMI_BRIDGE_APPROVAL_MODE=accept` are explicit
304
310
  high-risk opt-ins.
311
+
312
+ ## Antigravity Bridge
313
+
314
+ Antigravity Bridge requires Google Antigravity CLI 1.1.8 or newer with an active
315
+ login (`agy update` upgrades; the interactive installer verifies the version) and
316
+ a dedicated Board Connection whose platform is `Antigravity`. Interactive setup
317
+ installs the separate `ai-task-board-antigravity-bridge.service`, stores its
318
+ token in a `0600` environment file, and stages the embedded Antigravity runtime
319
+ under the current user's XDG data directory.
320
+
321
+ Foreground or non-systemd operation uses the same public npm package:
322
+
323
+ ```bash
324
+ AI_TASK_BOARD_URL='https://board.example.com' \
325
+ AI_TASK_BOARD_CONNECTION_TOKEN='atb_REPLACE_ME' \
326
+ ANTIGRAVITY_WORKING_DIRECTORY='/absolute/path/to/project' \
327
+ ANTIGRAVITY_BRIDGE_MODE='auto' \
328
+ ANTIGRAVITY_BRIDGE_APPROVAL_MODE='accept' \
329
+ npx --yes ai-task-board-bridge@1.1.0 run antigravity
330
+ ```
331
+
332
+ `ANTIGRAVITY_WORKING_DIRECTORIES` accepts 1 to 100 unique exact
333
+ `{key,name?,path}` entries. The Bridge dynamically reports the `agy models`
334
+ catalog with `low`/`medium`/`high` reasoning efforts. Each Web Thread is a
335
+ stable local binding; the first claimed task creates the real agy conversation
336
+ and later turns resume it with `--conversation`. Web creation and deletion are
337
+ supported, rename stays hidden (no public headless rename API), and deleting a
338
+ Thread removes only the Bridge binding so local history is preserved. The Board
339
+ token is removed from the `agy` child environment, and only final replies plus
340
+ bounded completion metadata are uploaded.
341
+ `ANTIGRAVITY_BRIDGE_APPROVAL_MODE=accept` adds
342
+ `--dangerously-skip-permissions` and is a high-risk opt-in;
343
+ `ANTIGRAVITY_BRIDGE_SANDBOX=true` enables agy's terminal sandbox.
@@ -0,0 +1,117 @@
1
+ import type { AntigravityBridgeConfiguration } from "./config.js";
2
+ export declare const ANTIGRAVITY_MINIMUM_VERSION = "1.1.8";
3
+ export declare const AGY_STREAM_PROTOCOL = "agy-stream-json/v1";
4
+ export type InventoryModel = {
5
+ id: string;
6
+ model: string;
7
+ display_name: string;
8
+ description: string | null;
9
+ default_reasoning_effort: string | null;
10
+ supported_reasoning_efforts: Array<{
11
+ reasoning_effort: string;
12
+ description: string | null;
13
+ }>;
14
+ input_modalities: string[];
15
+ is_default: boolean;
16
+ };
17
+ export declare const ANTIGRAVITY_FALLBACK_MODEL_CATALOG: readonly InventoryModel[];
18
+ export type AgyUsage = {
19
+ input_tokens?: number;
20
+ output_tokens?: number;
21
+ thinking_tokens?: number;
22
+ cache_read_tokens?: number;
23
+ total_tokens?: number;
24
+ };
25
+ export type AgyInitEvent = {
26
+ conversation_id?: string;
27
+ cwd?: string;
28
+ tools?: string[];
29
+ permission_mode?: string;
30
+ model?: string;
31
+ agent?: string;
32
+ };
33
+ export type AgyStepUpdateEvent = {
34
+ conversation_id?: string;
35
+ step_index?: number;
36
+ state?: string;
37
+ step_type?: string;
38
+ text_delta?: string;
39
+ tool_name?: string;
40
+ duration_seconds?: number;
41
+ usage?: AgyUsage;
42
+ tool_info?: {
43
+ name?: string;
44
+ error?: unknown;
45
+ } | null;
46
+ };
47
+ export type AgyResultEvent = {
48
+ conversation_id?: string;
49
+ status?: string;
50
+ response?: string;
51
+ error?: string;
52
+ duration_seconds?: number;
53
+ num_turns?: number;
54
+ usage?: AgyUsage;
55
+ };
56
+ export type AgyPromptResult = {
57
+ conversationId: string | null;
58
+ response: string;
59
+ status: string;
60
+ model: string | null;
61
+ usage: AgyUsage | null;
62
+ durationSeconds: number | null;
63
+ numTurns: number | null;
64
+ toolCallCount: number;
65
+ failedToolCallCount: number;
66
+ checkpointCount: number;
67
+ };
68
+ export type AgyPromptOptions = {
69
+ cwd: string;
70
+ prompt: string;
71
+ conversationId?: string | null;
72
+ model?: string | null;
73
+ reasoningEffort?: string | null;
74
+ signal: AbortSignal;
75
+ onTextDelta?: (text: string) => void;
76
+ onConversationId?: (conversationId: string) => void;
77
+ };
78
+ export type AgyStreamState = {
79
+ conversationId: string | null;
80
+ initModel: string | null;
81
+ response: string;
82
+ status: string;
83
+ usage: AgyUsage | null;
84
+ durationSeconds: number | null;
85
+ numTurns: number | null;
86
+ toolCallCount: number;
87
+ failedToolCallCount: number;
88
+ checkpointCount: number;
89
+ sawResult: boolean;
90
+ };
91
+ export declare function initialAgyStreamState(conversationId: string | null): AgyStreamState;
92
+ /**
93
+ * Pure NDJSON event reducer for agy's documented stream-json output. Kept
94
+ * separate from the spawn plumbing so parsing stays unit-testable.
95
+ */
96
+ export declare function reduceAgyStreamEvent(state: AgyStreamState, event: Record<string, unknown>, hooks?: {
97
+ onTextDelta?: (text: string) => void;
98
+ onConversationId?: (conversationId: string) => void;
99
+ }): void;
100
+ type ModelListItem = {
101
+ id: string;
102
+ name: string;
103
+ isDefault?: boolean;
104
+ };
105
+ export declare function parseModelListText(raw: string): ModelListItem[];
106
+ export declare function inventoryModelFromListItem(item: ModelListItem, index: number): InventoryModel;
107
+ export declare class AgyClient {
108
+ private readonly configuration;
109
+ private versionValue;
110
+ constructor(configuration: Pick<AntigravityBridgeConfiguration, "agyBinary" | "agentMode" | "approvalMode" | "sandbox" | "printTimeoutMs">);
111
+ version(): Promise<string>;
112
+ ensureSupportedVersion(): Promise<void>;
113
+ modelCatalog(): Promise<InventoryModel[]>;
114
+ prompt(options: AgyPromptOptions): Promise<AgyPromptResult>;
115
+ }
116
+ export {};
117
+ //# sourceMappingURL=agy-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agy-client.d.ts","sourceRoot":"","sources":["../src/agy-client.ts"],"names":[],"mappings":"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"}