ds-harness-remote 0.4.26 → 0.5.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.
- package/README.md +6 -6
- package/dist/acp/adapter.d.ts +19 -0
- package/dist/acp/adapter.d.ts.map +1 -0
- package/dist/acp/adapter.js +14 -0
- package/dist/acp/adapter.js.map +1 -0
- package/dist/acp/adapters/antigravity/executor.d.ts +20 -0
- package/dist/acp/adapters/antigravity/executor.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/executor.js +99 -0
- package/dist/acp/adapters/antigravity/executor.js.map +1 -0
- package/dist/acp/adapters/antigravity/image-store.d.ts +9 -0
- package/dist/acp/adapters/antigravity/image-store.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/image-store.js +116 -0
- package/dist/acp/adapters/antigravity/image-store.js.map +1 -0
- package/dist/acp/adapters/antigravity/index.d.ts +5 -0
- package/dist/acp/adapters/antigravity/index.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/index.js +5 -0
- package/dist/acp/adapters/antigravity/index.js.map +1 -0
- package/dist/acp/adapters/antigravity/models.d.ts +35 -0
- package/dist/acp/adapters/antigravity/models.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/models.js +59 -0
- package/dist/acp/adapters/antigravity/models.js.map +1 -0
- package/dist/acp/adapters/antigravity/service.d.ts +35 -0
- package/dist/acp/adapters/antigravity/service.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/service.js +67 -0
- package/dist/acp/adapters/antigravity/service.js.map +1 -0
- package/dist/acp/adapters/antigravity/transcript-loader.d.ts +21 -0
- package/dist/acp/adapters/antigravity/transcript-loader.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/transcript-loader.js +356 -0
- package/dist/acp/adapters/antigravity/transcript-loader.js.map +1 -0
- package/dist/acp/adapters/antigravity/transcript-watcher.d.ts +28 -0
- package/dist/acp/adapters/antigravity/transcript-watcher.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/transcript-watcher.js +157 -0
- package/dist/acp/adapters/antigravity/transcript-watcher.js.map +1 -0
- package/dist/acp/adapters/antigravity/types.d.ts +56 -0
- package/dist/acp/adapters/antigravity/types.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity/types.js +2 -0
- package/dist/acp/adapters/antigravity/types.js.map +1 -0
- package/dist/acp/adapters/antigravity-process.d.ts +69 -0
- package/dist/acp/adapters/antigravity-process.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity-process.js +566 -0
- package/dist/acp/adapters/antigravity-process.js.map +1 -0
- package/dist/acp/adapters/antigravity.d.ts +8 -0
- package/dist/acp/adapters/antigravity.d.ts.map +1 -0
- package/dist/acp/adapters/antigravity.js +9 -0
- package/dist/acp/adapters/antigravity.js.map +1 -0
- package/dist/acp/adapters/cursor-process.d.ts +75 -0
- package/dist/acp/adapters/cursor-process.d.ts.map +1 -0
- package/dist/acp/adapters/cursor-process.js +273 -0
- package/dist/acp/adapters/cursor-process.js.map +1 -0
- package/dist/acp/adapters/cursor.d.ts +8 -0
- package/dist/acp/adapters/cursor.d.ts.map +1 -0
- package/dist/acp/adapters/cursor.js +8 -0
- package/dist/acp/adapters/cursor.js.map +1 -0
- package/dist/acp/gateway.d.ts +108 -0
- package/dist/acp/gateway.d.ts.map +1 -0
- package/dist/acp/gateway.js +1040 -0
- package/dist/acp/gateway.js.map +1 -0
- package/dist/acp/image-content.d.ts +19 -0
- package/dist/acp/image-content.d.ts.map +1 -0
- package/dist/acp/image-content.js +76 -0
- package/dist/acp/image-content.js.map +1 -0
- package/dist/acp/method-policy.d.ts +239 -0
- package/dist/acp/method-policy.d.ts.map +1 -0
- package/dist/acp/method-policy.js +102 -0
- package/dist/acp/method-policy.js.map +1 -0
- package/dist/acp/peer-bridge.d.ts +59 -0
- package/dist/acp/peer-bridge.d.ts.map +1 -0
- package/dist/acp/peer-bridge.js +367 -0
- package/dist/acp/peer-bridge.js.map +1 -0
- package/dist/acp/virtual-harness.d.ts +181 -0
- package/dist/acp/virtual-harness.d.ts.map +1 -0
- package/dist/acp/virtual-harness.js +1556 -0
- package/dist/acp/virtual-harness.js.map +1 -0
- package/dist/acp/workspace-tools.d.ts +13 -0
- package/dist/acp/workspace-tools.d.ts.map +1 -0
- package/dist/acp/workspace-tools.js +46 -0
- package/dist/acp/workspace-tools.js.map +1 -0
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +1 -0
- package/dist/acp.js.map +1 -1
- package/dist/api-proxy-switch.d.ts +2 -0
- package/dist/api-proxy-switch.d.ts.map +1 -1
- package/dist/api-proxy-switch.js +9 -0
- package/dist/api-proxy-switch.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/client-runtime.d.ts +25 -1
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +222 -8
- package/dist/client-runtime.js.map +1 -1
- package/dist/client.github.js +327 -190
- package/dist/client.js +327 -190
- package/dist/client.js.map +1 -1
- package/dist/codex/domain.d.ts +4 -1
- package/dist/codex/domain.d.ts.map +1 -1
- package/dist/codex/domain.js +54 -4
- package/dist/codex/domain.js.map +1 -1
- package/dist/codex/virtual-harness.d.ts.map +1 -1
- package/dist/codex/virtual-harness.js +3 -0
- package/dist/codex/virtual-harness.js.map +1 -1
- package/dist/codex-workspace-bridge.d.ts +7 -105
- package/dist/codex-workspace-bridge.d.ts.map +1 -1
- package/dist/codex-workspace-bridge.js +10 -498
- package/dist/codex-workspace-bridge.js.map +1 -1
- package/dist/config.d.ts +28 -10
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +49 -5
- package/dist/config.js.map +1 -1
- package/dist/connection-controller.d.ts.map +1 -1
- package/dist/connection-controller.js +7 -4
- package/dist/connection-controller.js.map +1 -1
- package/dist/control-runtime.d.ts +1 -0
- package/dist/control-runtime.d.ts.map +1 -1
- package/dist/control-runtime.js +65 -10
- package/dist/control-runtime.js.map +1 -1
- package/dist/harness-version.d.ts.map +1 -1
- package/dist/harness-version.js +16 -3
- package/dist/harness-version.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13197 -8204
- package/dist/index.js.map +4 -4
- package/dist/loopback-host.d.ts +2 -2
- package/dist/loopback-host.d.ts.map +1 -1
- package/dist/loopback-host.js +41 -16
- package/dist/loopback-host.js.map +1 -1
- package/dist/remote-typert-gateway.d.ts.map +1 -1
- package/dist/remote-typert-gateway.js +7 -4
- package/dist/remote-typert-gateway.js.map +1 -1
- package/dist/rpc-router.d.ts +6 -5
- package/dist/rpc-router.d.ts.map +1 -1
- package/dist/rpc-router.js +49 -18
- package/dist/rpc-router.js.map +1 -1
- package/dist/server-api.d.ts +2 -0
- package/dist/server-api.d.ts.map +1 -1
- package/dist/server-api.js +5 -0
- package/dist/server-api.js.map +1 -1
- package/dist/server-connection.d.ts.map +1 -1
- package/dist/server-connection.js +15 -0
- package/dist/server-connection.js.map +1 -1
- package/dist/service.d.ts +30 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +114 -12
- package/dist/service.js.map +1 -1
- package/dist/session-format-compat.d.ts +1 -0
- package/dist/session-format-compat.d.ts.map +1 -1
- package/dist/session-format-compat.js +14 -0
- package/dist/session-format-compat.js.map +1 -1
- package/dist/tui-command.js +2 -0
- package/dist/tui-command.js.map +1 -1
- package/dist/typert-gateway-switch.d.ts +2 -0
- package/dist/typert-gateway-switch.d.ts.map +1 -1
- package/dist/typert-gateway-switch.js +16 -0
- package/dist/typert-gateway-switch.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/workspace-bridge.d.ts +117 -0
- package/dist/workspace-bridge.d.ts.map +1 -0
- package/dist/workspace-bridge.js +512 -0
- package/dist/workspace-bridge.js.map +1 -0
- package/dsh-plugin.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ Continue DeepSeek Harness sessions and experimental Codex workspaces from anothe
|
|
|
19
19
|
Add the current package version to the `web` profile, then restart Harness:
|
|
20
20
|
|
|
21
21
|
```sh
|
|
22
|
-
dsh plugin --profile web add -w ds-harness-remote@0.
|
|
22
|
+
dsh plugin --profile web add -w ds-harness-remote@0.5.0
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
### dsh-TUI Host
|
|
@@ -27,7 +27,7 @@ dsh plugin --profile web add -w ds-harness-remote@0.4.26
|
|
|
27
27
|
Remote can also run as a Host in a terminal-only [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI) profile:
|
|
28
28
|
|
|
29
29
|
```sh
|
|
30
|
-
dsh plugin --profile dsh-tui add -w ds-harness-remote@0.
|
|
30
|
+
dsh plugin --profile dsh-tui add -w ds-harness-remote@0.5.0
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
After starting dsh-TUI, manage Remote with `/remote`, `/remote login`, `/remote status`, and `/remote logout`.
|
|
@@ -44,13 +44,13 @@ After starting dsh-TUI, manage Remote with `/remote`, `/remote login`, `/remote
|
|
|
44
44
|
|
|
45
45
|
## Compatibility
|
|
46
46
|
|
|
47
|
-
Plugin `0.
|
|
47
|
+
Plugin `0.5.0` targets DeepSeek Harness `dsh-v0.2.0-rc.2` and retains `dsh-v0.1.7-rc.1` compatibility; it also supports `dsh-v0.1.6-alpha.2` and earlier settings hosts. It supports:
|
|
48
48
|
|
|
49
49
|
- `dsh-v0.1.1-rc.2` through the official legacy `ApiProxy`;
|
|
50
50
|
- `dsh-v0.1.2-alpha.1` through `dsh-v0.1.2-rc.1` through the official Typert Remote Gateway;
|
|
51
|
-
- `dsh-v0.1.5-rc.1`, `dsh-v0.1.6-alpha.1`, and `dsh-v0.2.0-rc.
|
|
51
|
+
- `dsh-v0.1.5-rc.1`, `dsh-v0.1.6-alpha.1`, and `dsh-v0.2.0-rc.2` Session V3 through the official Typert Remote Gateway.
|
|
52
52
|
|
|
53
|
-
The same package feature-detects the older settings registry and the `0.1.7-rc.1` and `0.2.0-rc.
|
|
53
|
+
The same package feature-detects the older settings registry and the `0.1.7-rc.1` and `0.2.0-rc.2` Volatile settings entry. Remote Web/Desktop and Android normalize released sessions that still report the retired `code` agent preset to `ptc`. The Host reads the running Harness version from the CLI entrypoint, or from the 0.2.0 Desktop shell's `@deepseek-ai/dsh-desktop-host` entrypoint when the Harness CLI package is only a sibling of that entrypoint inside `app.asar`.
|
|
54
54
|
|
|
55
55
|
## Self-hosted Server
|
|
56
56
|
|
|
@@ -62,7 +62,7 @@ This repository includes a minimal, single-account self-hosted Relay Server in [
|
|
|
62
62
|
- Account membership and the Host's locally pinned device identity must both authorize a connection.
|
|
63
63
|
- The Host creates outbound connections only; it does not listen on a public port.
|
|
64
64
|
- Remote does not expose general tool RPC, remote desktop, or file-mutation APIs.
|
|
65
|
-
- Interactive terminals are
|
|
65
|
+
- Interactive terminals are enabled by default and can be disabled in the Host-local Remote settings; they run as the Host user independently of Agent approvals.
|
|
66
66
|
|
|
67
67
|
## Documentation
|
|
68
68
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CursorAcpInbound, CursorAcpLike } from './adapters/cursor-process.js';
|
|
2
|
+
/**
|
|
3
|
+
* Backend adapter contract for the Host Agent ACP gateway (#65).
|
|
4
|
+
* Public Remote methods stay backend-neutral; adapters own runtime mapping.
|
|
5
|
+
*/
|
|
6
|
+
export type AcpBackendId = 'cursor' | 'antigravity' | (string & {});
|
|
7
|
+
export interface AcpBackendAdapter {
|
|
8
|
+
readonly id: AcpBackendId;
|
|
9
|
+
start(): Promise<void>;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
isReady(): boolean;
|
|
12
|
+
call(method: string, params: unknown, timeoutMs?: number): Promise<unknown>;
|
|
13
|
+
respond(id: string | number, result: unknown): Promise<void>;
|
|
14
|
+
respondError(id: string | number, code: number, message: string): Promise<void>;
|
|
15
|
+
onInbound(handler: (message: CursorAcpInbound) => void): () => void;
|
|
16
|
+
onUnavailable(handler: (code: string) => void): () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function adaptCursorProcess(process: CursorAcpLike, id?: AcpBackendId): AcpBackendAdapter;
|
|
19
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/acp/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEnF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEnE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAA;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,OAAO,IAAI,OAAO,CAAA;IAClB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3E,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/E,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACnE,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CAC3D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,GAAE,YAAuB,GAAG,iBAAiB,CAYzG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function adaptCursorProcess(process, id = 'cursor') {
|
|
2
|
+
return {
|
|
3
|
+
id,
|
|
4
|
+
start: () => process.start(),
|
|
5
|
+
close: () => process.close(),
|
|
6
|
+
isReady: () => process.isReady(),
|
|
7
|
+
call: (method, params, timeoutMs) => process.call(method, params, timeoutMs),
|
|
8
|
+
respond: (id, result) => process.respond(id, result),
|
|
9
|
+
respondError: (id, code, message) => process.respondError(id, code, message),
|
|
10
|
+
onInbound: handler => process.onInbound(handler),
|
|
11
|
+
onUnavailable: handler => process.onUnavailable(handler),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/acp/adapter.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,kBAAkB,CAAC,OAAsB,EAAE,KAAmB,QAAQ;IACpF,OAAO;QACL,EAAE;QACF,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QAChC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;QAC5E,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC;QACpD,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;QAC5E,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;QAChD,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;KACzD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ChildProcessWithoutNullStreams } from 'node:child_process';
|
|
2
|
+
import type { ExecutionOptions } from './types.js';
|
|
3
|
+
export interface SingleExecutionResult {
|
|
4
|
+
conversationId?: string;
|
|
5
|
+
output: string;
|
|
6
|
+
raw: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare class AntigravityExecutor {
|
|
9
|
+
private activeProcess?;
|
|
10
|
+
/**
|
|
11
|
+
* 非交互式调用:`agy -p "<prompt>" --output-format json`
|
|
12
|
+
*/
|
|
13
|
+
executeOnce(prompt: string, options?: ExecutionOptions): Promise<SingleExecutionResult>;
|
|
14
|
+
/**
|
|
15
|
+
* 启动常驻交互式流式子进程 (stream-json 管道模式)
|
|
16
|
+
*/
|
|
17
|
+
spawnStreamSession(options?: ExecutionOptions): ChildProcessWithoutNullStreams;
|
|
18
|
+
kill(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,8BAA8B,EAAE,MAAM,oBAAoB,CAAA;AAElG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,OAAO,CAAA;CACb;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAc;IAEpC;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,qBAAqB,CAAC;IAuEjC;;OAEG;IACH,kBAAkB,CAAC,OAAO,GAAE,gBAAqB,GAAG,8BAA8B;IAqBlF,IAAI,IAAI,IAAI;CAMb"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { resolveAntigravityBinary } from '../antigravity-process.js';
|
|
3
|
+
export class AntigravityExecutor {
|
|
4
|
+
activeProcess;
|
|
5
|
+
/**
|
|
6
|
+
* 非交互式调用:`agy -p "<prompt>" --output-format json`
|
|
7
|
+
*/
|
|
8
|
+
async executeOnce(prompt, options = {}) {
|
|
9
|
+
const args = ['-p', prompt, '--output-format', 'json'];
|
|
10
|
+
if (options.conversationId) {
|
|
11
|
+
args.push('--conversation', options.conversationId);
|
|
12
|
+
}
|
|
13
|
+
else if (options.continueLast) {
|
|
14
|
+
args.push('-c');
|
|
15
|
+
}
|
|
16
|
+
if (options.skipPermissions) {
|
|
17
|
+
args.push('--dangerously-skip-permissions');
|
|
18
|
+
}
|
|
19
|
+
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
20
|
+
args.push('--print-timeout', String(Math.floor(timeoutMs / 1000)));
|
|
21
|
+
const binary = resolveAntigravityBinary(options.binaryPath);
|
|
22
|
+
const child = spawn(binary, args, {
|
|
23
|
+
cwd: options.cwd ?? process.cwd(),
|
|
24
|
+
env: { ...process.env, ...options.env },
|
|
25
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
26
|
+
});
|
|
27
|
+
this.activeProcess = child;
|
|
28
|
+
let stdout = '';
|
|
29
|
+
let stderr = '';
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const timer = setTimeout(() => {
|
|
32
|
+
child.kill('SIGTERM');
|
|
33
|
+
reject(new Error(`Antigravity execution timed out after ${timeoutMs}ms`));
|
|
34
|
+
}, timeoutMs);
|
|
35
|
+
timer.unref?.();
|
|
36
|
+
child.stdout?.on('data', chunk => { stdout += chunk.toString('utf-8'); });
|
|
37
|
+
child.stderr?.on('data', chunk => { stderr += chunk.toString('utf-8'); });
|
|
38
|
+
child.on('error', err => {
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
this.activeProcess = undefined;
|
|
41
|
+
reject(err);
|
|
42
|
+
});
|
|
43
|
+
child.on('close', code => {
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
this.activeProcess = undefined;
|
|
46
|
+
if (code !== 0) {
|
|
47
|
+
return reject(new Error(`agy exited with code ${code}: ${stderr.trim()}`));
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(stdout);
|
|
51
|
+
const convId = typeof parsed.conversation_id === 'string'
|
|
52
|
+
? parsed.conversation_id
|
|
53
|
+
: options.conversationId;
|
|
54
|
+
const text = typeof parsed.content === 'string' ? parsed.content : stdout;
|
|
55
|
+
resolve({
|
|
56
|
+
conversationId: convId,
|
|
57
|
+
output: text,
|
|
58
|
+
raw: parsed,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
resolve({
|
|
63
|
+
conversationId: options.conversationId,
|
|
64
|
+
output: stdout,
|
|
65
|
+
raw: stdout,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 启动常驻交互式流式子进程 (stream-json 管道模式)
|
|
73
|
+
*/
|
|
74
|
+
spawnStreamSession(options = {}) {
|
|
75
|
+
const args = ['--input-format', 'stream-json', '--output-format', 'stream-json'];
|
|
76
|
+
if (options.conversationId) {
|
|
77
|
+
args.push('--conversation', options.conversationId);
|
|
78
|
+
}
|
|
79
|
+
else if (options.continueLast) {
|
|
80
|
+
args.push('-c');
|
|
81
|
+
}
|
|
82
|
+
if (options.skipPermissions) {
|
|
83
|
+
args.push('--dangerously-skip-permissions');
|
|
84
|
+
}
|
|
85
|
+
const binary = resolveAntigravityBinary(options.binaryPath);
|
|
86
|
+
return spawn(binary, args, {
|
|
87
|
+
cwd: options.cwd ?? process.cwd(),
|
|
88
|
+
env: { ...process.env, ...options.env },
|
|
89
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
kill() {
|
|
93
|
+
if (this.activeProcess && !this.activeProcess.killed) {
|
|
94
|
+
this.activeProcess.kill('SIGTERM');
|
|
95
|
+
this.activeProcess = undefined;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AcpImage } from '../../image-content.js';
|
|
2
|
+
export declare const AGY_IMAGE_ROOT: string;
|
|
3
|
+
export declare function prepareAgyImageDirectory(root?: string): Promise<string>;
|
|
4
|
+
export declare function stageAgyImages(sessionId: string, images: AcpImage[], root?: string): Promise<string[]>;
|
|
5
|
+
export declare function agyImagePrompt(text: string, paths: string[]): string;
|
|
6
|
+
export declare function stripAgyImageReferences(text: string): string;
|
|
7
|
+
export declare function agyImageReferences(text: string): string[];
|
|
8
|
+
export declare function readAgyImage(sessionId: string, path: string, root?: string): Promise<Record<string, unknown> | undefined>;
|
|
9
|
+
//# sourceMappingURL=image-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-store.d.ts","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/image-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmD,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKvG,eAAO,MAAM,cAAc,QAAwF,CAAA;AAWnH,wBAAsB,wBAAwB,CAAC,IAAI,SAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAGrF;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,SAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAI9G;AAsCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEpE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOzD;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,SAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAiBvI"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { promises as fs, realpathSync, constants } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join, basename } from 'node:path';
|
|
4
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
5
|
+
import { acpImageContent, parseAcpImage, imageByteLength } from '../../image-content.js';
|
|
6
|
+
const EXTENSIONS = { 'image/png': 'png', 'image/jpeg': 'jpg', 'image/webp': 'webp', 'image/gif': 'gif' };
|
|
7
|
+
const IMAGE_NAME = /^[0-9a-f-]{36}\.(png|jpg|webp|gif)$/;
|
|
8
|
+
const TTL = 24 * 60 * 60 * 1000;
|
|
9
|
+
export const AGY_IMAGE_ROOT = join(realpathSync(tmpdir()), `dsh-remote-agy-images-${process.getuid?.() ?? 'user'}`);
|
|
10
|
+
let stagingChain = Promise.resolve();
|
|
11
|
+
const sessionFolder = (sessionId) => createHash('sha256').update(sessionId).digest('hex');
|
|
12
|
+
async function privateDirectory(path) {
|
|
13
|
+
await fs.mkdir(path, { recursive: true, mode: 0o700 });
|
|
14
|
+
const info = await fs.lstat(path);
|
|
15
|
+
if (!info.isDirectory() || info.isSymbolicLink() || await fs.realpath(path) !== path
|
|
16
|
+
|| (process.getuid && (info.uid !== process.getuid() || (info.mode & 0o077) !== 0)))
|
|
17
|
+
throw new Error('Invalid AGY image cache directory.');
|
|
18
|
+
}
|
|
19
|
+
export async function prepareAgyImageDirectory(root = AGY_IMAGE_ROOT) {
|
|
20
|
+
await privateDirectory(root);
|
|
21
|
+
return root;
|
|
22
|
+
}
|
|
23
|
+
export function stageAgyImages(sessionId, images, root = AGY_IMAGE_ROOT) {
|
|
24
|
+
const result = stagingChain.then(() => stageImages(sessionId, images, root));
|
|
25
|
+
stagingChain = result.then(() => undefined, () => undefined);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
async function stageImages(sessionId, images, root) {
|
|
29
|
+
await prepareAgyImageDirectory(root);
|
|
30
|
+
// Only generated session directories are visited; symlinks are never followed.
|
|
31
|
+
let total = 0;
|
|
32
|
+
for (const entry of await fs.readdir(root)) {
|
|
33
|
+
if (!/^[0-9a-f]{64}$/.test(entry))
|
|
34
|
+
continue;
|
|
35
|
+
const dir = join(root, entry);
|
|
36
|
+
const info = await fs.lstat(dir);
|
|
37
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
38
|
+
continue;
|
|
39
|
+
for (const name of await fs.readdir(dir)) {
|
|
40
|
+
if (!IMAGE_NAME.test(name))
|
|
41
|
+
continue;
|
|
42
|
+
const path = join(dir, name);
|
|
43
|
+
const file = await fs.lstat(path);
|
|
44
|
+
if (!file.isFile() || file.isSymbolicLink())
|
|
45
|
+
continue;
|
|
46
|
+
if (Date.now() - file.mtimeMs > TTL)
|
|
47
|
+
await fs.unlink(path);
|
|
48
|
+
else
|
|
49
|
+
total += file.size;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const parsed = images.map(parseAcpImage);
|
|
53
|
+
if (total + parsed.reduce((sum, image) => sum + imageByteLength(image.data), 0) > 512 * 1024 * 1024)
|
|
54
|
+
throw new Error('AGY temporary image cache is full.');
|
|
55
|
+
const directory = join(root, sessionFolder(sessionId));
|
|
56
|
+
await privateDirectory(directory);
|
|
57
|
+
const paths = [];
|
|
58
|
+
try {
|
|
59
|
+
for (const image of parsed) {
|
|
60
|
+
const path = join(directory, `${randomUUID()}.${EXTENSIONS[image.mimeType]}`);
|
|
61
|
+
await fs.writeFile(path, Buffer.from(image.data, 'base64'), { flag: 'wx', mode: 0o600 });
|
|
62
|
+
paths.push(path);
|
|
63
|
+
}
|
|
64
|
+
return paths;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
await Promise.all(paths.map(path => fs.unlink(path).catch(() => undefined)));
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function agyImagePrompt(text, paths) {
|
|
72
|
+
return `${text}\n<AGY_REMOTE_IMAGES>\nUser attached images. Use view_file to inspect these images before answering.\n${JSON.stringify(paths)}\n</AGY_REMOTE_IMAGES>`;
|
|
73
|
+
}
|
|
74
|
+
export function stripAgyImageReferences(text) {
|
|
75
|
+
return text.replace(/\n?<AGY_REMOTE_IMAGES>[\s\S]*?<\/AGY_REMOTE_IMAGES>/g, '').trim();
|
|
76
|
+
}
|
|
77
|
+
export function agyImageReferences(text) {
|
|
78
|
+
const block = /<AGY_REMOTE_IMAGES>\n[^\n]*\n([^\n]+)\n<\/AGY_REMOTE_IMAGES>/.exec(text);
|
|
79
|
+
if (!block)
|
|
80
|
+
return [];
|
|
81
|
+
try {
|
|
82
|
+
const value = JSON.parse(block[1]);
|
|
83
|
+
return Array.isArray(value) && value.length <= 4 ? value.filter((path) => typeof path === 'string') : [];
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export async function readAgyImage(sessionId, path, root = AGY_IMAGE_ROOT) {
|
|
90
|
+
const name = basename(path);
|
|
91
|
+
if (!IMAGE_NAME.test(name) || path !== join(root, sessionFolder(sessionId), name))
|
|
92
|
+
return undefined;
|
|
93
|
+
try {
|
|
94
|
+
await privateDirectory(root);
|
|
95
|
+
await privateDirectory(join(root, sessionFolder(sessionId)));
|
|
96
|
+
const info = await fs.lstat(path);
|
|
97
|
+
if (!info.isFile() || info.isSymbolicLink() || info.size > 8 * 1024 * 1024 || Date.now() - info.mtimeMs > TTL)
|
|
98
|
+
return undefined;
|
|
99
|
+
const file = await fs.open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
100
|
+
try {
|
|
101
|
+
const current = await file.stat();
|
|
102
|
+
if (current.ino !== info.ino || current.dev !== info.dev || current.size !== info.size)
|
|
103
|
+
return undefined;
|
|
104
|
+
const mediaType = Object.entries(EXTENSIONS).find(([, ext]) => name.endsWith(`.${ext}`))?.[0];
|
|
105
|
+
const image = parseAcpImage({ type: 'image', mimeType: mediaType, data: (await file.readFile()).toString('base64') });
|
|
106
|
+
return acpImageContent(image, `agy-image:${name}`);
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
await file.close();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=image-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-store.js","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/image-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface AgySelection {
|
|
2
|
+
provider: 'antigravity';
|
|
3
|
+
model: string;
|
|
4
|
+
reasoningEffort?: string;
|
|
5
|
+
}
|
|
6
|
+
interface Model {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
reasoning?: {
|
|
10
|
+
efforts: Array<{
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
}>;
|
|
14
|
+
defaultEffort?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface AgyCatalog {
|
|
18
|
+
groups: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
models: Model[];
|
|
22
|
+
}>;
|
|
23
|
+
variants: Map<string, string>;
|
|
24
|
+
}
|
|
25
|
+
/** The catalog belongs to the running Host backend, like the CodeX model directory. */
|
|
26
|
+
export declare function cachedAgyModels(load: () => Promise<AgyCatalog>): () => Promise<AgyCatalog>;
|
|
27
|
+
/** Model identifiers and effort variants come from the installed CLI, never a static catalog. */
|
|
28
|
+
export declare function parseAgyModels(output: string): AgyCatalog;
|
|
29
|
+
export declare function readAgyModels(binary: string): Promise<AgyCatalog>;
|
|
30
|
+
export declare function agySelectionArgs(catalog: AgyCatalog, modelId: string, effort?: string): {
|
|
31
|
+
selection: AgySelection;
|
|
32
|
+
args: string[];
|
|
33
|
+
};
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/models.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE;AAClG,UAAU,KAAK;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;AAClI,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AAG3H,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAS1F;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAoBzD;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAKvE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAOnI"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const exec = promisify(execFile);
|
|
4
|
+
/** The catalog belongs to the running Host backend, like the CodeX model directory. */
|
|
5
|
+
export function cachedAgyModels(load) {
|
|
6
|
+
let catalog;
|
|
7
|
+
let pending;
|
|
8
|
+
return () => {
|
|
9
|
+
if (catalog)
|
|
10
|
+
return Promise.resolve(catalog);
|
|
11
|
+
pending ??= load().then(value => { catalog = value; return value; })
|
|
12
|
+
.finally(() => { pending = undefined; });
|
|
13
|
+
return pending;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Model identifiers and effort variants come from the installed CLI, never a static catalog. */
|
|
17
|
+
export function parseAgyModels(output) {
|
|
18
|
+
const models = new Map();
|
|
19
|
+
const variants = new Map();
|
|
20
|
+
for (const line of output.split(/\r?\n/)) {
|
|
21
|
+
const match = line.match(/^([A-Za-z0-9_.-]{1,128})\t([^\t]{1,256})$/);
|
|
22
|
+
if (!match)
|
|
23
|
+
continue;
|
|
24
|
+
const wireId = match[1];
|
|
25
|
+
const suffix = wireId.match(/-(low|medium|high|xhigh|max|thinking)$/)?.[1];
|
|
26
|
+
const effort = suffix ?? (/\(Thinking\)$/i.test(match[2]) ? 'thinking' : undefined);
|
|
27
|
+
const id = suffix ? wireId.slice(0, -(suffix.length + 1)) : wireId;
|
|
28
|
+
const model = models.get(id) ?? { id, name: match[2].replace(/\s+\((Low|Medium|High|Xhigh|Max|Thinking)\)$/i, '') };
|
|
29
|
+
if (effort) {
|
|
30
|
+
model.reasoning ??= { efforts: [], defaultEffort: effort };
|
|
31
|
+
if (!model.reasoning.efforts.some(item => item.id === effort))
|
|
32
|
+
model.reasoning.efforts.push({ id: effort, name: effort[0].toUpperCase() + effort.slice(1) });
|
|
33
|
+
}
|
|
34
|
+
models.set(id, model);
|
|
35
|
+
variants.set(`${id}/${effort ?? ''}`, wireId);
|
|
36
|
+
}
|
|
37
|
+
if (!models.size)
|
|
38
|
+
throw new Error('The installed AGY CLI did not return a model catalog.');
|
|
39
|
+
return { groups: [{ id: 'antigravity', name: 'Antigravity', models: [...models.values()] }], variants };
|
|
40
|
+
}
|
|
41
|
+
export async function readAgyModels(binary) {
|
|
42
|
+
try {
|
|
43
|
+
const result = await exec(binary, ['models'], { timeout: 30_000, maxBuffer: 1024 * 1024, encoding: 'utf8' });
|
|
44
|
+
return parseAgyModels(result.stdout);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new Error('The installed AGY model catalog is unavailable. Retry after checking the Host CLI.');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function agySelectionArgs(catalog, modelId, effort) {
|
|
51
|
+
const model = catalog.groups[0].models.find(item => item.id === modelId);
|
|
52
|
+
const chosenEffort = effort ?? model?.reasoning?.defaultEffort;
|
|
53
|
+
const wireId = catalog.variants.get(`${modelId}/${chosenEffort ?? ''}`);
|
|
54
|
+
if (!model || !wireId)
|
|
55
|
+
throw new Error('The selected AGY model or reasoning effort is unavailable.');
|
|
56
|
+
return { selection: { provider: 'antigravity', model: modelId, ...(chosenEffort ? { reasoningEffort: chosenEffort } : {}) },
|
|
57
|
+
args: ['--model', wireId, ...(chosenEffort && chosenEffort !== 'thinking' ? ['--effort', chosenEffort] : [])] };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AntigravityExecutor, type SingleExecutionResult } from './executor.js';
|
|
2
|
+
import { TranscriptWatcher } from './transcript-watcher.js';
|
|
3
|
+
import type { ExecutionOptions } from './types.js';
|
|
4
|
+
export declare class AntigravitySession {
|
|
5
|
+
readonly conversationId: string;
|
|
6
|
+
readonly watcher: TranscriptWatcher;
|
|
7
|
+
private readonly executor;
|
|
8
|
+
private readonly defaultOptions;
|
|
9
|
+
constructor(conversationId: string, watcher: TranscriptWatcher, executor: AntigravityExecutor, defaultOptions?: ExecutionOptions);
|
|
10
|
+
/**
|
|
11
|
+
* 发送 Prompt 并等待完成;期间 watcher 会持续抛出思考与工具调用事件
|
|
12
|
+
*/
|
|
13
|
+
prompt(text: string, options?: ExecutionOptions): Promise<SingleExecutionResult>;
|
|
14
|
+
close(): void;
|
|
15
|
+
}
|
|
16
|
+
export declare class AntigravityService {
|
|
17
|
+
private readonly executor;
|
|
18
|
+
constructor(executor?: AntigravityExecutor);
|
|
19
|
+
/**
|
|
20
|
+
* 创建新会话并执行首轮 Prompt
|
|
21
|
+
*/
|
|
22
|
+
createSession(initialPrompt: string, options?: ExecutionOptions): Promise<{
|
|
23
|
+
session: AntigravitySession;
|
|
24
|
+
result: SingleExecutionResult;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* 恢复已有会话
|
|
28
|
+
*/
|
|
29
|
+
resumeSession(conversationId: string, options?: ExecutionOptions): AntigravitySession;
|
|
30
|
+
/**
|
|
31
|
+
* 单次无状态执行
|
|
32
|
+
*/
|
|
33
|
+
executeOnce(prompt: string, options?: ExecutionOptions): Promise<SingleExecutionResult>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/acp/adapters/antigravity/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,qBAAa,kBAAkB;IAE3B,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC/B,QAAQ,CAAC,OAAO,EAAE,iBAAiB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAHtB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,iBAAiB,EAClB,QAAQ,EAAE,mBAAmB,EAC7B,cAAc,GAAE,gBAAqB;IAGxD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAW1F,KAAK,IAAI,IAAI;CAId;AAED,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,mBAA+C;IAEtF;;OAEG;IACG,aAAa,CACjB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,kBAAkB,CAAC;QAAC,MAAM,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAY1E;;OAEG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,kBAAkB;IASzF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAGlG"}
|
|
@@ -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
|