@mondaydotcomorg/atp-server 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 (307) hide show
  1. package/README.md +489 -0
  2. package/dist/aggregator/index.d.ts +59 -0
  3. package/dist/aggregator/index.d.ts.map +1 -0
  4. package/dist/aggregator/index.js +171 -0
  5. package/dist/aggregator/index.js.map +1 -0
  6. package/dist/callback/index.d.ts +98 -0
  7. package/dist/callback/index.d.ts.map +1 -0
  8. package/dist/callback/index.js +136 -0
  9. package/dist/callback/index.js.map +1 -0
  10. package/dist/client-sessions.d.ts +82 -0
  11. package/dist/client-sessions.d.ts.map +1 -0
  12. package/dist/client-sessions.js +174 -0
  13. package/dist/client-sessions.js.map +1 -0
  14. package/dist/controllers/definitions.controller.d.ts +4 -0
  15. package/dist/controllers/definitions.controller.d.ts.map +1 -0
  16. package/dist/controllers/definitions.controller.js +11 -0
  17. package/dist/controllers/definitions.controller.js.map +1 -0
  18. package/dist/controllers/execute.controller.d.ts +18 -0
  19. package/dist/controllers/execute.controller.d.ts.map +1 -0
  20. package/dist/controllers/execute.controller.js +122 -0
  21. package/dist/controllers/execute.controller.js.map +1 -0
  22. package/dist/controllers/info.controller.d.ts +3 -0
  23. package/dist/controllers/info.controller.d.ts.map +1 -0
  24. package/dist/controllers/info.controller.js +13 -0
  25. package/dist/controllers/info.controller.js.map +1 -0
  26. package/dist/controllers/resume.controller.d.ts +11 -0
  27. package/dist/controllers/resume.controller.d.ts.map +1 -0
  28. package/dist/controllers/resume.controller.js +61 -0
  29. package/dist/controllers/resume.controller.js.map +1 -0
  30. package/dist/controllers/search.controller.d.ts +4 -0
  31. package/dist/controllers/search.controller.d.ts.map +1 -0
  32. package/dist/controllers/search.controller.js +7 -0
  33. package/dist/controllers/search.controller.js.map +1 -0
  34. package/dist/controllers/stream.controller.d.ts +19 -0
  35. package/dist/controllers/stream.controller.d.ts.map +1 -0
  36. package/dist/controllers/stream.controller.js +141 -0
  37. package/dist/controllers/stream.controller.js.map +1 -0
  38. package/dist/core/config.d.ts +161 -0
  39. package/dist/core/config.d.ts.map +1 -0
  40. package/dist/core/config.js +7 -0
  41. package/dist/core/config.js.map +1 -0
  42. package/dist/core/http.d.ts +4 -0
  43. package/dist/core/http.d.ts.map +1 -0
  44. package/dist/core/http.js +17 -0
  45. package/dist/core/http.js.map +1 -0
  46. package/dist/create-server.d.ts +120 -0
  47. package/dist/create-server.d.ts.map +1 -0
  48. package/dist/create-server.js +423 -0
  49. package/dist/create-server.js.map +1 -0
  50. package/dist/execution-state/index.d.ts +95 -0
  51. package/dist/execution-state/index.d.ts.map +1 -0
  52. package/dist/execution-state/index.js +128 -0
  53. package/dist/execution-state/index.js.map +1 -0
  54. package/dist/executor/ast-provenance-bridge.d.ts +12 -0
  55. package/dist/executor/ast-provenance-bridge.d.ts.map +1 -0
  56. package/dist/executor/ast-provenance-bridge.js +66 -0
  57. package/dist/executor/ast-provenance-bridge.js.map +1 -0
  58. package/dist/executor/ast-tracking-runtime.d.ts +7 -0
  59. package/dist/executor/ast-tracking-runtime.d.ts.map +1 -0
  60. package/dist/executor/ast-tracking-runtime.js +559 -0
  61. package/dist/executor/ast-tracking-runtime.js.map +1 -0
  62. package/dist/executor/bootstrap-generated.d.ts +32 -0
  63. package/dist/executor/bootstrap-generated.d.ts.map +1 -0
  64. package/dist/executor/bootstrap-generated.js +90 -0
  65. package/dist/executor/bootstrap-generated.js.map +1 -0
  66. package/dist/executor/compiler-config.d.ts +32 -0
  67. package/dist/executor/compiler-config.d.ts.map +1 -0
  68. package/dist/executor/compiler-config.js +99 -0
  69. package/dist/executor/compiler-config.js.map +1 -0
  70. package/dist/executor/constants.d.ts +4 -0
  71. package/dist/executor/constants.d.ts.map +1 -0
  72. package/dist/executor/constants.js +4 -0
  73. package/dist/executor/constants.js.map +1 -0
  74. package/dist/executor/error-handler.d.ts +9 -0
  75. package/dist/executor/error-handler.d.ts.map +1 -0
  76. package/dist/executor/error-handler.js +95 -0
  77. package/dist/executor/error-handler.js.map +1 -0
  78. package/dist/executor/execution-error-handler.d.ts +7 -0
  79. package/dist/executor/execution-error-handler.d.ts.map +1 -0
  80. package/dist/executor/execution-error-handler.js +136 -0
  81. package/dist/executor/execution-error-handler.js.map +1 -0
  82. package/dist/executor/executor.d.ts +20 -0
  83. package/dist/executor/executor.d.ts.map +1 -0
  84. package/dist/executor/executor.js +452 -0
  85. package/dist/executor/executor.js.map +1 -0
  86. package/dist/executor/index.d.ts +4 -0
  87. package/dist/executor/index.d.ts.map +1 -0
  88. package/dist/executor/index.js +3 -0
  89. package/dist/executor/index.js.map +1 -0
  90. package/dist/executor/resume-handler.d.ts +9 -0
  91. package/dist/executor/resume-handler.d.ts.map +1 -0
  92. package/dist/executor/resume-handler.js +22 -0
  93. package/dist/executor/resume-handler.js.map +1 -0
  94. package/dist/executor/sandbox-builder.d.ts +29 -0
  95. package/dist/executor/sandbox-builder.d.ts.map +1 -0
  96. package/dist/executor/sandbox-builder.js +538 -0
  97. package/dist/executor/sandbox-builder.js.map +1 -0
  98. package/dist/executor/sandbox-injector.d.ts +7 -0
  99. package/dist/executor/sandbox-injector.d.ts.map +1 -0
  100. package/dist/executor/sandbox-injector.js +293 -0
  101. package/dist/executor/sandbox-injector.js.map +1 -0
  102. package/dist/executor/types.d.ts +21 -0
  103. package/dist/executor/types.d.ts.map +1 -0
  104. package/dist/executor/types.js +2 -0
  105. package/dist/executor/types.js.map +1 -0
  106. package/dist/explorer/index.d.ts +69 -0
  107. package/dist/explorer/index.d.ts.map +1 -0
  108. package/dist/explorer/index.js +228 -0
  109. package/dist/explorer/index.js.map +1 -0
  110. package/dist/handlers/definitions.handler.d.ts +3 -0
  111. package/dist/handlers/definitions.handler.d.ts.map +1 -0
  112. package/dist/handlers/definitions.handler.js +11 -0
  113. package/dist/handlers/definitions.handler.js.map +1 -0
  114. package/dist/handlers/execute.handler.d.ts +7 -0
  115. package/dist/handlers/execute.handler.d.ts.map +1 -0
  116. package/dist/handlers/execute.handler.js +225 -0
  117. package/dist/handlers/execute.handler.js.map +1 -0
  118. package/dist/handlers/explorer.handler.d.ts +4 -0
  119. package/dist/handlers/explorer.handler.d.ts.map +1 -0
  120. package/dist/handlers/explorer.handler.js +10 -0
  121. package/dist/handlers/explorer.handler.js.map +1 -0
  122. package/dist/handlers/init.handler.d.ts +5 -0
  123. package/dist/handlers/init.handler.d.ts.map +1 -0
  124. package/dist/handlers/init.handler.js +41 -0
  125. package/dist/handlers/init.handler.js.map +1 -0
  126. package/dist/handlers/resume.handler.d.ts +6 -0
  127. package/dist/handlers/resume.handler.d.ts.map +1 -0
  128. package/dist/handlers/resume.handler.js +256 -0
  129. package/dist/handlers/resume.handler.js.map +1 -0
  130. package/dist/handlers/search.handler.d.ts +5 -0
  131. package/dist/handlers/search.handler.d.ts.map +1 -0
  132. package/dist/handlers/search.handler.js +11 -0
  133. package/dist/handlers/search.handler.js.map +1 -0
  134. package/dist/http/request-handler.d.ts +15 -0
  135. package/dist/http/request-handler.d.ts.map +1 -0
  136. package/dist/http/request-handler.js +94 -0
  137. package/dist/http/request-handler.js.map +1 -0
  138. package/dist/http/router.d.ts +4 -0
  139. package/dist/http/router.d.ts.map +1 -0
  140. package/dist/http/router.js +32 -0
  141. package/dist/http/router.js.map +1 -0
  142. package/dist/index.d.ts +10 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +8 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/instrumentation/index.d.ts +5 -0
  147. package/dist/instrumentation/index.d.ts.map +1 -0
  148. package/dist/instrumentation/index.js +5 -0
  149. package/dist/instrumentation/index.js.map +1 -0
  150. package/dist/instrumentation/serializer.d.ts +61 -0
  151. package/dist/instrumentation/serializer.d.ts.map +1 -0
  152. package/dist/instrumentation/serializer.js +334 -0
  153. package/dist/instrumentation/serializer.js.map +1 -0
  154. package/dist/instrumentation/state-manager.d.ts +61 -0
  155. package/dist/instrumentation/state-manager.d.ts.map +1 -0
  156. package/dist/instrumentation/state-manager.js +205 -0
  157. package/dist/instrumentation/state-manager.js.map +1 -0
  158. package/dist/instrumentation/transformer.d.ts +9 -0
  159. package/dist/instrumentation/transformer.d.ts.map +1 -0
  160. package/dist/instrumentation/transformer.js +70 -0
  161. package/dist/instrumentation/transformer.js.map +1 -0
  162. package/dist/instrumentation/types.d.ts +59 -0
  163. package/dist/instrumentation/types.d.ts.map +1 -0
  164. package/dist/instrumentation/types.js +5 -0
  165. package/dist/instrumentation/types.js.map +1 -0
  166. package/dist/middleware/audit.d.ts +18 -0
  167. package/dist/middleware/audit.d.ts.map +1 -0
  168. package/dist/middleware/audit.js +76 -0
  169. package/dist/middleware/audit.js.map +1 -0
  170. package/dist/openapi/index.d.ts +133 -0
  171. package/dist/openapi/index.d.ts.map +1 -0
  172. package/dist/openapi/index.js +235 -0
  173. package/dist/openapi/index.js.map +1 -0
  174. package/dist/openapi-loader.d.ts +87 -0
  175. package/dist/openapi-loader.d.ts.map +1 -0
  176. package/dist/openapi-loader.js +491 -0
  177. package/dist/openapi-loader.js.map +1 -0
  178. package/dist/routes/index.d.ts +21 -0
  179. package/dist/routes/index.d.ts.map +1 -0
  180. package/dist/routes/index.js +47 -0
  181. package/dist/routes/index.js.map +1 -0
  182. package/dist/search/index.d.ts +48 -0
  183. package/dist/search/index.d.ts.map +1 -0
  184. package/dist/search/index.js +156 -0
  185. package/dist/search/index.js.map +1 -0
  186. package/dist/security/index.d.ts +2 -0
  187. package/dist/security/index.d.ts.map +1 -0
  188. package/dist/security/index.js +2 -0
  189. package/dist/security/index.js.map +1 -0
  190. package/dist/shutdown.d.ts +19 -0
  191. package/dist/shutdown.d.ts.map +1 -0
  192. package/dist/shutdown.js +87 -0
  193. package/dist/shutdown.js.map +1 -0
  194. package/dist/utils/banner.d.ts +12 -0
  195. package/dist/utils/banner.d.ts.map +1 -0
  196. package/dist/utils/banner.js +18 -0
  197. package/dist/utils/banner.js.map +1 -0
  198. package/dist/utils/context.d.ts +16 -0
  199. package/dist/utils/context.d.ts.map +1 -0
  200. package/dist/utils/context.js +44 -0
  201. package/dist/utils/context.js.map +1 -0
  202. package/dist/utils/error.d.ts +8 -0
  203. package/dist/utils/error.d.ts.map +1 -0
  204. package/dist/utils/error.js +17 -0
  205. package/dist/utils/error.js.map +1 -0
  206. package/dist/utils/hint-based-instrumentation.d.ts +14 -0
  207. package/dist/utils/hint-based-instrumentation.d.ts.map +1 -0
  208. package/dist/utils/hint-based-instrumentation.js +84 -0
  209. package/dist/utils/hint-based-instrumentation.js.map +1 -0
  210. package/dist/utils/index.d.ts +8 -0
  211. package/dist/utils/index.d.ts.map +1 -0
  212. package/dist/utils/index.js +8 -0
  213. package/dist/utils/index.js.map +1 -0
  214. package/dist/utils/info.d.ts +20 -0
  215. package/dist/utils/info.d.ts.map +1 -0
  216. package/dist/utils/info.js +15 -0
  217. package/dist/utils/info.js.map +1 -0
  218. package/dist/utils/provenance-reattachment.d.ts +32 -0
  219. package/dist/utils/provenance-reattachment.d.ts.map +1 -0
  220. package/dist/utils/provenance-reattachment.js +115 -0
  221. package/dist/utils/provenance-reattachment.js.map +1 -0
  222. package/dist/utils/request.d.ts +21 -0
  223. package/dist/utils/request.d.ts.map +1 -0
  224. package/dist/utils/request.js +44 -0
  225. package/dist/utils/request.js.map +1 -0
  226. package/dist/utils/response.d.ts +30 -0
  227. package/dist/utils/response.d.ts.map +1 -0
  228. package/dist/utils/response.js +53 -0
  229. package/dist/utils/response.js.map +1 -0
  230. package/dist/utils/runtime-types.d.ts +6 -0
  231. package/dist/utils/runtime-types.d.ts.map +1 -0
  232. package/dist/utils/runtime-types.js +14 -0
  233. package/dist/utils/runtime-types.js.map +1 -0
  234. package/dist/utils/schema.d.ts +9 -0
  235. package/dist/utils/schema.d.ts.map +1 -0
  236. package/dist/utils/schema.js +13 -0
  237. package/dist/utils/schema.js.map +1 -0
  238. package/dist/utils/token-emitter.d.ts +21 -0
  239. package/dist/utils/token-emitter.d.ts.map +1 -0
  240. package/dist/utils/token-emitter.js +129 -0
  241. package/dist/utils/token-emitter.js.map +1 -0
  242. package/dist/validator/index.d.ts +36 -0
  243. package/dist/validator/index.d.ts.map +1 -0
  244. package/dist/validator/index.js +224 -0
  245. package/dist/validator/index.js.map +1 -0
  246. package/package.json +68 -0
  247. package/src/aggregator/index.ts +207 -0
  248. package/src/callback/index.ts +191 -0
  249. package/src/client-sessions.ts +234 -0
  250. package/src/controllers/definitions.controller.ts +19 -0
  251. package/src/controllers/execute.controller.ts +166 -0
  252. package/src/controllers/info.controller.ts +14 -0
  253. package/src/controllers/resume.controller.ts +92 -0
  254. package/src/controllers/search.controller.ts +16 -0
  255. package/src/controllers/stream.controller.ts +190 -0
  256. package/src/core/config.ts +180 -0
  257. package/src/core/http.ts +21 -0
  258. package/src/create-server.ts +536 -0
  259. package/src/execution-state/index.ts +204 -0
  260. package/src/executor/ast-provenance-bridge.ts +80 -0
  261. package/src/executor/ast-tracking-runtime.ts +558 -0
  262. package/src/executor/bootstrap-generated.ts +90 -0
  263. package/src/executor/compiler-config.ts +146 -0
  264. package/src/executor/constants.ts +5 -0
  265. package/src/executor/error-handler.ts +118 -0
  266. package/src/executor/execution-error-handler.ts +178 -0
  267. package/src/executor/executor.ts +631 -0
  268. package/src/executor/index.ts +3 -0
  269. package/src/executor/resume-handler.ts +39 -0
  270. package/src/executor/sandbox-builder.ts +684 -0
  271. package/src/executor/sandbox-injector.ts +345 -0
  272. package/src/executor/types.ts +22 -0
  273. package/src/explorer/index.ts +297 -0
  274. package/src/handlers/definitions.handler.ts +13 -0
  275. package/src/handlers/execute.handler.ts +286 -0
  276. package/src/handlers/explorer.handler.ts +18 -0
  277. package/src/handlers/init.handler.ts +53 -0
  278. package/src/handlers/resume.handler.ts +316 -0
  279. package/src/handlers/search.handler.ts +32 -0
  280. package/src/http/request-handler.ts +117 -0
  281. package/src/http/router.ts +29 -0
  282. package/src/index.ts +60 -0
  283. package/src/instrumentation/index.ts +4 -0
  284. package/src/instrumentation/serializer.ts +421 -0
  285. package/src/instrumentation/state-manager.ts +237 -0
  286. package/src/instrumentation/transformer.ts +84 -0
  287. package/src/instrumentation/types.ts +76 -0
  288. package/src/middleware/audit.ts +101 -0
  289. package/src/openapi/index.ts +378 -0
  290. package/src/openapi-loader.ts +744 -0
  291. package/src/routes/index.ts +93 -0
  292. package/src/search/index.ts +216 -0
  293. package/src/security/index.ts +1 -0
  294. package/src/shutdown.ts +108 -0
  295. package/src/utils/banner.ts +25 -0
  296. package/src/utils/context.ts +58 -0
  297. package/src/utils/error.ts +25 -0
  298. package/src/utils/hint-based-instrumentation.ts +99 -0
  299. package/src/utils/index.ts +15 -0
  300. package/src/utils/info.ts +31 -0
  301. package/src/utils/provenance-reattachment.ts +144 -0
  302. package/src/utils/request.ts +53 -0
  303. package/src/utils/response.ts +69 -0
  304. package/src/utils/runtime-types.ts +14 -0
  305. package/src/utils/schema.ts +18 -0
  306. package/src/utils/token-emitter.ts +182 -0
  307. package/src/validator/index.ts +253 -0
