@mondaydotcomorg/atp-compiler 0.17.14

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 (285) hide show
  1. package/README.md +382 -0
  2. package/__tests__/integration/all-array-methods-native.test.ts +321 -0
  3. package/__tests__/integration/all-callback-types.test.ts +406 -0
  4. package/__tests__/integration/comprehensive-edge-cases.test.ts +701 -0
  5. package/__tests__/integration/native-behavior-verification.test.ts +340 -0
  6. package/__tests__/integration/semantic-correctness.test.ts +354 -0
  7. package/__tests__/integration/threshold-tests.test.ts +529 -0
  8. package/__tests__/unit/batch-optimizer.test.ts +253 -0
  9. package/__tests__/unit/checkpoint-manager.test.ts +145 -0
  10. package/__tests__/unit/detector.test.ts +346 -0
  11. package/dist/atp-compiler/src/index.d.ts +6 -0
  12. package/dist/atp-compiler/src/index.d.ts.map +1 -0
  13. package/dist/atp-compiler/src/index.js +6 -0
  14. package/dist/atp-compiler/src/index.js.map +1 -0
  15. package/dist/atp-compiler/src/runtime/batch-parallel.d.ts +3 -0
  16. package/dist/atp-compiler/src/runtime/batch-parallel.d.ts.map +1 -0
  17. package/dist/atp-compiler/src/runtime/batch-parallel.js +13 -0
  18. package/dist/atp-compiler/src/runtime/batch-parallel.js.map +1 -0
  19. package/dist/atp-compiler/src/runtime/checkpoint-manager.d.ts +19 -0
  20. package/dist/atp-compiler/src/runtime/checkpoint-manager.d.ts.map +1 -0
  21. package/dist/atp-compiler/src/runtime/checkpoint-manager.js +81 -0
  22. package/dist/atp-compiler/src/runtime/checkpoint-manager.js.map +1 -0
  23. package/dist/atp-compiler/src/runtime/context.d.ts +8 -0
  24. package/dist/atp-compiler/src/runtime/context.d.ts.map +1 -0
  25. package/dist/atp-compiler/src/runtime/context.js +25 -0
  26. package/dist/atp-compiler/src/runtime/context.js.map +1 -0
  27. package/dist/atp-compiler/src/runtime/errors.d.ts +38 -0
  28. package/dist/atp-compiler/src/runtime/errors.d.ts.map +1 -0
  29. package/dist/atp-compiler/src/runtime/errors.js +61 -0
  30. package/dist/atp-compiler/src/runtime/errors.js.map +1 -0
  31. package/dist/atp-compiler/src/runtime/index.d.ts +16 -0
  32. package/dist/atp-compiler/src/runtime/index.d.ts.map +1 -0
  33. package/dist/atp-compiler/src/runtime/index.js +20 -0
  34. package/dist/atp-compiler/src/runtime/index.js.map +1 -0
  35. package/dist/atp-compiler/src/runtime/resumable-arrays.d.ts +9 -0
  36. package/dist/atp-compiler/src/runtime/resumable-arrays.d.ts.map +1 -0
  37. package/dist/atp-compiler/src/runtime/resumable-arrays.js +179 -0
  38. package/dist/atp-compiler/src/runtime/resumable-arrays.js.map +1 -0
  39. package/dist/atp-compiler/src/runtime/resumable-loops.d.ts +4 -0
  40. package/dist/atp-compiler/src/runtime/resumable-loops.d.ts.map +1 -0
  41. package/dist/atp-compiler/src/runtime/resumable-loops.js +61 -0
  42. package/dist/atp-compiler/src/runtime/resumable-loops.js.map +1 -0
  43. package/dist/atp-compiler/src/runtime/resumable-parallel.d.ts +3 -0
  44. package/dist/atp-compiler/src/runtime/resumable-parallel.d.ts.map +1 -0
  45. package/dist/atp-compiler/src/runtime/resumable-parallel.js +44 -0
  46. package/dist/atp-compiler/src/runtime/resumable-parallel.js.map +1 -0
  47. package/dist/atp-compiler/src/transformer/array-transformer-batch.d.ts +13 -0
  48. package/dist/atp-compiler/src/transformer/array-transformer-batch.d.ts.map +1 -0
  49. package/dist/atp-compiler/src/transformer/array-transformer-batch.js +55 -0
  50. package/dist/atp-compiler/src/transformer/array-transformer-batch.js.map +1 -0
  51. package/dist/atp-compiler/src/transformer/array-transformer-sequential.d.ts +6 -0
  52. package/dist/atp-compiler/src/transformer/array-transformer-sequential.d.ts.map +1 -0
  53. package/dist/atp-compiler/src/transformer/array-transformer-sequential.js +23 -0
  54. package/dist/atp-compiler/src/transformer/array-transformer-sequential.js.map +1 -0
  55. package/dist/atp-compiler/src/transformer/array-transformer-utils.d.ts +18 -0
  56. package/dist/atp-compiler/src/transformer/array-transformer-utils.d.ts.map +1 -0
  57. package/dist/atp-compiler/src/transformer/array-transformer-utils.js +69 -0
  58. package/dist/atp-compiler/src/transformer/array-transformer-utils.js.map +1 -0
  59. package/dist/atp-compiler/src/transformer/array-transformer-wrappers.d.ts +26 -0
  60. package/dist/atp-compiler/src/transformer/array-transformer-wrappers.d.ts.map +1 -0
  61. package/dist/atp-compiler/src/transformer/array-transformer-wrappers.js +88 -0
  62. package/dist/atp-compiler/src/transformer/array-transformer-wrappers.js.map +1 -0
  63. package/dist/atp-compiler/src/transformer/array-transformer.d.ts +12 -0
  64. package/dist/atp-compiler/src/transformer/array-transformer.d.ts.map +1 -0
  65. package/dist/atp-compiler/src/transformer/array-transformer.js +47 -0
  66. package/dist/atp-compiler/src/transformer/array-transformer.js.map +1 -0
  67. package/dist/atp-compiler/src/transformer/batch-detector.d.ts +16 -0
  68. package/dist/atp-compiler/src/transformer/batch-detector.d.ts.map +1 -0
  69. package/dist/atp-compiler/src/transformer/batch-detector.js +131 -0
  70. package/dist/atp-compiler/src/transformer/batch-detector.js.map +1 -0
  71. package/dist/atp-compiler/src/transformer/batch-optimizer.d.ts +27 -0
  72. package/dist/atp-compiler/src/transformer/batch-optimizer.d.ts.map +1 -0
  73. package/dist/atp-compiler/src/transformer/batch-optimizer.js +244 -0
  74. package/dist/atp-compiler/src/transformer/batch-optimizer.js.map +1 -0
  75. package/dist/atp-compiler/src/transformer/detector.d.ts +9 -0
  76. package/dist/atp-compiler/src/transformer/detector.d.ts.map +1 -0
  77. package/dist/atp-compiler/src/transformer/detector.js +141 -0
  78. package/dist/atp-compiler/src/transformer/detector.js.map +1 -0
  79. package/dist/atp-compiler/src/transformer/index.d.ts +22 -0
  80. package/dist/atp-compiler/src/transformer/index.d.ts.map +1 -0
  81. package/dist/atp-compiler/src/transformer/index.js +132 -0
  82. package/dist/atp-compiler/src/transformer/index.js.map +1 -0
  83. package/dist/atp-compiler/src/transformer/loop-transformer.d.ts +25 -0
  84. package/dist/atp-compiler/src/transformer/loop-transformer.d.ts.map +1 -0
  85. package/dist/atp-compiler/src/transformer/loop-transformer.js +193 -0
  86. package/dist/atp-compiler/src/transformer/loop-transformer.js.map +1 -0
  87. package/dist/atp-compiler/src/transformer/promise-transformer.d.ts +17 -0
  88. package/dist/atp-compiler/src/transformer/promise-transformer.d.ts.map +1 -0
  89. package/dist/atp-compiler/src/transformer/promise-transformer.js +132 -0
  90. package/dist/atp-compiler/src/transformer/promise-transformer.js.map +1 -0
  91. package/dist/atp-compiler/src/transformer/utils.d.ts +15 -0
  92. package/dist/atp-compiler/src/transformer/utils.d.ts.map +1 -0
  93. package/dist/atp-compiler/src/transformer/utils.js +118 -0
  94. package/dist/atp-compiler/src/transformer/utils.js.map +1 -0
  95. package/dist/atp-compiler/src/types.d.ts +57 -0
  96. package/dist/atp-compiler/src/types.d.ts.map +1 -0
  97. package/dist/atp-compiler/src/types.js +23 -0
  98. package/dist/atp-compiler/src/types.js.map +1 -0
  99. package/dist/protocol/src/auth.d.ts +173 -0
  100. package/dist/protocol/src/auth.d.ts.map +1 -0
  101. package/dist/protocol/src/auth.js +202 -0
  102. package/dist/protocol/src/auth.js.map +1 -0
  103. package/dist/protocol/src/index.d.ts +7 -0
  104. package/dist/protocol/src/index.d.ts.map +1 -0
  105. package/dist/protocol/src/index.js +7 -0
  106. package/dist/protocol/src/index.js.map +1 -0
  107. package/dist/protocol/src/oauth.d.ts +63 -0
  108. package/dist/protocol/src/oauth.d.ts.map +1 -0
  109. package/dist/protocol/src/oauth.js +5 -0
  110. package/dist/protocol/src/oauth.js.map +1 -0
  111. package/dist/protocol/src/providers.d.ts +167 -0
  112. package/dist/protocol/src/providers.d.ts.map +1 -0
  113. package/dist/protocol/src/providers.js +33 -0
  114. package/dist/protocol/src/providers.js.map +1 -0
  115. package/dist/protocol/src/schemas.d.ts +6 -0
  116. package/dist/protocol/src/schemas.d.ts.map +1 -0
  117. package/dist/protocol/src/schemas.js +51 -0
  118. package/dist/protocol/src/schemas.js.map +1 -0
  119. package/dist/protocol/src/types.d.ts +489 -0
  120. package/dist/protocol/src/types.d.ts.map +1 -0
  121. package/dist/protocol/src/types.js +88 -0
  122. package/dist/protocol/src/types.js.map +1 -0
  123. package/dist/protocol/src/validation.d.ts +76 -0
  124. package/dist/protocol/src/validation.d.ts.map +1 -0
  125. package/dist/protocol/src/validation.js +129 -0
  126. package/dist/protocol/src/validation.js.map +1 -0
  127. package/dist/provenance/src/ast/instrumentor.d.ts +37 -0
  128. package/dist/provenance/src/ast/instrumentor.d.ts.map +1 -0
  129. package/dist/provenance/src/ast/instrumentor.js +299 -0
  130. package/dist/provenance/src/ast/instrumentor.js.map +1 -0
  131. package/dist/provenance/src/index.d.ts +7 -0
  132. package/dist/provenance/src/index.d.ts.map +1 -0
  133. package/dist/provenance/src/index.js +7 -0
  134. package/dist/provenance/src/index.js.map +1 -0
  135. package/dist/provenance/src/policies/engine.d.ts +71 -0
  136. package/dist/provenance/src/policies/engine.d.ts.map +1 -0
  137. package/dist/provenance/src/policies/engine.js +433 -0
  138. package/dist/provenance/src/policies/engine.js.map +1 -0
  139. package/dist/provenance/src/registry.d.ts +94 -0
  140. package/dist/provenance/src/registry.d.ts.map +1 -0
  141. package/dist/provenance/src/registry.js +445 -0
  142. package/dist/provenance/src/registry.js.map +1 -0
  143. package/dist/provenance/src/tokens.d.ts +49 -0
  144. package/dist/provenance/src/tokens.d.ts.map +1 -0
  145. package/dist/provenance/src/tokens.js +239 -0
  146. package/dist/provenance/src/tokens.js.map +1 -0
  147. package/dist/provenance/src/types.d.ts +150 -0
  148. package/dist/provenance/src/types.d.ts.map +1 -0
  149. package/dist/provenance/src/types.js +47 -0
  150. package/dist/provenance/src/types.js.map +1 -0
  151. package/dist/runtime/src/approval/handler.d.ts +12 -0
  152. package/dist/runtime/src/approval/handler.d.ts.map +1 -0
  153. package/dist/runtime/src/approval/handler.js +17 -0
  154. package/dist/runtime/src/approval/handler.js.map +1 -0
  155. package/dist/runtime/src/approval/index.d.ts +17 -0
  156. package/dist/runtime/src/approval/index.d.ts.map +1 -0
  157. package/dist/runtime/src/approval/index.js +94 -0
  158. package/dist/runtime/src/approval/index.js.map +1 -0
  159. package/dist/runtime/src/approval/types.d.ts +21 -0
  160. package/dist/runtime/src/approval/types.d.ts.map +1 -0
  161. package/dist/runtime/src/approval/types.js +5 -0
  162. package/dist/runtime/src/approval/types.js.map +1 -0
  163. package/dist/runtime/src/cache/backends.d.ts +39 -0
  164. package/dist/runtime/src/cache/backends.d.ts.map +1 -0
  165. package/dist/runtime/src/cache/backends.js +167 -0
  166. package/dist/runtime/src/cache/backends.js.map +1 -0
  167. package/dist/runtime/src/cache/index.d.ts +32 -0
  168. package/dist/runtime/src/cache/index.d.ts.map +1 -0
  169. package/dist/runtime/src/cache/index.js +103 -0
  170. package/dist/runtime/src/cache/index.js.map +1 -0
  171. package/dist/runtime/src/cache/types.d.ts +20 -0
  172. package/dist/runtime/src/cache/types.d.ts.map +1 -0
  173. package/dist/runtime/src/cache/types.js +2 -0
  174. package/dist/runtime/src/cache/types.js.map +1 -0
  175. package/dist/runtime/src/embedding/index.d.ts +39 -0
  176. package/dist/runtime/src/embedding/index.d.ts.map +1 -0
  177. package/dist/runtime/src/embedding/index.js +162 -0
  178. package/dist/runtime/src/embedding/index.js.map +1 -0
  179. package/dist/runtime/src/embedding/types.d.ts +28 -0
  180. package/dist/runtime/src/embedding/types.d.ts.map +1 -0
  181. package/dist/runtime/src/embedding/types.js +5 -0
  182. package/dist/runtime/src/embedding/types.js.map +1 -0
  183. package/dist/runtime/src/embedding/utils.d.ts +11 -0
  184. package/dist/runtime/src/embedding/utils.d.ts.map +1 -0
  185. package/dist/runtime/src/embedding/utils.js +30 -0
  186. package/dist/runtime/src/embedding/utils.js.map +1 -0
  187. package/dist/runtime/src/embedding/vector-store.d.ts +64 -0
  188. package/dist/runtime/src/embedding/vector-store.d.ts.map +1 -0
  189. package/dist/runtime/src/embedding/vector-store.js +142 -0
  190. package/dist/runtime/src/embedding/vector-store.js.map +1 -0
  191. package/dist/runtime/src/index.d.ts +18 -0
  192. package/dist/runtime/src/index.d.ts.map +1 -0
  193. package/dist/runtime/src/index.js +17 -0
  194. package/dist/runtime/src/index.js.map +1 -0
  195. package/dist/runtime/src/llm/callback.d.ts +13 -0
  196. package/dist/runtime/src/llm/callback.d.ts.map +1 -0
  197. package/dist/runtime/src/llm/callback.js +19 -0
  198. package/dist/runtime/src/llm/callback.js.map +1 -0
  199. package/dist/runtime/src/llm/index.d.ts +29 -0
  200. package/dist/runtime/src/llm/index.d.ts.map +1 -0
  201. package/dist/runtime/src/llm/index.js +118 -0
  202. package/dist/runtime/src/llm/index.js.map +1 -0
  203. package/dist/runtime/src/llm/replay.d.ts +47 -0
  204. package/dist/runtime/src/llm/replay.d.ts.map +1 -0
  205. package/dist/runtime/src/llm/replay.js +114 -0
  206. package/dist/runtime/src/llm/replay.js.map +1 -0
  207. package/dist/runtime/src/llm/types.d.ts +24 -0
  208. package/dist/runtime/src/llm/types.d.ts.map +1 -0
  209. package/dist/runtime/src/llm/types.js +2 -0
  210. package/dist/runtime/src/llm/types.js.map +1 -0
  211. package/dist/runtime/src/log/index.d.ts +12 -0
  212. package/dist/runtime/src/log/index.d.ts.map +1 -0
  213. package/dist/runtime/src/log/index.js +166 -0
  214. package/dist/runtime/src/log/index.js.map +1 -0
  215. package/dist/runtime/src/log/types.d.ts +19 -0
  216. package/dist/runtime/src/log/types.d.ts.map +1 -0
  217. package/dist/runtime/src/log/types.js +5 -0
  218. package/dist/runtime/src/log/types.js.map +1 -0
  219. package/dist/runtime/src/metadata/decorators.d.ts +27 -0
  220. package/dist/runtime/src/metadata/decorators.d.ts.map +1 -0
  221. package/dist/runtime/src/metadata/decorators.js +38 -0
  222. package/dist/runtime/src/metadata/decorators.js.map +1 -0
  223. package/dist/runtime/src/metadata/generated.d.ts +18 -0
  224. package/dist/runtime/src/metadata/generated.d.ts.map +1 -0
  225. package/dist/runtime/src/metadata/generated.js +290 -0
  226. package/dist/runtime/src/metadata/generated.js.map +1 -0
  227. package/dist/runtime/src/metadata/index.d.ts +11 -0
  228. package/dist/runtime/src/metadata/index.d.ts.map +1 -0
  229. package/dist/runtime/src/metadata/index.js +45 -0
  230. package/dist/runtime/src/metadata/index.js.map +1 -0
  231. package/dist/runtime/src/metadata/types.d.ts +22 -0
  232. package/dist/runtime/src/metadata/types.d.ts.map +1 -0
  233. package/dist/runtime/src/metadata/types.js +6 -0
  234. package/dist/runtime/src/metadata/types.js.map +1 -0
  235. package/dist/runtime/src/pause/index.d.ts +11 -0
  236. package/dist/runtime/src/pause/index.d.ts.map +1 -0
  237. package/dist/runtime/src/pause/index.js +15 -0
  238. package/dist/runtime/src/pause/index.js.map +1 -0
  239. package/dist/runtime/src/pause/types.d.ts +46 -0
  240. package/dist/runtime/src/pause/types.d.ts.map +1 -0
  241. package/dist/runtime/src/pause/types.js +57 -0
  242. package/dist/runtime/src/pause/types.js.map +1 -0
  243. package/dist/runtime/src/progress/index.d.ts +19 -0
  244. package/dist/runtime/src/progress/index.d.ts.map +1 -0
  245. package/dist/runtime/src/progress/index.js +61 -0
  246. package/dist/runtime/src/progress/index.js.map +1 -0
  247. package/dist/runtime/src/progress/types.d.ts +7 -0
  248. package/dist/runtime/src/progress/types.d.ts.map +1 -0
  249. package/dist/runtime/src/progress/types.js +2 -0
  250. package/dist/runtime/src/progress/types.js.map +1 -0
  251. package/dist/runtime/src/registry.d.ts +16 -0
  252. package/dist/runtime/src/registry.d.ts.map +1 -0
  253. package/dist/runtime/src/registry.js +16 -0
  254. package/dist/runtime/src/registry.js.map +1 -0
  255. package/dist/runtime/src/utils.d.ts +11 -0
  256. package/dist/runtime/src/utils.d.ts.map +1 -0
  257. package/dist/runtime/src/utils.js +31 -0
  258. package/dist/runtime/src/utils.js.map +1 -0
  259. package/dist/tsconfig.tsbuildinfo +1 -0
  260. package/jest.config.js +29 -0
  261. package/package.json +56 -0
  262. package/project.json +31 -0
  263. package/src/index.ts +6 -0
  264. package/src/runtime/batch-parallel.ts +22 -0
  265. package/src/runtime/checkpoint-manager.ts +105 -0
  266. package/src/runtime/context.ts +33 -0
  267. package/src/runtime/errors.ts +79 -0
  268. package/src/runtime/index.ts +35 -0
  269. package/src/runtime/resumable-arrays.ts +253 -0
  270. package/src/runtime/resumable-loops.ts +93 -0
  271. package/src/runtime/resumable-parallel.ts +57 -0
  272. package/src/transformer/array-transformer-batch.ts +86 -0
  273. package/src/transformer/array-transformer-sequential.ts +38 -0
  274. package/src/transformer/array-transformer-utils.ts +80 -0
  275. package/src/transformer/array-transformer-wrappers.ts +165 -0
  276. package/src/transformer/array-transformer.ts +76 -0
  277. package/src/transformer/batch-detector.ts +166 -0
  278. package/src/transformer/batch-optimizer.ts +320 -0
  279. package/src/transformer/detector.ts +171 -0
  280. package/src/transformer/index.ts +155 -0
  281. package/src/transformer/loop-transformer.ts +285 -0
  282. package/src/transformer/promise-transformer.ts +194 -0
  283. package/src/transformer/utils.ts +147 -0
  284. package/src/types.ts +101 -0
  285. package/tsconfig.json +12 -0
