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.
Files changed (165) hide show
  1. package/README.md +6 -6
  2. package/dist/acp/adapter.d.ts +19 -0
  3. package/dist/acp/adapter.d.ts.map +1 -0
  4. package/dist/acp/adapter.js +14 -0
  5. package/dist/acp/adapter.js.map +1 -0
  6. package/dist/acp/adapters/antigravity/executor.d.ts +20 -0
  7. package/dist/acp/adapters/antigravity/executor.d.ts.map +1 -0
  8. package/dist/acp/adapters/antigravity/executor.js +99 -0
  9. package/dist/acp/adapters/antigravity/executor.js.map +1 -0
  10. package/dist/acp/adapters/antigravity/image-store.d.ts +9 -0
  11. package/dist/acp/adapters/antigravity/image-store.d.ts.map +1 -0
  12. package/dist/acp/adapters/antigravity/image-store.js +116 -0
  13. package/dist/acp/adapters/antigravity/image-store.js.map +1 -0
  14. package/dist/acp/adapters/antigravity/index.d.ts +5 -0
  15. package/dist/acp/adapters/antigravity/index.d.ts.map +1 -0
  16. package/dist/acp/adapters/antigravity/index.js +5 -0
  17. package/dist/acp/adapters/antigravity/index.js.map +1 -0
  18. package/dist/acp/adapters/antigravity/models.d.ts +35 -0
  19. package/dist/acp/adapters/antigravity/models.d.ts.map +1 -0
  20. package/dist/acp/adapters/antigravity/models.js +59 -0
  21. package/dist/acp/adapters/antigravity/models.js.map +1 -0
  22. package/dist/acp/adapters/antigravity/service.d.ts +35 -0
  23. package/dist/acp/adapters/antigravity/service.d.ts.map +1 -0
  24. package/dist/acp/adapters/antigravity/service.js +67 -0
  25. package/dist/acp/adapters/antigravity/service.js.map +1 -0
  26. package/dist/acp/adapters/antigravity/transcript-loader.d.ts +21 -0
  27. package/dist/acp/adapters/antigravity/transcript-loader.d.ts.map +1 -0
  28. package/dist/acp/adapters/antigravity/transcript-loader.js +356 -0
  29. package/dist/acp/adapters/antigravity/transcript-loader.js.map +1 -0
  30. package/dist/acp/adapters/antigravity/transcript-watcher.d.ts +28 -0
  31. package/dist/acp/adapters/antigravity/transcript-watcher.d.ts.map +1 -0
  32. package/dist/acp/adapters/antigravity/transcript-watcher.js +157 -0
  33. package/dist/acp/adapters/antigravity/transcript-watcher.js.map +1 -0
  34. package/dist/acp/adapters/antigravity/types.d.ts +56 -0
  35. package/dist/acp/adapters/antigravity/types.d.ts.map +1 -0
  36. package/dist/acp/adapters/antigravity/types.js +2 -0
  37. package/dist/acp/adapters/antigravity/types.js.map +1 -0
  38. package/dist/acp/adapters/antigravity-process.d.ts +69 -0
  39. package/dist/acp/adapters/antigravity-process.d.ts.map +1 -0
  40. package/dist/acp/adapters/antigravity-process.js +566 -0
  41. package/dist/acp/adapters/antigravity-process.js.map +1 -0
  42. package/dist/acp/adapters/antigravity.d.ts +8 -0
  43. package/dist/acp/adapters/antigravity.d.ts.map +1 -0
  44. package/dist/acp/adapters/antigravity.js +9 -0
  45. package/dist/acp/adapters/antigravity.js.map +1 -0
  46. package/dist/acp/adapters/cursor-process.d.ts +75 -0
  47. package/dist/acp/adapters/cursor-process.d.ts.map +1 -0
  48. package/dist/acp/adapters/cursor-process.js +273 -0
  49. package/dist/acp/adapters/cursor-process.js.map +1 -0
  50. package/dist/acp/adapters/cursor.d.ts +8 -0
  51. package/dist/acp/adapters/cursor.d.ts.map +1 -0
  52. package/dist/acp/adapters/cursor.js +8 -0
  53. package/dist/acp/adapters/cursor.js.map +1 -0
  54. package/dist/acp/gateway.d.ts +108 -0
  55. package/dist/acp/gateway.d.ts.map +1 -0
  56. package/dist/acp/gateway.js +1040 -0
  57. package/dist/acp/gateway.js.map +1 -0
  58. package/dist/acp/image-content.d.ts +19 -0
  59. package/dist/acp/image-content.d.ts.map +1 -0
  60. package/dist/acp/image-content.js +76 -0
  61. package/dist/acp/image-content.js.map +1 -0
  62. package/dist/acp/method-policy.d.ts +239 -0
  63. package/dist/acp/method-policy.d.ts.map +1 -0
  64. package/dist/acp/method-policy.js +102 -0
  65. package/dist/acp/method-policy.js.map +1 -0
  66. package/dist/acp/peer-bridge.d.ts +59 -0
  67. package/dist/acp/peer-bridge.d.ts.map +1 -0
  68. package/dist/acp/peer-bridge.js +367 -0
  69. package/dist/acp/peer-bridge.js.map +1 -0
  70. package/dist/acp/virtual-harness.d.ts +181 -0
  71. package/dist/acp/virtual-harness.d.ts.map +1 -0
  72. package/dist/acp/virtual-harness.js +1556 -0
  73. package/dist/acp/virtual-harness.js.map +1 -0
  74. package/dist/acp/workspace-tools.d.ts +13 -0
  75. package/dist/acp/workspace-tools.d.ts.map +1 -0
  76. package/dist/acp/workspace-tools.js +46 -0
  77. package/dist/acp/workspace-tools.js.map +1 -0
  78. package/dist/acp.d.ts.map +1 -1
  79. package/dist/acp.js +1 -0
  80. package/dist/acp.js.map +1 -1
  81. package/dist/api-proxy-switch.d.ts +2 -0
  82. package/dist/api-proxy-switch.d.ts.map +1 -1
  83. package/dist/api-proxy-switch.js +9 -0
  84. package/dist/api-proxy-switch.js.map +1 -1
  85. package/dist/cli.d.ts.map +1 -1
  86. package/dist/cli.js +4 -3
  87. package/dist/cli.js.map +1 -1
  88. package/dist/client-runtime.d.ts +25 -1
  89. package/dist/client-runtime.d.ts.map +1 -1
  90. package/dist/client-runtime.js +222 -8
  91. package/dist/client-runtime.js.map +1 -1
  92. package/dist/client.github.js +327 -190
  93. package/dist/client.js +327 -190
  94. package/dist/client.js.map +1 -1
  95. package/dist/codex/domain.d.ts +4 -1
  96. package/dist/codex/domain.d.ts.map +1 -1
  97. package/dist/codex/domain.js +54 -4
  98. package/dist/codex/domain.js.map +1 -1
  99. package/dist/codex/virtual-harness.d.ts.map +1 -1
  100. package/dist/codex/virtual-harness.js +3 -0
  101. package/dist/codex/virtual-harness.js.map +1 -1
  102. package/dist/codex-workspace-bridge.d.ts +7 -105
  103. package/dist/codex-workspace-bridge.d.ts.map +1 -1
  104. package/dist/codex-workspace-bridge.js +10 -498
  105. package/dist/codex-workspace-bridge.js.map +1 -1
  106. package/dist/config.d.ts +28 -10
  107. package/dist/config.d.ts.map +1 -1
  108. package/dist/config.js +49 -5
  109. package/dist/config.js.map +1 -1
  110. package/dist/connection-controller.d.ts.map +1 -1
  111. package/dist/connection-controller.js +7 -4
  112. package/dist/connection-controller.js.map +1 -1
  113. package/dist/control-runtime.d.ts +1 -0
  114. package/dist/control-runtime.d.ts.map +1 -1
  115. package/dist/control-runtime.js +65 -10
  116. package/dist/control-runtime.js.map +1 -1
  117. package/dist/harness-version.d.ts.map +1 -1
  118. package/dist/harness-version.js +16 -3
  119. package/dist/harness-version.js.map +1 -1
  120. package/dist/index.d.ts +4 -0
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +13197 -8204
  123. package/dist/index.js.map +4 -4
  124. package/dist/loopback-host.d.ts +2 -2
  125. package/dist/loopback-host.d.ts.map +1 -1
  126. package/dist/loopback-host.js +41 -16
  127. package/dist/loopback-host.js.map +1 -1
  128. package/dist/remote-typert-gateway.d.ts.map +1 -1
  129. package/dist/remote-typert-gateway.js +7 -4
  130. package/dist/remote-typert-gateway.js.map +1 -1
  131. package/dist/rpc-router.d.ts +6 -5
  132. package/dist/rpc-router.d.ts.map +1 -1
  133. package/dist/rpc-router.js +49 -18
  134. package/dist/rpc-router.js.map +1 -1
  135. package/dist/server-api.d.ts +2 -0
  136. package/dist/server-api.d.ts.map +1 -1
  137. package/dist/server-api.js +5 -0
  138. package/dist/server-api.js.map +1 -1
  139. package/dist/server-connection.d.ts.map +1 -1
  140. package/dist/server-connection.js +15 -0
  141. package/dist/server-connection.js.map +1 -1
  142. package/dist/service.d.ts +30 -1
  143. package/dist/service.d.ts.map +1 -1
  144. package/dist/service.js +114 -12
  145. package/dist/service.js.map +1 -1
  146. package/dist/session-format-compat.d.ts +1 -0
  147. package/dist/session-format-compat.d.ts.map +1 -1
  148. package/dist/session-format-compat.js +14 -0
  149. package/dist/session-format-compat.js.map +1 -1
  150. package/dist/tui-command.js +2 -0
  151. package/dist/tui-command.js.map +1 -1
  152. package/dist/typert-gateway-switch.d.ts +2 -0
  153. package/dist/typert-gateway-switch.d.ts.map +1 -1
  154. package/dist/typert-gateway-switch.js +16 -0
  155. package/dist/typert-gateway-switch.js.map +1 -1
  156. package/dist/version.d.ts +1 -1
  157. package/dist/version.d.ts.map +1 -1
  158. package/dist/version.js +1 -1
  159. package/dist/version.js.map +1 -1
  160. package/dist/workspace-bridge.d.ts +117 -0
  161. package/dist/workspace-bridge.d.ts.map +1 -0
  162. package/dist/workspace-bridge.js +512 -0
  163. package/dist/workspace-bridge.js.map +1 -0
  164. package/dsh-plugin.json +1 -1
  165. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-bridge.d.ts","sourceRoot":"","sources":["../../src/acp/peer-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EAExB,4BAA4B,EAG5B,0BAA0B,EAC3B,MAAM,sBAAsB,CAAA;AAO7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,iBAAiB,GAAG,yBAAyB,EACpD,IAAI,EAAE,iBAAiB,GAAG,wBAAwB,KAC/C,OAAO,CAAC,IAAI,CAAC,CAAA;AAyClB,uEAAuE;AACvE,qBAAa,aAAa;IAQtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAV1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IACxE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IACxE,OAAO,CAAC,MAAM,CAAQ;gBAGH,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,eAAe,EACxB,MAAM,CAAC,EAAE,UAAU,YAAA;IAGhC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAI9B,UAAU;IAexB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAC;IAK9C,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;YA2BlF,UAAU;IAkBxB,4EAA4E;IAC5E,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAOxC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAQ/D,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAuBlE,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAyB/E,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAC;IA4C3E,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B;IAqBxD,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAMhE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5F,WAAW,CAAC,MAAM,GAAE,wBAAwB,CAAC,QAAQ,CAAY,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB/B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,367 @@
