@agentuity/cli 0.0.51 → 0.0.52

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 (299) hide show
  1. package/dist/api.js +68 -0
  2. package/dist/api.js.map +1 -0
  3. package/dist/auth.js +225 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/banner.js +35 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/cli-logger.js +72 -0
  8. package/dist/cli-logger.js.map +1 -0
  9. package/dist/cli.js +822 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/cmd/ai/capabilities/index.js +10 -0
  12. package/dist/cmd/ai/capabilities/index.js.map +1 -0
  13. package/dist/cmd/ai/capabilities/show.js +221 -0
  14. package/dist/cmd/ai/capabilities/show.js.map +1 -0
  15. package/dist/cmd/ai/index.js +11 -0
  16. package/dist/cmd/ai/index.js.map +1 -0
  17. package/dist/cmd/ai/prompt/index.js +10 -0
  18. package/dist/cmd/ai/prompt/index.js.map +1 -0
  19. package/dist/cmd/ai/prompt/llm.js +365 -0
  20. package/dist/cmd/ai/prompt/llm.js.map +1 -0
  21. package/dist/cmd/ai/schema/index.js +10 -0
  22. package/dist/cmd/ai/schema/index.js.map +1 -0
  23. package/dist/cmd/ai/schema/show.js +23 -0
  24. package/dist/cmd/ai/schema/show.js.map +1 -0
  25. package/dist/cmd/auth/api.js +85 -0
  26. package/dist/cmd/auth/api.js.map +1 -0
  27. package/dist/cmd/auth/index.js +13 -0
  28. package/dist/cmd/auth/index.js.map +1 -0
  29. package/dist/cmd/auth/login.js +84 -0
  30. package/dist/cmd/auth/login.js.map +1 -0
  31. package/dist/cmd/auth/logout.js +17 -0
  32. package/dist/cmd/auth/logout.js.map +1 -0
  33. package/dist/cmd/auth/signup.js +55 -0
  34. package/dist/cmd/auth/signup.js.map +1 -0
  35. package/dist/cmd/auth/ssh/add.js +239 -0
  36. package/dist/cmd/auth/ssh/add.js.map +1 -0
  37. package/dist/cmd/auth/ssh/api.js +53 -0
  38. package/dist/cmd/auth/ssh/api.js.map +1 -0
  39. package/dist/cmd/auth/ssh/delete.js +126 -0
  40. package/dist/cmd/auth/ssh/delete.js.map +1 -0
  41. package/dist/cmd/auth/ssh/index.js +11 -0
  42. package/dist/cmd/auth/ssh/index.js.map +1 -0
  43. package/dist/cmd/auth/ssh/list.js +70 -0
  44. package/dist/cmd/auth/ssh/list.js.map +1 -0
  45. package/dist/cmd/auth/whoami.js +68 -0
  46. package/dist/cmd/auth/whoami.js.map +1 -0
  47. package/dist/cmd/build/ast.js +608 -0
  48. package/dist/cmd/build/ast.js.map +1 -0
  49. package/dist/cmd/build/ast.test.js +389 -0
  50. package/dist/cmd/build/ast.test.js.map +1 -0
  51. package/dist/cmd/build/bundler.js +304 -0
  52. package/dist/cmd/build/bundler.js.map +1 -0
  53. package/dist/cmd/build/file.js +10 -0
  54. package/dist/cmd/build/file.js.map +1 -0
  55. package/dist/cmd/build/fix-duplicate-exports.js +167 -0
  56. package/dist/cmd/build/fix-duplicate-exports.js.map +1 -0
  57. package/dist/cmd/build/fix-duplicate-exports.test.js +300 -0
  58. package/dist/cmd/build/fix-duplicate-exports.test.js.map +1 -0
  59. package/dist/cmd/build/index.d.ts.map +1 -1
  60. package/dist/cmd/build/index.js +79 -0
  61. package/dist/cmd/build/index.js.map +1 -0
  62. package/dist/cmd/build/patch/_util.js +42 -0
  63. package/dist/cmd/build/patch/_util.js.map +1 -0
  64. package/dist/cmd/build/patch/aisdk.js +65 -0
  65. package/dist/cmd/build/patch/aisdk.js.map +1 -0
  66. package/dist/cmd/build/patch/index.js +97 -0
  67. package/dist/cmd/build/patch/index.js.map +1 -0
  68. package/dist/cmd/build/patch/llm.js +18 -0
  69. package/dist/cmd/build/patch/llm.js.map +1 -0
  70. package/dist/cmd/build/plugin.d.ts.map +1 -1
  71. package/dist/cmd/build/plugin.js +556 -0
  72. package/dist/cmd/build/plugin.js.map +1 -0
  73. package/dist/cmd/cloud/agents/index.js +133 -0
  74. package/dist/cmd/cloud/agents/index.js.map +1 -0
  75. package/dist/cmd/cloud/deploy.js +341 -0
  76. package/dist/cmd/cloud/deploy.js.map +1 -0
  77. package/dist/cmd/cloud/deployment/index.js +20 -0
  78. package/dist/cmd/cloud/deployment/index.js.map +1 -0
  79. package/dist/cmd/cloud/deployment/list.js +89 -0
  80. package/dist/cmd/cloud/deployment/list.js.map +1 -0
  81. package/dist/cmd/cloud/deployment/remove.js +60 -0
  82. package/dist/cmd/cloud/deployment/remove.js.map +1 -0
  83. package/dist/cmd/cloud/deployment/rollback.js +80 -0
  84. package/dist/cmd/cloud/deployment/rollback.js.map +1 -0
  85. package/dist/cmd/cloud/deployment/show.js +106 -0
  86. package/dist/cmd/cloud/deployment/show.js.map +1 -0
  87. package/dist/cmd/cloud/deployment/undeploy.js +45 -0
  88. package/dist/cmd/cloud/deployment/undeploy.js.map +1 -0
  89. package/dist/cmd/cloud/deployment/utils.js +10 -0
  90. package/dist/cmd/cloud/deployment/utils.js.map +1 -0
  91. package/dist/cmd/cloud/domain.js +77 -0
  92. package/dist/cmd/cloud/domain.js.map +1 -0
  93. package/dist/cmd/cloud/env/delete.js +50 -0
  94. package/dist/cmd/cloud/env/delete.js.map +1 -0
  95. package/dist/cmd/cloud/env/get.js +65 -0
  96. package/dist/cmd/cloud/env/get.js.map +1 -0
  97. package/dist/cmd/cloud/env/import.js +113 -0
  98. package/dist/cmd/cloud/env/import.js.map +1 -0
  99. package/dist/cmd/cloud/env/index.js +24 -0
  100. package/dist/cmd/cloud/env/index.js.map +1 -0
  101. package/dist/cmd/cloud/env/list.js +58 -0
  102. package/dist/cmd/cloud/env/list.js.map +1 -0
  103. package/dist/cmd/cloud/env/pull.js +81 -0
  104. package/dist/cmd/cloud/env/pull.js.map +1 -0
  105. package/dist/cmd/cloud/env/push.js +61 -0
  106. package/dist/cmd/cloud/env/push.js.map +1 -0
  107. package/dist/cmd/cloud/env/set.js +73 -0
  108. package/dist/cmd/cloud/env/set.js.map +1 -0
  109. package/dist/cmd/cloud/index.js +31 -0
  110. package/dist/cmd/cloud/index.js.map +1 -0
  111. package/dist/cmd/cloud/keyvalue/create-namespace.js +41 -0
  112. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -0
  113. package/dist/cmd/cloud/keyvalue/delete-namespace.js +64 -0
  114. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -0
  115. package/dist/cmd/cloud/keyvalue/delete.js +47 -0
  116. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -0
  117. package/dist/cmd/cloud/keyvalue/get.js +65 -0
  118. package/dist/cmd/cloud/keyvalue/get.js.map +1 -0
  119. package/dist/cmd/cloud/keyvalue/index.js +32 -0
  120. package/dist/cmd/cloud/keyvalue/index.js.map +1 -0
  121. package/dist/cmd/cloud/keyvalue/keys.js +50 -0
  122. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -0
  123. package/dist/cmd/cloud/keyvalue/list-namespaces.js +37 -0
  124. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -0
  125. package/dist/cmd/cloud/keyvalue/repl.js +277 -0
  126. package/dist/cmd/cloud/keyvalue/repl.js.map +1 -0
  127. package/dist/cmd/cloud/keyvalue/search.js +72 -0
  128. package/dist/cmd/cloud/keyvalue/search.js.map +1 -0
  129. package/dist/cmd/cloud/keyvalue/set.js +59 -0
  130. package/dist/cmd/cloud/keyvalue/set.js.map +1 -0
  131. package/dist/cmd/cloud/keyvalue/stats.js +82 -0
  132. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -0
  133. package/dist/cmd/cloud/keyvalue/util.js +19 -0
  134. package/dist/cmd/cloud/keyvalue/util.js.map +1 -0
  135. package/dist/cmd/cloud/objectstore/delete-bucket.js +66 -0
  136. package/dist/cmd/cloud/objectstore/delete-bucket.js.map +1 -0
  137. package/dist/cmd/cloud/objectstore/delete.js +56 -0
  138. package/dist/cmd/cloud/objectstore/delete.js.map +1 -0
  139. package/dist/cmd/cloud/objectstore/get.js +64 -0
  140. package/dist/cmd/cloud/objectstore/get.js.map +1 -0
  141. package/dist/cmd/cloud/objectstore/index.js +28 -0
  142. package/dist/cmd/cloud/objectstore/index.js.map +1 -0
  143. package/dist/cmd/cloud/objectstore/list-buckets.js +37 -0
  144. package/dist/cmd/cloud/objectstore/list-buckets.js.map +1 -0
  145. package/dist/cmd/cloud/objectstore/list-keys.js +52 -0
  146. package/dist/cmd/cloud/objectstore/list-keys.js.map +1 -0
  147. package/dist/cmd/cloud/objectstore/put.js +57 -0
  148. package/dist/cmd/cloud/objectstore/put.js.map +1 -0
  149. package/dist/cmd/cloud/objectstore/repl.js +219 -0
  150. package/dist/cmd/cloud/objectstore/repl.js.map +1 -0
  151. package/dist/cmd/cloud/objectstore/url.js +55 -0
  152. package/dist/cmd/cloud/objectstore/url.js.map +1 -0
  153. package/dist/cmd/cloud/objectstore/util.js +18 -0
  154. package/dist/cmd/cloud/objectstore/util.js.map +1 -0
  155. package/dist/cmd/cloud/resource/add.js +70 -0
  156. package/dist/cmd/cloud/resource/add.js.map +1 -0
  157. package/dist/cmd/cloud/resource/delete.js +126 -0
  158. package/dist/cmd/cloud/resource/delete.js.map +1 -0
  159. package/dist/cmd/cloud/resource/index.js +12 -0
  160. package/dist/cmd/cloud/resource/index.js.map +1 -0
  161. package/dist/cmd/cloud/resource/list.js +89 -0
  162. package/dist/cmd/cloud/resource/list.js.map +1 -0
  163. package/dist/cmd/cloud/scp/download.js +72 -0
  164. package/dist/cmd/cloud/scp/download.js.map +1 -0
  165. package/dist/cmd/cloud/scp/index.js +10 -0
  166. package/dist/cmd/cloud/scp/index.js.map +1 -0
  167. package/dist/cmd/cloud/scp/upload.js +75 -0
  168. package/dist/cmd/cloud/scp/upload.js.map +1 -0
  169. package/dist/cmd/cloud/secret/delete.js +50 -0
  170. package/dist/cmd/cloud/secret/delete.js.map +1 -0
  171. package/dist/cmd/cloud/secret/get.js +69 -0
  172. package/dist/cmd/cloud/secret/get.js.map +1 -0
  173. package/dist/cmd/cloud/secret/import.js +88 -0
  174. package/dist/cmd/cloud/secret/import.js.map +1 -0
  175. package/dist/cmd/cloud/secret/index.js +24 -0
  176. package/dist/cmd/cloud/secret/index.js.map +1 -0
  177. package/dist/cmd/cloud/secret/list.js +58 -0
  178. package/dist/cmd/cloud/secret/list.js.map +1 -0
  179. package/dist/cmd/cloud/secret/pull.js +81 -0
  180. package/dist/cmd/cloud/secret/pull.js.map +1 -0
  181. package/dist/cmd/cloud/secret/push.js +61 -0
  182. package/dist/cmd/cloud/secret/push.js.map +1 -0
  183. package/dist/cmd/cloud/secret/set.js +57 -0
  184. package/dist/cmd/cloud/secret/set.js.map +1 -0
  185. package/dist/cmd/cloud/session/get.d.ts.map +1 -1
  186. package/dist/cmd/cloud/session/get.js +155 -0
  187. package/dist/cmd/cloud/session/get.js.map +1 -0
  188. package/dist/cmd/cloud/session/index.js +11 -0
  189. package/dist/cmd/cloud/session/index.js.map +1 -0
  190. package/dist/cmd/cloud/session/list.js +132 -0
  191. package/dist/cmd/cloud/session/list.js.map +1 -0
  192. package/dist/cmd/cloud/session/logs.js +56 -0
  193. package/dist/cmd/cloud/session/logs.js.map +1 -0
  194. package/dist/cmd/cloud/ssh.js +67 -0
  195. package/dist/cmd/cloud/ssh.js.map +1 -0
  196. package/dist/cmd/dev/agents.js +103 -0
  197. package/dist/cmd/dev/agents.js.map +1 -0
  198. package/dist/cmd/dev/api.js +26 -0
  199. package/dist/cmd/dev/api.js.map +1 -0
  200. package/dist/cmd/dev/download.js +77 -0
  201. package/dist/cmd/dev/download.js.map +1 -0
  202. package/dist/cmd/dev/index.js +745 -0
  203. package/dist/cmd/dev/index.js.map +1 -0
  204. package/dist/cmd/dev/sync.js +229 -0
  205. package/dist/cmd/dev/sync.js.map +1 -0
  206. package/dist/cmd/dev/templates.js +75 -0
  207. package/dist/cmd/dev/templates.js.map +1 -0
  208. package/dist/cmd/index.js +49 -0
  209. package/dist/cmd/index.js.map +1 -0
  210. package/dist/cmd/profile/create.js +89 -0
  211. package/dist/cmd/profile/create.js.map +1 -0
  212. package/dist/cmd/profile/delete.js +63 -0
  213. package/dist/cmd/profile/delete.js.map +1 -0
  214. package/dist/cmd/profile/index.js +14 -0
  215. package/dist/cmd/profile/index.js.map +1 -0
  216. package/dist/cmd/profile/list.js +28 -0
  217. package/dist/cmd/profile/list.js.map +1 -0
  218. package/dist/cmd/profile/show.js +68 -0
  219. package/dist/cmd/profile/show.js.map +1 -0
  220. package/dist/cmd/profile/use.js +37 -0
  221. package/dist/cmd/profile/use.js.map +1 -0
  222. package/dist/cmd/project/create.js +92 -0
  223. package/dist/cmd/project/create.js.map +1 -0
  224. package/dist/cmd/project/delete.js +117 -0
  225. package/dist/cmd/project/delete.js.map +1 -0
  226. package/dist/cmd/project/download.js +217 -0
  227. package/dist/cmd/project/download.js.map +1 -0
  228. package/dist/cmd/project/index.js +12 -0
  229. package/dist/cmd/project/index.js.map +1 -0
  230. package/dist/cmd/project/list.js +51 -0
  231. package/dist/cmd/project/list.js.map +1 -0
  232. package/dist/cmd/project/show.js +54 -0
  233. package/dist/cmd/project/show.js.map +1 -0
  234. package/dist/cmd/project/template-flow.js +315 -0
  235. package/dist/cmd/project/template-flow.js.map +1 -0
  236. package/dist/cmd/project/templates.js +31 -0
  237. package/dist/cmd/project/templates.js.map +1 -0
  238. package/dist/cmd/repl/index.js +444 -0
  239. package/dist/cmd/repl/index.js.map +1 -0
  240. package/dist/cmd/version/index.js +29 -0
  241. package/dist/cmd/version/index.js.map +1 -0
  242. package/dist/command-prefix.js +37 -0
  243. package/dist/command-prefix.js.map +1 -0
  244. package/dist/config.js +536 -0
  245. package/dist/config.js.map +1 -0
  246. package/dist/crypto/box.js +382 -0
  247. package/dist/crypto/box.js.map +1 -0
  248. package/dist/crypto/box.test.js +317 -0
  249. package/dist/crypto/box.test.js.map +1 -0
  250. package/dist/download.js +64 -0
  251. package/dist/download.js.map +1 -0
  252. package/dist/env-util.js +219 -0
  253. package/dist/env-util.js.map +1 -0
  254. package/dist/env-util.test.js +146 -0
  255. package/dist/env-util.test.js.map +1 -0
  256. package/dist/errors.js +177 -0
  257. package/dist/errors.js.map +1 -0
  258. package/dist/explain.js +90 -0
  259. package/dist/explain.js.map +1 -0
  260. package/dist/index.js +23 -0
  261. package/dist/index.js.map +1 -0
  262. package/dist/json.js +29 -0
  263. package/dist/json.js.map +1 -0
  264. package/dist/legacy-check.js +104 -0
  265. package/dist/legacy-check.js.map +1 -0
  266. package/dist/output.js +207 -0
  267. package/dist/output.js.map +1 -0
  268. package/dist/repl.js +1176 -0
  269. package/dist/repl.js.map +1 -0
  270. package/dist/runtime.js +19 -0
  271. package/dist/runtime.js.map +1 -0
  272. package/dist/schema-generator.js +289 -0
  273. package/dist/schema-generator.js.map +1 -0
  274. package/dist/schema-parser.js +145 -0
  275. package/dist/schema-parser.js.map +1 -0
  276. package/dist/sound.js +44 -0
  277. package/dist/sound.js.map +1 -0
  278. package/dist/steps.js +293 -0
  279. package/dist/steps.js.map +1 -0
  280. package/dist/terminal.js +130 -0
  281. package/dist/terminal.js.map +1 -0
  282. package/dist/tui.js +1124 -0
  283. package/dist/tui.js.map +1 -0
  284. package/dist/types.js +163 -0
  285. package/dist/types.js.map +1 -0
  286. package/dist/utils/detectSubagent.js +25 -0
  287. package/dist/utils/detectSubagent.js.map +1 -0
  288. package/dist/utils/format.js +21 -0
  289. package/dist/utils/format.js.map +1 -0
  290. package/dist/utils/zip.js +33 -0
  291. package/dist/utils/zip.js.map +1 -0
  292. package/dist/version.js +24 -0
  293. package/dist/version.js.map +1 -0
  294. package/package.json +6 -6
  295. package/src/banner.ts +1 -1
  296. package/src/cmd/build/index.ts +15 -21
  297. package/src/cmd/build/plugin.ts +2 -1
  298. package/src/cmd/cloud/session/get.ts +20 -14
  299. package/src/cmd/cloud/session/list.ts +1 -1
