ds-harness-remote 0.4.27 → 0.5.1

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 (157) hide show
  1. package/README.md +27 -8
  2. package/dist/acp/adapter.d.ts +19 -0
  3. package/dist/acp/adapter.d.ts.map +1 -0
  4. package/dist/acp/adapter.js +14 -0
  5. package/dist/acp/adapter.js.map +1 -0
  6. package/dist/acp/adapters/antigravity/executor.d.ts +20 -0
  7. package/dist/acp/adapters/antigravity/executor.d.ts.map +1 -0
  8. package/dist/acp/adapters/antigravity/executor.js +99 -0
  9. package/dist/acp/adapters/antigravity/executor.js.map +1 -0
  10. package/dist/acp/adapters/antigravity/image-store.d.ts +9 -0
  11. package/dist/acp/adapters/antigravity/image-store.d.ts.map +1 -0
  12. package/dist/acp/adapters/antigravity/image-store.js +116 -0
  13. package/dist/acp/adapters/antigravity/image-store.js.map +1 -0
  14. package/dist/acp/adapters/antigravity/index.d.ts +5 -0
  15. package/dist/acp/adapters/antigravity/index.d.ts.map +1 -0
  16. package/dist/acp/adapters/antigravity/index.js +5 -0
  17. package/dist/acp/adapters/antigravity/index.js.map +1 -0
  18. package/dist/acp/adapters/antigravity/models.d.ts +35 -0
  19. package/dist/acp/adapters/antigravity/models.d.ts.map +1 -0
  20. package/dist/acp/adapters/antigravity/models.js +59 -0
  21. package/dist/acp/adapters/antigravity/models.js.map +1 -0
  22. package/dist/acp/adapters/antigravity/service.d.ts +35 -0
  23. package/dist/acp/adapters/antigravity/service.d.ts.map +1 -0
  24. package/dist/acp/adapters/antigravity/service.js +67 -0
  25. package/dist/acp/adapters/antigravity/service.js.map +1 -0
  26. package/dist/acp/adapters/antigravity/transcript-loader.d.ts +21 -0
  27. package/dist/acp/adapters/antigravity/transcript-loader.d.ts.map +1 -0
  28. package/dist/acp/adapters/antigravity/transcript-loader.js +356 -0
  29. package/dist/acp/adapters/antigravity/transcript-loader.js.map +1 -0
  30. package/dist/acp/adapters/antigravity/transcript-watcher.d.ts +28 -0
  31. package/dist/acp/adapters/antigravity/transcript-watcher.d.ts.map +1 -0
  32. package/dist/acp/adapters/antigravity/transcript-watcher.js +157 -0
  33. package/dist/acp/adapters/antigravity/transcript-watcher.js.map +1 -0
  34. package/dist/acp/adapters/antigravity/types.d.ts +56 -0
  35. package/dist/acp/adapters/antigravity/types.d.ts.map +1 -0
  36. package/dist/acp/adapters/antigravity/types.js +2 -0
  37. package/dist/acp/adapters/antigravity/types.js.map +1 -0
  38. package/dist/acp/adapters/antigravity-process.d.ts +69 -0
  39. package/dist/acp/adapters/antigravity-process.d.ts.map +1 -0
  40. package/dist/acp/adapters/antigravity-process.js +566 -0
  41. package/dist/acp/adapters/antigravity-process.js.map +1 -0
  42. package/dist/acp/adapters/antigravity.d.ts +8 -0
  43. package/dist/acp/adapters/antigravity.d.ts.map +1 -0
  44. package/dist/acp/adapters/antigravity.js +9 -0
  45. package/dist/acp/adapters/antigravity.js.map +1 -0
  46. package/dist/acp/adapters/cursor-process.d.ts +75 -0
  47. package/dist/acp/adapters/cursor-process.d.ts.map +1 -0
  48. package/dist/acp/adapters/cursor-process.js +273 -0
  49. package/dist/acp/adapters/cursor-process.js.map +1 -0
  50. package/dist/acp/adapters/cursor.d.ts +8 -0
  51. package/dist/acp/adapters/cursor.d.ts.map +1 -0
  52. package/dist/acp/adapters/cursor.js +8 -0
  53. package/dist/acp/adapters/cursor.js.map +1 -0
  54. package/dist/acp/gateway.d.ts +108 -0
  55. package/dist/acp/gateway.d.ts.map +1 -0
  56. package/dist/acp/gateway.js +1040 -0
  57. package/dist/acp/gateway.js.map +1 -0
  58. package/dist/acp/image-content.d.ts +19 -0
  59. package/dist/acp/image-content.d.ts.map +1 -0
  60. package/dist/acp/image-content.js +76 -0
  61. package/dist/acp/image-content.js.map +1 -0
  62. package/dist/acp/method-policy.d.ts +239 -0
  63. package/dist/acp/method-policy.d.ts.map +1 -0
  64. package/dist/acp/method-policy.js +102 -0
  65. package/dist/acp/method-policy.js.map +1 -0
  66. package/dist/acp/peer-bridge.d.ts +59 -0
  67. package/dist/acp/peer-bridge.d.ts.map +1 -0
  68. package/dist/acp/peer-bridge.js +367 -0
  69. package/dist/acp/peer-bridge.js.map +1 -0
  70. package/dist/acp/virtual-harness.d.ts +181 -0
  71. package/dist/acp/virtual-harness.d.ts.map +1 -0
  72. package/dist/acp/virtual-harness.js +1556 -0
  73. package/dist/acp/virtual-harness.js.map +1 -0
  74. package/dist/acp/workspace-tools.d.ts +13 -0
  75. package/dist/acp/workspace-tools.d.ts.map +1 -0
  76. package/dist/acp/workspace-tools.js +46 -0
  77. package/dist/acp/workspace-tools.js.map +1 -0
  78. package/dist/acp.d.ts.map +1 -1
  79. package/dist/acp.js +1 -0
  80. package/dist/acp.js.map +1 -1
  81. package/dist/api-proxy-switch.d.ts +2 -0
  82. package/dist/api-proxy-switch.d.ts.map +1 -1
  83. package/dist/api-proxy-switch.js +9 -0
  84. package/dist/api-proxy-switch.js.map +1 -1
  85. package/dist/cli.d.ts.map +1 -1
  86. package/dist/cli.js +4 -3
  87. package/dist/cli.js.map +1 -1
  88. package/dist/client-runtime.d.ts +14 -1
  89. package/dist/client-runtime.d.ts.map +1 -1
  90. package/dist/client-runtime.js +160 -8
  91. package/dist/client-runtime.js.map +1 -1
  92. package/dist/client.github.js +313 -143
  93. package/dist/client.js +313 -143
  94. package/dist/client.js.map +1 -1
  95. package/dist/codex/domain.d.ts +4 -1
  96. package/dist/codex/domain.d.ts.map +1 -1
  97. package/dist/codex/domain.js +32 -4
  98. package/dist/codex/domain.js.map +1 -1
  99. package/dist/codex/virtual-harness.d.ts.map +1 -1
  100. package/dist/codex/virtual-harness.js +3 -0
  101. package/dist/codex/virtual-harness.js.map +1 -1
  102. package/dist/codex-workspace-bridge.d.ts +7 -105
  103. package/dist/codex-workspace-bridge.d.ts.map +1 -1
  104. package/dist/codex-workspace-bridge.js +10 -498
  105. package/dist/codex-workspace-bridge.js.map +1 -1
  106. package/dist/config.d.ts +22 -10
  107. package/dist/config.d.ts.map +1 -1
  108. package/dist/config.js +45 -4
  109. package/dist/config.js.map +1 -1
  110. package/dist/connection-controller.d.ts.map +1 -1
  111. package/dist/connection-controller.js +7 -4
  112. package/dist/connection-controller.js.map +1 -1
  113. package/dist/control-runtime.d.ts +1 -0
  114. package/dist/control-runtime.d.ts.map +1 -1
  115. package/dist/control-runtime.js +49 -9
  116. package/dist/control-runtime.js.map +1 -1
  117. package/dist/harness-remote-bridge.d.ts +1 -1
  118. package/dist/harness-remote-bridge.d.ts.map +1 -1
  119. package/dist/harness-remote-bridge.js +4 -0
  120. package/dist/harness-remote-bridge.js.map +1 -1
  121. package/dist/index.d.ts +4 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +13177 -8303
  124. package/dist/index.js.map +4 -4
  125. package/dist/remote-typert-gateway.d.ts.map +1 -1
  126. package/dist/remote-typert-gateway.js +7 -4
  127. package/dist/remote-typert-gateway.js.map +1 -1
  128. package/dist/rpc-router.d.ts +6 -5
  129. package/dist/rpc-router.d.ts.map +1 -1
  130. package/dist/rpc-router.js +49 -18
  131. package/dist/rpc-router.js.map +1 -1
  132. package/dist/server-connection.js +7 -0
  133. package/dist/server-connection.js.map +1 -1
  134. package/dist/service.d.ts +26 -0
  135. package/dist/service.d.ts.map +1 -1
  136. package/dist/service.js +97 -9
  137. package/dist/service.js.map +1 -1
  138. package/dist/session-format-compat.d.ts +1 -0
  139. package/dist/session-format-compat.d.ts.map +1 -1
  140. package/dist/session-format-compat.js +14 -0
  141. package/dist/session-format-compat.js.map +1 -1
  142. package/dist/tui-command.js +2 -0
  143. package/dist/tui-command.js.map +1 -1
  144. package/dist/typert-gateway-switch.d.ts +2 -0
  145. package/dist/typert-gateway-switch.d.ts.map +1 -1
  146. package/dist/typert-gateway-switch.js +16 -0
  147. package/dist/typert-gateway-switch.js.map +1 -1
  148. package/dist/version.d.ts +1 -1
  149. package/dist/version.d.ts.map +1 -1
  150. package/dist/version.js +1 -1
  151. package/dist/version.js.map +1 -1
  152. package/dist/workspace-bridge.d.ts +117 -0
  153. package/dist/workspace-bridge.d.ts.map +1 -0
  154. package/dist/workspace-bridge.js +512 -0
  155. package/dist/workspace-bridge.js.map +1 -0
  156. package/dsh-plugin.json +1 -1
  157. package/package.json +31 -32
