@agentdeck/bridge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/adapters/claude-code.d.ts +38 -0
  2. package/dist/adapters/claude-code.d.ts.map +1 -0
  3. package/dist/adapters/claude-code.js +184 -0
  4. package/dist/adapters/claude-code.js.map +1 -0
  5. package/dist/adapters/index.d.ts +8 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +18 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/openclaw.d.ts +70 -0
  10. package/dist/adapters/openclaw.d.ts.map +1 -0
  11. package/dist/adapters/openclaw.js +664 -0
  12. package/dist/adapters/openclaw.js.map +1 -0
  13. package/dist/auth.d.ts +9 -0
  14. package/dist/auth.d.ts.map +1 -0
  15. package/dist/auth.js +64 -0
  16. package/dist/auth.js.map +1 -0
  17. package/dist/check-deps.d.ts +5 -0
  18. package/dist/check-deps.d.ts.map +1 -0
  19. package/dist/check-deps.js +47 -0
  20. package/dist/check-deps.js.map +1 -0
  21. package/dist/diag-analyzer.d.ts +29 -0
  22. package/dist/diag-analyzer.d.ts.map +1 -0
  23. package/dist/diag-analyzer.js +145 -0
  24. package/dist/diag-analyzer.js.map +1 -0
  25. package/dist/event-journal.d.ts +22 -0
  26. package/dist/event-journal.d.ts.map +1 -0
  27. package/dist/event-journal.js +117 -0
  28. package/dist/event-journal.js.map +1 -0
  29. package/dist/hook-server.d.ts +31 -0
  30. package/dist/hook-server.d.ts.map +1 -0
  31. package/dist/hook-server.js +260 -0
  32. package/dist/hook-server.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +796 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/logger.d.ts +11 -0
  38. package/dist/logger.d.ts.map +1 -0
  39. package/dist/logger.js +27 -0
  40. package/dist/logger.js.map +1 -0
  41. package/dist/mdns.d.ts +9 -0
  42. package/dist/mdns.d.ts.map +1 -0
  43. package/dist/mdns.js +44 -0
  44. package/dist/mdns.js.map +1 -0
  45. package/dist/model-catalog.d.ts +29 -0
  46. package/dist/model-catalog.d.ts.map +1 -0
  47. package/dist/model-catalog.js +91 -0
  48. package/dist/model-catalog.js.map +1 -0
  49. package/dist/output-parser.d.ts +65 -0
  50. package/dist/output-parser.d.ts.map +1 -0
  51. package/dist/output-parser.js +1089 -0
  52. package/dist/output-parser.js.map +1 -0
  53. package/dist/pty-manager.d.ts +14 -0
  54. package/dist/pty-manager.d.ts.map +1 -0
  55. package/dist/pty-manager.js +93 -0
  56. package/dist/pty-manager.js.map +1 -0
  57. package/dist/pty-ringbuffer.d.ts +23 -0
  58. package/dist/pty-ringbuffer.d.ts.map +1 -0
  59. package/dist/pty-ringbuffer.js +65 -0
  60. package/dist/pty-ringbuffer.js.map +1 -0
  61. package/dist/session-registry.d.ts +17 -0
  62. package/dist/session-registry.d.ts.map +1 -0
  63. package/dist/session-registry.js +107 -0
  64. package/dist/session-registry.js.map +1 -0
  65. package/dist/state-machine.d.ts +48 -0
  66. package/dist/state-machine.d.ts.map +1 -0
  67. package/dist/state-machine.js +470 -0
  68. package/dist/state-machine.js.map +1 -0
  69. package/dist/types.d.ts +28 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +4 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/usage-api.d.ts +16 -0
  74. package/dist/usage-api.d.ts.map +1 -0
  75. package/dist/usage-api.js +84 -0
  76. package/dist/usage-api.js.map +1 -0
  77. package/dist/usage-tracker.d.ts +24 -0
  78. package/dist/usage-tracker.d.ts.map +1 -0
  79. package/dist/usage-tracker.js +89 -0
  80. package/dist/usage-tracker.js.map +1 -0
  81. package/dist/voice.d.ts +27 -0
  82. package/dist/voice.d.ts.map +1 -0
  83. package/dist/voice.js +412 -0
  84. package/dist/voice.js.map +1 -0
  85. package/dist/whisper-server-manager.d.ts +19 -0
  86. package/dist/whisper-server-manager.d.ts.map +1 -0
  87. package/dist/whisper-server-manager.js +171 -0
  88. package/dist/whisper-server-manager.js.map +1 -0
  89. package/dist/ws-server.d.ts +18 -0
  90. package/dist/ws-server.d.ts.map +1 -0
  91. package/dist/ws-server.js +86 -0
  92. package/dist/ws-server.js.map +1 -0
  93. package/package.json +43 -0