@@ -0,0 +1,317 @@
1
+ import { describe, test, expect, beforeAll } from 'bun:test';
2
+ import { generateKeyPairSync } from 'node:crypto';
3
+ import { Readable, Writable } from 'node:stream';
4
+ import { encryptFIPSKEMDEMStream, decryptFIPSKEMDEMStream } from './box';
5
+ function createReadableStream(data) {
6
+ return Readable.from([data]);
7
+ }
8
+ class CollectorStream extends Writable {
9
+ chunks = [];
10
+ _write(chunk, _encoding, callback) {
11
+ this.chunks.push(chunk);
12
+ callback();
13
+ }
14
+ getData() {
15
+ return Buffer.concat(this.chunks);
16
+ }
17
+ }
18
+ function generateP256KeyPair() {
19
+ return generateKeyPairSync('ec', {
20
+ namedCurve: 'prime256v1',
21
+ });
22
+ }
23
+ function generateP384KeyPair() {
24
+ return generateKeyPairSync('ec', {
25
+ namedCurve: 'secp384r1',
26
+ });
27
+ }
28
+ describe('crypto/box', () => {
29
+ describe('TestBasicEncryptDecrypt', () => {
30
+ let keyPair;
31
+ beforeAll(() => {
32
+ keyPair = generateP256KeyPair();
33
+ });
34
+ const testCases = [
35
+ { name: 'empty', data: Buffer.alloc(0) },
36
+ { name: 'small', data: Buffer.from('hello world') },
37
+ { name: 'medium', data: Buffer.alloc(1000).fill('A') },
38
+ { name: 'large', data: Buffer.alloc(100000).fill('B') },
39
+ { name: 'exactly_one_frame', data: Buffer.alloc(64 * 1024).fill('C') },
40
+ { name: 'just_over_one_frame', data: Buffer.alloc(64 * 1024 + 1).fill('D') },
41
+ ];
42
+ for (const tc of testCases) {
43
+ test(tc.name, async () => {
44
+ const src = createReadableStream(tc.data);
45
+ const encrypted = new CollectorStream();
46
+ const written = await encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted);
47
+ expect(written).toBe(tc.data.length);
48
+ const encryptedData = encrypted.getData();
49
+ const decryptSrc = createReadableStream(encryptedData);
50
+ const decrypted = new CollectorStream();
51
+ const read = await decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc, decrypted);
52
+ expect(read).toBe(tc.data.length);
53
+ const decryptedData = decrypted.getData();
54
+ expect(decryptedData.equals(tc.data)).toBe(true);
55
+ });
56
+ }
57
+ });
58
+ describe('TestDifferentKeys', () => {
59
+ test('should fail to decrypt with wrong key', async () => {
60
+ const keyPair1 = generateP256KeyPair();
61
+ const keyPair2 = generateP256KeyPair();
62
+ const data = Buffer.from('test data');
63
+ const src = createReadableStream(data);
64
+ const encrypted = new CollectorStream();
65
+ await encryptFIPSKEMDEMStream(keyPair1.publicKey, src, encrypted);
66
+ const encryptedData = encrypted.getData();
67
+ const decryptSrc = createReadableStream(encryptedData);
68
+ const decrypted = new CollectorStream();
69
+ await expect(decryptFIPSKEMDEMStream(keyPair2.privateKey, decryptSrc, decrypted)).rejects.toThrow('DEK unwrap failed');
70
+ });
71
+ });
72
+ describe('TestMalformedHeaders', () => {
73
+ let keyPair;
74
+ beforeAll(() => {
75
+ keyPair = generateP256KeyPair();
76
+ });
77
+ const testCases = [
78
+ { name: 'empty', data: Buffer.alloc(0), err: 'unexpected EOF' },
79
+ { name: 'partial_len', data: Buffer.from([0]), err: 'unexpected EOF' },
80
+ {
81
+ name: 'invalid_wrapped_len',
82
+ data: Buffer.from([0x10, 0x00]),
83
+ err: 'invalid wrapped DEK length',
84
+ },
85
+ { name: 'zero_len', data: Buffer.from([0x00, 0x00]), err: 'invalid wrapped DEK length' },
86
+ ];
87
+ for (const tc of testCases) {
88
+ test(tc.name, async () => {
89
+ const src = createReadableStream(tc.data);
90
+ const decrypted = new CollectorStream();
91
+ await expect(decryptFIPSKEMDEMStream(keyPair.privateKey, src, decrypted)).rejects.toThrow(tc.err);
92
+ });
93
+ }
94
+ });
95
+ describe('TestMalformedChunks', () => {
96
+ test('should fail authentication for malformed chunk', async () => {
97
+ const keyPair = generateP256KeyPair();
98
+ const buf = Buffer.alloc(2 + 113 + 12 + 2 + 32);
99
+ let offset = 0;
100
+ buf.writeUInt16BE(113, offset); // reasonable wrapped length (65+32+16)
101
+ offset += 2;
102
+ offset += 113;
103
+ offset += 12;
104
+ buf.writeUInt16BE(32, offset); // reasonable chunk size
105
+ offset += 2;
106
+ const src = createReadableStream(buf);
107
+ const decrypted = new CollectorStream();
108
+ await expect(decryptFIPSKEMDEMStream(keyPair.privateKey, src, decrypted)).rejects.toThrow();
109
+ });
110
+ });
111
+ describe('TestStreamEOF', () => {
112
+ test('should handle empty stream', async () => {
113
+ const keyPair = generateP256KeyPair();
114
+ const src = createReadableStream(Buffer.alloc(0));
115
+ const encrypted = new CollectorStream();
116
+ const written = await encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted);
117
+ expect(written).toBe(0);
118
+ const encryptedData = encrypted.getData();
119
+ const decryptSrc = createReadableStream(encryptedData);
120
+ const decrypted = new CollectorStream();
121
+ const read = await decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc, decrypted);
122
+ expect(read).toBe(0);
123
+ });
124
+ });
125
+ describe('TestNonceReuseProtection', () => {
126
+ test('different encryptions should produce different ciphertexts', async () => {
127
+ const keyPair = generateP256KeyPair();
128
+ const data = Buffer.from('test data for nonce reuse protection');
129
+ const src1 = createReadableStream(data);
130
+ const encrypted1 = new CollectorStream();
131
+ await encryptFIPSKEMDEMStream(keyPair.publicKey, src1, encrypted1);
132
+ const src2 = createReadableStream(data);
133
+ const encrypted2 = new CollectorStream();
134
+ await encryptFIPSKEMDEMStream(keyPair.publicKey, src2, encrypted2);
135
+ const enc1Data = encrypted1.getData();
136
+ const enc2Data = encrypted2.getData();
137
+ expect(enc1Data.equals(enc2Data)).toBe(false);
138
+ const decryptSrc1 = createReadableStream(enc1Data);
139
+ const decrypted1 = new CollectorStream();
140
+ await decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc1, decrypted1);
141
+ const decryptSrc2 = createReadableStream(enc2Data);
142
+ const decrypted2 = new CollectorStream();
143
+ await decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc2, decrypted2);
144
+ expect(decrypted1.getData().equals(data)).toBe(true);
145
+ expect(decrypted2.getData().equals(data)).toBe(true);
146
+ });
147
+ });
148
+ describe('TestFrameSizeBoundaries', () => {
149
+ let keyPair;
150
+ beforeAll(() => {
151
+ keyPair = generateP256KeyPair();
152
+ });
153
+ const FRAME = 65519;
154
+ const testCases = [
155
+ { name: 'exactly_max_frame', size: FRAME },
156
+ { name: 'max_frame_minus_1', size: FRAME - 1 },
157
+ { name: 'max_frame_plus_1', size: FRAME + 1 },
158
+ { name: 'half_frame', size: Math.floor(FRAME / 2) },
159
+ { name: 'double_frame', size: FRAME * 2 },
160
+ ];
161
+ for (const tc of testCases) {
162
+ test(tc.name, async () => {
163
+ const data = Buffer.alloc(tc.size).fill('A');
164
+ const src = createReadableStream(data);
165
+ const encrypted = new CollectorStream();
166
+ const written = await encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted);
167
+ expect(written).toBe(tc.size);
168
+ const encryptedData = encrypted.getData();
169
+ const decryptSrc = createReadableStream(encryptedData);
170
+ const decrypted = new CollectorStream();
171
+ const read = await decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc, decrypted);
172
+ expect(read).toBe(tc.size);
173
+ const decryptedData = decrypted.getData();
174
+ expect(decryptedData.equals(data)).toBe(true);
175
+ });
176
+ }
177
+ });
178
+ describe('TestUint16OverflowProtection', () => {
179
+ test('should not overflow with maximum frame size', async () => {
180
+ const FRAME = 65519;
181
+ const GCM_TAG = 16;
182
+ const maxExpected = FRAME + GCM_TAG;
183
+ expect(maxExpected).toBeLessThanOrEqual(0xffff);
184
+ const keyPair = generateP256KeyPair();
185
+ const data = Buffer.alloc(FRAME).fill('B');
186
+ const src = createReadableStream(data);
187
+ const encrypted = new CollectorStream();
188
+ await expect(encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted)).resolves.toBe(FRAME);
189
+ });
190
+ });
191
+ describe('TestUnsupportedCurves', () => {
192
+ test('should reject P-384 keys', async () => {
193
+ const keyPair384 = generateP384KeyPair();
194
+ const data = Buffer.from('test data');
195
+ const src = createReadableStream(data);
196
+ const encrypted = new CollectorStream();
197
+ await expect(encryptFIPSKEMDEMStream(keyPair384.publicKey, src, encrypted)).rejects.toThrow('only P-256 keys supported');
198
+ const decryptSrc = createReadableStream(Buffer.alloc(0));
199
+ const decrypted = new CollectorStream();
200
+ await expect(decryptFIPSKEMDEMStream(keyPair384.privateKey, decryptSrc, decrypted)).rejects.toThrow('only P-256 keys supported');
201
+ });
202
+ });
203
+ describe('TestConcurrentOperations', () => {
204
+ test('should handle concurrent encrypt/decrypt operations', async () => {
205
+ const keyPair = generateP256KeyPair();
206
+ const numGoroutines = 10;
207
+ const dataSize = 10000;
208
+ const promises = [];
209
+ for (let i = 0; i < numGoroutines; i++) {
210
+ const promise = (async (id) => {
211
+ const data = Buffer.alloc(Math.floor(dataSize / 10))
212
+ .fill(`data${id}`)
213
+ .subarray(0, Math.floor(dataSize / 10));
214
+ const src = createReadableStream(data);
215
+ const encrypted = new CollectorStream();
216
+ await encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted);
217
+ const encryptedData = encrypted.getData();
218
+ const decryptSrc = createReadableStream(encryptedData);
219
+ const decrypted = new CollectorStream();
220
+ await decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc, decrypted);
221
+ const decryptedData = decrypted.getData();
222
+ if (!decryptedData.equals(data)) {
223
+ throw new Error(`goroutine ${id} data mismatch`);
224
+ }
225
+ })(i);
226
+ promises.push(promise);
227
+ }
228
+ await Promise.all(promises);
229
+ });
230
+ });
231
+ describe('TestDifferentKeyPairs', () => {
232
+ test('should work with correct key and fail with wrong key', async () => {
233
+ const keyPair1 = generateP256KeyPair();
234
+ const keyPair2 = generateP256KeyPair();
235
+ const data = Buffer.from('test data');
236
+ const src = createReadableStream(data);
237
+ const encrypted = new CollectorStream();
238
+ const written = await encryptFIPSKEMDEMStream(keyPair1.publicKey, src, encrypted);
239
+ expect(written).toBe(data.length);
240
+ const encryptedData = encrypted.getData();
241
+ const decryptSrc1 = createReadableStream(encryptedData);
242
+ const decrypted1 = new CollectorStream();
243
+ const read = await decryptFIPSKEMDEMStream(keyPair1.privateKey, decryptSrc1, decrypted1);
244
+ expect(read).toBe(data.length);
245
+ expect(decrypted1.getData().equals(data)).toBe(true);
246
+ const decryptSrc2 = createReadableStream(encryptedData);
247
+ const decrypted2 = new CollectorStream();
248
+ await expect(decryptFIPSKEMDEMStream(keyPair2.privateKey, decryptSrc2, decrypted2)).rejects.toThrow();
249
+ expect(decrypted2.getData().length).toBe(0);
250
+ });
251
+ });
252
+ describe('TestPartialCorruption', () => {
253
+ test('should handle corrupted data gracefully', async () => {
254
+ const keyPair = generateP256KeyPair();
255
+ const testData = Buffer.from('This is test data for corruption testing');
256
+ const src = createReadableStream(testData);
257
+ const encrypted = new CollectorStream();
258
+ await encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted);
259
+ const validEncrypted = encrypted.getData();
260
+ const corruptPositions = [
261
+ 0, // Header start
262
+ 1, // Header middle
263
+ Math.floor(validEncrypted.length / 4), // Early data
264
+ Math.floor(validEncrypted.length / 2), // Middle data
265
+ Math.floor((3 * validEncrypted.length) / 4), // Late data
266
+ validEncrypted.length - 1, // End data
267
+ ];
268
+ for (const pos of corruptPositions) {
269
+ if (pos >= validEncrypted.length) {
270
+ continue;
271
+ }
272
+ const corrupted = Buffer.from(validEncrypted);
273
+ corrupted[pos] ^= 0x01; // Flip one bit
274
+ const decryptSrc = createReadableStream(corrupted);
275
+ const decrypted = new CollectorStream();
276
+ await expect(decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc, decrypted)).rejects.toThrow();
277
+ }
278
+ });
279
+ });
280
+ describe('TestLargeData', () => {
281
+ test('should handle multi-megabyte data', async () => {
282
+ const keyPair = generateP256KeyPair();
283
+ const data = Buffer.alloc(1024 * 1024).fill('X');
284
+ const src = createReadableStream(data);
285
+ const encrypted = new CollectorStream();
286
+ const written = await encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted);
287
+ expect(written).toBe(data.length);
288
+ const encryptedData = encrypted.getData();
289
+ const decryptSrc = createReadableStream(encryptedData);
290
+ const decrypted = new CollectorStream();
291
+ const read = await decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc, decrypted);
292
+ expect(read).toBe(data.length);
293
+ const decryptedData = decrypted.getData();
294
+ expect(decryptedData.equals(data)).toBe(true);
295
+ });
296
+ });
297
+ describe('TestChunkTooLarge', () => {
298
+ test('should reject chunks that are too large', async () => {
299
+ const keyPair = generateP256KeyPair();
300
+ const data = Buffer.from('test data');
301
+ const src = createReadableStream(data);
302
+ const encrypted = new CollectorStream();
303
+ await encryptFIPSKEMDEMStream(keyPair.publicKey, src, encrypted);
304
+ const validEncrypted = encrypted.getData();
305
+ const headerSize = 2 + validEncrypted.readUInt16BE(0) + 12;
306
+ const chunkSizeOffset = headerSize;
307
+ const corrupted = Buffer.from(validEncrypted);
308
+ const FRAME = 65519;
309
+ const GCM_TAG = 16;
310
+ corrupted.writeUInt16BE(FRAME + GCM_TAG, chunkSizeOffset);
311
+ const decryptSrc = createReadableStream(corrupted);
312
+ const decrypted = new CollectorStream();
313
+ await expect(decryptFIPSKEMDEMStream(keyPair.privateKey, decryptSrc, decrypted)).rejects.toThrow();
314
+ });
315
+ });
316
+ });
317
+ //# sourceMappingURL=box.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.test.js","sourceRoot":"","sources":["../../src/crypto/box.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { Transform, Readable } from 'node:stream';
2
+ import * as tui from './tui';
3
+ /**
4
+ * Download a file with progress tracking
5
+ * Returns the response body stream for further processing
6
+ */
7
+ export async function downloadWithProgress(options) {
8
+ const { url, headers = {}, onProgress } = options;
9
+ // Add GITHUB_TOKEN if available and not already set
10
+ const requestHeaders = { ...headers };
11
+ if (process.env.GITHUB_TOKEN && !requestHeaders['Authorization']) {
12
+ requestHeaders['Authorization'] = `Bearer ${process.env.GITHUB_TOKEN}`;
13
+ }
14
+ const response = await fetch(url, { headers: requestHeaders });
15
+ if (!response.ok) {
16
+ throw new Error(`Download failed: ${response.statusText}`);
17
+ }
18
+ const contentLength = parseInt(response.headers.get('content-length') || '0', 10);
19
+ let downloadedBytes = 0;
20
+ // Create a transform stream that tracks progress
21
+ const progressStream = new Transform({
22
+ transform(chunk, _encoding, callback) {
23
+ downloadedBytes += chunk.length;
24
+ if (contentLength > 0) {
25
+ const percent = Math.min(100, Math.floor((downloadedBytes / contentLength) * 100));
26
+ if (onProgress) {
27
+ onProgress(percent, downloadedBytes, contentLength);
28
+ }
29
+ }
30
+ callback(null, chunk);
31
+ },
32
+ });
33
+ // Pipe the response through the progress tracker
34
+ const responseStream = Readable.fromWeb(response.body);
35
+ responseStream.pipe(progressStream);
36
+ return progressStream;
37
+ }
38
+ /**
39
+ * Download a file with a TUI spinner showing progress
40
+ */
41
+ export async function downloadWithSpinner(options, processor) {
42
+ const { message = 'Downloading...' } = options;
43
+ return await tui.spinner({
44
+ type: 'progress',
45
+ message,
46
+ clearOnSuccess: true,
47
+ callback: async (updateProgress) => {
48
+ const stream = await downloadWithProgress({
49
+ ...options,
50
+ onProgress: (percent) => updateProgress(percent),
51
+ });
52
+ const result = await processor(stream);
53
+ // Ensure we show 100% at the end
54
+ updateProgress(100);
55
+ return result;
56
+ },
57
+ });
58
+ }
59
+ export async function downloadGitHubTarball(options) {
60
+ const { repo, branch = 'main', message = 'Downloading from GitHub...' } = options;
61
+ const url = `https://codeload.github.com/${repo}/tar.gz/${branch}`;
62
+ return await downloadWithSpinner({ url, message }, async (stream) => stream);
63
+ }
64
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Utility functions for handling .env files
3
+ */
4
+ import { join } from 'node:path';
5
+ /**
6
+ * Find the appropriate .env file to use for user environment variables.
7
+ * Always returns .env.production path (will be created if needed).
8
+ * .env should only contain AGENTUITY_SDK_KEY.
9
+ */
10
+ export async function findEnvFile(dir) {
11
+ return join(dir, '.env.production');
12
+ }
13
+ /**
14
+ * Find an existing env file for reading.
15
+ * Preference: .env.production > .env
16
+ */
17
+ export async function findExistingEnvFile(dir) {
18
+ const productionEnv = join(dir, '.env.production');
19
+ const defaultEnv = join(dir, '.env');
20
+ if (await Bun.file(productionEnv).exists()) {
21
+ return productionEnv;
22
+ }
23
+ return defaultEnv;
24
+ }
25
+ /**
26
+ * Parse a single line from an .env file
27
+ * Handles comments, empty lines, and quoted values
28
+ */
29
+ export function parseEnvLine(line) {
30
+ const trimmed = line.trim();
31
+ // Skip empty lines and comments
32
+ if (!trimmed || trimmed.startsWith('#')) {
33
+ return null;
34
+ }
35
+ const equalIndex = trimmed.indexOf('=');
36
+ if (equalIndex === -1) {
37
+ return null;
38
+ }
39
+ const key = trimmed.slice(0, equalIndex).trim();
40
+ let value = trimmed.slice(equalIndex + 1).trim();
41
+ // Remove surrounding quotes if present
42
+ if ((value.startsWith('"') && value.endsWith('"')) ||
43
+ (value.startsWith("'") && value.endsWith("'"))) {
44
+ value = value.slice(1, -1);
45
+ }
46
+ return { key, value };
47
+ }
48
+ /**
49
+ * Read and parse an .env file
50
+ */
51
+ export async function readEnvFile(path) {
52
+ const file = Bun.file(path);
53
+ if (!(await file.exists())) {
54
+ return {};
55
+ }
56
+ const content = await file.text();
57
+ const lines = content.split('\n');
58
+ const env = {};
59
+ for (const line of lines) {
60
+ const parsed = parseEnvLine(line);
61
+ if (parsed) {
62
+ env[parsed.key] = parsed.value;
63
+ }
64
+ }
65
+ return env;
66
+ }
67
+ /**
68
+ * Write environment variables to an .env file
69
+ * Optionally skip certain keys (like AGENTUITY_SDK_KEY)
70
+ */
71
+ export async function writeEnvFile(path, vars, options) {
72
+ const skipKeys = options?.skipKeys || [];
73
+ const lines = [];
74
+ // Sort keys for consistent output
75
+ const sortedKeys = Object.keys(vars).sort();
76
+ for (const key of sortedKeys) {
77
+ if (skipKeys.includes(key)) {
78
+ continue;
79
+ }
80
+ const value = vars[key];
81
+ // Add comment if provided
82
+ if (options?.addComment) {
83
+ const comment = options.addComment(key);
84
+ if (comment) {
85
+ lines.push(`# ${comment}`);
86
+ }
87
+ }
88
+ // Write key=value
89
+ lines.push(`${key}=${value}`);
90
+ }
91
+ const content = lines.join('\n') + '\n';
92
+ await Bun.write(path, content);
93
+ }
94
+ /**
95
+ * Merge environment variables with special handling
96
+ * - Later values override earlier values
97
+ * - Can filter out keys (like AGENTUITY_* keys)
98
+ */
99
+ export function mergeEnvVars(base, updates, options) {
100
+ const merged = { ...base };
101
+ const filterPrefix = options?.filterPrefix;
102
+ for (const [key, value] of Object.entries(updates)) {
103
+ // Skip keys with filter prefix if specified
104
+ if (filterPrefix && key.startsWith(filterPrefix)) {
105
+ continue;
106
+ }
107
+ merged[key] = value;
108
+ }
109
+ return merged;
110
+ }
111
+ /**
112
+ * Filter out AGENTUITY_ prefixed keys from env vars
113
+ * This is used when pushing to the cloud to avoid sending SDK keys
114
+ */
115
+ export function filterAgentuitySdkKeys(vars) {
116
+ const filtered = {};
117
+ for (const [key, value] of Object.entries(vars)) {
118
+ if (!key.startsWith('AGENTUITY_')) {
119
+ filtered[key] = value;
120
+ }
121
+ }
122
+ return filtered;
123
+ }
124
+ /**
125
+ * Split env vars into env and secrets based on key names
126
+ * Convention: Keys ending with _SECRET, _KEY, _TOKEN, _PASSWORD are secrets
127
+ */
128
+ export function splitEnvAndSecrets(vars) {
129
+ const env = {};
130
+ const secrets = {};
131
+ const secretSuffixes = ['_SECRET', '_KEY', '_TOKEN', '_PASSWORD', '_PRIVATE'];
132
+ for (const [key, value] of Object.entries(vars)) {
133
+ // Skip AGENTUITY_ prefixed keys
134
+ if (key.startsWith('AGENTUITY_')) {
135
+ continue;
136
+ }
137
+ const isSecret = secretSuffixes.some((suffix) => key.endsWith(suffix));
138
+ if (isSecret) {
139
+ secrets[key] = value;
140
+ }
141
+ else {
142
+ env[key] = value;
143
+ }
144
+ }
145
+ return { env, secrets };
146
+ }
147
+ /**
148
+ * Mask a secret value for display
149
+ */
150
+ export function maskSecret(value) {
151
+ if (!value) {
152
+ return '';
153
+ }
154
+ if (value.length <= 8) {
155
+ return '***';
156
+ }
157
+ // Show first 4 and last 4 characters
158
+ return `${value.slice(0, 4)}...${value.slice(-4)}`;
159
+ }
160
+ /**
161
+ * Detect if a key or value looks like it should be a secret
162
+ */
163
+ export function looksLikeSecret(key, value) {
164
+ // Check key name for secret-like patterns
165
+ const secretKeyPatterns = [
166
+ /_SECRET$/i,
167
+ /_KEY$/i,
168
+ /_TOKEN$/i,
169
+ /_PASSWORD$/i,
170
+ /_PRIVATE$/i,
171
+ /_CERT$/i,
172
+ /_CERTIFICATE$/i,
173
+ /^SECRET_/i,
174
+ /^API_?KEY/i,
175
+ /^JWT/i,
176
+ /PASSWORD/i,
177
+ /CREDENTIAL/i,
178
+ /AUTH.*KEY/i,
179
+ ];
180
+ const keyLooksSecret = secretKeyPatterns.some((pattern) => pattern.test(key));
181
+ if (keyLooksSecret) {
182
+ return true;
183
+ }
184
+ // Check value for secret-like patterns
185
+ if (!value || value.length < 8) {
186
+ return false;
187
+ }
188
+ // JWT pattern (header.payload.signature)
189
+ if (/^eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(value)) {
190
+ return true;
191
+ }
192
+ // Bearer token pattern
193
+ if (/^Bearer\s+[A-Za-z0-9_-]{20,}$/i.test(value)) {
194
+ return true;
195
+ }
196
+ // AWS/Cloud provider key patterns
197
+ if (/^(AKIA|ASIA)[A-Z0-9]{16}$/.test(value)) {
198
+ // AWS access key
199
+ return true;
200
+ }
201
+ // GitHub token patterns
202
+ if (/^gh[ps]_[A-Za-z0-9_]{36,}$/.test(value)) {
203
+ return true;
204
+ }
205
+ // Generic long alphanumeric strings (likely API keys)
206
+ // Exclude UUIDs (8-4-4-4-12 format) and simple alphanumeric IDs
207
+ const isUUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(value);
208
+ if (!isUUID && /^[A-Za-z0-9_-]{32,}$/.test(value) && !/^[0-9]+$/.test(value)) {
209
+ return true;
210
+ }
211
+ // PEM-encoded certificates or private keys
212
+ if (value.includes('BEGIN CERTIFICATE') ||
213
+ value.includes('BEGIN PRIVATE KEY') ||
214
+ value.includes('BEGIN RSA PRIVATE KEY')) {
215
+ return true;
216
+ }
217
+ return false;
218
+ }
219
+ //# sourceMappingURL=env-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-util.js","sourceRoot":"","sources":["../src/env-util.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAMjC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAErC,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,OAAO,UAAU,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,gCAAgC;IAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEjD,uCAAuC;IACvC,IACC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC7C,CAAC;QACF,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAY,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAChC,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,IAAY,EACZ,IAAa,EACb,OAGC;IAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,kCAAkC;IAClC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,SAAS;QACV,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAExB,0BAA0B;QAC1B,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAC5B,CAAC;QACF,CAAC;QAED,kBAAkB;QAClB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC3B,IAAa,EACb,OAAgB,EAChB,OAEC;IAED,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,4CAA4C;QAC5C,IAAI,YAAY,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAClD,SAAS;QACV,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAa;IACnD,MAAM,QAAQ,GAAY,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAI/C,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,MAAM,OAAO,GAAY,EAAE,CAAC;IAE5B,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAE9E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,gCAAgC;QAChC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,SAAS;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvE,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACP,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAClB,CAAC;IACF,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,KAAa;IACzD,0CAA0C;IAC1C,MAAM,iBAAiB,GAAG;QACzB,WAAW;QACX,QAAQ;QACR,UAAU;QACV,aAAa;QACb,YAAY;QACZ,SAAS;QACT,gBAAgB;QAChB,WAAW;QACX,YAAY;QACZ,OAAO;QACP,WAAW;QACX,aAAa;QACb,YAAY;KACZ,CAAC;IAEF,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,IAAI,cAAc,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,yCAAyC;IACzC,IAAI,wDAAwD,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uBAAuB;IACvB,IAAI,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,kCAAkC;IAClC,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,iBAAiB;QACjB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,wBAAwB;IACxB,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,sDAAsD;IACtD,gEAAgE;IAChE,MAAM,MAAM,GAAG,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC;IACb,CAAC;IAED,2CAA2C;IAC3C,IACC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EACtC,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}