@dotcraft/sdk 0.5.9

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 (139) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +30 -0
  3. package/dist/app-binding.d.ts +4 -0
  4. package/dist/app-binding.d.ts.map +1 -0
  5. package/dist/app-binding.js +2 -0
  6. package/dist/app-binding.js.map +1 -0
  7. package/dist/appServerClient.d.ts +66 -0
  8. package/dist/appServerClient.d.ts.map +1 -0
  9. package/dist/appServerClient.js +140 -0
  10. package/dist/appServerClient.js.map +1 -0
  11. package/dist/client.d.ts +90 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +418 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/client.test.d.ts +2 -0
  16. package/dist/client.test.d.ts.map +1 -0
  17. package/dist/client.test.js +244 -0
  18. package/dist/client.test.js.map +1 -0
  19. package/dist/contracts.d.ts +5 -0
  20. package/dist/contracts.d.ts.map +1 -0
  21. package/dist/contracts.js +5 -0
  22. package/dist/contracts.js.map +1 -0
  23. package/dist/dotcraft.d.ts +331 -0
  24. package/dist/dotcraft.d.ts.map +1 -0
  25. package/dist/dotcraft.js +819 -0
  26. package/dist/dotcraft.js.map +1 -0
  27. package/dist/dotcraft.test.d.ts +2 -0
  28. package/dist/dotcraft.test.d.ts.map +1 -0
  29. package/dist/dotcraft.test.js +423 -0
  30. package/dist/dotcraft.test.js.map +1 -0
  31. package/dist/dynamic-tools.d.ts +3 -0
  32. package/dist/dynamic-tools.d.ts.map +1 -0
  33. package/dist/dynamic-tools.js +2 -0
  34. package/dist/dynamic-tools.js.map +1 -0
  35. package/dist/errors.d.ts +50 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +112 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/generated/appserver/client-notifications.generated.d.ts +9 -0
  40. package/dist/generated/appserver/client-notifications.generated.d.ts.map +1 -0
  41. package/dist/generated/appserver/client-notifications.generated.js +3 -0
  42. package/dist/generated/appserver/client-notifications.generated.js.map +1 -0
  43. package/dist/generated/appserver/client-requests.generated.d.ts +785 -0
  44. package/dist/generated/appserver/client-requests.generated.d.ts.map +1 -0
  45. package/dist/generated/appserver/client-requests.generated.js +3 -0
  46. package/dist/generated/appserver/client-requests.generated.js.map +1 -0
  47. package/dist/generated/appserver/index.d.ts +9 -0
  48. package/dist/generated/appserver/index.d.ts.map +1 -0
  49. package/dist/generated/appserver/index.js +10 -0
  50. package/dist/generated/appserver/index.js.map +1 -0
  51. package/dist/generated/appserver/item-payloads.generated.d.ts +52 -0
  52. package/dist/generated/appserver/item-payloads.generated.d.ts.map +1 -0
  53. package/dist/generated/appserver/item-payloads.generated.js +35 -0
  54. package/dist/generated/appserver/item-payloads.generated.js.map +1 -0
  55. package/dist/generated/appserver/method-groups.generated.d.ts +8 -0
  56. package/dist/generated/appserver/method-groups.generated.d.ts.map +1 -0
  57. package/dist/generated/appserver/method-groups.generated.js +274 -0
  58. package/dist/generated/appserver/method-groups.generated.js.map +1 -0
  59. package/dist/generated/appserver/models.generated.d.ts +4415 -0
  60. package/dist/generated/appserver/models.generated.d.ts.map +1 -0
  61. package/dist/generated/appserver/models.generated.js +3 -0
  62. package/dist/generated/appserver/models.generated.js.map +1 -0
  63. package/dist/generated/appserver/protocol-info.generated.d.ts +6 -0
  64. package/dist/generated/appserver/protocol-info.generated.d.ts.map +1 -0
  65. package/dist/generated/appserver/protocol-info.generated.js +7 -0
  66. package/dist/generated/appserver/protocol-info.generated.js.map +1 -0
  67. package/dist/generated/appserver/server-notifications.generated.d.ts +197 -0
  68. package/dist/generated/appserver/server-notifications.generated.d.ts.map +1 -0
  69. package/dist/generated/appserver/server-notifications.generated.js +3 -0
  70. package/dist/generated/appserver/server-notifications.generated.js.map +1 -0
  71. package/dist/generated/appserver/server-requests.generated.d.ts +73 -0
  72. package/dist/generated/appserver/server-requests.generated.d.ts.map +1 -0
  73. package/dist/generated/appserver/server-requests.generated.js +3 -0
  74. package/dist/generated/appserver/server-requests.generated.js.map +1 -0
  75. package/dist/generatedAppServer.test.d.ts +2 -0
  76. package/dist/generatedAppServer.test.d.ts.map +1 -0
  77. package/dist/generatedAppServer.test.js +112 -0
  78. package/dist/generatedAppServer.test.js.map +1 -0
  79. package/dist/hub.d.ts +6 -0
  80. package/dist/hub.d.ts.map +1 -0
  81. package/dist/hub.js +5 -0
  82. package/dist/hub.js.map +1 -0
  83. package/dist/hubClient.d.ts +134 -0
  84. package/dist/hubClient.d.ts.map +1 -0
  85. package/dist/hubClient.js +372 -0
  86. package/dist/hubClient.js.map +1 -0
  87. package/dist/hubClient.test.d.ts +2 -0
  88. package/dist/hubClient.test.d.ts.map +1 -0
  89. package/dist/hubClient.test.js +220 -0
  90. package/dist/hubClient.test.js.map +1 -0
  91. package/dist/index.d.ts +7 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +5 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/meta.d.ts +2 -0
  96. package/dist/meta.d.ts.map +1 -0
  97. package/dist/meta.js +2 -0
  98. package/dist/meta.js.map +1 -0
  99. package/dist/models.d.ts +44 -0
  100. package/dist/models.d.ts.map +1 -0
  101. package/dist/models.js +96 -0
  102. package/dist/models.js.map +1 -0
  103. package/dist/protocolBaseline.test.d.ts +2 -0
  104. package/dist/protocolBaseline.test.d.ts.map +1 -0
  105. package/dist/protocolBaseline.test.js +77 -0
  106. package/dist/protocolBaseline.test.js.map +1 -0
  107. package/dist/publicApi.test.d.ts +2 -0
  108. package/dist/publicApi.test.d.ts.map +1 -0
  109. package/dist/publicApi.test.js +29 -0
  110. package/dist/publicApi.test.js.map +1 -0
  111. package/dist/test-contract-fixtures.d.ts +6 -0
  112. package/dist/test-contract-fixtures.d.ts.map +1 -0
  113. package/dist/test-contract-fixtures.js +33 -0
  114. package/dist/test-contract-fixtures.js.map +1 -0
  115. package/dist/testing.d.ts +3 -0
  116. package/dist/testing.d.ts.map +1 -0
  117. package/dist/testing.js +3 -0
  118. package/dist/testing.js.map +1 -0
  119. package/dist/transport.d.ts +54 -0
  120. package/dist/transport.d.ts.map +1 -0
  121. package/dist/transport.js +214 -0
  122. package/dist/transport.js.map +1 -0
  123. package/dist/transport.test.d.ts +2 -0
  124. package/dist/transport.test.d.ts.map +1 -0
  125. package/dist/transport.test.js +105 -0
  126. package/dist/transport.test.js.map +1 -0
  127. package/dist/turnReply.d.ts +25 -0
  128. package/dist/turnReply.d.ts.map +1 -0
  129. package/dist/turnReply.js +143 -0
  130. package/dist/turnReply.js.map +1 -0
  131. package/dist/turnReply.test.d.ts +2 -0
  132. package/dist/turnReply.test.d.ts.map +1 -0
  133. package/dist/turnReply.test.js +41 -0
  134. package/dist/turnReply.test.js.map +1 -0
  135. package/dist/wire.d.ts +8 -0
  136. package/dist/wire.d.ts.map +1 -0
  137. package/dist/wire.js +6 -0
  138. package/dist/wire.js.map +1 -0
  139. package/package.json +102 -0
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Transport layer: StdioTransport and WebSocketTransport.
3
+ */
4
+ import { createInterface } from "node:readline";
5
+ import WebSocket from "ws";
6
+ export class TransportError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "TransportError";
10
+ }
11
+ }
12
+ export class TransportClosed extends TransportError {
13
+ constructor(message = "Transport closed") {
14
+ super(message);
15
+ this.name = "TransportClosed";
16
+ }
17
+ }
18
+ /**
19
+ * Newline-delimited JSON (JSONL) on stdin/stdout.
20
+ * Used when DotCraft spawns the adapter as a subprocess.
21
+ */
22
+ export class StdioTransport {
23
+ closed = false;
24
+ rl;
25
+ lineIter = null;
26
+ constructor() {
27
+ this.rl = createInterface({ input: process.stdin, crlfDelay: Infinity });
28
+ }
29
+ async readMessage() {
30
+ if (this.closed)
31
+ throw new TransportClosed();
32
+ if (!this.lineIter) {
33
+ this.lineIter = this.rl[Symbol.asyncIterator]();
34
+ }
35
+ // eslint-disable-next-line no-constant-condition
36
+ while (true) {
37
+ const { value, done } = await this.lineIter.next();
38
+ if (done)
39
+ throw new TransportClosed("stdin closed");
40
+ const text = String(value).trim();
41
+ if (!text)
42
+ continue;
43
+ return JSON.parse(text);
44
+ }
45
+ }
46
+ async writeMessage(msg) {
47
+ if (this.closed)
48
+ throw new TransportClosed();
49
+ const line = `${JSON.stringify(msg)}\n`;
50
+ await new Promise((resolve, reject) => {
51
+ process.stdout.write(line, (err) => (err ? reject(err) : resolve()));
52
+ });
53
+ }
54
+ async close() {
55
+ this.closed = true;
56
+ this.rl.close();
57
+ }
58
+ }
59
+ /**
60
+ * One JSON-RPC message per WebSocket text frame.
61
+ */
62
+ export class WebSocketTransport {
63
+ baseUrl;
64
+ token;
65
+ ws = null;
66
+ closed = false;
67
+ receivedFrames = [];
68
+ waitingReaders = [];
69
+ terminalError = null;
70
+ constructor(opts) {
71
+ this.baseUrl = opts.url;
72
+ this.token = opts.token;
73
+ }
74
+ get urlWithToken() {
75
+ if (!this.token?.trim())
76
+ return this.baseUrl;
77
+ try {
78
+ const parsed = new URL(this.baseUrl);
79
+ if (!parsed.searchParams.has("token")) {
80
+ parsed.searchParams.set("token", this.token.trim());
81
+ }
82
+ return parsed.toString();
83
+ }
84
+ catch {
85
+ const sep = this.baseUrl.includes("?") ? "&" : "?";
86
+ return `${this.baseUrl}${sep}token=${encodeURIComponent(this.token.trim())}`;
87
+ }
88
+ }
89
+ async connect() {
90
+ if (this.closed)
91
+ throw new TransportClosed();
92
+ if (this.ws !== null)
93
+ return;
94
+ this.terminalError = null;
95
+ this.receivedFrames = [];
96
+ this.ws = new WebSocket(this.urlWithToken);
97
+ await new Promise((resolve, reject) => {
98
+ const w = this.ws;
99
+ const onOpen = () => {
100
+ cleanup();
101
+ this.attachSocketHandlers(w);
102
+ resolve();
103
+ };
104
+ const onError = (e) => {
105
+ cleanup();
106
+ this.terminalError = e;
107
+ reject(e);
108
+ };
109
+ const onClose = () => {
110
+ cleanup();
111
+ const err = new TransportClosed("WebSocket closed");
112
+ this.terminalError = err;
113
+ reject(err);
114
+ };
115
+ const cleanup = () => {
116
+ w.off("open", onOpen);
117
+ w.off("error", onError);
118
+ w.off("close", onClose);
119
+ };
120
+ w.once("open", onOpen);
121
+ w.once("error", onError);
122
+ w.once("close", onClose);
123
+ });
124
+ }
125
+ async readMessage() {
126
+ if (this.closed)
127
+ throw new TransportClosed();
128
+ if (this.ws === null)
129
+ await this.connect();
130
+ if (this.receivedFrames.length > 0) {
131
+ const frame = this.receivedFrames.shift();
132
+ return JSON.parse(frame);
133
+ }
134
+ if (this.terminalError) {
135
+ throw this.terminalError;
136
+ }
137
+ return await new Promise((resolve, reject) => {
138
+ this.waitingReaders.push({ resolve, reject });
139
+ });
140
+ }
141
+ async writeMessage(msg) {
142
+ if (this.closed)
143
+ throw new TransportClosed();
144
+ if (this.ws === null)
145
+ throw new TransportError("WebSocket not connected; call connect() first");
146
+ const text = JSON.stringify(msg);
147
+ await new Promise((resolve, reject) => {
148
+ this.ws.send(text, (err) => (err ? reject(err) : resolve()));
149
+ });
150
+ }
151
+ async close() {
152
+ this.closed = true;
153
+ const closeError = new TransportClosed("Transport closed");
154
+ this.terminalError = closeError;
155
+ this.receivedFrames = [];
156
+ this.rejectWaitingReaders(closeError);
157
+ if (this.ws) {
158
+ this.ws.close();
159
+ this.ws = null;
160
+ }
161
+ }
162
+ attachSocketHandlers(ws) {
163
+ ws.on("message", (data) => {
164
+ const text = this.rawDataToUtf8(data);
165
+ if (this.waitingReaders.length > 0) {
166
+ const waiter = this.waitingReaders.shift();
167
+ try {
168
+ waiter.resolve(JSON.parse(text));
169
+ }
170
+ catch (error) {
171
+ waiter.reject(error);
172
+ }
173
+ return;
174
+ }
175
+ this.receivedFrames.push(text);
176
+ });
177
+ ws.on("close", () => {
178
+ if (this.closed)
179
+ return;
180
+ this.ws = null;
181
+ const err = new TransportClosed("WebSocket closed");
182
+ this.terminalError = err;
183
+ this.receivedFrames = [];
184
+ this.rejectWaitingReaders(err);
185
+ });
186
+ ws.on("error", (error) => {
187
+ this.terminalError = error;
188
+ this.rejectWaitingReaders(error);
189
+ });
190
+ }
191
+ rejectWaitingReaders(error) {
192
+ if (this.waitingReaders.length === 0)
193
+ return;
194
+ const readers = this.waitingReaders;
195
+ this.waitingReaders = [];
196
+ for (const reader of readers) {
197
+ reader.reject(error);
198
+ }
199
+ }
200
+ rawDataToUtf8(data) {
201
+ if (typeof data === "string")
202
+ return data;
203
+ if (data instanceof Buffer)
204
+ return data.toString("utf-8");
205
+ if (Array.isArray(data))
206
+ return Buffer.concat(data).toString("utf-8");
207
+ if (data instanceof ArrayBuffer)
208
+ return Buffer.from(new Uint8Array(data)).toString("utf-8");
209
+ if (ArrayBuffer.isView(data))
210
+ return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf-8");
211
+ throw new TransportError("Unsupported WebSocket raw data format");
212
+ }
213
+ }
214
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.test.d.ts","sourceRoot":"","sources":["../src/transport.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import assert from "node:assert/strict";
2
+ import { setTimeout as sleep } from "node:timers/promises";
3
+ import test from "node:test";
4
+ import { WebSocketServer } from "ws";
5
+ import { TransportClosed, WebSocketTransport } from "./transport.js";
6
+ async function withServer(onConnection, run) {
7
+ const server = new WebSocketServer({ port: 0 });
8
+ server.on("connection", (socket, request) => {
9
+ void onConnection(socket, request);
10
+ });
11
+ await new Promise((resolve) => server.once("listening", () => resolve()));
12
+ const address = server.address();
13
+ if (!address || typeof address === "string") {
14
+ throw new Error("WebSocket server did not expose a TCP port");
15
+ }
16
+ try {
17
+ await run(`ws://127.0.0.1:${address.port}`);
18
+ }
19
+ finally {
20
+ await new Promise((resolve, reject) => {
21
+ server.close((error) => {
22
+ if (error)
23
+ reject(error);
24
+ else
25
+ resolve();
26
+ });
27
+ });
28
+ }
29
+ }
30
+ async function withTimeout(promise, timeoutMs = 400) {
31
+ return await Promise.race([
32
+ promise,
33
+ (async () => {
34
+ await sleep(timeoutMs);
35
+ throw new Error(`Timed out after ${timeoutMs}ms`);
36
+ })(),
37
+ ]);
38
+ }
39
+ test("WebSocketTransport keeps ordered frames across burst and consumer gap", async () => {
40
+ await withServer(async (socket) => {
41
+ socket.send(JSON.stringify({ seq: 1 }));
42
+ socket.send(JSON.stringify({ seq: 2 }));
43
+ await sleep(10);
44
+ socket.send(JSON.stringify({ seq: 3 }));
45
+ }, async (url) => {
46
+ const transport = new WebSocketTransport({ url });
47
+ await transport.connect();
48
+ const first = await withTimeout(transport.readMessage());
49
+ await sleep(25);
50
+ const second = await withTimeout(transport.readMessage());
51
+ const third = await withTimeout(transport.readMessage());
52
+ assert.deepEqual(first, { seq: 1 });
53
+ assert.deepEqual(second, { seq: 2 });
54
+ assert.deepEqual(third, { seq: 3 });
55
+ await transport.close();
56
+ });
57
+ });
58
+ test("WebSocketTransport rejects pending read on close", async () => {
59
+ await withServer(async (socket) => {
60
+ await sleep(20);
61
+ socket.close();
62
+ }, async (url) => {
63
+ const transport = new WebSocketTransport({ url });
64
+ await transport.connect();
65
+ await assert.rejects(withTimeout(transport.readMessage()), (error) => {
66
+ return error instanceof TransportClosed;
67
+ });
68
+ await transport.close();
69
+ });
70
+ });
71
+ test("WebSocketTransport decodes binary UTF-8 frames", async () => {
72
+ await withServer(async (socket) => {
73
+ socket.send(Buffer.from(JSON.stringify({ mode: "binary" }), "utf-8"));
74
+ }, async (url) => {
75
+ const transport = new WebSocketTransport({ url });
76
+ await transport.connect();
77
+ const message = await withTimeout(transport.readMessage());
78
+ assert.deepEqual(message, { mode: "binary" });
79
+ await transport.close();
80
+ });
81
+ });
82
+ test("WebSocketTransport appends token once", async () => {
83
+ const seen = [];
84
+ await withServer((socket, request) => {
85
+ seen.push(request.url ?? "");
86
+ socket.close();
87
+ }, async (url) => {
88
+ const transport = new WebSocketTransport({ url, token: "secret" });
89
+ await transport.connect();
90
+ await transport.close();
91
+ });
92
+ await withServer((socket, request) => {
93
+ seen.push(request.url ?? "");
94
+ socket.close();
95
+ }, async (url) => {
96
+ const transport = new WebSocketTransport({ url: `${url}?token=existing`, token: "secret" });
97
+ await transport.connect();
98
+ await transport.close();
99
+ });
100
+ const first = new URL(`ws://127.0.0.1${seen[0]}`);
101
+ const second = new URL(`ws://127.0.0.1${seen[1]}`);
102
+ assert.deepEqual(first.searchParams.getAll("token"), ["secret"]);
103
+ assert.deepEqual(second.searchParams.getAll("token"), ["existing"]);
104
+ });
105
+ //# sourceMappingURL=transport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../src/transport.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAkB,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAErE,KAAK,UAAU,UAAU,CACvB,YAAmF,EACnF,GAAmC;IAEnC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAC1C,KAAK,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,kBAAkB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACpB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,OAAmB,EAAE,SAAS,GAAG,GAAG;IAChE,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;QACxB,OAAO;QACP,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,EAAE;KACL,CAAC,CAAC;AACL,CAAC;AAED,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,UAAU,CACd,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;IAClE,MAAM,UAAU,CACd,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAE1B,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE;YAC5E,OAAO,KAAK,YAAY,eAAe,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,MAAM,UAAU,CACd,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9C,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;IACvD,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,MAAM,UAAU,CACd,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CACF,CAAC;IAEF,MAAM,UAAU,CACd,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5F,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CACF,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Helpers to build the final assistant reply from turn/completed snapshots and streamed deltas.
3
+ * turn/completed includes full turn items; delta aggregation can miss early chunks if handlers
4
+ * attach after turn/start returns (race). Prefer the snapshot when it is at least as long as deltas.
5
+ */
6
+ /**
7
+ * Concatenates text from all agentMessage items in turn/completed params (wire order).
8
+ */
9
+ export declare function extractAgentReplyTextFromTurnCompletedParams(params: Record<string, unknown> | null | undefined): string;
10
+ /**
11
+ * Extracts text from each agentMessage item in turn/completed params (wire order).
12
+ */
13
+ export declare function extractAgentReplyTextsFromTurnCompletedParams(params: Record<string, unknown> | null | undefined): string[];
14
+ /**
15
+ * Configure whether `mergeReplyTextFromDeltaAndSnapshot` emits stderr traces.
16
+ * Pass `true` to enable; `false` or `undefined` to disable.
17
+ */
18
+ export declare function configureTextMergeDebug(enabled: boolean | undefined): void;
19
+ /**
20
+ * Merge streamed deltas with the authoritative snapshot from the server.
21
+ * When neither string contains the other but they share a common prefix, append the non-overlapping
22
+ * tail from the other side so unique text is not dropped (pick-longer-only loses one branch).
23
+ */
24
+ export declare function mergeReplyTextFromDeltaAndSnapshot(deltaText: string, snapshotText: string): string;
25
+ //# sourceMappingURL=turnReply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnReply.d.ts","sourceRoot":"","sources":["../src/turnReply.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,4CAA4C,CAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,6CAA6C,CAC3D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,MAAM,EAAE,CAiBV;AAiCD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAE1E;AAWD;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CA+ClG"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Helpers to build the final assistant reply from turn/completed snapshots and streamed deltas.
3
+ * turn/completed includes full turn items; delta aggregation can miss early chunks if handlers
4
+ * attach after turn/start returns (race). Prefer the snapshot when it is at least as long as deltas.
5
+ */
6
+ /**
7
+ * Concatenates text from all agentMessage items in turn/completed params (wire order).
8
+ */
9
+ export function extractAgentReplyTextFromTurnCompletedParams(params) {
10
+ return extractAgentReplyTextsFromTurnCompletedParams(params).join("");
11
+ }
12
+ /**
13
+ * Extracts text from each agentMessage item in turn/completed params (wire order).
14
+ */
15
+ export function extractAgentReplyTextsFromTurnCompletedParams(params) {
16
+ if (!params)
17
+ return [];
18
+ const turn = params.turn;
19
+ if (!turn)
20
+ return [];
21
+ const items = turn.items;
22
+ if (!Array.isArray(items))
23
+ return [];
24
+ const parts = [];
25
+ for (const raw of items) {
26
+ if (!raw || typeof raw !== "object")
27
+ continue;
28
+ const item = raw;
29
+ if (item.type !== "agentMessage")
30
+ continue;
31
+ const payload = item.payload;
32
+ if (!payload)
33
+ continue;
34
+ const text = payload.text;
35
+ if (typeof text === "string" && text.length > 0)
36
+ parts.push(text);
37
+ }
38
+ return parts;
39
+ }
40
+ function commonPrefixLength(left, right) {
41
+ const max = Math.min(left.length, right.length);
42
+ let idx = 0;
43
+ while (idx < max && left[idx] === right[idx])
44
+ idx += 1;
45
+ return idx;
46
+ }
47
+ /**
48
+ * Like {@link commonPrefixLength}, but when the first word after the last space differs between
49
+ * strings (e.g. "Hello streamed" vs "Hello snapshot"), roll back to that space so we do not treat a
50
+ * shared first letter ("s") as part of a safe prefix — otherwise snapshot tails become truncated
51
+ * (e.g. "napshot" instead of "snapshot").
52
+ */
53
+ function commonPrefixLengthForMerge(left, right) {
54
+ const raw = commonPrefixLength(left, right);
55
+ if (raw === 0)
56
+ return 0;
57
+ const lastSpace = left.lastIndexOf(" ", raw - 1);
58
+ if (lastSpace < 0)
59
+ return raw;
60
+ const afterSpace = lastSpace + 1;
61
+ const w1 = (left.slice(afterSpace).split(/\s/)[0] ?? "");
62
+ const w2 = (right.slice(afterSpace).split(/\s/)[0] ?? "");
63
+ if (w1 === w2)
64
+ return raw;
65
+ const wordLcp = commonPrefixLength(w1, w2);
66
+ if (wordLcp === 0)
67
+ return afterSpace;
68
+ if (wordLcp === 1 && w1.length > 1 && w2.length > 1)
69
+ return afterSpace;
70
+ return afterSpace + wordLcp;
71
+ }
72
+ /** Set by {@link configureTextMergeDebug}; only `true` enables merge stderr traces. */
73
+ let textMergeDebugOverride;
74
+ /**
75
+ * Configure whether `mergeReplyTextFromDeltaAndSnapshot` emits stderr traces.
76
+ * Pass `true` to enable; `false` or `undefined` to disable.
77
+ */
78
+ export function configureTextMergeDebug(enabled) {
79
+ textMergeDebugOverride = enabled;
80
+ }
81
+ function isDebugTextMergeEnabled() {
82
+ return textMergeDebugOverride === true;
83
+ }
84
+ function debugTextMerge(message, data) {
85
+ if (!isDebugTextMergeEnabled())
86
+ return;
87
+ console.error(`[dotcraft-sdk:text-merge] ${message}`, data);
88
+ }
89
+ /**
90
+ * Merge streamed deltas with the authoritative snapshot from the server.
91
+ * When neither string contains the other but they share a common prefix, append the non-overlapping
92
+ * tail from the other side so unique text is not dropped (pick-longer-only loses one branch).
93
+ */
94
+ export function mergeReplyTextFromDeltaAndSnapshot(deltaText, snapshotText) {
95
+ if (!deltaText) {
96
+ debugTextMerge("empty_delta", { snapshotChars: snapshotText.length });
97
+ return snapshotText;
98
+ }
99
+ if (!snapshotText) {
100
+ debugTextMerge("empty_snapshot", { deltaChars: deltaText.length });
101
+ return deltaText;
102
+ }
103
+ if (deltaText === snapshotText)
104
+ return snapshotText;
105
+ if (snapshotText.includes(deltaText))
106
+ return snapshotText;
107
+ if (deltaText.includes(snapshotText))
108
+ return deltaText;
109
+ const cp = commonPrefixLengthForMerge(deltaText, snapshotText);
110
+ if (cp > 0) {
111
+ const snapTail = snapshotText.slice(cp).trim();
112
+ const deltaTail = deltaText.slice(cp).trim();
113
+ if (snapTail && !deltaText.includes(snapTail)) {
114
+ const merged = `${deltaText.trimEnd()}\n\n${snapTail}`;
115
+ debugTextMerge("appended_snapshot_tail", {
116
+ commonPrefixLen: cp,
117
+ deltaChars: deltaText.length,
118
+ snapshotChars: snapshotText.length,
119
+ mergedChars: merged.length,
120
+ });
121
+ return merged;
122
+ }
123
+ if (deltaTail && !snapshotText.includes(deltaTail)) {
124
+ const merged = `${snapshotText.trimEnd()}\n\n${deltaTail}`;
125
+ debugTextMerge("appended_delta_tail", {
126
+ commonPrefixLen: cp,
127
+ deltaChars: deltaText.length,
128
+ snapshotChars: snapshotText.length,
129
+ mergedChars: merged.length,
130
+ });
131
+ return merged;
132
+ }
133
+ }
134
+ const picked = snapshotText.length >= deltaText.length ? snapshotText : deltaText;
135
+ debugTextMerge("fallback_longer", {
136
+ commonPrefixLen: cp,
137
+ deltaChars: deltaText.length,
138
+ snapshotChars: snapshotText.length,
139
+ pickedChars: picked.length,
140
+ });
141
+ return picked;
142
+ }
143
+ //# sourceMappingURL=turnReply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnReply.js","sourceRoot":"","sources":["../src/turnReply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=turnReply.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnReply.test.d.ts","sourceRoot":"","sources":["../src/turnReply.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { extractAgentReplyTextFromTurnCompletedParams, extractAgentReplyTextsFromTurnCompletedParams, mergeReplyTextFromDeltaAndSnapshot, } from "./turnReply.js";
4
+ test("extractAgentReplyTextsFromTurnCompletedParams keeps wire order", () => {
5
+ const texts = extractAgentReplyTextsFromTurnCompletedParams({
6
+ turn: {
7
+ items: [
8
+ { id: "tool-1", type: "toolCall", payload: {} },
9
+ { id: "a1", type: "agentMessage", payload: { text: "first " } },
10
+ { id: "a2", type: "agentMessage", payload: { text: "second" } },
11
+ ],
12
+ },
13
+ });
14
+ assert.deepEqual(texts, ["first ", "second"]);
15
+ assert.equal(extractAgentReplyTextFromTurnCompletedParams({ turn: { items: [{ type: "agentMessage", payload: { text: "ok" } }] } }), "ok");
16
+ });
17
+ test("mergeReplyTextFromDeltaAndSnapshot prefers containing variant", () => {
18
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("存在。", "文件存在。"), "文件存在。");
19
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("文件存在。", "存在。"), "文件存在。");
20
+ });
21
+ test("mergeReplyTextFromDeltaAndSnapshot handles empty values", () => {
22
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("", "snapshot"), "snapshot");
23
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("delta", ""), "delta");
24
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("", ""), "");
25
+ });
26
+ test("mergeReplyTextFromDeltaAndSnapshot falls back to longer text", () => {
27
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("abc", "ab"), "abc");
28
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("ab", "abc"), "abc");
29
+ });
30
+ test("mergeReplyTextFromDeltaAndSnapshot appends divergent tail after common prefix", () => {
31
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("hello world", "hello there"), "hello world\n\nthere");
32
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("hello there", "hello world"), "hello there\n\nworld");
33
+ });
34
+ test("mergeReplyTextFromDeltaAndSnapshot does not split on a shared first letter of different words", () => {
35
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("Hello streamed", "Hello snapshot"), "Hello streamed\n\nsnapshot");
36
+ });
37
+ test("mergeReplyTextFromDeltaAndSnapshot falls back when no shared prefix", () => {
38
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("aaa", "bbb"), "bbb");
39
+ assert.equal(mergeReplyTextFromDeltaAndSnapshot("bbb", "aaa"), "aaa");
40
+ });
41
+ //# sourceMappingURL=turnReply.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnReply.test.js","sourceRoot":"","sources":["../src/turnReply.test.ts"],"names":[],"mappings":"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"}
package/dist/wire.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /** Low-level AppServer JSON-RPC transport. Contracts live in `@dotcraft/sdk/contracts`. */
2
+ export { DotCraftWireClient } from "./client.js";
3
+ export type { DotCraftWireClientOptions, NotificationHandler, ServerRequestHandler, Unsubscribe, WireConnectionState, } from "./client.js";
4
+ export { JsonRpcError, ReconnectQueueFullError, RequestTimeoutError, } from "./errors.js";
5
+ export { ERR_ALREADY_INITIALIZED, ERR_APPROVAL_TIMEOUT, ERR_CHANNEL_REJECTED, ERR_CRON_NOT_FOUND, ERR_NOT_INITIALIZED, ERR_THREAD_NOT_ACTIVE, ERR_THREAD_NOT_FOUND, ERR_TURN_IN_PROGRESS, ERR_TURN_NOT_FOUND, ERR_TURN_NOT_RUNNING, JsonRpcMessage, } from "./models.js";
6
+ export { StdioTransport, TransportClosed, TransportError, WebSocketTransport, } from "./transport.js";
7
+ export type { Transport, WebSocketTransportOptions } from "./transport.js";
8
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EACV,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACX,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/wire.js ADDED
@@ -0,0 +1,6 @@
1
+ /** Low-level AppServer JSON-RPC transport. Contracts live in `@dotcraft/sdk/contracts`. */
2
+ export { DotCraftWireClient } from "./client.js";
3
+ export { JsonRpcError, ReconnectQueueFullError, RequestTimeoutError, } from "./errors.js";
4
+ export { ERR_ALREADY_INITIALIZED, ERR_APPROVAL_TIMEOUT, ERR_CHANNEL_REJECTED, ERR_CRON_NOT_FOUND, ERR_NOT_INITIALIZED, ERR_THREAD_NOT_ACTIVE, ERR_THREAD_NOT_FOUND, ERR_TURN_IN_PROGRESS, ERR_TURN_NOT_FOUND, ERR_TURN_NOT_RUNNING, JsonRpcMessage, } from "./models.js";
5
+ export { StdioTransport, TransportClosed, TransportError, WebSocketTransport, } from "./transport.js";
6
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQjD,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}