@@ -0,0 +1,406 @@
1
+ /**
2
+ * COMPREHENSIVE CALLBACK TYPE TESTS
3
+ *
4
+ * Tests ALL callback types: llm, approval, embedding
5
+ * Verifies batch optimization works correctly for each type
6
+ */
7
+
8
+ import { describe, test, expect, beforeEach } from '@jest/globals';
9
+ import { ATPCompiler } from '../../src/transformer/index';
10
+
11
+ describe('All Callback Types - Comprehensive Tests', () => {
12
+ let compiler: ATPCompiler;
13
+
14
+ beforeEach(() => {
15
+ compiler = new ATPCompiler({ enableBatchParallel: true });
16
+ });
17
+
18
+ describe('LLM Callbacks', () => {
19
+ test('✅ atp.llm.call - simple map should batch', () => {
20
+ const code = `
21
+ const results = await items.map(async (item) => {
22
+ return await atp.llm.call({ prompt: item });
23
+ });
24
+ `;
25
+ const result = compiler.transform(code);
26
+ expect(result.transformed).toBe(true);
27
+ expect(result.code).toContain('batchParallel');
28
+ expect(result.code).toContain('type: "llm"');
29
+ expect(result.code).toContain('operation: "call"');
30
+ });
31
+
32
+ test('✅ atp.llm.stream - simple forEach should batch', () => {
33
+ const code = `
34
+ await items.forEach(async (item) => {
35
+ await atp.llm.stream({ prompt: item });
36
+ });
37
+ `;
38
+ const result = compiler.transform(code);
39
+ expect(result.transformed).toBe(true);
40
+ expect(result.code).toContain('batchParallel');
41
+ expect(result.code).toContain('type: "llm"');
42
+ expect(result.code).toContain('operation: "stream"');
43
+ });
44
+
45
+ test('✅ atp.llm.generate - for...of should batch', () => {
46
+ const code = `
47
+ for (const item of items) {
48
+ await atp.llm.generate({ prompt: item });
49
+ }
50
+ `;
51
+ const result = compiler.transform(code);
52
+ expect(result.transformed).toBe(true);
53
+ expect(result.code).toContain('batchParallel');
54
+ expect(result.code).toContain('type: "llm"');
55
+ expect(result.code).toContain('operation: "generate"');
56
+ });
57
+
58
+ test('❌ LLM with conditional - should NOT batch', () => {
59
+ const code = `
60
+ const results = await items.map(async (item) => {
61
+ if (item.shouldProcess) {
62
+ return await atp.llm.call({ prompt: item.text });
63
+ }
64
+ });
65
+ `;
66
+ const result = compiler.transform(code);
67
+ expect(result.code).toContain('resumableMap');
68
+ expect(result.code).not.toContain('batchParallel');
69
+ });
70
+ });
71
+
72
+ describe('Approval Callbacks', () => {
73
+ test('✅ atp.approval.request - simple map should batch', () => {
74
+ const code = `
75
+ const results = await items.map(async (item) => {
76
+ return await atp.approval.request({ message: item });
77
+ });
78
+ `;
79
+ const result = compiler.transform(code);
80
+ expect(result.transformed).toBe(true);
81
+ expect(result.code).toContain('batchParallel');
82
+ expect(result.code).toContain('type: "approval"');
83
+ expect(result.code).toContain('operation: "request"');
84
+ });
85
+
86
+ test('✅ atp.approval.confirm - forEach should batch', () => {
87
+ const code = `
88
+ await items.forEach(async (item) => {
89
+ await atp.approval.confirm({ action: item.action });
90
+ });
91
+ `;
92
+ const result = compiler.transform(code);
93
+ expect(result.transformed).toBe(true);
94
+ expect(result.code).toContain('batchParallel');
95
+ expect(result.code).toContain('type: "approval"');
96
+ expect(result.code).toContain('operation: "confirm"');
97
+ });
98
+
99
+ test('✅ atp.approval.verify - for...of should batch', () => {
100
+ const code = `
101
+ for (const item of items) {
102
+ await atp.approval.verify({ data: item });
103
+ }
104
+ `;
105
+ const result = compiler.transform(code);
106
+ expect(result.transformed).toBe(true);
107
+ expect(result.code).toContain('batchParallel');
108
+ expect(result.code).toContain('type: "approval"');
109
+ expect(result.code).toContain('operation: "verify"');
110
+ });
111
+
112
+ test('❌ Approval with try-catch - should NOT batch', () => {
113
+ const code = `
114
+ const results = await items.map(async (item) => {
115
+ try {
116
+ return await atp.approval.request({ message: item });
117
+ } catch (e) {
118
+ return null;
119
+ }
120
+ });
121
+ `;
122
+ const result = compiler.transform(code);
123
+ expect(result.code).toContain('resumableMap');
124
+ expect(result.code).not.toContain('batchParallel');
125
+ });
126
+ });
127
+
128
+ describe('Embedding Callbacks', () => {
129
+ test('✅ atp.embedding.create - simple map should batch', () => {
130
+ const code = `
131
+ const results = await items.map(async (item) => {
132
+ return await atp.embedding.create({ text: item });
133
+ });
134
+ `;
135
+ const result = compiler.transform(code);
136
+ expect(result.transformed).toBe(true);
137
+ expect(result.code).toContain('batchParallel');
138
+ expect(result.code).toContain('type: "embedding"');
139
+ expect(result.code).toContain('operation: "create"');
140
+ });
141
+
142
+ test('✅ atp.embedding.generate - forEach should batch', () => {
143
+ const code = `
144
+ await items.forEach(async (item) => {
145
+ await atp.embedding.generate({ content: item });
146
+ });
147
+ `;
148
+ const result = compiler.transform(code);
149
+ expect(result.transformed).toBe(true);
150
+ expect(result.code).toContain('batchParallel');
151
+ expect(result.code).toContain('type: "embedding"');
152
+ expect(result.code).toContain('operation: "generate"');
153
+ });
154
+
155
+ test('✅ atp.embedding.encode - for...of should batch', () => {
156
+ const code = `
157
+ for (const item of items) {
158
+ await atp.embedding.encode({ data: item });
159
+ }
160
+ `;
161
+ const result = compiler.transform(code);
162
+ expect(result.transformed).toBe(true);
163
+ expect(result.code).toContain('batchParallel');
164
+ expect(result.code).toContain('type: "embedding"');
165
+ expect(result.code).toContain('operation: "encode"');
166
+ });
167
+
168
+ test('❌ Embedding with nested loop - should NOT batch outer', () => {
169
+ const code = `
170
+ const results = await items.map(async (item) => {
171
+ for (const sub of item.parts) {
172
+ await atp.embedding.create({ text: sub });
173
+ }
174
+ });
175
+ `;
176
+ const result = compiler.transform(code);
177
+ expect(result.code).toContain('resumableMap');
178
+ // Inner loop should be batched though
179
+ expect(result.code).toContain('batchParallel');
180
+ });
181
+ });
182
+
183
+ describe('Mixed Callback Types', () => {
184
+ test('Different callbacks in separate operations', () => {
185
+ const code = `
186
+ const llmResults = await items.map(async (item) => {
187
+ return await atp.llm.call({ prompt: item });
188
+ });
189
+
190
+ const approvalResults = await items.map(async (item) => {
191
+ return await atp.approval.request({ message: item });
192
+ });
193
+
194
+ const embeddings = await items.map(async (item) => {
195
+ return await atp.embedding.create({ text: item });
196
+ });
197
+ `;
198
+ const result = compiler.transform(code);
199
+ expect(result.transformed).toBe(true);
200
+ // All three should be batched
201
+ expect(result.code).toContain('type: "llm"');
202
+ expect(result.code).toContain('type: "approval"');
203
+ expect(result.code).toContain('type: "embedding"');
204
+ // Should have 3 batch operations
205
+ const batchCount = (result.code.match(/batchParallel/g) || []).length;
206
+ expect(batchCount).toBeGreaterThanOrEqual(3);
207
+ });
208
+
209
+ test('❌ Multiple different callbacks in same iteration - should NOT batch', () => {
210
+ const code = `
211
+ const results = await items.map(async (item) => {
212
+ const llm = await atp.llm.call({ prompt: item });
213
+ const approval = await atp.approval.request({ message: llm });
214
+ return approval;
215
+ });
216
+ `;
217
+ const result = compiler.transform(code);
218
+ // Has dependencies, so sequential
219
+ expect(result.code).toContain('resumableMap');
220
+ expect(result.code).not.toContain('batchParallel');
221
+ });
222
+ });
223
+
224
+ describe('Complex Payloads', () => {
225
+ test('✅ LLM with complex payload', () => {
226
+ const code = `
227
+ const results = await items.map(async (item) => {
228
+ return await atp.llm.call({
229
+ prompt: item.text,
230
+ model: 'gpt-4',
231
+ temperature: 0.7,
232
+ maxTokens: 1000,
233
+ metadata: { id: item.id, timestamp: Date.now() }
234
+ });
235
+ });
236
+ `;
237
+ const result = compiler.transform(code);
238
+ expect(result.transformed).toBe(true);
239
+ expect(result.code).toContain('batchParallel');
240
+ // Payload should be preserved
241
+ expect(result.code).toContain('prompt');
242
+ expect(result.code).toContain('model');
243
+ });
244
+
245
+ test('✅ Approval with complex payload', () => {
246
+ const code = `
247
+ const results = await items.map(async (item) => {
248
+ return await atp.approval.request({
249
+ message: item.message,
250
+ priority: item.priority,
251
+ requester: item.user,
252
+ context: { category: item.category }
253
+ });
254
+ });
255
+ `;
256
+ const result = compiler.transform(code);
257
+ expect(result.transformed).toBe(true);
258
+ expect(result.code).toContain('batchParallel');
259
+ expect(result.code).toContain('message');
260
+ expect(result.code).toContain('priority');
261
+ });
262
+
263
+ test('✅ Embedding with complex payload', () => {
264
+ const code = `
265
+ const results = await items.map(async (item) => {
266
+ return await atp.embedding.create({
267
+ text: item.content,
268
+ model: 'text-embedding-3-small',
269
+ dimensions: 1536,
270
+ metadata: item.meta
271
+ });
272
+ });
273
+ `;
274
+ const result = compiler.transform(code);
275
+ expect(result.transformed).toBe(true);
276
+ expect(result.code).toContain('batchParallel');
277
+ expect(result.code).toContain('text');
278
+ expect(result.code).toContain('model');
279
+ });
280
+ });
281
+
282
+ describe('Edge Cases - Callback Variations', () => {
283
+ test('✅ Callback with destructured parameter', () => {
284
+ const code = `
285
+ const results = await items.map(async ({ text, id }) => {
286
+ return await atp.llm.call({ prompt: text, context: id });
287
+ });
288
+ `;
289
+ const result = compiler.transform(code);
290
+ expect(result.transformed).toBe(true);
291
+ });
292
+
293
+ test('✅ Callback with index parameter', () => {
294
+ const code = `
295
+ const results = await items.map(async (item, index) => {
296
+ return await atp.llm.call({ prompt: \`\${index}: \${item}\` });
297
+ });
298
+ `;
299
+ const result = compiler.transform(code);
300
+ expect(result.transformed).toBe(true);
301
+ expect(result.code).toContain('batchParallel');
302
+ });
303
+
304
+ test('✅ Callback with computed property', () => {
305
+ const code = `
306
+ const results = await items.map(async (item) => {
307
+ return await atp.llm.call({ prompt: item.text.toUpperCase() });
308
+ });
309
+ `;
310
+ const result = compiler.transform(code);
311
+ expect(result.transformed).toBe(true);
312
+ expect(result.code).toContain('batchParallel');
313
+ });
314
+
315
+ test('✅ Callback with template literal', () => {
316
+ const code = `
317
+ const results = await items.map(async (item) => {
318
+ return await atp.llm.call({ prompt: \`Process: \${item}\` });
319
+ });
320
+ `;
321
+ const result = compiler.transform(code);
322
+ expect(result.transformed).toBe(true);
323
+ expect(result.code).toContain('batchParallel');
324
+ });
325
+
326
+ test('✅ Callback with spread operator', () => {
327
+ const code = `
328
+ const results = await items.map(async (item) => {
329
+ return await atp.llm.call({ ...item.config, prompt: item.text });
330
+ });
331
+ `;
332
+ const result = compiler.transform(code);
333
+ expect(result.transformed).toBe(true);
334
+ expect(result.code).toContain('batchParallel');
335
+ });
336
+ });
337
+
338
+ describe('Promise.all with Mixed Callbacks', () => {
339
+ test('✅ Promise.all with different callback types', () => {
340
+ const code = `
341
+ const results = await Promise.all([
342
+ atp.llm.call({ prompt: 'A' }),
343
+ atp.approval.request({ message: 'B' }),
344
+ atp.embedding.create({ text: 'C' })
345
+ ]);
346
+ `;
347
+ const result = compiler.transform(code);
348
+ expect(result.transformed).toBe(true);
349
+ // Promise.all is handled by PromiseTransformer (batchParallel or resumablePromiseAll)
350
+ const hasBatchParallel = result.code.includes('batchParallel');
351
+ const hasResumablePromiseAll = result.code.includes('resumablePromiseAll');
352
+ expect(hasBatchParallel || hasResumablePromiseAll).toBe(true);
353
+ });
354
+
355
+ test('✅ Promise.all with same callback type', () => {
356
+ const code = `
357
+ const results = await Promise.all([
358
+ atp.llm.call({ prompt: 'Question 1' }),
359
+ atp.llm.call({ prompt: 'Question 2' }),
360
+ atp.llm.call({ prompt: 'Question 3' })
361
+ ]);
362
+ `;
363
+ const result = compiler.transform(code);
364
+ expect(result.transformed).toBe(true);
365
+ expect(result.code).toContain('batchParallel');
366
+ const llmCount = (result.code.match(/type: "llm"/g) || []).length;
367
+ expect(llmCount).toBe(3);
368
+ });
369
+ });
370
+
371
+ describe('Verification of Generated Code', () => {
372
+ test('Batch code structure is correct', () => {
373
+ const code = `
374
+ const results = await items.map(async (item) => {
375
+ return await atp.llm.call({ prompt: item });
376
+ });
377
+ `;
378
+ const result = compiler.transform(code);
379
+
380
+ // Should have proper structure:
381
+ // items.map((item) => ({ type: 'llm', operation: 'call', payload: {...} }))
382
+ expect(result.code).toMatch(/\.map\s*\(\s*\(?[^)]+\)?\s*=>\s*\(\s*\{/);
383
+ expect(result.code).toContain('type:');
384
+ expect(result.code).toContain('operation:');
385
+ expect(result.code).toContain('payload:');
386
+ });
387
+
388
+ test('Payload preservation is correct', () => {
389
+ const code = `
390
+ const results = await items.map(async (item) => {
391
+ return await atp.llm.call({
392
+ prompt: item.text,
393
+ model: item.model
394
+ });
395
+ });
396
+ `;
397
+ const result = compiler.transform(code);
398
+
399
+ // Payload should reference item properties
400
+ expect(result.code).toContain('item.text');
401
+ expect(result.code).toContain('item.model');
402
+ });
403
+ });
404
+ });
405
+
406
+ console.log('\n✅ ALL CALLBACK TYPE TESTS COMPLETE!\n');