@@ -0,0 +1,67 @@
1
+ import { AntigravityExecutor } from './executor.js';
2
+ import { TranscriptWatcher } from './transcript-watcher.js';
3
+ export class AntigravitySession {
4
+ conversationId;
5
+ watcher;
6
+ executor;
7
+ defaultOptions;
8
+ constructor(conversationId, watcher, executor, defaultOptions = {}) {
9
+ this.conversationId = conversationId;
10
+ this.watcher = watcher;
11
+ this.executor = executor;
12
+ this.defaultOptions = defaultOptions;
13
+ }
14
+ /**
15
+ * 发送 Prompt 并等待完成;期间 watcher 会持续抛出思考与工具调用事件
16
+ */
17
+ async prompt(text, options = {}) {
18
+ const merged = {
19
+ ...this.defaultOptions,
20
+ ...options,
21
+ conversationId: this.conversationId,
22
+ };
23
+ const result = await this.executor.executeOnce(text, merged);
24
+ await this.watcher.flush();
25
+ return result;
26
+ }
27
+ close() {
28
+ this.watcher.stop();
29
+ this.executor.kill();
30
+ }
31
+ }
32
+ export class AntigravityService {
33
+ executor;
34
+ constructor(executor = new AntigravityExecutor()) {
35
+ this.executor = executor;
36
+ }
37
+ /**
38
+ * 创建新会话并执行首轮 Prompt
39
+ */
40
+ async createSession(initialPrompt, options = {}) {
41
+ const result = await this.executor.executeOnce(initialPrompt, options);
42
+ const conversationId = result.conversationId || 'default';
43
+ const watcher = new TranscriptWatcher(conversationId);
44
+ watcher.start();
45
+ await watcher.flush();
46
+ const session = new AntigravitySession(conversationId, watcher, this.executor, options);
47
+ return { session, result };
48
+ }
49
+ /**
50
+ * 恢复已有会话
51
+ */
52
+ resumeSession(conversationId, options = {}) {
53
+ const watcher = new TranscriptWatcher(conversationId);
54
+ watcher.start();
55
+ return new AntigravitySession(conversationId, watcher, this.executor, {
56
+ ...options,
57
+ conversationId,
58
+ });
59
+ }
60
+ /**
61
+ * 单次无状态执行
62
+ */
63
+ async executeOnce(prompt, options = {}) {
64
+ return this.executor.executeOnce(prompt, options);
65
+ }
66
+ }
67
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA8B,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAG3D,MAAM,OAAO,kBAAkB;IAElB;IACA;IACQ;IACA;IAJnB,YACW,cAAsB,EACtB,OAA0B,EAClB,QAA6B,EAC7B,iBAAmC,EAAE;QAH7C,mBAAc,GAAd,cAAc,CAAQ;QACtB,YAAO,GAAP,OAAO,CAAmB;QAClB,aAAQ,GAAR,QAAQ,CAAqB;QAC7B,mBAAc,GAAd,cAAc,CAAuB;IACrD,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,UAA4B,EAAE;QACvD,MAAM,MAAM,GAAqB;YAC/B,GAAG,IAAI,CAAC,cAAc;YACtB,GAAG,OAAO;YACV,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAC1B,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,WAAgC,IAAI,mBAAmB,EAAE;QAAzD,aAAQ,GAAR,QAAQ,CAAiD;IAAG,CAAC;IAE1F;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,aAAqB,EACrB,UAA4B,EAAE;QAE9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;QACtE,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,SAAS,CAAA;QAEzD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,cAAc,CAAC,CAAA;QACrD,OAAO,CAAC,KAAK,EAAE,CAAA;QACf,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QAErB,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACvF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,cAAsB,EAAE,UAA4B,EAAE;QAClE,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,cAAc,CAAC,CAAA;QACrD,OAAO,CAAC,KAAK,EAAE,CAAA;QACf,OAAO,IAAI,kBAAkB,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE;YACpE,GAAG,OAAO;YACV,cAAc;SACf,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,UAA4B,EAAE;QAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ export interface HydratedSessionEvent {
2
+ type: 'event';
3
+ event: {
4
+ type: string;
5
+ seq: number;
6
+ time: number;
7
+ data: unknown;
8
+ surfaceOp?: 'append';
9
+ };
10
+ }
11
+ export declare function cleanUserPrompt(raw?: string): string;
12
+ export declare function loadTranscriptEvents(conversationId: string, sessionId: string, baseDir?: string): Promise<HydratedSessionEvent[]>;
13
+ export interface DiscoveredSession {
14
+ conversationId: string;
15
+ title: string;
16
+ createdAt: number;
17
+ updatedAt: number;
18
+ }
19
+ export declare function discoverAntigravityWorkspaces(dbPath?: string, baseDir?: string): Promise<string[]>;
20
+ export declare function discoverAntigravitySessions(workspacePath: string, limit?: number, baseDir?: string, dbPath?: string): Promise<DiscoveredSession[]>;
21
+ //# sourceMappingURL=transcript-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-loader.d.ts","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/transcript-loader.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,OAAO,CAAA;QACb,SAAS,CAAC,EAAE,QAAQ,CAAA;KACrB,CAAA;CACF;AAED,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAyD,GACjE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAqHjC;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAiCD,wBAAsB,6BAA6B,CACjD,MAAM,GAAE,MAA6E,EACrF,OAAO,GAAE,MAAyD,GACjE,OAAO,CAAC,MAAM,EAAE,CAAC,CA8CnB;AA0BD,wBAAsB,2BAA2B,CAC/C,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAAW,EAClB,OAAO,GAAE,MAAyD,EAClE,MAAM,GAAE,MAA6E,GACpF,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAkF9B"}
@@ -0,0 +1,356 @@
1
+ import { AGY_IMAGE_ROOT, stripAgyImageReferences, agyImageReferences, readAgyImage } from './image-store.js';
2
+ import { promises as fs } from 'node:fs';
3
+ import { MAX_AGENT_ACP_TRANSFER_BYTES } from '@dsh-remote/protocol';
4
+ import { isAbsolute, join, relative, resolve, sep } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { homedir } from 'node:os';
7
+ export function cleanUserPrompt(raw) {
8
+ if (!raw)
9
+ return '';
10
+ raw = stripAgyImageReferences(raw);
11
+ const match = raw.match(/<USER_REQUEST>([\s\S]*?)<\/USER_REQUEST>/);
12
+ if (match && match[1]) {
13
+ return match[1].trim();
14
+ }
15
+ return raw.trim();
16
+ }
17
+ export async function loadTranscriptEvents(conversationId, sessionId, baseDir = join(homedir(), '.gemini/antigravity-cli/brain')) {
18
+ let content = '';
19
+ try {
20
+ const filePath = await transcriptPath(baseDir, conversationId);
21
+ if (filePath === undefined || (await fs.stat(filePath)).size > MAX_AGENT_ACP_TRANSFER_BYTES)
22
+ return [];
23
+ content = await fs.readFile(filePath, 'utf-8');
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ const lines = content.split('\n');
29
+ const events = [];
30
+ let currentSeq = 0;
31
+ let currentTurn = 0;
32
+ let turnOpen = false;
33
+ const push = (type, data, time, surface = false) => {
34
+ events.push({
35
+ type: 'event',
36
+ event: {
37
+ type,
38
+ seq: currentSeq++,
39
+ time,
40
+ data,
41
+ ...(surface ? { surfaceOp: 'append' } : {}),
42
+ },
43
+ });
44
+ };
45
+ for (const line of lines) {
46
+ const trimmed = line.trim();
47
+ if (!trimmed)
48
+ continue;
49
+ let record;
50
+ try {
51
+ record = JSON.parse(trimmed);
52
+ }
53
+ catch {
54
+ continue;
55
+ }
56
+ const time = record.created_at ? new Date(record.created_at).getTime() : Date.now();
57
+ if (record.type === 'USER_INPUT') {
58
+ if (turnOpen) {
59
+ push('step/end', { turn: currentTurn, step: 1 }, time);
60
+ push('turn/end', { turn: currentTurn, reason: { kind: 'completed' } }, time);
61
+ turnOpen = false;
62
+ }
63
+ currentTurn += 1;
64
+ turnOpen = true;
65
+ push('turn/start', { turn: currentTurn }, time);
66
+ push('step/start', { turn: currentTurn, step: 1 }, time);
67
+ const text = cleanUserPrompt(record.content);
68
+ const images = (await Promise.all(agyImageReferences(record.content ?? '').map(path => readAgyImage(conversationId, path))))
69
+ .filter((image) => image !== undefined);
70
+ push('user/message', {
71
+ id: `user:${record.step_index}`,
72
+ role: 'user',
73
+ content: [...(text ? [{ type: 'text', text }] : []), ...images],
74
+ source: { kind: 'user' },
75
+ }, time, true);
76
+ }
77
+ else if (record.type === 'PLANNER_RESPONSE') {
78
+ if (!turnOpen) {
79
+ currentTurn += 1;
80
+ turnOpen = true;
81
+ push('turn/start', { turn: currentTurn }, time);
82
+ push('step/start', { turn: currentTurn, step: 1 }, time);
83
+ }
84
+ if (Array.isArray(record.tool_calls)) {
85
+ for (const call of record.tool_calls) {
86
+ const toolName = (typeof call.name === 'string' && call.name.length > 0) ? call.name : 'tool';
87
+ const callId = `${record.step_index}:${toolName}`;
88
+ push('tool/call', {
89
+ turn: currentTurn,
90
+ step: 1,
91
+ callId,
92
+ name: toolName,
93
+ arguments: typeof call.args === 'object' && call.args !== null ? JSON.stringify(call.args) : '{}',
94
+ toolCallId: callId,
95
+ toolName,
96
+ status: call.status === 'ERROR' ? 'failed' : 'finished',
97
+ }, time, false);
98
+ }
99
+ }
100
+ if (record.content && record.content.trim() !== '') {
101
+ const contentBlocks = [];
102
+ if (record.thinking && record.thinking.trim() !== '') {
103
+ contentBlocks.push({ type: 'reasoning', text: record.thinking.trim() });
104
+ }
105
+ contentBlocks.push({ type: 'text', text: record.content.trim() });
106
+ push('assistant/message', {
107
+ turn: currentTurn,
108
+ step: 1,
109
+ message: {
110
+ id: `${sessionId}:${record.step_index}`,
111
+ role: 'assistant',
112
+ content: contentBlocks,
113
+ },
114
+ // Harness trajectory timing expects every assistant message to carry
115
+ // an iterable stream, including messages restored from transcript.
116
+ stream: [],
117
+ }, time, true);
118
+ }
119
+ }
120
+ }
121
+ if (turnOpen) {
122
+ // Hydration must not extend a settled turn until the time of the read.
123
+ const settledAt = events.at(-1)?.event.time ?? Date.now();
124
+ push('step/end', { turn: currentTurn, step: 1 }, settledAt);
125
+ push('turn/end', { turn: currentTurn, reason: { kind: 'completed' } }, settledAt);
126
+ }
127
+ return events;
128
+ }
129
+ async function querySqliteJson(dbPath, sql, params = []) {
130
+ try {
131
+ const { DatabaseSync } = await import('node:sqlite');
132
+ const db = new DatabaseSync(dbPath, { readOnly: true });
133
+ try {
134
+ const stmt = db.prepare(sql);
135
+ const rows = stmt.all(...params);
136
+ return rows;
137
+ }
138
+ finally {
139
+ db.close();
140
+ }
141
+ }
142
+ catch {
143
+ // fallback to sqlite3 CLI
144
+ }
145
+ try {
146
+ const { execFile } = await import('node:child_process');
147
+ const { promisify } = await import('node:util');
148
+ const execFileAsync = promisify(execFile);
149
+ let formattedSql = sql;
150
+ for (const p of params) {
151
+ const val = typeof p === 'number' ? String(p) : `'${String(p).replace(/'/g, "''")}'`;
152
+ formattedSql = formattedSql.replace('?', val);
153
+ }
154
+ const { stdout } = await execFileAsync('sqlite3', [dbPath, '-json', formattedSql]);
155
+ return JSON.parse(stdout || '[]');
156
+ }
157
+ catch {
158
+ return [];
159
+ }
160
+ }
161
+ export async function discoverAntigravityWorkspaces(dbPath = join(homedir(), '.gemini/antigravity-cli/conversation_summaries.db'), baseDir = join(homedir(), '.gemini/antigravity-cli/brain')) {
162
+ try {
163
+ await fs.stat(dbPath);
164
+ }
165
+ catch {
166
+ return [];
167
+ }
168
+ const sql = "SELECT conversation_id, workspace_uris, step_count, title FROM conversation_summaries ORDER BY step_count DESC;";
169
+ const rows = await querySqliteJson(dbPath, sql);
170
+ const paths = new Set();
171
+ for (const row of rows) {
172
+ if (!row?.workspace_uris)
173
+ continue;
174
+ if (!(row.step_count && row.step_count > 0) && !row.title?.trim() && !await readTranscriptSummary(baseDir, row.conversation_id))
175
+ continue;
176
+ try {
177
+ const uris = JSON.parse(row.workspace_uris);
178
+ if (Array.isArray(uris)) {
179
+ for (const u of uris) {
180
+ if (typeof u === 'string' && u.startsWith('file://')) {
181
+ try {
182
+ const p = fileURLToPath(u);
183
+ const imageRelative = relative(AGY_IMAGE_ROOT, p);
184
+ const imageCache = imageRelative === '' || (!isAbsolute(imageRelative)
185
+ && imageRelative !== '..' && !imageRelative.startsWith(`..${sep}`));
186
+ if (!imageCache)
187
+ paths.add(p);
188
+ }
189
+ catch {
190
+ // ignore
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ catch {
197
+ // ignore
198
+ }
199
+ }
200
+ const verified = [];
201
+ for (const p of paths) {
202
+ try {
203
+ const s = await fs.stat(p);
204
+ if (s.isDirectory())
205
+ verified.push(p);
206
+ }
207
+ catch {
208
+ // ignore
209
+ }
210
+ }
211
+ return verified;
212
+ }
213
+ async function readTranscriptSummary(baseDir, conversationId) {
214
+ try {
215
+ const path = await transcriptPath(baseDir, conversationId);
216
+ if (path === undefined)
217
+ return undefined;
218
+ const stat = await fs.stat(path);
219
+ const handle = await fs.open(path, 'r');
220
+ try {
221
+ const buffer = Buffer.alloc(4096);
222
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
223
+ const firstLine = buffer.subarray(0, bytesRead).toString('utf-8').split('\n')[0];
224
+ if (!firstLine)
225
+ return undefined;
226
+ const record = JSON.parse(firstLine);
227
+ if (record.type !== 'USER_INPUT')
228
+ return undefined;
229
+ const title = cleanUserPrompt(record.content).split('\n')[0]?.trim().slice(0, 40) || (agyImageReferences(record.content ?? '').length > 0 ? 'Image' : undefined);
230
+ if (!title)
231
+ return undefined;
232
+ return { conversationId, title, createdAt: record.created_at ? new Date(record.created_at).getTime() : stat.mtimeMs, updatedAt: stat.mtimeMs };
233
+ }
234
+ finally {
235
+ await handle.close();
236
+ }
237
+ }
238
+ catch {
239
+ return undefined;
240
+ }
241
+ }
242
+ export async function discoverAntigravitySessions(workspacePath, limit = 30, baseDir = join(homedir(), '.gemini/antigravity-cli/brain'), dbPath = join(homedir(), '.gemini/antigravity-cli/conversation_summaries.db')) {
243
+ const requestedWorkspace = workspacePath.trim() === '' ? undefined : resolve(workspacePath);
244
+ // Database URIs provide workspace authority. Decode them before comparing so
245
+ // percent-encoded names, path separators, and similarly named projects stay distinct.
246
+ try {
247
+ await fs.stat(dbPath);
248
+ const rows = await querySqliteJson(dbPath, 'SELECT conversation_id, title, workspace_uris, step_count, last_modified_time FROM conversation_summaries ORDER BY last_modified_time DESC;');
249
+ const summaries = [];
250
+ for (const row of rows) {
251
+ if (requestedWorkspace !== undefined && !workspaceMatches(row.workspace_uris, requestedWorkspace))
252
+ continue;
253
+ const transcript = row.title?.trim() ? undefined : await readTranscriptSummary(baseDir, row.conversation_id);
254
+ if (!row.step_count && !row.title?.trim()) {
255
+ if (transcript !== undefined)
256
+ summaries.push(transcript);
257
+ continue;
258
+ }
259
+ const time = row.last_modified_time ? new Date(row.last_modified_time).getTime() : Date.now();
260
+ summaries.push({
261
+ conversationId: row.conversation_id,
262
+ title: row.title?.trim() || transcript?.title || 'Untitled Session',
263
+ createdAt: time,
264
+ updatedAt: time,
265
+ });
266
+ }
267
+ return summaries.sort((a, b) => b.updatedAt - a.updatedAt).slice(0, limit);
268
+ }
269
+ catch {
270
+ // Unscoped discovery may fall back to transcript scanning without a database.
271
+ }
272
+ // A transcript alone does not establish which project it belongs to.
273
+ if (requestedWorkspace !== undefined)
274
+ return [];
275
+ // 2. Fallback to filesystem scanning
276
+ let dirEntries;
277
+ try {
278
+ dirEntries = await fs.readdir(baseDir);
279
+ }
280
+ catch {
281
+ return [];
282
+ }
283
+ const results = [];
284
+ for (const entry of dirEntries) {
285
+ if (entry === 'tempmediaStorage' || !entry.includes('-'))
286
+ continue;
287
+ try {
288
+ const path = await transcriptPath(baseDir, entry);
289
+ if (path === undefined)
290
+ continue;
291
+ const s = await fs.stat(path);
292
+ const handle = await fs.open(path, 'r');
293
+ try {
294
+ const buf = Buffer.alloc(4096);
295
+ const { bytesRead } = await handle.read(buf, 0, 4096, 0);
296
+ const firstLine = buf.subarray(0, bytesRead).toString('utf-8').split('\n')[0];
297
+ if (firstLine) {
298
+ const parsed = JSON.parse(firstLine);
299
+ const rawPrompt = cleanUserPrompt(parsed.content);
300
+ const title = rawPrompt ? rawPrompt.split('\n')[0]?.trim().slice(0, 40) : undefined;
301
+ if (title) {
302
+ const createdAt = parsed.created_at ? new Date(parsed.created_at).getTime() : s.mtimeMs;
303
+ results.push({
304
+ conversationId: entry,
305
+ title,
306
+ createdAt,
307
+ updatedAt: s.mtimeMs,
308
+ });
309
+ }
310
+ }
311
+ }
312
+ finally {
313
+ await handle.close();
314
+ }
315
+ }
316
+ catch {
317
+ // ignore
318
+ }
319
+ }
320
+ results.sort((a, b) => b.updatedAt - a.updatedAt);
321
+ return results.slice(0, limit);
322
+ }
323
+ function workspaceMatches(rawUris, requestedWorkspace) {
324
+ if (rawUris === undefined)
325
+ return false;
326
+ try {
327
+ const uris = JSON.parse(rawUris);
328
+ return Array.isArray(uris) && uris.some(uri => {
329
+ if (typeof uri !== 'string')
330
+ return false;
331
+ try {
332
+ return resolve(fileURLToPath(uri)) === requestedWorkspace;
333
+ }
334
+ catch {
335
+ return false;
336
+ }
337
+ });
338
+ }
339
+ catch {
340
+ return false;
341
+ }
342
+ }
343
+ /** Remote conversation ids can select only a real transcript inside the AGY brain. */
344
+ async function transcriptPath(baseDir, conversationId) {
345
+ if (!/^[a-zA-Z0-9_-]{1,256}$/.test(conversationId))
346
+ return undefined;
347
+ try {
348
+ const root = await fs.realpath(baseDir);
349
+ const expected = join(root, conversationId, '.system_generated', 'logs', 'transcript.jsonl');
350
+ return await fs.realpath(expected) === expected ? expected : undefined;
351
+ }
352
+ catch {
353
+ return undefined;
354
+ }
355
+ }
356
+ //# sourceMappingURL=transcript-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-loader.js","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/transcript-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { AntigravityEvents } from './types.js';
3
+ export declare class TranscriptWatcher extends EventEmitter {
4
+ readonly conversationId: string;
5
+ readonly baseDir: string;
6
+ private offset;
7
+ private lineRemainder;
8
+ private pollTimer?;
9
+ private closed;
10
+ private readonly transcriptPath;
11
+ private readonly transcriptFullPath;
12
+ constructor(conversationId: string, baseDir?: string);
13
+ on<U extends keyof AntigravityEvents>(event: U, listener: AntigravityEvents[U]): this;
14
+ emit<U extends keyof AntigravityEvents>(event: U, ...args: Parameters<AntigravityEvents[U]>): boolean;
15
+ /**
16
+ * 启动增量文件监听
17
+ */
18
+ start(intervalMs?: number): void;
19
+ stop(): void;
20
+ /**
21
+ * 立即触发一次读取(同步/主动检查)
22
+ */
23
+ flush(): Promise<void>;
24
+ private readNewLines;
25
+ private parseAndDispatch;
26
+ private enrichFromFullTranscript;
27
+ }
28
+ //# sourceMappingURL=transcript-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-watcher.d.ts","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/transcript-watcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,YAAY,CAAA;AAElE,qBAAa,iBAAkB,SAAQ,YAAY;IAS/C,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM;IAT1B,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;gBAGhC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,MAAyD;IAQpE,EAAE,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIrF,IAAI,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;IAI9G;;OAEG;IACH,KAAK,CAAC,UAAU,SAAM,GAAG,IAAI;IAgB7B,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,YAAY;YA+BZ,gBAAgB;YAiDhB,wBAAwB;CAiBvC"}
@@ -0,0 +1,157 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { EventEmitter } from 'node:events';
4
+ import { homedir } from 'node:os';
5
+ export class TranscriptWatcher extends EventEmitter {
6
+ conversationId;
7
+ baseDir;
8
+ offset = 0;
9
+ lineRemainder = '';
10
+ pollTimer;
11
+ closed = false;
12
+ transcriptPath;
13
+ transcriptFullPath;
14
+ constructor(conversationId, baseDir = join(homedir(), '.gemini/antigravity-cli/brain')) {
15
+ super();
16
+ this.conversationId = conversationId;
17
+ this.baseDir = baseDir;
18
+ const brainDir = join(this.baseDir, conversationId, '.system_generated/logs');
19
+ this.transcriptPath = join(brainDir, 'transcript.jsonl');
20
+ this.transcriptFullPath = join(brainDir, 'transcript_full.jsonl');
21
+ }
22
+ on(event, listener) {
23
+ return super.on(event, listener);
24
+ }
25
+ emit(event, ...args) {
26
+ return super.emit(event, ...args);
27
+ }
28
+ /**
29
+ * 启动增量文件监听
30
+ */
31
+ start(intervalMs = 250) {
32
+ if (this.closed)
33
+ return;
34
+ const poll = async () => {
35
+ try {
36
+ await this.readNewLines();
37
+ }
38
+ catch {
39
+ // 文件可能尚未创建或临时锁占用,静默重试
40
+ }
41
+ if (!this.closed) {
42
+ this.pollTimer = setTimeout(poll, intervalMs);
43
+ this.pollTimer.unref?.();
44
+ }
45
+ };
46
+ void poll();
47
+ }
48
+ stop() {
49
+ this.closed = true;
50
+ if (this.pollTimer !== undefined) {
51
+ clearTimeout(this.pollTimer);
52
+ this.pollTimer = undefined;
53
+ }
54
+ }
55
+ /**
56
+ * 立即触发一次读取(同步/主动检查)
57
+ */
58
+ async flush() {
59
+ await this.readNewLines();
60
+ }
61
+ async readNewLines() {
62
+ let stat;
63
+ try {
64
+ stat = await fs.stat(this.transcriptPath);
65
+ }
66
+ catch {
67
+ return;
68
+ }
69
+ if (stat.size <= this.offset)
70
+ return;
71
+ const handle = await fs.open(this.transcriptPath, 'r');
72
+ try {
73
+ const bytesToRead = stat.size - this.offset;
74
+ const buffer = Buffer.alloc(bytesToRead);
75
+ const { bytesRead } = await handle.read(buffer, 0, bytesToRead, this.offset);
76
+ this.offset += bytesRead;
77
+ const text = this.lineRemainder + buffer.subarray(0, bytesRead).toString('utf-8');
78
+ const lines = text.split('\n');
79
+ this.lineRemainder = lines.pop() ?? '';
80
+ for (const line of lines) {
81
+ const trimmed = line.trim();
82
+ if (!trimmed)
83
+ continue;
84
+ await this.parseAndDispatch(trimmed);
85
+ }
86
+ }
87
+ finally {
88
+ await handle.close();
89
+ }
90
+ }
91
+ async parseAndDispatch(rawLine) {
92
+ let record;
93
+ try {
94
+ record = JSON.parse(rawLine);
95
+ }
96
+ catch {
97
+ return;
98
+ }
99
+ if (Array.isArray(record.truncated_fields) && record.truncated_fields.length > 0) {
100
+ record = await this.enrichFromFullTranscript(record);
101
+ }
102
+ this.emit('step', record);
103
+ if (record.type === 'PLANNER_RESPONSE') {
104
+ if (record.thinking && record.thinking.trim() !== '') {
105
+ this.emit('thinking', {
106
+ stepIndex: record.step_index,
107
+ thinking: record.thinking,
108
+ createdAt: record.created_at,
109
+ });
110
+ }
111
+ if (Array.isArray(record.tool_calls) && record.tool_calls.length > 0) {
112
+ this.emit('toolCall', {
113
+ stepIndex: record.step_index,
114
+ toolCalls: record.tool_calls,
115
+ createdAt: record.created_at,
116
+ });
117
+ }
118
+ if (record.content && record.content.trim() !== '') {
119
+ this.emit('message', {
120
+ stepIndex: record.step_index,
121
+ text: record.content,
122
+ createdAt: record.created_at,
123
+ });
124
+ }
125
+ }
126
+ else if (record.type === 'USER_INPUT' && record.content) {
127
+ this.emit('message', {
128
+ stepIndex: record.step_index,
129
+ text: record.content,
130
+ createdAt: record.created_at,
131
+ });
132
+ }
133
+ if (record.status === 'DONE' && record.type === 'PLANNER_RESPONSE') {
134
+ this.emit('complete', this.conversationId);
135
+ }
136
+ }
137
+ async enrichFromFullTranscript(record) {
138
+ try {
139
+ const content = await fs.readFile(this.transcriptFullPath, 'utf-8');
140
+ const lines = content.split('\n');
141
+ for (const line of lines) {
142
+ const trimmed = line.trim();
143
+ if (!trimmed)
144
+ continue;
145
+ const full = JSON.parse(trimmed);
146
+ if (full.step_index === record.step_index) {
147
+ return full;
148
+ }
149
+ }
150
+ }
151
+ catch {
152
+ // 容错降级
153
+ }
154
+ return record;
155
+ }
156
+ }
157
+ //# sourceMappingURL=transcript-watcher.js.map