@agentdeck/bridge 0.1.0 → 0.2.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.
- package/LICENSE +21 -0
- package/dist/adapters/claude-code.d.ts +11 -27
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +29 -123
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/codex-cli.d.ts +21 -0
- package/dist/adapters/codex-cli.d.ts.map +1 -0
- package/dist/adapters/codex-cli.js +53 -0
- package/dist/adapters/codex-cli.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +13 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/monitor.d.ts +34 -0
- package/dist/adapters/monitor.d.ts.map +1 -0
- package/dist/adapters/monitor.js +86 -0
- package/dist/adapters/monitor.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +36 -2
- package/dist/adapters/openclaw.d.ts.map +1 -1
- package/dist/adapters/openclaw.js +329 -59
- package/dist/adapters/openclaw.js.map +1 -1
- package/dist/adapters/opencode-adapter.d.ts +48 -0
- package/dist/adapters/opencode-adapter.d.ts.map +1 -0
- package/dist/adapters/opencode-adapter.js +345 -0
- package/dist/adapters/opencode-adapter.js.map +1 -0
- package/dist/adapters/pty-adapter.d.ts +56 -0
- package/dist/adapters/pty-adapter.d.ts.map +1 -0
- package/dist/adapters/pty-adapter.js +143 -0
- package/dist/adapters/pty-adapter.js.map +1 -0
- package/dist/adb-reverse.d.ts +25 -0
- package/dist/adb-reverse.d.ts.map +1 -0
- package/dist/adb-reverse.js +129 -0
- package/dist/adb-reverse.js.map +1 -0
- package/dist/antigravity-local.d.ts +7 -0
- package/dist/antigravity-local.d.ts.map +1 -0
- package/dist/antigravity-local.js +153 -0
- package/dist/antigravity-local.js.map +1 -0
- package/dist/apme/adapters/claude-hook.d.ts +15 -0
- package/dist/apme/adapters/claude-hook.d.ts.map +1 -0
- package/dist/apme/adapters/claude-hook.js +85 -0
- package/dist/apme/adapters/claude-hook.js.map +1 -0
- package/dist/apme/adapters/claude-pty.d.ts +28 -0
- package/dist/apme/adapters/claude-pty.d.ts.map +1 -0
- package/dist/apme/adapters/claude-pty.js +88 -0
- package/dist/apme/adapters/claude-pty.js.map +1 -0
- package/dist/apme/adapters/timeline.d.ts +16 -0
- package/dist/apme/adapters/timeline.d.ts.map +1 -0
- package/dist/apme/adapters/timeline.js +66 -0
- package/dist/apme/adapters/timeline.js.map +1 -0
- package/dist/apme/classifier.d.ts +53 -0
- package/dist/apme/classifier.d.ts.map +1 -0
- package/dist/apme/classifier.js +266 -0
- package/dist/apme/classifier.js.map +1 -0
- package/dist/apme/claude-transcript-reader.d.ts +38 -0
- package/dist/apme/claude-transcript-reader.d.ts.map +1 -0
- package/dist/apme/claude-transcript-reader.js +127 -0
- package/dist/apme/claude-transcript-reader.js.map +1 -0
- package/dist/apme/collector.d.ts +108 -0
- package/dist/apme/collector.d.ts.map +1 -0
- package/dist/apme/collector.js +659 -0
- package/dist/apme/collector.js.map +1 -0
- package/dist/apme/dashboard-html.d.ts +9 -0
- package/dist/apme/dashboard-html.d.ts.map +1 -0
- package/dist/apme/dashboard-html.js +416 -0
- package/dist/apme/dashboard-html.js.map +1 -0
- package/dist/apme/http.d.ts +19 -0
- package/dist/apme/http.d.ts.map +1 -0
- package/dist/apme/http.js +210 -0
- package/dist/apme/http.js.map +1 -0
- package/dist/apme/hw-sampler.d.ts +30 -0
- package/dist/apme/hw-sampler.d.ts.map +1 -0
- package/dist/apme/hw-sampler.js +106 -0
- package/dist/apme/hw-sampler.js.map +1 -0
- package/dist/apme/index.d.ts +43 -0
- package/dist/apme/index.d.ts.map +1 -0
- package/dist/apme/index.js +75 -0
- package/dist/apme/index.js.map +1 -0
- package/dist/apme/outcome.d.ts +48 -0
- package/dist/apme/outcome.d.ts.map +1 -0
- package/dist/apme/outcome.js +232 -0
- package/dist/apme/outcome.js.map +1 -0
- package/dist/apme/recommend.d.ts +32 -0
- package/dist/apme/recommend.d.ts.map +1 -0
- package/dist/apme/recommend.js +41 -0
- package/dist/apme/recommend.js.map +1 -0
- package/dist/apme/runner.d.ts +94 -0
- package/dist/apme/runner.d.ts.map +1 -0
- package/dist/apme/runner.js +812 -0
- package/dist/apme/runner.js.map +1 -0
- package/dist/apme/settings.d.ts +65 -0
- package/dist/apme/settings.d.ts.map +1 -0
- package/dist/apme/settings.js +97 -0
- package/dist/apme/settings.js.map +1 -0
- package/dist/apme/store.d.ts +99 -0
- package/dist/apme/store.d.ts.map +1 -0
- package/dist/apme/store.js +911 -0
- package/dist/apme/store.js.map +1 -0
- package/dist/apme/tuner.d.ts +64 -0
- package/dist/apme/tuner.d.ts.map +1 -0
- package/dist/apme/tuner.js +297 -0
- package/dist/apme/tuner.js.map +1 -0
- package/dist/apme/types.d.ts +11 -0
- package/dist/apme/types.d.ts.map +1 -0
- package/dist/apme/types.js +10 -0
- package/dist/apme/types.js.map +1 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +15 -5
- package/dist/auth.js.map +1 -1
- package/dist/bridge-core.d.ts +162 -0
- package/dist/bridge-core.d.ts.map +1 -0
- package/dist/bridge-core.js +627 -0
- package/dist/bridge-core.js.map +1 -0
- package/dist/check-deps.d.ts +3 -1
- package/dist/check-deps.d.ts.map +1 -1
- package/dist/check-deps.js +34 -13
- package/dist/check-deps.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1235 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-auth.d.ts +10 -0
- package/dist/codex-auth.d.ts.map +1 -0
- package/dist/codex-auth.js +63 -0
- package/dist/codex-auth.js.map +1 -0
- package/dist/codex-output-parser.d.ts +21 -0
- package/dist/codex-output-parser.d.ts.map +1 -0
- package/dist/codex-output-parser.js +253 -0
- package/dist/codex-output-parser.js.map +1 -0
- package/dist/d200h/hid-protocol.d.ts +62 -0
- package/dist/d200h/hid-protocol.d.ts.map +1 -0
- package/dist/d200h/hid-protocol.js +124 -0
- package/dist/d200h/hid-protocol.js.map +1 -0
- package/dist/d200h/image-renderer.d.ts +36 -0
- package/dist/d200h/image-renderer.d.ts.map +1 -0
- package/dist/d200h/image-renderer.js +487 -0
- package/dist/d200h/image-renderer.js.map +1 -0
- package/dist/daemon-server.d.ts +19 -0
- package/dist/daemon-server.d.ts.map +1 -0
- package/dist/daemon-server.js +1168 -0
- package/dist/daemon-server.js.map +1 -0
- package/dist/daemon-ws-client.d.ts +82 -0
- package/dist/daemon-ws-client.d.ts.map +1 -0
- package/dist/daemon-ws-client.js +179 -0
- package/dist/daemon-ws-client.js.map +1 -0
- package/dist/daemon.d.ts +10 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +56 -0
- package/dist/daemon.js.map +1 -0
- package/dist/display-monitor.d.ts +25 -0
- package/dist/display-monitor.d.ts.map +1 -0
- package/dist/display-monitor.js +143 -0
- package/dist/display-monitor.js.map +1 -0
- package/dist/esp32-serial.d.ts +112 -0
- package/dist/esp32-serial.d.ts.map +1 -0
- package/dist/esp32-serial.js +502 -0
- package/dist/esp32-serial.js.map +1 -0
- package/dist/gateway-probe.d.ts +12 -0
- package/dist/gateway-probe.d.ts.map +1 -0
- package/dist/gateway-probe.js +39 -0
- package/dist/gateway-probe.js.map +1 -0
- package/dist/hook-migration.d.ts +2 -0
- package/dist/hook-migration.d.ts.map +1 -0
- package/dist/hook-migration.js +104 -0
- package/dist/hook-migration.js.map +1 -0
- package/dist/hook-server.d.ts +29 -0
- package/dist/hook-server.d.ts.map +1 -1
- package/dist/hook-server.js +366 -8
- package/dist/hook-server.js.map +1 -1
- package/dist/index.d.ts +20 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1304 -562
- package/dist/index.js.map +1 -1
- package/dist/log-stream.d.ts +26 -0
- package/dist/log-stream.d.ts.map +1 -0
- package/dist/log-stream.js +111 -0
- package/dist/log-stream.js.map +1 -0
- package/dist/logger.d.ts +9 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +36 -5
- package/dist/logger.js.map +1 -1
- package/dist/mdns.d.ts +15 -1
- package/dist/mdns.d.ts.map +1 -1
- package/dist/mdns.js +143 -28
- package/dist/mdns.js.map +1 -1
- package/dist/mlx-probe.d.ts +14 -0
- package/dist/mlx-probe.d.ts.map +1 -0
- package/dist/mlx-probe.js +44 -0
- package/dist/mlx-probe.js.map +1 -0
- package/dist/model-catalog.d.ts +5 -3
- package/dist/model-catalog.d.ts.map +1 -1
- package/dist/model-catalog.js +45 -29
- package/dist/model-catalog.js.map +1 -1
- package/dist/modules/adb-module.d.ts +14 -0
- package/dist/modules/adb-module.d.ts.map +1 -0
- package/dist/modules/adb-module.js +36 -0
- package/dist/modules/adb-module.js.map +1 -0
- package/dist/modules/d200h-module.d.ts +43 -0
- package/dist/modules/d200h-module.d.ts.map +1 -0
- package/dist/modules/d200h-module.js +360 -0
- package/dist/modules/d200h-module.js.map +1 -0
- package/dist/modules/d200h-renderer.d.ts +7 -0
- package/dist/modules/d200h-renderer.d.ts.map +1 -0
- package/dist/modules/d200h-renderer.js +321 -0
- package/dist/modules/d200h-renderer.js.map +1 -0
- package/dist/modules/index.d.ts +23 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +65 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/mdns-module.d.ts +12 -0
- package/dist/modules/mdns-module.d.ts.map +1 -0
- package/dist/modules/mdns-module.js +21 -0
- package/dist/modules/mdns-module.js.map +1 -0
- package/dist/modules/pixoo-module.d.ts +8 -0
- package/dist/modules/pixoo-module.d.ts.map +1 -0
- package/dist/modules/pixoo-module.js +24 -0
- package/dist/modules/pixoo-module.js.map +1 -0
- package/dist/modules/serial-module.d.ts +18 -0
- package/dist/modules/serial-module.d.ts.map +1 -0
- package/dist/modules/serial-module.js +47 -0
- package/dist/modules/serial-module.js.map +1 -0
- package/dist/modules/types.d.ts +39 -0
- package/dist/modules/types.d.ts.map +1 -0
- package/dist/modules/types.js +2 -0
- package/dist/modules/types.js.map +1 -0
- package/dist/ollama-probe.d.ts +13 -0
- package/dist/ollama-probe.d.ts.map +1 -0
- package/dist/ollama-probe.js +46 -0
- package/dist/ollama-probe.js.map +1 -0
- package/dist/opencode-client.d.ts +126 -0
- package/dist/opencode-client.d.ts.map +1 -0
- package/dist/opencode-client.js +181 -0
- package/dist/opencode-client.js.map +1 -0
- package/dist/output-parser.d.ts +3 -0
- package/dist/output-parser.d.ts.map +1 -1
- package/dist/output-parser.js +29 -3
- package/dist/output-parser.js.map +1 -1
- package/dist/passive-observer.d.ts +38 -0
- package/dist/passive-observer.d.ts.map +1 -0
- package/dist/passive-observer.js +632 -0
- package/dist/passive-observer.js.map +1 -0
- package/dist/pixoo/pixoo-bridge.d.ts +50 -0
- package/dist/pixoo/pixoo-bridge.d.ts.map +1 -0
- package/dist/pixoo/pixoo-bridge.js +280 -0
- package/dist/pixoo/pixoo-bridge.js.map +1 -0
- package/dist/pixoo/pixoo-camera.d.ts +80 -0
- package/dist/pixoo/pixoo-camera.d.ts.map +1 -0
- package/dist/pixoo/pixoo-camera.js +271 -0
- package/dist/pixoo/pixoo-camera.js.map +1 -0
- package/dist/pixoo/pixoo-client.d.ts +67 -0
- package/dist/pixoo/pixoo-client.d.ts.map +1 -0
- package/dist/pixoo/pixoo-client.js +335 -0
- package/dist/pixoo/pixoo-client.js.map +1 -0
- package/dist/pixoo/pixoo-font.d.ts +24 -0
- package/dist/pixoo/pixoo-font.d.ts.map +1 -0
- package/dist/pixoo/pixoo-font.js +121 -0
- package/dist/pixoo/pixoo-font.js.map +1 -0
- package/dist/pixoo/pixoo-renderer.d.ts +32 -0
- package/dist/pixoo/pixoo-renderer.d.ts.map +1 -0
- package/dist/pixoo/pixoo-renderer.js +696 -0
- package/dist/pixoo/pixoo-renderer.js.map +1 -0
- package/dist/pixoo/pixoo-settings.d.ts +10 -0
- package/dist/pixoo/pixoo-settings.d.ts.map +1 -0
- package/dist/pixoo/pixoo-settings.js +47 -0
- package/dist/pixoo/pixoo-settings.js.map +1 -0
- package/dist/pixoo/pixoo-sprites.d.ts +187 -0
- package/dist/pixoo/pixoo-sprites.d.ts.map +1 -0
- package/dist/pixoo/pixoo-sprites.js +926 -0
- package/dist/pixoo/pixoo-sprites.js.map +1 -0
- package/dist/pty-manager.d.ts +1 -1
- package/dist/pty-manager.d.ts.map +1 -1
- package/dist/pty-manager.js +36 -15
- package/dist/pty-manager.js.map +1 -1
- package/dist/session-aggregator.d.ts +41 -0
- package/dist/session-aggregator.d.ts.map +1 -0
- package/dist/session-aggregator.js +76 -0
- package/dist/session-aggregator.js.map +1 -0
- package/dist/session-focus-relay.d.ts +35 -0
- package/dist/session-focus-relay.d.ts.map +1 -0
- package/dist/session-focus-relay.js +127 -0
- package/dist/session-focus-relay.js.map +1 -0
- package/dist/session-registry.d.ts +88 -1
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/session-registry.js +222 -15
- package/dist/session-registry.js.map +1 -1
- package/dist/session-timeline-relay.d.ts +27 -0
- package/dist/session-timeline-relay.d.ts.map +1 -0
- package/dist/session-timeline-relay.js +124 -0
- package/dist/session-timeline-relay.js.map +1 -0
- package/dist/state-machine.d.ts +1 -0
- package/dist/state-machine.d.ts.map +1 -1
- package/dist/state-machine.js +14 -0
- package/dist/state-machine.js.map +1 -1
- package/dist/terminal-status.d.ts +28 -0
- package/dist/terminal-status.d.ts.map +1 -0
- package/dist/terminal-status.js +152 -0
- package/dist/terminal-status.js.map +1 -0
- package/dist/timeline-store.d.ts +22 -0
- package/dist/timeline-store.d.ts.map +1 -0
- package/dist/timeline-store.js +79 -0
- package/dist/timeline-store.js.map +1 -0
- package/dist/timeline-summarizer.d.ts +14 -0
- package/dist/timeline-summarizer.d.ts.map +1 -0
- package/dist/timeline-summarizer.js +154 -0
- package/dist/timeline-summarizer.js.map +1 -0
- package/dist/tts.d.ts +25 -0
- package/dist/tts.d.ts.map +1 -0
- package/dist/tts.js +99 -0
- package/dist/tts.js.map +1 -0
- package/dist/tui/ansi.d.ts +92 -0
- package/dist/tui/ansi.d.ts.map +1 -0
- package/dist/tui/ansi.js +181 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/dashboard.d.ts +35 -0
- package/dist/tui/dashboard.d.ts.map +1 -0
- package/dist/tui/dashboard.js +436 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/gauge.d.ts +15 -0
- package/dist/tui/gauge.d.ts.map +1 -0
- package/dist/tui/gauge.js +82 -0
- package/dist/tui/gauge.js.map +1 -0
- package/dist/tui/renderer.d.ts +15 -0
- package/dist/tui/renderer.d.ts.map +1 -0
- package/dist/tui/renderer.js +758 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/screen.d.ts +27 -0
- package/dist/tui/screen.d.ts.map +1 -0
- package/dist/tui/screen.js +109 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/terrarium.d.ts +96 -0
- package/dist/tui/terrarium.d.ts.map +1 -0
- package/dist/tui/terrarium.js +912 -0
- package/dist/tui/terrarium.js.map +1 -0
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -2
- package/dist/types.js.map +1 -1
- package/dist/usage-api.d.ts +9 -2
- package/dist/usage-api.d.ts.map +1 -1
- package/dist/usage-api.js +224 -42
- package/dist/usage-api.js.map +1 -1
- package/dist/usage-event.d.ts +12 -0
- package/dist/usage-event.d.ts.map +1 -0
- package/dist/usage-event.js +78 -0
- package/dist/usage-event.js.map +1 -0
- package/dist/usage-tracker.d.ts +4 -0
- package/dist/usage-tracker.d.ts.map +1 -1
- package/dist/usage-tracker.js +17 -0
- package/dist/usage-tracker.js.map +1 -1
- package/dist/utility-proxy.d.ts +30 -0
- package/dist/utility-proxy.d.ts.map +1 -0
- package/dist/utility-proxy.js +217 -0
- package/dist/utility-proxy.js.map +1 -0
- package/dist/utils/project-name.d.ts +22 -0
- package/dist/utils/project-name.d.ts.map +1 -0
- package/dist/utils/project-name.js +72 -0
- package/dist/utils/project-name.js.map +1 -0
- package/dist/version-check.d.ts +26 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +225 -0
- package/dist/version-check.js.map +1 -0
- package/dist/voice-assistant.d.ts +63 -0
- package/dist/voice-assistant.d.ts.map +1 -0
- package/dist/voice-assistant.js +406 -0
- package/dist/voice-assistant.js.map +1 -0
- package/dist/voice.d.ts +2 -0
- package/dist/voice.d.ts.map +1 -1
- package/dist/voice.js +26 -1
- package/dist/voice.js.map +1 -1
- package/dist/wake-word.d.ts +35 -0
- package/dist/wake-word.d.ts.map +1 -0
- package/dist/wake-word.js +225 -0
- package/dist/wake-word.js.map +1 -0
- package/dist/whisper-server-manager.d.ts +1 -1
- package/dist/whisper-server-manager.js +1 -1
- package/dist/wifi-config.d.ts +24 -0
- package/dist/wifi-config.d.ts.map +1 -0
- package/dist/wifi-config.js +84 -0
- package/dist/wifi-config.js.map +1 -0
- package/dist/ws-server.d.ts +12 -0
- package/dist/ws-server.d.ts.map +1 -1
- package/dist/ws-server.js +81 -3
- package/dist/ws-server.js.map +1 -1
- package/package.json +21 -13
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { PtyManager } from '../pty-manager.js';
|
|
3
|
+
import { HookServer } from '../hook-server.js';
|
|
4
|
+
import { debug } from '../logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* Abstract base class for PTY-based agent adapters.
|
|
7
|
+
*
|
|
8
|
+
* Provides common infrastructure: PtyManager, HookServer, PTY lifecycle,
|
|
9
|
+
* input/output wiring, and standard command handling (respond, interrupt, escape).
|
|
10
|
+
*
|
|
11
|
+
* Subclasses implement:
|
|
12
|
+
* - capabilities — agent-specific feature flags
|
|
13
|
+
* - getDefaultCommand() — CLI command to spawn (e.g. 'claude', 'codex')
|
|
14
|
+
* - wireOutputParser() — connect output parser events → AdapterEvents
|
|
15
|
+
* - feedParser(data) — feed PTY data to the output parser
|
|
16
|
+
* - handleAgentCommand(cmd) — agent-specific commands (e.g. switch_mode)
|
|
17
|
+
*/
|
|
18
|
+
export class PtyAdapter extends EventEmitter {
|
|
19
|
+
ptyManager;
|
|
20
|
+
hookServer;
|
|
21
|
+
port = 0;
|
|
22
|
+
/** Callback for raw PTY data (diagnostics) */
|
|
23
|
+
rawDataCallback = null;
|
|
24
|
+
constructor() {
|
|
25
|
+
super();
|
|
26
|
+
this.ptyManager = new PtyManager();
|
|
27
|
+
this.hookServer = new HookServer();
|
|
28
|
+
}
|
|
29
|
+
/** Whether this agent uses HTTP hook server. Override to false for hook-less agents. */
|
|
30
|
+
useHookServer() { return true; }
|
|
31
|
+
/**
|
|
32
|
+
* Handle agent-specific commands (e.g. switch_mode for Claude).
|
|
33
|
+
* Return true if handled, false to fall through to common handlers.
|
|
34
|
+
*/
|
|
35
|
+
handleAgentCommand(_cmd) { return false; }
|
|
36
|
+
/** Get the hook server instance (for external wiring like SSE broadcast) */
|
|
37
|
+
getHookServer() { return this.hookServer; }
|
|
38
|
+
async start(options) {
|
|
39
|
+
this.port = options.port;
|
|
40
|
+
// 1. Start HTTP hook server (optional per agent)
|
|
41
|
+
if (this.useHookServer()) {
|
|
42
|
+
await this.hookServer.listen(this.port);
|
|
43
|
+
// Wire HookServer events → AdapterEvents
|
|
44
|
+
this.hookServer.on('hook', ({ event, data }) => {
|
|
45
|
+
if (event === 'shutdown') {
|
|
46
|
+
this.emitAdapterEvent({ source: 'hook', event: 'shutdown', data });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.emitAdapterEvent({ source: 'hook', event, data });
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// 2. Wire output parser (subclass-specific)
|
|
53
|
+
this.wireOutputParser();
|
|
54
|
+
// 3. Spawn PTY
|
|
55
|
+
const command = options.command || this.getDefaultCommand();
|
|
56
|
+
await this.ptyManager.spawn(command, { AGENTDECK_PORT: String(this.port) });
|
|
57
|
+
// 4. Feed PTY output → parser + activity
|
|
58
|
+
this.ptyManager.on('data', (data) => {
|
|
59
|
+
if (this.rawDataCallback) {
|
|
60
|
+
this.rawDataCallback(data);
|
|
61
|
+
}
|
|
62
|
+
this.feedParser(data);
|
|
63
|
+
this.emitAdapterEvent({ source: 'activity' });
|
|
64
|
+
});
|
|
65
|
+
// 5. Handle PTY exit
|
|
66
|
+
this.ptyManager.on('exit', (code, signal) => {
|
|
67
|
+
debug('adapter:pty', `PTY exited (code=${code}, signal=${signal})`);
|
|
68
|
+
this.emitAdapterEvent({ source: 'hook', event: 'SessionEnd', data: {} });
|
|
69
|
+
this.emitAdapterEvent({ source: 'connection', status: 'disconnected' });
|
|
70
|
+
this.emit('exit', code, signal);
|
|
71
|
+
});
|
|
72
|
+
// 6. Emit initial events
|
|
73
|
+
this.emitAdapterEvent({ source: 'hook', event: 'SessionStart', data: {} });
|
|
74
|
+
this.emitAdapterEvent({ source: 'connection', status: 'connected' });
|
|
75
|
+
}
|
|
76
|
+
handleCommand(cmd) {
|
|
77
|
+
// Let subclass handle agent-specific commands first
|
|
78
|
+
if (this.handleAgentCommand(cmd))
|
|
79
|
+
return true;
|
|
80
|
+
// Common PTY commands
|
|
81
|
+
switch (cmd.type) {
|
|
82
|
+
case 'respond':
|
|
83
|
+
debug('adapter:pty', `respond: "${cmd.value}"`);
|
|
84
|
+
this.ptyManager.write(cmd.value + '\r');
|
|
85
|
+
return true;
|
|
86
|
+
case 'interrupt':
|
|
87
|
+
this.ptyManager.interrupt();
|
|
88
|
+
return true;
|
|
89
|
+
case 'escape':
|
|
90
|
+
debug('adapter:pty', 'escape: sending Esc');
|
|
91
|
+
this.ptyManager.write('\x1b');
|
|
92
|
+
return true;
|
|
93
|
+
// These require StateMachine context — handled by bridge
|
|
94
|
+
case 'select_option':
|
|
95
|
+
case 'navigate_option':
|
|
96
|
+
case 'send_prompt':
|
|
97
|
+
return false;
|
|
98
|
+
// Bridge-only commands
|
|
99
|
+
case 'voice':
|
|
100
|
+
case 'query_usage':
|
|
101
|
+
return false;
|
|
102
|
+
default:
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
writeInput(data) {
|
|
107
|
+
this.ptyManager.write(data);
|
|
108
|
+
}
|
|
109
|
+
isAlive() {
|
|
110
|
+
return this.ptyManager.isAlive();
|
|
111
|
+
}
|
|
112
|
+
attachTerminal(stdin, stdout) {
|
|
113
|
+
this.ptyManager.attachTerminal(stdin, stdout);
|
|
114
|
+
}
|
|
115
|
+
getTtyPath() {
|
|
116
|
+
return this.ptyManager.getTtyPath();
|
|
117
|
+
}
|
|
118
|
+
getProjectName() {
|
|
119
|
+
return null; // Override in subclasses with output parsers
|
|
120
|
+
}
|
|
121
|
+
getHttpServer() {
|
|
122
|
+
return this.hookServer.getServer();
|
|
123
|
+
}
|
|
124
|
+
prepareForNavigation() {
|
|
125
|
+
// Override in subclasses
|
|
126
|
+
}
|
|
127
|
+
onDiag(handler) {
|
|
128
|
+
this.hookServer.onDiag(handler);
|
|
129
|
+
}
|
|
130
|
+
onRawData(callback) {
|
|
131
|
+
this.rawDataCallback = callback;
|
|
132
|
+
}
|
|
133
|
+
async shutdown() {
|
|
134
|
+
if (this.ptyManager.isAlive()) {
|
|
135
|
+
this.ptyManager.kill();
|
|
136
|
+
}
|
|
137
|
+
await this.hookServer.close();
|
|
138
|
+
}
|
|
139
|
+
emitAdapterEvent(evt) {
|
|
140
|
+
this.emit('event', evt);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=pty-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-adapter.js","sourceRoot":"","sources":["../../src/adapters/pty-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AASrC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAgB,UAAW,SAAQ,YAAY;IAGzC,UAAU,CAAa;IACvB,UAAU,CAAa;IACvB,IAAI,GAAG,CAAC,CAAC;IAEnB,8CAA8C;IACtC,eAAe,GAAoC,IAAI,CAAC;IAEhE;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACrC,CAAC;IAWD,wFAAwF;IAC9E,aAAa,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;IAEnD;;;OAGG;IACO,kBAAkB,CAAC,IAAmB,IAAa,OAAO,KAAK,CAAC,CAAC,CAAC;IAE5E,4EAA4E;IAC5E,aAAa,KAAiB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvD,KAAK,CAAC,KAAK,CAAC,OAA4B;QACtC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAEzB,iDAAiD;QACjD,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAExC,yCAAyC;YACzC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAoD,EAAE,EAAE;gBAC/F,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;oBACzB,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;oBACnE,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,eAAe;QACf,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5D,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5E,yCAAyC;QACzC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAC1C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;YAC1D,KAAK,CAAC,aAAa,EAAE,oBAAoB,IAAI,YAAY,MAAM,GAAG,CAAC,CAAC;YACpE,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,aAAa,CAAC,GAAkB;QAC9B,oDAAoD;QACpD,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAE9C,sBAAsB;QACtB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,SAAS;gBACZ,KAAK,CAAC,aAAa,EAAE,aAAa,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;gBACxC,OAAO,IAAI,CAAC;YAEd,KAAK,WAAW;gBACd,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YAEd,KAAK,QAAQ;gBACX,KAAK,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;gBAC5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9B,OAAO,IAAI,CAAC;YAEd,yDAAyD;YACzD,KAAK,eAAe,CAAC;YACrB,KAAK,iBAAiB,CAAC;YACvB,KAAK,aAAa;gBAChB,OAAO,KAAK,CAAC;YAEf,uBAAuB;YACvB,KAAK,OAAO,CAAC;YACb,KAAK,aAAa;gBAChB,OAAO,KAAK,CAAC;YAEf;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,cAAc,CAAC,KAA4B,EAAE,MAA6B;QACxE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,CAAC,6CAA6C;IAC5D,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;IACrC,CAAC;IAED,oBAAoB;QAClB,yBAAyB;IAC3B,CAAC;IAED,MAAM,CAAC,OAAmC;QACxC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,QAAgC;QACxC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAES,gBAAgB,CAAC,GAAiB;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADB reverse tunnel management for Android dashboard clients.
|
|
3
|
+
* D200H Deck Dock is now handled by D200hModule (HID protocol) — no ADB needed.
|
|
4
|
+
*/
|
|
5
|
+
export declare function hasAdb(): boolean;
|
|
6
|
+
export declare function getConnectedAdbDevices(): string[];
|
|
7
|
+
/**
|
|
8
|
+
* Set up `adb reverse` for all connected Android devices.
|
|
9
|
+
* Non-blocking, best-effort — bridge starts fine without adb.
|
|
10
|
+
*/
|
|
11
|
+
export declare function setupAdbReverse(port: number): void;
|
|
12
|
+
/**
|
|
13
|
+
* Periodically re-check adb reverse (handles USB re-plug).
|
|
14
|
+
* Returns a cleanup function to stop polling.
|
|
15
|
+
*/
|
|
16
|
+
export declare function startAdbReversePolling(port: number, intervalMs?: number): () => void;
|
|
17
|
+
/**
|
|
18
|
+
* Get number of currently connected ADB devices (best-effort).
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAdbDeviceCount(): number;
|
|
21
|
+
/**
|
|
22
|
+
* Remove `adb reverse` mappings on shutdown.
|
|
23
|
+
*/
|
|
24
|
+
export declare function cleanupAdbReverse(port: number): void;
|
|
25
|
+
//# sourceMappingURL=adb-reverse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adb-reverse.d.ts","sourceRoot":"","sources":["../src/adb-reverse.ts"],"names":[],"mappings":"AAMA;;;GAGG;AAEH,wBAAgB,MAAM,IAAI,OAAO,CAOhC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAmBjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAuBlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,MAAM,IAAI,CA4BpF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAepD"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { debug } from './logger.js';
|
|
3
|
+
const TAG = 'adb';
|
|
4
|
+
const ANDROID_PORT = 9120;
|
|
5
|
+
/**
|
|
6
|
+
* ADB reverse tunnel management for Android dashboard clients.
|
|
7
|
+
* D200H Deck Dock is now handled by D200hModule (HID protocol) — no ADB needed.
|
|
8
|
+
*/
|
|
9
|
+
export function hasAdb() {
|
|
10
|
+
try {
|
|
11
|
+
execSync('which adb', { stdio: 'pipe' });
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function getConnectedAdbDevices() {
|
|
19
|
+
try {
|
|
20
|
+
const output = execSync('adb devices', { stdio: 'pipe', timeout: 5000 }).toString();
|
|
21
|
+
const lines = output.split('\n').slice(1).filter((l) => l.trim().length > 0);
|
|
22
|
+
const connected = [];
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
const [serial, state] = line.split('\t');
|
|
25
|
+
if (state === 'device') {
|
|
26
|
+
connected.push(serial);
|
|
27
|
+
}
|
|
28
|
+
else if (state === 'unauthorized') {
|
|
29
|
+
debug(TAG, `Device ${serial} is unauthorized — accept USB debugging prompt on device`);
|
|
30
|
+
}
|
|
31
|
+
else if (state === 'offline') {
|
|
32
|
+
debug(TAG, `Device ${serial} is offline`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return connected;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Set up `adb reverse` for all connected Android devices.
|
|
43
|
+
* Non-blocking, best-effort — bridge starts fine without adb.
|
|
44
|
+
*/
|
|
45
|
+
export function setupAdbReverse(port) {
|
|
46
|
+
if (!hasAdb()) {
|
|
47
|
+
debug(TAG, 'adb not found, skipping reverse setup');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const devices = getConnectedAdbDevices();
|
|
51
|
+
if (devices.length === 0) {
|
|
52
|
+
debug(TAG, 'no connected devices');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
for (const serial of devices) {
|
|
56
|
+
try {
|
|
57
|
+
execSync(`adb -s ${serial} reverse tcp:${ANDROID_PORT} tcp:${port}`, {
|
|
58
|
+
stdio: 'pipe',
|
|
59
|
+
timeout: 5000,
|
|
60
|
+
});
|
|
61
|
+
debug(TAG, `adb reverse ${serial}: android:${ANDROID_PORT} → daemon:${port}`);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
debug(TAG, `adb reverse failed for ${serial}: ${err}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Periodically re-check adb reverse (handles USB re-plug).
|
|
70
|
+
* Returns a cleanup function to stop polling.
|
|
71
|
+
*/
|
|
72
|
+
export function startAdbReversePolling(port, intervalMs = 30_000) {
|
|
73
|
+
if (!hasAdb())
|
|
74
|
+
return () => { };
|
|
75
|
+
const timer = setInterval(() => {
|
|
76
|
+
const devices = getConnectedAdbDevices();
|
|
77
|
+
if (devices.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
for (const serial of devices) {
|
|
80
|
+
try {
|
|
81
|
+
// Check if reverse already exists — if not, set it up
|
|
82
|
+
const existing = execSync(`adb -s ${serial} reverse --list`, {
|
|
83
|
+
stdio: 'pipe',
|
|
84
|
+
timeout: 5000,
|
|
85
|
+
}).toString();
|
|
86
|
+
if (!existing.includes(`tcp:${ANDROID_PORT}`)) {
|
|
87
|
+
execSync(`adb -s ${serial} reverse tcp:${ANDROID_PORT} tcp:${port}`, {
|
|
88
|
+
stdio: 'pipe',
|
|
89
|
+
timeout: 5000,
|
|
90
|
+
});
|
|
91
|
+
debug(TAG, `adb reverse re-established ${serial}: android:${ANDROID_PORT} → daemon:${port}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
debug(TAG, `adb reverse poll failed for ${serial}: ${err?.message ?? err}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}, intervalMs);
|
|
99
|
+
return () => clearInterval(timer);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get number of currently connected ADB devices (best-effort).
|
|
103
|
+
*/
|
|
104
|
+
export function getAdbDeviceCount() {
|
|
105
|
+
if (!hasAdb())
|
|
106
|
+
return 0;
|
|
107
|
+
return getConnectedAdbDevices().length;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Remove `adb reverse` mappings on shutdown.
|
|
111
|
+
*/
|
|
112
|
+
export function cleanupAdbReverse(port) {
|
|
113
|
+
if (!hasAdb())
|
|
114
|
+
return;
|
|
115
|
+
const devices = getConnectedAdbDevices();
|
|
116
|
+
for (const serial of devices) {
|
|
117
|
+
try {
|
|
118
|
+
execSync(`adb -s ${serial} reverse --remove tcp:${ANDROID_PORT}`, {
|
|
119
|
+
stdio: 'pipe',
|
|
120
|
+
timeout: 3000,
|
|
121
|
+
});
|
|
122
|
+
debug(TAG, `removed reverse for ${serial}`);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// ignore — device may already be disconnected
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=adb-reverse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adb-reverse.js","sourceRoot":"","sources":["../src/adb-reverse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface AntigravityStatusInfo {
|
|
2
|
+
planName?: string;
|
|
3
|
+
availableCredits?: number;
|
|
4
|
+
minimumCreditAmountForUsage?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function readAntigravityLocalStatus(): AntigravityStatusInfo | undefined;
|
|
7
|
+
//# sourceMappingURL=antigravity-local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity-local.d.ts","sourceRoot":"","sources":["../src/antigravity-local.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AA2ID,wBAAgB,0BAA0B,IAAI,qBAAqB,GAAG,SAAS,CAO9E"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { execFileSync } from 'child_process';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
const DB_PATH = join(homedir(), 'Library/Application Support/Antigravity/User/globalStorage/state.vscdb');
|
|
6
|
+
function sqliteValue(key) {
|
|
7
|
+
if (!existsSync(DB_PATH))
|
|
8
|
+
return null;
|
|
9
|
+
try {
|
|
10
|
+
const hex = execFileSync('/usr/bin/sqlite3', [DB_PATH, `select hex(value) from ItemTable where key = '${key.replace(/'/g, "''")}' limit 1;`], { encoding: 'utf8', timeout: 3000 }).trim();
|
|
11
|
+
if (!hex)
|
|
12
|
+
return null;
|
|
13
|
+
return Buffer.from(hex, 'hex').toString('utf8');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function readVarint(buf, offset) {
|
|
20
|
+
let result = 0;
|
|
21
|
+
let shift = 0;
|
|
22
|
+
let index = offset;
|
|
23
|
+
while (index < buf.length) {
|
|
24
|
+
const byte = buf[index++];
|
|
25
|
+
result |= (byte & 0x7f) << shift;
|
|
26
|
+
if ((byte & 0x80) === 0)
|
|
27
|
+
return { value: result, next: index };
|
|
28
|
+
shift += 7;
|
|
29
|
+
if (shift > 49)
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
function parseProto(buf) {
|
|
35
|
+
const out = [];
|
|
36
|
+
let index = 0;
|
|
37
|
+
while (index < buf.length) {
|
|
38
|
+
const key = readVarint(buf, index);
|
|
39
|
+
if (!key)
|
|
40
|
+
break;
|
|
41
|
+
index = key.next;
|
|
42
|
+
const field = key.value >> 3;
|
|
43
|
+
const wire = key.value & 0x07;
|
|
44
|
+
if (wire === 0) {
|
|
45
|
+
const value = readVarint(buf, index);
|
|
46
|
+
if (!value)
|
|
47
|
+
break;
|
|
48
|
+
out.push({ field, wire, value: value.value });
|
|
49
|
+
index = value.next;
|
|
50
|
+
}
|
|
51
|
+
else if (wire === 2) {
|
|
52
|
+
const length = readVarint(buf, index);
|
|
53
|
+
if (!length)
|
|
54
|
+
break;
|
|
55
|
+
index = length.next;
|
|
56
|
+
out.push({ field, wire, value: buf.subarray(index, index + length.value) });
|
|
57
|
+
index += length.value;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
function firstString(fields, field) {
|
|
66
|
+
const hit = fields.find((entry) => entry.field === field && entry.wire === 2);
|
|
67
|
+
return hit && Buffer.isBuffer(hit.value) ? hit.value.toString('utf8') : undefined;
|
|
68
|
+
}
|
|
69
|
+
function firstBytes(fields, field) {
|
|
70
|
+
const hit = fields.find((entry) => entry.field === field && entry.wire === 2);
|
|
71
|
+
return hit && Buffer.isBuffer(hit.value) ? hit.value : undefined;
|
|
72
|
+
}
|
|
73
|
+
function firstVarint(fields, field) {
|
|
74
|
+
const hit = fields.find((entry) => entry.field === field && entry.wire === 0);
|
|
75
|
+
return hit && typeof hit.value === 'number' ? hit.value : undefined;
|
|
76
|
+
}
|
|
77
|
+
function extractAsciiStrings(buf, minimumLength = 6) {
|
|
78
|
+
const out = [];
|
|
79
|
+
let current = '';
|
|
80
|
+
for (const byte of buf.values()) {
|
|
81
|
+
if (byte >= 32 && byte <= 126) {
|
|
82
|
+
current += String.fromCharCode(byte);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
if (current.length >= minimumLength)
|
|
86
|
+
out.push(current.trim());
|
|
87
|
+
current = '';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (current.length >= minimumLength)
|
|
91
|
+
out.push(current.trim());
|
|
92
|
+
return out.filter(Boolean);
|
|
93
|
+
}
|
|
94
|
+
function parsePlanName(authStatusText) {
|
|
95
|
+
if (!authStatusText)
|
|
96
|
+
return undefined;
|
|
97
|
+
try {
|
|
98
|
+
const auth = JSON.parse(authStatusText);
|
|
99
|
+
if (!auth.userStatusProtoBinaryBase64)
|
|
100
|
+
return undefined;
|
|
101
|
+
const proto = Buffer.from(auth.userStatusProtoBinaryBase64, 'base64');
|
|
102
|
+
const strings = extractAsciiStrings(proto);
|
|
103
|
+
return (['Google AI Ultra', 'Google AI Pro', 'Google AI Standard', 'Google AI Free']
|
|
104
|
+
.find((candidate) => strings.includes(candidate)) ??
|
|
105
|
+
strings.find((value) => value.startsWith('Google AI ')));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function parseModelCredits(text) {
|
|
112
|
+
if (!text)
|
|
113
|
+
return {};
|
|
114
|
+
try {
|
|
115
|
+
const outer = Buffer.from(text, 'base64');
|
|
116
|
+
const fields = parseProto(outer);
|
|
117
|
+
let availableCredits;
|
|
118
|
+
let minimumCreditAmountForUsage;
|
|
119
|
+
for (const entry of fields) {
|
|
120
|
+
if (entry.field !== 1 || entry.wire !== 2 || !Buffer.isBuffer(entry.value))
|
|
121
|
+
continue;
|
|
122
|
+
const pair = parseProto(entry.value);
|
|
123
|
+
const key = firstString(pair, 1);
|
|
124
|
+
const wrapped = firstBytes(pair, 2);
|
|
125
|
+
if (!key || !wrapped)
|
|
126
|
+
continue;
|
|
127
|
+
const wrappedB64 = firstString(parseProto(wrapped), 1);
|
|
128
|
+
if (!wrappedB64)
|
|
129
|
+
continue;
|
|
130
|
+
const wrappedFields = parseProto(Buffer.from(wrappedB64, 'base64'));
|
|
131
|
+
const value = firstVarint(wrappedFields, 1) ?? firstVarint(wrappedFields, 2);
|
|
132
|
+
if (value == null)
|
|
133
|
+
continue;
|
|
134
|
+
if (key === 'availableCreditsSentinelKey')
|
|
135
|
+
availableCredits = value;
|
|
136
|
+
if (key === 'minimumCreditAmountForUsageKey')
|
|
137
|
+
minimumCreditAmountForUsage = value;
|
|
138
|
+
}
|
|
139
|
+
return { availableCredits, minimumCreditAmountForUsage };
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return {};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export function readAntigravityLocalStatus() {
|
|
146
|
+
const planName = parsePlanName(sqliteValue('antigravityAuthStatus'));
|
|
147
|
+
if (!planName)
|
|
148
|
+
return undefined;
|
|
149
|
+
return {
|
|
150
|
+
planName,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=antigravity-local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity-local.js","sourceRoot":"","sources":["../src/antigravity-local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code hook → TelemetrySpan adapter.
|
|
3
|
+
*
|
|
4
|
+
* Translates the per-event hook payload (UserPromptSubmit / PreToolUse /
|
|
5
|
+
* PostToolUse / Stop / SessionStart / SessionEnd / shutdown / …) emitted by
|
|
6
|
+
* Claude Code 2.1+ into AgentDeck telemetry spans.
|
|
7
|
+
*
|
|
8
|
+
* `/clear` is detected here and emitted as a `task_boundary` span so the
|
|
9
|
+
* collector can run `splitRun` before processing it as a normal prompt —
|
|
10
|
+
* preserving the legacy behavior where the slash-command never becomes a
|
|
11
|
+
* real task prompt.
|
|
12
|
+
*/
|
|
13
|
+
import type { AdapterContext, TelemetrySpan } from '@agentdeck/shared';
|
|
14
|
+
export declare function claudeHookToSpans(ctx: AdapterContext, event: string, data: Record<string, unknown>): TelemetrySpan[];
|
|
15
|
+
//# sourceMappingURL=claude-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-hook.d.ts","sourceRoot":"","sources":["../../../src/apme/adapters/claude-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAG3B,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,aAAa,EAAE,CA6DjB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code hook → TelemetrySpan adapter.
|
|
3
|
+
*
|
|
4
|
+
* Translates the per-event hook payload (UserPromptSubmit / PreToolUse /
|
|
5
|
+
* PostToolUse / Stop / SessionStart / SessionEnd / shutdown / …) emitted by
|
|
6
|
+
* Claude Code 2.1+ into AgentDeck telemetry spans.
|
|
7
|
+
*
|
|
8
|
+
* `/clear` is detected here and emitted as a `task_boundary` span so the
|
|
9
|
+
* collector can run `splitRun` before processing it as a normal prompt —
|
|
10
|
+
* preserving the legacy behavior where the slash-command never becomes a
|
|
11
|
+
* real task prompt.
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from 'crypto';
|
|
14
|
+
import { spanNameForKind } from '@agentdeck/shared';
|
|
15
|
+
export function claudeHookToSpans(ctx, event, data) {
|
|
16
|
+
const ts = Date.now();
|
|
17
|
+
const baseAttrs = {
|
|
18
|
+
'agentdeck.agent_type': ctx.agentType,
|
|
19
|
+
...(ctx.cwd ? { 'agentdeck.cwd': ctx.cwd } : {}),
|
|
20
|
+
};
|
|
21
|
+
const make = (kind, attributes) => ({
|
|
22
|
+
traceId: ctx.traceId,
|
|
23
|
+
spanId: randomUUID(),
|
|
24
|
+
parentSpanId: ctx.activeTurnId,
|
|
25
|
+
name: spanNameForKind(kind),
|
|
26
|
+
kind,
|
|
27
|
+
ts,
|
|
28
|
+
attributes: { ...baseAttrs, ...attributes },
|
|
29
|
+
});
|
|
30
|
+
if (event === 'UserPromptSubmit') {
|
|
31
|
+
const prompt = extractPrompt(data);
|
|
32
|
+
if (/^\s*\/clear\s*$/i.test(prompt)) {
|
|
33
|
+
return [make('task_boundary', { 'agentdeck.boundary_signal': 'clear' })];
|
|
34
|
+
}
|
|
35
|
+
return [
|
|
36
|
+
make('turn_start', {
|
|
37
|
+
'agentdeck.prompt_text': prompt,
|
|
38
|
+
'agentdeck.raw_payload': data,
|
|
39
|
+
}),
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
if (event === 'PreToolUse') {
|
|
43
|
+
const toolName = typeof data.tool_name === 'string' ? data.tool_name : undefined;
|
|
44
|
+
return [
|
|
45
|
+
make('tool_call', {
|
|
46
|
+
...(toolName ? { 'gen_ai.tool.name': toolName, 'agentdeck.tool_name': toolName } : {}),
|
|
47
|
+
'agentdeck.raw_payload': data,
|
|
48
|
+
}),
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
if (event === 'PostToolUse') {
|
|
52
|
+
const toolName = typeof data.tool_name === 'string' ? data.tool_name : undefined;
|
|
53
|
+
return [
|
|
54
|
+
make('tool_result', {
|
|
55
|
+
...(toolName ? { 'gen_ai.tool.name': toolName, 'agentdeck.tool_name': toolName } : {}),
|
|
56
|
+
'agentdeck.raw_payload': data,
|
|
57
|
+
}),
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
// Everything else (Stop, SessionStart, SessionEnd, Notification, shutdown, …)
|
|
61
|
+
// is recorded verbatim. The collector still inserts a `steps` row so timeline
|
|
62
|
+
// and tuner queries see them.
|
|
63
|
+
return [
|
|
64
|
+
make('raw_step', {
|
|
65
|
+
'agentdeck.raw_event': event,
|
|
66
|
+
'agentdeck.raw_payload': data,
|
|
67
|
+
}),
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
/** Claude Code sends `{ message: { content: "..." } }`. Some legacy clients send
|
|
71
|
+
* `{ prompt: "..." }`. Returns `''` if no recognizable shape — caller handles. */
|
|
72
|
+
function extractPrompt(data) {
|
|
73
|
+
const fromMessage = (() => {
|
|
74
|
+
const msg = data.message;
|
|
75
|
+
if (msg && typeof msg === 'object') {
|
|
76
|
+
const content = msg.content;
|
|
77
|
+
return typeof content === 'string' ? content : '';
|
|
78
|
+
}
|
|
79
|
+
return '';
|
|
80
|
+
})();
|
|
81
|
+
if (fromMessage)
|
|
82
|
+
return fromMessage;
|
|
83
|
+
return typeof data.prompt === 'string' ? data.prompt : '';
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=claude-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-hook.js","sourceRoot":"","sources":["../../../src/apme/adapters/claude-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAMpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,UAAU,iBAAiB,CAC/B,GAAmB,EACnB,KAAa,EACb,IAA6B;IAE7B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,SAAS,GAAwB;QACrC,sBAAsB,EAAE,GAAG,CAAC,SAAS;QACrC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC;IACF,MAAM,IAAI,GAAG,CACX,IAA2B,EAC3B,UAA+B,EAChB,EAAE,CAAC,CAAC;QACnB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,UAAU,EAAE;QACpB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;QAC3B,IAAI;QACJ,EAAE;QACF,UAAU,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,UAAU,EAAE;KAC5C,CAAC,CAAC;IAEH,IAAI,KAAK,KAAK,kBAAkB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,2BAA2B,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO;YACL,IAAI,CAAC,YAAY,EAAE;gBACjB,uBAAuB,EAAE,MAAM;gBAC/B,uBAAuB,EAAE,IAAI;aAC9B,CAAC;SACH,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,OAAO;YACL,IAAI,CAAC,WAAW,EAAE;gBAChB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtF,uBAAuB,EAAE,IAAI;aAC9B,CAAC;SACH,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,OAAO;YACL,IAAI,CAAC,aAAa,EAAE;gBAClB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtF,uBAAuB,EAAE,IAAI;aAC9B,CAAC;SACH,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,8BAA8B;IAC9B,OAAO;QACL,IAAI,CAAC,UAAU,EAAE;YACf,qBAAqB,EAAE,KAAK;YAC5B,uBAAuB,EAAE,IAAI;SAC9B,CAAC;KACH,CAAC;AACJ,CAAC;AAED;mFACmF;AACnF,SAAS,aAAa,CAAC,IAA6B;IAClD,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,OAAO,GAAI,GAA+B,CAAC,OAAO,CAAC;YACzD,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IACpC,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code PTY parser → TelemetrySpan adapter.
|
|
3
|
+
*
|
|
4
|
+
* Two distinct emission points:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Parser events** (`tool_start` / `tool_end` / `spinner_start` / `idle` /
|
|
7
|
+
* `spinner_stop`) — fired by the BridgeCore output parser as terminal text
|
|
8
|
+
* scrolls. We map these to lifecycle spans (`tool_call` / `tool_result`)
|
|
9
|
+
* plus generic `raw_step` for state transitions. This is the **fallback**
|
|
10
|
+
* when Claude Code 2.1+ hooks are flaky (memory: feedback_apme_stop_hook).
|
|
11
|
+
*
|
|
12
|
+
* 2. **Extracted response text** — `spinner_stop` triggers a 500 ms timeout
|
|
13
|
+
* in the bridge, the PTY ringbuffer tail is scanned for the `⏺` marker,
|
|
14
|
+
* and the cleaned text is fed to `claudePtyResponseToSpan` to emit a
|
|
15
|
+
* `turn_response` span.
|
|
16
|
+
*
|
|
17
|
+
* Splitting these into two functions keeps each call site free to do its own
|
|
18
|
+
* timing / extraction work without smuggling sentinels through `data`.
|
|
19
|
+
*/
|
|
20
|
+
import type { AdapterContext, TelemetrySpan } from '@agentdeck/shared';
|
|
21
|
+
export declare function claudePtyParserEventToSpans(ctx: AdapterContext, event: string, data?: Record<string, unknown>): TelemetrySpan[];
|
|
22
|
+
/** Extracted PTY response text → `turn_response` span. The caller is responsible
|
|
23
|
+
* for the actual extraction (PTY ringbuffer + `⏺` marker + cleaning) since
|
|
24
|
+
* that logic is intertwined with `BridgeCore` timing. */
|
|
25
|
+
export declare function claudePtyResponseToSpan(ctx: AdapterContext, response: string, options?: {
|
|
26
|
+
fallbackToLastClosed?: boolean;
|
|
27
|
+
}): TelemetrySpan | null;
|
|
28
|
+
//# sourceMappingURL=claude-pty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-pty.d.ts","sourceRoot":"","sources":["../../../src/apme/adapters/claude-pty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAW3B,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,aAAa,EAAE,CAmCjB;AAED;;0DAE0D;AAC1D,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,aAAa,GAAG,IAAI,CAgBtB"}
|