1
+ import { acpToolStreamSchema } from './method-policy.js';
2
+ import { Buffer } from 'node:buffer';
3
+ import { AGENT_ACP_TRANSFER_CHUNK_BYTES, MAX_AGENT_ACP_TRANSFER_BYTES, MAX_SECURE_MESSAGE_BYTES, } from '@dsh-remote/protocol';
4
+ import { z } from 'zod';
5
+ import { RpcError } from '../safe-error.js';
6
+ const streamOpenSchema = z.object({
7
+ streamId: z.string().min(1).max(128),
8
+ sessionId: z.string().min(1).max(256),
9
+ tool: acpToolStreamSchema.optional(),
10
+ }).strict();
11
+ const streamCloseSchema = z.object({ streamId: z.string().min(1).max(128) }).strict();
12
+ const transferOpenSchema = z.object({
13
+ transferId: z.string().uuid(),
14
+ totalBytes: z.number().int().positive().max(MAX_AGENT_ACP_TRANSFER_BYTES),
15
+ totalChunks: z.number().int().positive(),
16
+ }).strict();
17
+ const transferChunkSchema = z.object({
18
+ transferId: z.string().uuid(),
19
+ index: z.number().int().nonnegative(),
20
+ data: z.string().min(1).max(Math.ceil(AGENT_ACP_TRANSFER_CHUNK_BYTES / 3) * 4),
21
+ }).strict();
22
+ const transferIdSchema = z.object({ transferId: z.string().uuid() }).strict();
23
+ const transferReadSchema = z.object({ transferId: z.string().uuid(), index: z.number().int().nonnegative() }).strict();
24
+ const MAX_ACTIVE_STREAMS = 16;
25
+ const MAX_ACTIVE_TRANSFERS = 2;
26
+ const TRANSFER_IDLE_MS = 2 * 60_000;
27
+ const INLINE_TRANSFER_RESPONSE_BYTES = 2 * 1024 * 1024;
28
+ /** Per-authenticated-connection state for the Cursor Remote domain. */
29
+ export class AcpPeerBridge {
30
+ domain;
31
+ context;
32
+ publish;
33
+ logger;
34
+ toolControllers = new Map();
35
+ streams = new Map();
36
+ incomingTransfers = new Map();
37
+ outgoingTransfers = new Map();
38
+ closed = false;
39
+ constructor(domain, context, publish, logger) {
40
+ this.domain = domain;
41
+ this.context = context;
42
+ this.publish = publish;
43
+ this.logger = logger;
44
+ }
45
+ async call(input) {
46
+ return this.callDomain(input, true);
47
+ }
48
+ async callDomain(input, logFailure) {
49
+ this.requireOpen();
50
+ try {
51
+ return await this.domain.call(this.context.connectionId, input);
52
+ }
53
+ catch (error) {
54
+ if (logFailure) {
55
+ this.logger?.warn('Cursor call failed', {
56
+ method: safeMethod(input),
57
+ code: safeErrorCode(error),
58
+ });
59
+ }
60
+ throw error;
61
+ }
62
+ }
63
+ respond(input) {
64
+ this.requireOpen();
65
+ return this.domain.respond(this.context.connectionId, input);
66
+ }
67
+ async openStream(input) {
68
+ this.requireOpen();
69
+ const params = streamOpenSchema.parse(input);
70
+ if (this.streams.has(params.streamId))
71
+ throw new RpcError('REQUEST_CONFLICT', 'The ACP stream id is already active.');
72
+ if (this.streams.size >= MAX_ACTIVE_STREAMS) {
73
+ throw new RpcError('RATE_LIMITED', 'Too many ACP streams are active for this connection.', undefined, true);
74
+ }
75
+ this.domain.assertStreamable(this.context.connectionId, params.sessionId);
76
+ this.streams.set(params.streamId, params.sessionId);
77
+ if (params.tool) {
78
+ const controller = new AbortController();
79
+ this.toolControllers.set(params.streamId, controller);
80
+ try {
81
+ const source = await this.domain.openToolStream(this.context.connectionId, params.sessionId, params.tool.backend, params.tool.endpoint, params.tool.args, controller.signal);
82
+ if (controller.signal.aborted || this.closed) {
83
+ controller.abort();
84
+ return { opened: true, streamId: params.streamId, sessionId: params.sessionId };
85
+ }
86
+ void this.followTool(params.streamId, source, controller);
87
+ }
88
+ catch (error) {
89
+ controller.abort();
90
+ this.streams.delete(params.streamId);
91
+ this.toolControllers.delete(params.streamId);
92
+ throw error;
93
+ }
94
+ }
95
+ else
96
+ await this.domain.replayBufferedFrames(this.context.connectionId, params.sessionId);
97
+ return { opened: true, streamId: params.streamId, sessionId: params.sessionId };
98
+ }
99
+ async followTool(streamId, source, controller) {
100
+ let reason = 'completed';
101
+ try {
102
+ for await (const value of source) {
103
+ if (controller.signal.aborted || this.closed)
104
+ break;
105
+ const data = { streamId, frame: { method: 'dsh/workspaceTool', params: { value } } };
106
+ if (Buffer.byteLength(JSON.stringify(data)) > MAX_SECURE_MESSAGE_BYTES)
107
+ throw new Error('Oversized workspace tool frame');
108
+ await this.publish('agent.acp.frame', data);
109
+ }
110
+ }
111
+ catch {
112
+ reason = 'failed';
113
+ }
114
+ finally {
115
+ this.streams.delete(streamId);
116
+ this.toolControllers.delete(streamId);
117
+ controller.abort();
118
+ if (!this.closed)
119
+ await this.publish('agent.acp.stream.closed', { streamId, reason }).catch(() => undefined);
120
+ }
121
+ }
122
+ /** Whether this peer has at least one live stream observing the session. */
123
+ hasStreamFor(sessionId) {
124
+ for (const target of this.streams.values()) {
125
+ if (target === sessionId)
126
+ return true;
127
+ }
128
+ return false;
129
+ }
130
+ closeStream(input) {
131
+ const params = streamCloseSchema.parse(input);
132
+ this.streams.delete(params.streamId);
133
+ this.toolControllers.get(params.streamId)?.abort();
134
+ this.toolControllers.delete(params.streamId);
135
+ return { closed: true, streamId: params.streamId };
136
+ }
137
+ openTransfer(input) {
138
+ this.requireOpen();
139
+ this.pruneTransfers();
140
+ const params = transferOpenSchema.parse(input);
141
+ if (params.totalChunks !== Math.ceil(params.totalBytes / AGENT_ACP_TRANSFER_CHUNK_BYTES)) {
142
+ throw new RpcError('INVALID_MESSAGE', 'The ACP transfer chunk count is invalid.');
143
+ }
144
+ if (this.incomingTransfers.has(params.transferId) || this.outgoingTransfers.has(params.transferId)) {
145
+ throw new RpcError('REQUEST_CONFLICT', 'The ACP transfer id is already active.');
146
+ }
147
+ if (this.incomingTransfers.size >= MAX_ACTIVE_TRANSFERS) {
148
+ throw new RpcError('RATE_LIMITED', 'Too many ACP transfers are active.', undefined, true);
149
+ }
150
+ this.incomingTransfers.set(params.transferId, {
151
+ totalBytes: params.totalBytes,
152
+ totalChunks: params.totalChunks,
153
+ chunks: [],
154
+ receivedBytes: 0,
155
+ touchedAt: Date.now(),
156
+ });
157
+ return { opened: true, transferId: params.transferId };
158
+ }
159
+ appendTransfer(input) {
160
+ this.requireOpen();
161
+ this.pruneTransfers();
162
+ const params = transferChunkSchema.parse(input);
163
+ const transfer = this.incomingTransfers.get(params.transferId);
164
+ if (transfer === undefined)
165
+ throw new RpcError('TRANSFER_NOT_FOUND', 'The ACP transfer is not active.');
166
+ if (params.index !== transfer.chunks.length || params.index >= transfer.totalChunks) {
167
+ this.incomingTransfers.delete(params.transferId);
168
+ throw new RpcError('INVALID_MESSAGE', 'ACP transfer chunks must arrive exactly once and in order.');
169
+ }
170
+ const chunk = decodeCanonicalBase64(params.data);
171
+ const expectedBytes = Math.min(AGENT_ACP_TRANSFER_CHUNK_BYTES, transfer.totalBytes - params.index * AGENT_ACP_TRANSFER_CHUNK_BYTES);
172
+ if (chunk.byteLength !== expectedBytes) {
173
+ this.incomingTransfers.delete(params.transferId);
174
+ throw new RpcError('INVALID_MESSAGE', 'The ACP transfer chunk size is invalid.');
175
+ }
176
+ transfer.chunks.push(chunk);
177
+ transfer.receivedBytes += chunk.byteLength;
178
+ transfer.touchedAt = Date.now();
179
+ return { accepted: true, transferId: params.transferId, index: params.index };
180
+ }
181
+ async commitTransfer(input) {
182
+ this.requireOpen();
183
+ this.pruneTransfers();
184
+ const params = transferIdSchema.parse(input);
185
+ const transfer = this.incomingTransfers.get(params.transferId);
186
+ if (transfer === undefined)
187
+ throw new RpcError('TRANSFER_NOT_FOUND', 'The ACP transfer is not active.');
188
+ this.incomingTransfers.delete(params.transferId);
189
+ if (transfer.chunks.length !== transfer.totalChunks || transfer.receivedBytes !== transfer.totalBytes) {
190
+ throw new RpcError('INVALID_MESSAGE', 'The ACP transfer is incomplete.');
191
+ }
192
+ let request;
193
+ try {
194
+ request = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(concatChunks(transfer.chunks, transfer.totalBytes)));
195
+ }
196
+ catch {
197
+ throw new RpcError('INVALID_MESSAGE', 'The ACP transfer does not contain a valid request.');
198
+ }
199
+ let response;
200
+ try {
201
+ response = await this.callDomain(request, false);
202
+ }
203
+ catch (error) {
204
+ this.logger?.warn('ACP transfer call failed', {
205
+ method: safeMethod(request),
206
+ code: safeErrorCode(error),
207
+ });
208
+ throw error;
209
+ }
210
+ const responseBytes = new TextEncoder().encode(JSON.stringify(response));
211
+ if (responseBytes.byteLength <= INLINE_TRANSFER_RESPONSE_BYTES)
212
+ return { kind: 'inline', response };
213
+ if (responseBytes.byteLength > MAX_AGENT_ACP_TRANSFER_BYTES) {
214
+ throw new RpcError('RESPONSE_TOO_LARGE', 'The Cursor response exceeds the bounded transfer limit.');
215
+ }
216
+ if (this.outgoingTransfers.size >= MAX_ACTIVE_TRANSFERS) {
217
+ throw new RpcError('RATE_LIMITED', 'Too many Cursor response transfers are active.', undefined, true);
218
+ }
219
+ const totalChunks = Math.ceil(responseBytes.byteLength / AGENT_ACP_TRANSFER_CHUNK_BYTES);
220
+ this.outgoingTransfers.set(params.transferId, {
221
+ bytes: responseBytes,
222
+ totalChunks,
223
+ nextIndex: 0,
224
+ touchedAt: Date.now(),
225
+ });
226
+ return { kind: 'chunked', transferId: params.transferId, totalBytes: responseBytes.byteLength, totalChunks };
227
+ }
228
+ readTransfer(input) {
229
+ this.requireOpen();
230
+ this.pruneTransfers();
231
+ const params = transferReadSchema.parse(input);
232
+ const transfer = this.outgoingTransfers.get(params.transferId);
233
+ if (transfer === undefined)
234
+ throw new RpcError('TRANSFER_NOT_FOUND', 'The Cursor response transfer is not active.');
235
+ if (params.index !== transfer.nextIndex || params.index >= transfer.totalChunks) {
236
+ this.outgoingTransfers.delete(params.transferId);
237
+ throw new RpcError('INVALID_MESSAGE', 'Cursor response chunks must be read exactly once and in order.');
238
+ }
239
+ const start = params.index * AGENT_ACP_TRANSFER_CHUNK_BYTES;
240
+ const end = Math.min(start + AGENT_ACP_TRANSFER_CHUNK_BYTES, transfer.bytes.byteLength);
241
+ transfer.nextIndex += 1;
242
+ transfer.touchedAt = Date.now();
243
+ return {
244
+ transferId: params.transferId,
245
+ index: params.index,
246
+ data: Buffer.from(transfer.bytes.subarray(start, end)).toString('base64'),
247
+ };
248
+ }
249
+ closeTransfer(input) {
250
+ const params = transferIdSchema.parse(input);
251
+ const closed = this.incomingTransfers.delete(params.transferId) || this.outgoingTransfers.delete(params.transferId);
252
+ return { closed, transferId: params.transferId };
253
+ }
254
+ async publishInbound(sessionId, frame) {
255
+ if (this.closed)
256
+ throw new RpcError('ACP_CONNECTION_CLOSED', 'The ACP connection is closed.');
257
+ const streamIds = [...this.streams.entries()]
258
+ .filter(([id, targetSessionId]) => !this.toolControllers.has(id) && targetSessionId === sessionId)
259
+ .map(([streamId]) => streamId);
260
+ if (streamIds.length === 0) {
261
+ this.logger?.warn('Publishing ACP frame without an open stream; using session-scoped delivery', {
262
+ method: frame.method,
263
+ });
264
+ }
265
+ // Always address live frames by session id. Explicit stream ids are still
266
+ // tracked for interest/backpressure, but Clients match session-scoped
267
+ // delivery after reconnects when stream ids diverge.
268
+ const data = { streamId: `session:${sessionId}`, frame };
269
+ if (new TextEncoder().encode(JSON.stringify(data)).byteLength > MAX_SECURE_MESSAGE_BYTES) {
270
+ for (const streamId of streamIds) {
271
+ this.streams.delete(streamId);
272
+ await this.publish('agent.acp.stream.closed', { streamId, reason: 'failed' }).catch(() => undefined);
273
+ }
274
+ this.logger?.warn('ACP stream closed after oversized frame', { method: frame.method });
275
+ throw new RpcError('RESPONSE_TOO_LARGE', 'The ACP frame exceeds the secure channel limit.');
276
+ }
277
+ try {
278
+ await this.publish('agent.acp.frame', data);
279
+ }
280
+ catch (error) {
281
+ this.logger?.warn('ACP frame publish failed', {
282
+ method: frame.method,
283
+ code: safeErrorCode(error),
284
+ });
285
+ throw error;
286
+ }
287
+ }
288
+ async failStreams(reason = 'failed', sessions) {
289
+ if (this.closed)
290
+ return;
291
+ const streamIds = [...this.streams].filter(([, sessionId]) => sessions === undefined || sessions.has(sessionId)).map(([id]) => id);
292
+ for (const id of streamIds) {
293
+ this.streams.delete(id);
294
+ this.toolControllers.get(id)?.abort();
295
+ this.toolControllers.delete(id);
296
+ }
297
+ this.incomingTransfers.clear();
298
+ this.outgoingTransfers.clear();
299
+ await Promise.all(streamIds.map(streamId => this.publish('agent.acp.stream.closed', {
300
+ streamId,
301
+ reason,
302
+ }).catch(() => undefined)));
303
+ }
304
+ async closeAll() {
305
+ if (this.closed)
306
+ return;
307
+ this.closed = true;
308
+ const streamIds = [...this.streams.keys()];
309
+ this.streams.clear();
310
+ for (const controller of this.toolControllers.values())
311
+ controller.abort();
312
+ this.toolControllers.clear();
313
+ this.incomingTransfers.clear();
314
+ this.outgoingTransfers.clear();
315
+ await Promise.all(streamIds.map(streamId => this.publish('agent.acp.stream.closed', {
316
+ streamId,
317
+ reason: 'peer-disconnected',
318
+ }).catch(() => undefined)));
319
+ this.domain.dropPeer(this.context.connectionId);
320
+ }
321
+ pruneTransfers() {
322
+ const staleBefore = Date.now() - TRANSFER_IDLE_MS;
323
+ for (const [id, transfer] of this.incomingTransfers) {
324
+ if (transfer.touchedAt < staleBefore)
325
+ this.incomingTransfers.delete(id);
326
+ }
327
+ for (const [id, transfer] of this.outgoingTransfers) {
328
+ if (transfer.touchedAt < staleBefore)
329
+ this.outgoingTransfers.delete(id);
330
+ }
331
+ }
332
+ requireOpen() {
333
+ if (this.closed)
334
+ throw new RpcError('ACP_CONNECTION_CLOSED', 'The ACP connection is closed.');
335
+ }
336
+ }
337
+ function decodeCanonicalBase64(value) {
338
+ if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value)) {
339
+ throw new RpcError('INVALID_MESSAGE', 'The ACP transfer chunk is not canonical base64.');
340
+ }
341
+ const decoded = Buffer.from(value, 'base64');
342
+ if (decoded.toString('base64') !== value) {
343
+ throw new RpcError('INVALID_MESSAGE', 'The ACP transfer chunk is not canonical base64.');
344
+ }
345
+ return decoded;
346
+ }
347
+ function isRecord(value) {
348
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
349
+ }
350
+ function safeErrorCode(error) {
351
+ if (isRecord(error) && typeof error.code === 'string')
352
+ return error.code;
353
+ return 'UNKNOWN';
354
+ }
355
+ function safeMethod(input) {
356
+ return isRecord(input) && typeof input.method === 'string' ? input.method : 'invalid';
357
+ }
358
+ function concatChunks(chunks, totalBytes) {
359
+ const output = new Uint8Array(totalBytes);
360
+ let offset = 0;
361
+ for (const chunk of chunks) {
362
+ output.set(chunk, offset);
363
+ offset += chunk.byteLength;
364
+ }
365
+ return output;
366
+ }
367
+ //# sourceMappingURL=peer-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-bridge.js","sourceRoot":"","sources":["../../src/acp/peer-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ import { ACP_TOOL_CALL_ENDPOINTS, type AcpSessionModels, type AgentAcpStreamOpenParams } from '@dsh-remote/protocol';
2
+ import { type AcpImage } from './image-content.js';
3
+ import type { ApiProxy } from '@deepseek-ai/dsh-host-apiproxy/api';
4
+ import { AgentAcpClient } from '@dsh-remote/client-core';
5
+ import type { AgentAcpFrameData, AgentAcpStreamClosedData } from '@dsh-remote/protocol';
6
+ import type { RemoteTypertGatewayTarget, TypertGatewayRequest, TypertRpcResult } from '../typert-gateway-contract.js';
7
+ type JsonRecord = Record<string, unknown>;
8
+ export interface AcpVirtualWorkspaceView {
9
+ workspaceId: string;
10
+ path: string;
11
+ title: string;
12
+ sessionIds: string[];
13
+ sessionCount: number;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ }
17
+ export interface AcpClientLike {
18
+ sessionModels?(sessionId: string, backend: 'antigravity', signal?: AbortSignal): Promise<AcpSessionModels>;
19
+ selectModel?(sessionId: string, backend: 'antigravity', selection: AcpModelSelection, signal?: AbortSignal): Promise<AcpModelSelection>;
20
+ workspaceToolCall?(sessionId: string, backend: 'cursor' | 'antigravity', endpoint: typeof ACP_TOOL_CALL_ENDPOINTS[number], args: JsonRecord, signal?: AbortSignal): Promise<unknown>;
21
+ createSession(cwd: string, mode?: 'agent' | 'plan' | 'ask', backend?: 'cursor' | 'antigravity', signal?: AbortSignal): Promise<{
22
+ sessionId: string;
23
+ cwd?: string;
24
+ }>;
25
+ prompt(sessionId: string, text: string, signal?: AbortSignal, images?: AcpImage[], backend?: 'cursor' | 'antigravity'): Promise<unknown>;
26
+ cancel(sessionId: string, signal?: AbortSignal): Promise<unknown>;
27
+ listDirectory(path: string, signal?: AbortSignal): Promise<unknown>;
28
+ listWorkspaces?(backend?: string, signal?: AbortSignal): Promise<Array<{
29
+ path: string;
30
+ title?: string;
31
+ sessionCount?: number;
32
+ }>>;
33
+ listSessions?(path: string, backend?: string, limit?: number, signal?: AbortSignal): Promise<Array<{
34
+ conversationId: string;
35
+ title: string;
36
+ createdAt: number;
37
+ updatedAt: number;
38
+ }>>;
39
+ loadSessionHistory?(sessionId: string, backend?: string, signal?: AbortSignal): Promise<unknown[]>;
40
+ openStream(sessionId: string, onFrame: (frame: AgentAcpFrameData) => void, onClosed?: (closed: AgentAcpStreamClosedData) => void, signal?: AbortSignal, tool?: AgentAcpStreamOpenParams['tool']): Promise<{
41
+ close(): Promise<void>;
42
+ }>;
43
+ respond(requestHandle: string, decision: 'allow-once' | 'allow-always' | 'reject-once' | 'cancel', result?: unknown, signal?: AbortSignal): Promise<unknown>;
44
+ }
45
+ /** Build a backend-scoped virtual Workspace id for an absolute Host cwd. */
46
+ export declare function acpCwdWorkspaceId(path: string, backend: 'cursor' | 'antigravity'): string;
47
+ export declare function createAcpWorkspaceView(path: string, backend: 'cursor' | 'antigravity', title?: string): AcpVirtualWorkspaceView;
48
+ /** Discover ACP virtual workspaces visible on the Host. */
49
+ export declare function discoverAcpVirtualWorkspaces(client: AcpClientLike, backend: 'cursor' | 'antigravity', signal?: AbortSignal): Promise<AcpVirtualWorkspaceView[]>;
50
+ /**
51
+ * Browser-safe, in-memory Harness projection for the independent Agent ACP domain. Projects
52
+ * cwd workspaces and ACP sessions onto the native DSH Workspace / Session /
53
+ * Composer surface without writing DSH SessionStore.
54
+ */
55
+ export declare class AcpVirtualHarness implements RemoteTypertGatewayTarget {
56
+ private readonly client;
57
+ private readonly host;
58
+ readonly backend: 'cursor' | 'antigravity';
59
+ readonly api: ApiProxy;
60
+ private readonly workspaceById;
61
+ private readonly sessions;
62
+ private readonly workspaceStreams;
63
+ private readonly controlStreams;
64
+ private readonly eventStreams;
65
+ private readonly rcMuxStreams;
66
+ private readonly rcHostStreams;
67
+ private readonly follows;
68
+ private readonly pendingApprovals;
69
+ private selectedWorkspaceId?;
70
+ private readonly selectedModels;
71
+ private lastProjectionSeq;
72
+ private readonly imageAttachments;
73
+ private closed;
74
+ constructor(client: AcpClientLike, host: {
75
+ deviceId: string;
76
+ name: string;
77
+ }, backend?: 'cursor' | 'antigravity');
78
+ static remote(core: ConstructorParameters<typeof AgentAcpClient>[0], host: {
79
+ deviceId: string;
80
+ name: string;
81
+ }, backend?: 'cursor' | 'antigravity', capabilities?: readonly string[]): AcpVirtualHarness;
82
+ workspaces(): Promise<AcpVirtualWorkspaceView[]>;
83
+ private backendLabel;
84
+ selectWorkspace(workspaceId: string): Promise<AcpVirtualWorkspaceView>;
85
+ selectOrCreateWorkspace(path: string): Promise<AcpVirtualWorkspaceView>;
86
+ preferredSessionId(): Promise<string | undefined>;
87
+ invoke(request: TypertGatewayRequest): Promise<unknown>;
88
+ dispatch(endpoint: string, payload: unknown, signal: AbortSignal): Promise<TypertRpcResult>;
89
+ open(endpoint: string, payload: unknown, signal: AbortSignal): Promise<AsyncIterable<unknown>>;
90
+ close(): Promise<void>;
91
+ private visibleWorkspaces;
92
+ private createWorkspace;
93
+ private renameWorkspace;
94
+ private workspaceForSession;
95
+ private archiveSession;
96
+ private createSession;
97
+ private ensureSessionRegistered;
98
+ private prompt;
99
+ private cancel;
100
+ private renameSession;
101
+ private cacheImageAttachments;
102
+ private attachment;
103
+ private hydrateSession;
104
+ private sessionHistory;
105
+ private sessionPage;
106
+ private historyPage;
107
+ private describeHost;
108
+ private listDirectory;
109
+ private answerRemoteEvent;
110
+ private workspaceFollow;
111
+ private sessionControl;
112
+ private remoteEvents;
113
+ private sessionFollow;
114
+ private ensureFollow;
115
+ private acceptAcpFrame;
116
+ private acceptSessionUpdate;
117
+ private acceptApproval;
118
+ private pushAssistantChunk;
119
+ private endAssistantAttempt;
120
+ private appendAssistantDelta;
121
+ private appendReasoningDelta;
122
+ private closeFollowAfterRemoteStreamClosed;
123
+ private pushEvent;
124
+ private registerSession;
125
+ private applyDiscoveredTitle;
126
+ private refreshSessionTitle;
127
+ private discoverAndAttachSessions;
128
+ private attachSessionToWorkspace;
129
+ private ensureInitialSession;
130
+ private handleSessionList;
131
+ private sessionSummaries;
132
+ private sessionSummary;
133
+ private modelSelection;
134
+ private modelSelectionProjection;
135
+ private hostSessionModels;
136
+ private selectModel;
137
+ private publishWorkspaceBaseline;
138
+ private publishProjection;
139
+ private emitRemoteEvent;
140
+ private emitApproval;
141
+ private nextProjectionSeq;
142
+ private createApiProxy;
143
+ private rcMux;
144
+ private rcHost;
145
+ private broadcastRcMux;
146
+ private broadcastRcHost;
147
+ }
148
+ export interface AcpModelSelection {
149
+ provider: string;
150
+ model: string;
151
+ reasoningEffort?: string;
152
+ }
153
+ export interface AcpModelView {
154
+ id: string;
155
+ name: string;
156
+ description?: string;
157
+ reasoning?: {
158
+ efforts: Array<{
159
+ id: string;
160
+ name: string;
161
+ description?: string;
162
+ }>;
163
+ defaultEffort?: string;
164
+ };
165
+ }
166
+ export declare function modelCatalog(backend?: 'cursor' | 'antigravity'): {
167
+ default: AcpModelSelection;
168
+ routableProviders: string[];
169
+ groups: Array<{
170
+ id: string;
171
+ name: string;
172
+ models: AcpModelView[];
173
+ }>;
174
+ failures: Array<{
175
+ id: string;
176
+ name: string;
177
+ message: string;
178
+ }>;
179
+ };
180
+ export {};
181
+ //# sourceMappingURL=virtual-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-harness.d.ts","sourceRoot":"","sources":["../../src/acp/virtual-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA6B,KAAK,gBAAgB,EAAE,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/I,OAAO,EAAkD,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClG,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,oCAAoC,CAAA;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EAChB,MAAM,+BAA+B,CAAA;AAStC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAoDD,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC1G,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACvI,iBAAiB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,aAAa,EAAE,QAAQ,EAAE,OAAO,uBAAuB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpL,aAAa,CACX,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,EAC/B,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,EAClC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACxI,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACnE,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IAChI,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IACpL,kBAAkB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAClG,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,EAC3C,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,EACrD,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,wBAAwB,CAAC,MAAM,CAAC,GACtC,OAAO,CAAC;QAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAA;IACtC,OAAO,CACL,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,EAClE,MAAM,CAAC,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAAA;CACpB;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM,CAGzF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAY/H;AAED,2DAA2D;AAC3D,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,QAAQ,GAAG,aAAa,EACjC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAkBpC;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,yBAAyB;IAmB/D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,aAAa;IApB5C,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;IAEtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6C;IAC3E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAClE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqC;IACtE,OAAO,CAAC,mBAAmB,CAAC,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuC;IACtE,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA8E;IAC/G,OAAO,CAAC,MAAM,CAAQ;gBAGH,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAChD,OAAO,GAAE,QAAQ,GAAG,aAAwB;IAKvD,MAAM,CAAC,MAAM,CACX,IAAI,EAAE,qBAAqB,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,EACrD,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EACxC,OAAO,GAAE,QAAQ,GAAG,aAAwB,EAC5C,YAAY,GAAE,SAAS,MAAM,EAAO,GACnC,iBAAiB;IAId,UAAU,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAItD,OAAO,CAAC,YAAY;IAId,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAatE,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAevE,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAsBjD,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAcvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAqE3F,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAqB9F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB5B,OAAO,CAAC,iBAAiB;YAUX,eAAe;YAQf,eAAe;YAYf,mBAAmB;YAQnB,cAAc;YAkBd,aAAa;IAuB3B,OAAO,CAAC,uBAAuB;YAkBjB,MAAM;YAuCN,MAAM;YAUN,aAAa;IAa3B,OAAO,CAAC,qBAAqB;YAUf,UAAU;YAUV,cAAc;YAkBd,cAAc;YAwBd,WAAW;IAazB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,YAAY;YAgBN,aAAa;YASb,iBAAiB;YAgBjB,eAAe;YAcf,cAAc;YAWd,YAAY;YAeZ,aAAa;YA8Db,YAAY;IA6B1B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,mBAAmB;IAmE3B,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,kCAAkC;IAsD1C,OAAO,CAAC,SAAS;IA4BjB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,oBAAoB;YAOd,mBAAmB;YAWnB,yBAAyB;IA6BvC,OAAO,CAAC,wBAAwB;YAclB,oBAAoB;YAYpB,iBAAiB;IAU/B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,wBAAwB;YAKlB,iBAAiB;YAOjB,WAAW;IA+BzB,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;YAmEP,KAAK;YAiBL,MAAM;IAWrB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;CAIxB;AAyBD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAClE,aAAa,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;CACF;AAWD,wBAAgB,YAAY,CAAC,OAAO,GAAE,QAAQ,GAAG,aAAwB,GAAG;IAC1E,OAAO,EAAE,iBAAiB,CAAA;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAA;IACnE,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/D,CAeA"}