@@ -0,0 +1,204 @@
1
+ import { log } from '@mondaydotcomorg/atp-runtime';
2
+ import type { ExecutionConfig, CallbackType, CacheProvider } from '@mondaydotcomorg/atp-protocol';
3
+ import type { ProvenanceState, ProvenanceSnapshot } from '@mondaydotcomorg/atp-provenance';
4
+
5
+ /**
6
+ * Callback request sent to client when execution is paused
7
+ */
8
+ export interface CallbackRequest {
9
+ type: CallbackType;
10
+ operation: string;
11
+ payload: Record<string, unknown>;
12
+ }
13
+
14
+ /**
15
+ * Callback execution record for replay
16
+ */
17
+ export interface CallbackRecord {
18
+ type: CallbackType;
19
+ operation: string;
20
+ payload: Record<string, unknown>;
21
+ result?: unknown;
22
+ timestamp: number;
23
+ sequenceNumber: number;
24
+ }
25
+
26
+ /**
27
+ * Paused execution state
28
+ */
29
+ export interface PausedExecution {
30
+ executionId: string;
31
+ code: string;
32
+ config: ExecutionConfig;
33
+ clientId: string;
34
+ callbackRequest: CallbackRequest;
35
+ pausedAt: number;
36
+
37
+ callbackHistory: CallbackRecord[];
38
+ currentCallbackIndex: number;
39
+
40
+ context: {
41
+ variables?: Record<string, unknown>;
42
+ codeTransformed?: boolean;
43
+ };
44
+
45
+ provenanceState?: ProvenanceState | ProvenanceSnapshot;
46
+ }
47
+
48
+ /**
49
+ * Execution state manager using CacheProvider
50
+ * Works with any CacheProvider (MemoryCache, RedisCache, etc.)
51
+ */
52
+ export class ExecutionStateManager {
53
+ private cache: CacheProvider;
54
+ private keyPrefix: string;
55
+ private ttl: number;
56
+ private maxPauseDuration: number;
57
+ private metrics: {
58
+ totalPauses: number;
59
+ totalResumes: number;
60
+ totalExpired: number;
61
+ totalFailed: number;
62
+ };
63
+
64
+ constructor(
65
+ cache: CacheProvider,
66
+ options?: {
67
+ keyPrefix?: string;
68
+ ttl?: number;
69
+ maxPauseDuration?: number;
70
+ }
71
+ ) {
72
+ this.cache = cache;
73
+ this.keyPrefix = options?.keyPrefix || 'atp:execution:';
74
+ this.ttl = options?.ttl || 3600;
75
+ this.maxPauseDuration = (options?.maxPauseDuration ?? 3600) * 1000;
76
+ this.metrics = {
77
+ totalPauses: 0,
78
+ totalResumes: 0,
79
+ totalExpired: 0,
80
+ totalFailed: 0,
81
+ };
82
+
83
+ log.info('ExecutionStateManager initialized', {
84
+ cacheProvider: cache.name,
85
+ ttl: this.ttl,
86
+ maxPauseDuration: this.maxPauseDuration / 1000,
87
+ });
88
+ }
89
+
90
+ /**
91
+ * Saves paused execution state
92
+ */
93
+ async pause(state: PausedExecution): Promise<void> {
94
+ this.metrics.totalPauses++;
95
+
96
+ const key = this.getKey(state.executionId);
97
+ const serialized = JSON.stringify(state);
98
+ await this.cache.set(key, serialized, this.ttl);
99
+
100
+ log.info('Execution paused', {
101
+ executionId: state.executionId,
102
+ clientId: state.clientId,
103
+ callbackType: state.callbackRequest.type,
104
+ cacheProvider: this.cache.name,
105
+ ttl: this.ttl,
106
+ maxPauseDuration: this.maxPauseDuration / 1000,
107
+ });
108
+ }
109
+
110
+ /**
111
+ * Retrieves paused execution state
112
+ */
113
+ async get(executionId: string): Promise<PausedExecution | null> {
114
+ const key = this.getKey(executionId);
115
+ const serialized = await this.cache.get(key);
116
+
117
+ if (!serialized) {
118
+ log.warn('Execution not found or expired', { executionId });
119
+ this.metrics.totalExpired++;
120
+ return null;
121
+ }
122
+
123
+ const state = JSON.parse(serialized as string) as PausedExecution;
124
+
125
+ const pauseDuration = Date.now() - state.pausedAt;
126
+ if (pauseDuration > this.maxPauseDuration) {
127
+ log.warn('Execution pause duration exceeded maximum', {
128
+ executionId,
129
+ pauseDuration: pauseDuration / 1000,
130
+ maxDuration: this.maxPauseDuration / 1000,
131
+ });
132
+ await this.delete(executionId);
133
+ this.metrics.totalExpired++;
134
+ return null;
135
+ }
136
+
137
+ await this.cache.set(key, serialized, this.ttl);
138
+
139
+ this.metrics.totalResumes++;
140
+ return state;
141
+ }
142
+
143
+ /**
144
+ * Deletes execution state
145
+ */
146
+ async delete(executionId: string): Promise<void> {
147
+ const key = this.getKey(executionId);
148
+ await this.cache.delete(key);
149
+ log.debug('Execution state deleted', { executionId });
150
+ }
151
+
152
+ /**
153
+ * Gets the full cache key for an execution ID
154
+ */
155
+ private getKey(executionId: string): string {
156
+ return `${this.keyPrefix}${executionId}`;
157
+ }
158
+
159
+ /**
160
+ * Closes connections and cleanup
161
+ */
162
+ async close(): Promise<void> {
163
+ if (this.cache.disconnect) {
164
+ await this.cache.disconnect();
165
+ }
166
+ log.debug('ExecutionStateManager closed');
167
+ }
168
+
169
+ /**
170
+ * Gets storage type from cache provider
171
+ */
172
+ getStorageType(): string {
173
+ return this.cache.name;
174
+ }
175
+
176
+ /**
177
+ * Gets pause/resume metrics
178
+ */
179
+ getMetrics() {
180
+ return {
181
+ ...this.metrics,
182
+ successRate:
183
+ this.metrics.totalResumes > 0
184
+ ? ((this.metrics.totalResumes / (this.metrics.totalPauses || 1)) * 100).toFixed(2) + '%'
185
+ : '0%',
186
+ expiredRate:
187
+ this.metrics.totalExpired > 0
188
+ ? ((this.metrics.totalExpired / (this.metrics.totalPauses || 1)) * 100).toFixed(2) + '%'
189
+ : '0%',
190
+ };
191
+ }
192
+
193
+ /**
194
+ * Resets metrics (useful for testing)
195
+ */
196
+ resetMetrics(): void {
197
+ this.metrics = {
198
+ totalPauses: 0,
199
+ totalResumes: 0,
200
+ totalExpired: 0,
201
+ totalFailed: 0,
202
+ };
203
+ }
204
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Bridge between AST tracker in isolated-vm and host policy engine
3
+ */
4
+ import * as ivm from 'isolated-vm';
5
+ import { getProvenance, getProvenanceForPrimitive } from '@mondaydotcomorg/atp-provenance';
6
+
7
+ // Store active isolate contexts for AST mode provenance checking
8
+ const activeIsolates = new Map<string, ivm.Context>();
9
+
10
+ // Cache the getProvenance function to avoid repeated requires
11
+ let cachedGetProvenance: ((value: unknown) => any) | null = null;
12
+
13
+ export function registerIsolateContext(executionId: string, context: ivm.Context): void {
14
+ activeIsolates.set(executionId, context);
15
+ }
16
+
17
+ export function unregisterIsolateContext(executionId: string): void {
18
+ activeIsolates.delete(executionId);
19
+ }
20
+
21
+ /**
22
+ * Create a getProvenance function that can check AST tracker inside the isolate
23
+ * Falls back to host-side getProvenance for hint-based tracking
24
+ */
25
+ export function createASTProvenanceChecker(executionId: string): (value: unknown) => any {
26
+ return (value: unknown) => {
27
+ const context = activeIsolates.get(executionId);
28
+
29
+ // First, try checking in the isolate's AST tracker
30
+ if (context) {
31
+ try {
32
+ // Serialize the value to pass into isolate for checking
33
+ const valueStr =
34
+ typeof value === 'string' || typeof value === 'number'
35
+ ? JSON.stringify(String(value))
36
+ : JSON.stringify(value);
37
+
38
+ // Call __check_provenance inside the isolate
39
+ const checkCode = `
40
+ (function() {
41
+ try {
42
+ if (typeof globalThis.__check_provenance !== 'function') {
43
+ return null;
44
+ }
45
+ const value = ${valueStr};
46
+ const result = globalThis.__check_provenance(value);
47
+ return result;
48
+ } catch (e) {
49
+ return null;
50
+ }
51
+ })()
52
+ `;
53
+
54
+ const result = context.evalSync(checkCode, { timeout: 100, copy: true });
55
+ if (result) {
56
+ return result;
57
+ }
58
+ } catch (error) {
59
+ // Fall through to host check
60
+ }
61
+ }
62
+
63
+ // Fall back to host-side provenance check (for hints and registered metadata)
64
+ // This is critical for checking primitives that were registered via hints
65
+ if (!cachedGetProvenance) {
66
+ cachedGetProvenance = getProvenance;
67
+ }
68
+ const hostResult = cachedGetProvenance?.(value);
69
+
70
+ // Also check getProvenanceForPrimitive for tainted primitives
71
+ if (!hostResult && (typeof value === 'string' || typeof value === 'number')) {
72
+ const primitiveResult = getProvenanceForPrimitive?.(value);
73
+ if (primitiveResult) {
74
+ return primitiveResult;
75
+ }
76
+ }
77
+
78
+ return hostResult;
79
+ };
80
+ }