@@ -0,0 +1,38 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { Server } from 'http';
3
+ import { HookServer } from '../hook-server.js';
4
+ import type { AgentAdapter, AgentCapabilities, AdapterStartOptions, PluginCommand } from '../types.js';
5
+ /**
6
+ * Claude Code adapter — wraps PtyManager, OutputParser, HookServer.
7
+ *
8
+ * Emits unified AdapterEvents that the bridge wires to StateMachine/WsServer.
9
+ * All Claude-specific logic (PTY keystroke injection, terminal regex parsing,
10
+ * HTTP hook ingestion) is encapsulated here.
11
+ */
12
+ export declare class ClaudeCodeAdapter extends EventEmitter implements AgentAdapter {
13
+ readonly capabilities: AgentCapabilities;
14
+ private ptyManager;
15
+ private outputParser;
16
+ /** Exposed for SSE broadcasting from bridge index */
17
+ readonly hookServer: HookServer;
18
+ private port;
19
+ /** Mode switch debounce */
20
+ private lastModeSwitchTime;
21
+ /** Callback for raw PTY data (before parsing) — used by bridge for diagnostics */
22
+ private rawDataCallback;
23
+ constructor();
24
+ start(options: AdapterStartOptions): Promise<void>;
25
+ handleCommand(cmd: PluginCommand): boolean;
26
+ writeInput(data: string): void;
27
+ isAlive(): boolean;
28
+ attachTerminal(stdin: NodeJS.ReadableStream, stdout: NodeJS.WritableStream): void;
29
+ getTtyPath(): string | undefined;
30
+ getProjectName(): string | null;
31
+ prepareForNavigation(): void;
32
+ getHttpServer(): Server;
33
+ onDiag(handler: (tail?: number) => unknown): void;
34
+ onRawData(callback: (data: string) => void): void;
35
+ shutdown(): Promise<void>;
36
+ private emitAdapterEvent;
37
+ }
38
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EAEnB,aAAa,EACd,MAAM,aAAa,CAAC;AAGrB;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,YAAa,YAAW,YAAY;IACzE,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAA4B;IAEpE,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,qDAAqD;IACrD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,OAAO,CAAC,IAAI,CAAK;IAEjB,2BAA2B;IAC3B,OAAO,CAAC,kBAAkB,CAAK;IAE/B,kFAAkF;IAClF,OAAO,CAAC,eAAe,CAAyC;;IAS1D,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmFxD,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAqD1C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,IAAI,OAAO;IAIlB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI;IAIjF,UAAU,IAAI,MAAM,GAAG,SAAS;IAIhC,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B,oBAAoB,IAAI,IAAI;IAI5B,aAAa,IAAI,MAAM;IAIvB,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAIjD,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,OAAO,CAAC,gBAAgB;CAGzB"}
@@ -0,0 +1,184 @@
1
+ import { EventEmitter } from 'events';
2
+ import { PtyManager } from '../pty-manager.js';
3
+ import { OutputParser } from '../output-parser.js';
4
+ import { HookServer } from '../hook-server.js';
5
+ import { debug } from '../logger.js';
6
+ import { CLAUDE_CODE_CAPABILITIES } from '../types.js';
7
+ /**
8
+ * Claude Code adapter — wraps PtyManager, OutputParser, HookServer.
9
+ *
10
+ * Emits unified AdapterEvents that the bridge wires to StateMachine/WsServer.
11
+ * All Claude-specific logic (PTY keystroke injection, terminal regex parsing,
12
+ * HTTP hook ingestion) is encapsulated here.
13
+ */
14
+ export class ClaudeCodeAdapter extends EventEmitter {
15
+ capabilities = CLAUDE_CODE_CAPABILITIES;
16
+ ptyManager;
17
+ outputParser;
18
+ /** Exposed for SSE broadcasting from bridge index */
19
+ hookServer;
20
+ port = 0;
21
+ /** Mode switch debounce */
22
+ lastModeSwitchTime = 0;
23
+ /** Callback for raw PTY data (before parsing) — used by bridge for diagnostics */
24
+ rawDataCallback = null;
25
+ constructor() {
26
+ super();
27
+ this.ptyManager = new PtyManager();
28
+ this.outputParser = new OutputParser();
29
+ this.hookServer = new HookServer();
30
+ }
31
+ async start(options) {
32
+ this.port = options.port;
33
+ // 1. Start HTTP hook server
34
+ await this.hookServer.listen(this.port);
35
+ // 2. Wire HookServer events → AdapterEvents
36
+ this.hookServer.on('hook', ({ event, data }) => {
37
+ if (event === 'shutdown') {
38
+ this.emitAdapterEvent({ source: 'hook', event: 'shutdown', data });
39
+ return;
40
+ }
41
+ this.emitAdapterEvent({ source: 'hook', event, data });
42
+ });
43
+ // 3. Wire OutputParser events → AdapterEvents
44
+ const parserEvents = [
45
+ 'spinner_start',
46
+ 'spinner_stop',
47
+ 'permission_prompt',
48
+ 'option_prompt',
49
+ 'diff_prompt',
50
+ 'idle',
51
+ 'status_line',
52
+ 'tool_action',
53
+ 'project_name',
54
+ 'model_info',
55
+ 'mode_change',
56
+ 'suggested_prompt',
57
+ 'remote_url',
58
+ ];
59
+ for (const eventName of parserEvents) {
60
+ this.outputParser.on(eventName, (data) => {
61
+ this.emitAdapterEvent({ source: 'parser', event: eventName, data });
62
+ });
63
+ }
64
+ // 3a. cursor_update → metadata event
65
+ this.outputParser.on('cursor_update', (data) => {
66
+ this.emitAdapterEvent({ source: 'metadata', event: 'cursor_update', data: data ?? {} });
67
+ });
68
+ // 3b. usage_info → metadata event
69
+ this.outputParser.on('usage_info', (data) => {
70
+ if (data) {
71
+ this.emitAdapterEvent({ source: 'metadata', event: 'usage_info', data });
72
+ }
73
+ });
74
+ // 3c. user_prompt → metadata event
75
+ this.outputParser.on('user_prompt', (data) => {
76
+ const text = data?.text;
77
+ if (text) {
78
+ this.emitAdapterEvent({ source: 'metadata', event: 'user_prompt', data: { text } });
79
+ }
80
+ });
81
+ // 4. Spawn Claude via PTY
82
+ const command = options.command || 'claude';
83
+ this.ptyManager.spawn(command, { AGENTDECK_PORT: String(this.port) });
84
+ // 5. Feed PTY output to OutputParser + emit activity signals
85
+ this.ptyManager.on('data', (data) => {
86
+ if (this.rawDataCallback) {
87
+ this.rawDataCallback(data);
88
+ }
89
+ this.outputParser.feed(data);
90
+ this.emitAdapterEvent({ source: 'activity' });
91
+ });
92
+ // 6. Handle PTY exit → emit events
93
+ this.ptyManager.on('exit', (code, signal) => {
94
+ debug('adapter:claude', `PTY exited (code=${code}, signal=${signal})`);
95
+ this.emitAdapterEvent({ source: 'hook', event: 'SessionEnd', data: {} });
96
+ this.emitAdapterEvent({ source: 'connection', status: 'disconnected' });
97
+ this.emit('exit', code, signal);
98
+ });
99
+ // 7. Emit initial session start + connected
100
+ this.emitAdapterEvent({ source: 'hook', event: 'SessionStart', data: {} });
101
+ this.emitAdapterEvent({ source: 'connection', status: 'connected' });
102
+ }
103
+ handleCommand(cmd) {
104
+ switch (cmd.type) {
105
+ case 'respond':
106
+ debug('adapter:claude', `respond: "${cmd.value}"`);
107
+ this.ptyManager.write(cmd.value + '\r');
108
+ return true;
109
+ case 'select_option':
110
+ // Requires StateMachine context (navigable/cursorIndex).
111
+ // Bridge handles the logic and calls writeInput() for PTY transport.
112
+ return false;
113
+ case 'navigate_option':
114
+ // Bridge handles cursor clamping; we just handle the PTY write part.
115
+ // But bridge also needs to update StateMachine, so return false.
116
+ return false;
117
+ case 'send_prompt':
118
+ // Bridge handles template expansion, then calls writeInput().
119
+ return false;
120
+ case 'switch_mode': {
121
+ const now = Date.now();
122
+ if (now - this.lastModeSwitchTime < 100) {
123
+ debug('adapter:claude', `switch_mode: debounced (${now - this.lastModeSwitchTime}ms < 100ms)`);
124
+ return true;
125
+ }
126
+ this.lastModeSwitchTime = now;
127
+ debug('adapter:claude', 'switch_mode: sending Shift+Tab');
128
+ this.outputParser.notifyModeSwitchSent();
129
+ this.ptyManager.write('\x1b[Z');
130
+ return true;
131
+ }
132
+ case 'interrupt':
133
+ this.ptyManager.interrupt();
134
+ return true;
135
+ case 'escape':
136
+ debug('adapter:claude', 'escape: sending Esc');
137
+ this.ptyManager.write('\x1b');
138
+ return true;
139
+ case 'voice':
140
+ case 'query_usage':
141
+ // Handled by bridge (VoiceManager, UsageTracker)
142
+ return false;
143
+ default:
144
+ return false;
145
+ }
146
+ }
147
+ writeInput(data) {
148
+ this.ptyManager.write(data);
149
+ }
150
+ isAlive() {
151
+ return this.ptyManager.isAlive();
152
+ }
153
+ attachTerminal(stdin, stdout) {
154
+ this.ptyManager.attachTerminal(stdin, stdout);
155
+ }
156
+ getTtyPath() {
157
+ return this.ptyManager.getTtyPath();
158
+ }
159
+ getProjectName() {
160
+ return this.outputParser.getProjectName();
161
+ }
162
+ prepareForNavigation() {
163
+ this.outputParser.startInteractiveCooldown();
164
+ }
165
+ getHttpServer() {
166
+ return this.hookServer.getServer();
167
+ }
168
+ onDiag(handler) {
169
+ this.hookServer.onDiag(handler);
170
+ }
171
+ onRawData(callback) {
172
+ this.rawDataCallback = callback;
173
+ }
174
+ async shutdown() {
175
+ if (this.ptyManager.isAlive()) {
176
+ this.ptyManager.kill();
177
+ }
178
+ await this.hookServer.close();
179
+ }
180
+ emitAdapterEvent(evt) {
181
+ this.emit('event', evt);
182
+ }
183
+ }
184
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AgentType, AgentAdapter } from '../types.js';
2
+ export { ClaudeCodeAdapter } from './claude-code.js';
3
+ export { OpenClawAdapter } from './openclaw.js';
4
+ /**
5
+ * Factory: create an adapter for the given agent type.
6
+ */
7
+ export declare function createAdapter(type: AgentType, gatewayUrl?: string): AgentAdapter;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAShF"}
@@ -0,0 +1,18 @@
1
+ import { ClaudeCodeAdapter } from './claude-code.js';
2
+ import { OpenClawAdapter } from './openclaw.js';
3
+ export { ClaudeCodeAdapter } from './claude-code.js';
4
+ export { OpenClawAdapter } from './openclaw.js';
5
+ /**
6
+ * Factory: create an adapter for the given agent type.
7
+ */
8
+ export function createAdapter(type, gatewayUrl) {
9
+ switch (type) {
10
+ case 'claude-code':
11
+ return new ClaudeCodeAdapter();
12
+ case 'openclaw':
13
+ return new OpenClawAdapter(gatewayUrl);
14
+ default:
15
+ throw new Error(`Unknown agent type: ${type}`);
16
+ }
17
+ }
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAe,EAAE,UAAmB;IAChE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;QACzC;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { EventEmitter } from 'events';
2
+ import { type Server } from 'http';
3
+ import type { AgentAdapter, AgentCapabilities, AdapterStartOptions, PluginCommand } from '../types.js';
4
+ /**
5
+ * OpenClaw adapter — connects to OpenClaw Gateway via WebSocket.
6
+ *
7
+ * Protocol: Custom framing (req/res/event), Ed25519 device auth handshake,
8
+ * v3 protocol. Unlike ClaudeCodeAdapter (PTY-based), this adapter:
9
+ * - Connects to an already-running Gateway process
10
+ * - Authenticates via Ed25519 device signature (~/.openclaw/identity/)
11
+ * - Uses req/res framing over WebSocket for all commands
12
+ * - Has no terminal (PTY), mode switching, or diff review
13
+ * - Handles select_option/navigate_option/send_prompt directly via RPC
14
+ */
15
+ export declare class OpenClawAdapter extends EventEmitter implements AgentAdapter {
16
+ readonly capabilities: AgentCapabilities;
17
+ private gatewayUrl;
18
+ private ws;
19
+ private httpServer;
20
+ private reqId;
21
+ private pendingRpc;
22
+ private reconnectTimer;
23
+ private projectName;
24
+ private alive;
25
+ private shutdownRequested;
26
+ private diagHandler;
27
+ private rawDataCallback;
28
+ private currentSessionKey;
29
+ private currentRunId;
30
+ private pendingApprovalId;
31
+ private deviceIdentity;
32
+ private deviceAuthToken;
33
+ /** Reconnect delay (doubles on each failure, max 30s) */
34
+ private reconnectDelay;
35
+ private static readonly MAX_RECONNECT_DELAY;
36
+ private static readonly RPC_TIMEOUT;
37
+ constructor(gatewayUrl?: string);
38
+ start(options: AdapterStartOptions): Promise<void>;
39
+ handleCommand(cmd: PluginCommand): boolean;
40
+ writeInput(data: string): void;
41
+ isAlive(): boolean;
42
+ attachTerminal(_stdin: NodeJS.ReadableStream, _stdout: NodeJS.WritableStream): void;
43
+ getTtyPath(): string | undefined;
44
+ getProjectName(): string | null;
45
+ getHttpServer(): Server;
46
+ onDiag(handler: (tail?: number) => unknown): void;
47
+ onRawData(callback: (data: string) => void): void;
48
+ shutdown(): Promise<void>;
49
+ private loadDeviceIdentity;
50
+ /** Extract raw 32-byte Ed25519 public key from PEM → base64url */
51
+ private getPublicKeyBase64Url;
52
+ /** Build signed device auth for connect request */
53
+ private buildDeviceAuth;
54
+ private connectGateway;
55
+ private scheduleReconnect;
56
+ private rpcCall;
57
+ private handleGatewayMessage;
58
+ private handleGatewayEvent;
59
+ /**
60
+ * Send `connect` request with Ed25519 device authentication.
61
+ * Called when Gateway sends `connect.challenge` event with nonce.
62
+ */
63
+ private sendConnectRequest;
64
+ /** Fetch sessions and set the most recently updated one as active. */
65
+ private fetchSessions;
66
+ /** Fetch model catalog via CLI and emit events. Retries once on failure. */
67
+ private emitModelCatalog;
68
+ private emitAdapterEvent;
69
+ }
70
+ //# sourceMappingURL=openclaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAOjD,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EAEnB,aAAa,EACd,MAAM,aAAa,CAAC;AA8DrB;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,YAAa,YAAW,YAAY;IACvE,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAyB;IAEjE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,UAAU,CAIb;IACL,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,eAAe,CAAyC;IAGhE,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,iBAAiB,CAAuB;IAGhD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAgC;IAEvD,yDAAyD;IACzD,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAU;gBAEjC,UAAU,CAAC,EAAE,MAAM;IA0CzB,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BxD,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IA4F1C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc9B,OAAO,IAAI,OAAO;IAIlB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI;IAInF,UAAU,IAAI,MAAM,GAAG,SAAS;IAIhC,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B,aAAa,IAAI,MAAM;IAIvB,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAIjD,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B/B,OAAO,CAAC,kBAAkB;IA8B1B,kEAAkE;IAClE,OAAO,CAAC,qBAAqB;IAQ7B,mDAAmD;IACnD,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,cAAc;IAwDtB,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,OAAO;IA+Bf,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,kBAAkB;IAkG1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuF1B,sEAAsE;YACxD,aAAa;IAoC3B,4EAA4E;IAC5E,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,gBAAgB;CAGzB"}