@xoxoai/checkmate 0.4.28 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/README.md +259 -224
  2. package/bin/checkmate.js +1 -1
  3. package/dist/ai/client.d.ts +45 -30
  4. package/dist/ai/client.d.ts.map +1 -1
  5. package/dist/ai/client.js +198 -129
  6. package/dist/ai/client.js.map +1 -1
  7. package/dist/ai/message-handler.d.ts +5 -7
  8. package/dist/ai/message-handler.d.ts.map +1 -1
  9. package/dist/ai/message-handler.js +38 -21
  10. package/dist/ai/message-handler.js.map +1 -1
  11. package/dist/ai/message-history.d.ts +4 -6
  12. package/dist/ai/message-history.d.ts.map +1 -1
  13. package/dist/ai/message-history.js +18 -21
  14. package/dist/ai/message-history.js.map +1 -1
  15. package/dist/ai/rate-limit-policy.d.ts +5 -3
  16. package/dist/ai/rate-limit-policy.d.ts.map +1 -1
  17. package/dist/ai/rate-limit-policy.js +24 -7
  18. package/dist/ai/rate-limit-policy.js.map +1 -1
  19. package/dist/ai/tool-response-handler.d.ts +11 -16
  20. package/dist/ai/tool-response-handler.d.ts.map +1 -1
  21. package/dist/ai/tool-response-handler.js +59 -28
  22. package/dist/ai/tool-response-handler.js.map +1 -1
  23. package/dist/ai/turn-processor.d.ts +34 -0
  24. package/dist/ai/turn-processor.d.ts.map +1 -0
  25. package/dist/ai/turn-processor.js +107 -0
  26. package/dist/ai/turn-processor.js.map +1 -0
  27. package/dist/api/allocate-run-identity.d.ts +8 -0
  28. package/dist/api/allocate-run-identity.d.ts.map +1 -0
  29. package/dist/api/allocate-run-identity.js +10 -0
  30. package/dist/api/allocate-run-identity.js.map +1 -0
  31. package/dist/api/execute-prepared-run.d.ts +22 -0
  32. package/dist/api/execute-prepared-run.d.ts.map +1 -0
  33. package/dist/api/execute-prepared-run.js +160 -0
  34. package/dist/api/execute-prepared-run.js.map +1 -0
  35. package/dist/api/index.d.ts +25 -0
  36. package/dist/api/index.d.ts.map +1 -0
  37. package/dist/api/index.js +69 -0
  38. package/dist/api/index.js.map +1 -0
  39. package/dist/api/prepare-run.d.ts +44 -0
  40. package/dist/api/prepare-run.d.ts.map +1 -0
  41. package/dist/api/prepare-run.js +261 -0
  42. package/dist/api/prepare-run.js.map +1 -0
  43. package/dist/cli/diagnostic-relay.d.ts +6 -0
  44. package/dist/cli/diagnostic-relay.d.ts.map +1 -0
  45. package/dist/cli/diagnostic-relay.js +6 -0
  46. package/dist/cli/diagnostic-relay.js.map +1 -0
  47. package/dist/cli/main.d.ts +21 -0
  48. package/dist/cli/main.d.ts.map +1 -0
  49. package/dist/cli/main.js +166 -0
  50. package/dist/cli/main.js.map +1 -0
  51. package/dist/cli/protocol.d.ts +57 -0
  52. package/dist/cli/protocol.d.ts.map +1 -0
  53. package/dist/cli/protocol.js +116 -0
  54. package/dist/cli/protocol.js.map +1 -0
  55. package/dist/cli/reconcile-result.d.ts +13 -0
  56. package/dist/cli/reconcile-result.d.ts.map +1 -0
  57. package/dist/cli/reconcile-result.js +300 -0
  58. package/dist/cli/reconcile-result.js.map +1 -0
  59. package/dist/cli/run-parent.d.ts +37 -0
  60. package/dist/cli/run-parent.d.ts.map +1 -0
  61. package/dist/cli/run-parent.js +491 -0
  62. package/dist/cli/run-parent.js.map +1 -0
  63. package/dist/cli/signals.d.ts +36 -0
  64. package/dist/cli/signals.d.ts.map +1 -0
  65. package/dist/cli/signals.js +85 -0
  66. package/dist/cli/signals.js.map +1 -0
  67. package/dist/cli/static-commands.d.ts +11 -0
  68. package/dist/cli/static-commands.d.ts.map +1 -0
  69. package/dist/cli/static-commands.js +83 -0
  70. package/dist/cli/static-commands.js.map +1 -0
  71. package/dist/cli/worker-stream-guard.d.ts +20 -0
  72. package/dist/cli/worker-stream-guard.d.ts.map +1 -0
  73. package/dist/cli/worker-stream-guard.js +41 -0
  74. package/dist/cli/worker-stream-guard.js.map +1 -0
  75. package/dist/cli/worker.d.ts +3 -0
  76. package/dist/cli/worker.d.ts.map +1 -0
  77. package/dist/cli/worker.js +111 -0
  78. package/dist/cli/worker.js.map +1 -0
  79. package/dist/config/ingestion.d.ts +58 -0
  80. package/dist/config/ingestion.d.ts.map +1 -0
  81. package/dist/config/ingestion.js +283 -0
  82. package/dist/config/ingestion.js.map +1 -0
  83. package/dist/config/manifest.d.ts +20 -0
  84. package/dist/config/manifest.d.ts.map +1 -0
  85. package/dist/config/manifest.js +91 -0
  86. package/dist/config/manifest.js.map +1 -0
  87. package/dist/config/model-egress.d.ts +10 -0
  88. package/dist/config/model-egress.d.ts.map +1 -0
  89. package/dist/config/model-egress.js +62 -0
  90. package/dist/config/model-egress.js.map +1 -0
  91. package/dist/config/package-resolution.d.ts +4 -0
  92. package/dist/config/package-resolution.d.ts.map +1 -0
  93. package/dist/config/package-resolution.js +24 -0
  94. package/dist/config/package-resolution.js.map +1 -0
  95. package/dist/config/policy.d.ts +44 -0
  96. package/dist/config/policy.d.ts.map +1 -0
  97. package/dist/config/policy.js +141 -0
  98. package/dist/config/policy.js.map +1 -0
  99. package/dist/config/record.d.ts +4 -0
  100. package/dist/config/record.d.ts.map +1 -0
  101. package/dist/config/record.js +10 -0
  102. package/dist/config/record.js.map +1 -0
  103. package/dist/config/secrets.d.ts +11 -0
  104. package/dist/config/secrets.d.ts.map +1 -0
  105. package/dist/config/secrets.js +42 -0
  106. package/dist/config/secrets.js.map +1 -0
  107. package/dist/contracts/diagnostics.d.ts +4 -0
  108. package/dist/contracts/diagnostics.d.ts.map +1 -0
  109. package/dist/contracts/diagnostics.js +31 -0
  110. package/dist/contracts/diagnostics.js.map +1 -0
  111. package/dist/contracts/serialize.d.ts +2 -0
  112. package/dist/contracts/serialize.d.ts.map +1 -0
  113. package/dist/contracts/serialize.js +90 -0
  114. package/dist/contracts/serialize.js.map +1 -0
  115. package/dist/contracts/types.d.ts +316 -0
  116. package/dist/contracts/types.d.ts.map +1 -0
  117. package/dist/contracts/types.js +74 -0
  118. package/dist/contracts/types.js.map +1 -0
  119. package/dist/contracts/validator.d.ts +8 -0
  120. package/dist/contracts/validator.d.ts.map +1 -0
  121. package/dist/contracts/validator.js +71 -0
  122. package/dist/contracts/validator.js.map +1 -0
  123. package/dist/driver.d.ts +97 -0
  124. package/dist/driver.d.ts.map +1 -0
  125. package/dist/driver.js +24 -0
  126. package/dist/driver.js.map +1 -0
  127. package/dist/drivers/descriptor.d.ts +15 -0
  128. package/dist/drivers/descriptor.d.ts.map +1 -0
  129. package/dist/drivers/descriptor.js +122 -0
  130. package/dist/drivers/descriptor.js.map +1 -0
  131. package/dist/drivers/loader.d.ts +18 -0
  132. package/dist/drivers/loader.d.ts.map +1 -0
  133. package/dist/drivers/loader.js +97 -0
  134. package/dist/drivers/loader.js.map +1 -0
  135. package/dist/drivers/web/checkmate-driver.json +44 -0
  136. package/dist/drivers/web/index.d.ts +6 -0
  137. package/dist/drivers/web/index.d.ts.map +1 -0
  138. package/dist/drivers/web/index.js +27 -0
  139. package/dist/drivers/web/index.js.map +1 -0
  140. package/dist/drivers/web/session.d.ts +22 -0
  141. package/dist/drivers/web/session.d.ts.map +1 -0
  142. package/dist/drivers/web/session.js +130 -0
  143. package/dist/drivers/web/session.js.map +1 -0
  144. package/dist/drivers/web/tools/network-request-recorder.d.ts +46 -0
  145. package/dist/drivers/web/tools/network-request-recorder.d.ts.map +1 -0
  146. package/dist/drivers/web/tools/network-request-recorder.js +164 -0
  147. package/dist/drivers/web/tools/network-request-recorder.js.map +1 -0
  148. package/dist/{tools/browser → drivers/web/tools}/screenshot-service.d.ts +1 -1
  149. package/dist/drivers/web/tools/screenshot-service.d.ts.map +1 -0
  150. package/dist/drivers/web/tools/screenshot-service.js.map +1 -0
  151. package/dist/drivers/web/tools/snapshot-filter/index.d.ts.map +1 -0
  152. package/dist/drivers/web/tools/snapshot-filter/index.js.map +1 -0
  153. package/dist/drivers/web/tools/snapshot-filter/semantic-scorer.d.ts.map +1 -0
  154. package/dist/drivers/web/tools/snapshot-filter/semantic-scorer.js.map +1 -0
  155. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.d.ts +5 -0
  156. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.d.ts.map +1 -0
  157. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.js +56 -0
  158. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.js.map +1 -0
  159. package/dist/drivers/web/tools/snapshot-filter/tree-reconstructor.d.ts.map +1 -0
  160. package/dist/drivers/web/tools/snapshot-filter/tree-reconstructor.js.map +1 -0
  161. package/dist/drivers/web/tools/snapshot-service.d.ts +31 -0
  162. package/dist/drivers/web/tools/snapshot-service.d.ts.map +1 -0
  163. package/dist/{tools/browser → drivers/web/tools}/snapshot-service.js +36 -7
  164. package/dist/drivers/web/tools/snapshot-service.js.map +1 -0
  165. package/dist/drivers/web/tools/tool.d.ts +76 -0
  166. package/dist/drivers/web/tools/tool.d.ts.map +1 -0
  167. package/dist/drivers/web/tools/tool.js +562 -0
  168. package/dist/drivers/web/tools/tool.js.map +1 -0
  169. package/dist/drivers/web/tools/transient-state-tracker.d.ts +26 -0
  170. package/dist/drivers/web/tools/transient-state-tracker.d.ts.map +1 -0
  171. package/dist/{tools/browser → drivers/web/tools}/transient-state-tracker.js +54 -19
  172. package/dist/drivers/web/tools/transient-state-tracker.js.map +1 -0
  173. package/dist/drivers/web/tools/types.d.ts +11 -0
  174. package/dist/drivers/web/tools/types.d.ts.map +1 -0
  175. package/dist/drivers/web/tools/types.js +2 -0
  176. package/dist/drivers/web/tools/types.js.map +1 -0
  177. package/dist/evidence/atomic-file.d.ts +23 -0
  178. package/dist/evidence/atomic-file.d.ts.map +1 -0
  179. package/dist/evidence/atomic-file.js +104 -0
  180. package/dist/evidence/atomic-file.js.map +1 -0
  181. package/dist/evidence/layout.d.ts +30 -0
  182. package/dist/evidence/layout.d.ts.map +1 -0
  183. package/dist/evidence/layout.js +152 -0
  184. package/dist/evidence/layout.js.map +1 -0
  185. package/dist/evidence/retention.d.ts +5 -0
  186. package/dist/evidence/retention.d.ts.map +1 -0
  187. package/dist/evidence/retention.js +10 -0
  188. package/dist/evidence/retention.js.map +1 -0
  189. package/dist/evidence/store.d.ts +101 -0
  190. package/dist/evidence/store.d.ts.map +1 -0
  191. package/dist/evidence/store.js +375 -0
  192. package/dist/evidence/store.js.map +1 -0
  193. package/dist/evidence/terminal-finalizer.d.ts +19 -0
  194. package/dist/evidence/terminal-finalizer.d.ts.map +1 -0
  195. package/dist/evidence/terminal-finalizer.js +56 -0
  196. package/dist/evidence/terminal-finalizer.js.map +1 -0
  197. package/dist/index.d.ts +8 -1
  198. package/dist/index.d.ts.map +1 -1
  199. package/dist/index.js +11 -1
  200. package/dist/index.js.map +1 -1
  201. package/dist/logging/invocation-logger.d.ts +4 -0
  202. package/dist/logging/invocation-logger.d.ts.map +1 -0
  203. package/dist/logging/invocation-logger.js +25 -0
  204. package/dist/logging/invocation-logger.js.map +1 -0
  205. package/dist/logging/types.d.ts +8 -0
  206. package/dist/logging/types.d.ts.map +1 -0
  207. package/dist/logging/types.js +7 -0
  208. package/dist/logging/types.js.map +1 -0
  209. package/dist/redaction/diagnostic-sanitizer.d.ts +7 -0
  210. package/dist/redaction/diagnostic-sanitizer.d.ts.map +1 -0
  211. package/dist/redaction/diagnostic-sanitizer.js +42 -0
  212. package/dist/redaction/diagnostic-sanitizer.js.map +1 -0
  213. package/dist/redaction/redactor.d.ts +40 -0
  214. package/dist/redaction/redactor.d.ts.map +1 -0
  215. package/dist/redaction/redactor.js +176 -0
  216. package/dist/redaction/redactor.js.map +1 -0
  217. package/dist/redaction/scrub.d.ts +29 -0
  218. package/dist/redaction/scrub.d.ts.map +1 -0
  219. package/dist/redaction/scrub.js +54 -0
  220. package/dist/redaction/scrub.js.map +1 -0
  221. package/dist/runtime/config.d.ts +15 -0
  222. package/dist/runtime/config.d.ts.map +1 -0
  223. package/dist/runtime/config.js +2 -0
  224. package/dist/runtime/config.js.map +1 -0
  225. package/dist/runtime/driver-boundary.d.ts +16 -0
  226. package/dist/runtime/driver-boundary.d.ts.map +1 -0
  227. package/dist/runtime/driver-boundary.js +71 -0
  228. package/dist/runtime/driver-boundary.js.map +1 -0
  229. package/dist/runtime/driver-session.d.ts +9 -0
  230. package/dist/runtime/driver-session.d.ts.map +1 -0
  231. package/dist/runtime/driver-session.js +64 -0
  232. package/dist/runtime/driver-session.js.map +1 -0
  233. package/dist/runtime/internal-step-evidence.d.ts +30 -0
  234. package/dist/runtime/internal-step-evidence.d.ts.map +1 -0
  235. package/dist/runtime/internal-step-evidence.js +82 -0
  236. package/dist/runtime/internal-step-evidence.js.map +1 -0
  237. package/dist/runtime/result-adapter.d.ts +9 -0
  238. package/dist/runtime/result-adapter.d.ts.map +1 -0
  239. package/dist/runtime/result-adapter.js +77 -0
  240. package/dist/runtime/result-adapter.js.map +1 -0
  241. package/dist/runtime/runner.d.ts +35 -88
  242. package/dist/runtime/runner.d.ts.map +1 -1
  243. package/dist/runtime/runner.js +60 -74
  244. package/dist/runtime/runner.js.map +1 -1
  245. package/dist/runtime/scenario-control.d.ts +40 -0
  246. package/dist/runtime/scenario-control.d.ts.map +1 -0
  247. package/dist/runtime/scenario-control.js +94 -0
  248. package/dist/runtime/scenario-control.js.map +1 -0
  249. package/dist/runtime/scenario-runner.d.ts +39 -0
  250. package/dist/runtime/scenario-runner.d.ts.map +1 -0
  251. package/dist/runtime/scenario-runner.js +273 -0
  252. package/dist/runtime/scenario-runner.js.map +1 -0
  253. package/dist/runtime/scenario-state.d.ts +55 -0
  254. package/dist/runtime/scenario-state.d.ts.map +1 -0
  255. package/dist/runtime/scenario-state.js +128 -0
  256. package/dist/runtime/scenario-state.js.map +1 -0
  257. package/dist/runtime/step-execution.d.ts +24 -14
  258. package/dist/runtime/step-execution.d.ts.map +1 -1
  259. package/dist/runtime/step-execution.js +130 -36
  260. package/dist/runtime/step-execution.js.map +1 -1
  261. package/dist/runtime/text.d.ts +10 -0
  262. package/dist/runtime/text.d.ts.map +1 -0
  263. package/dist/runtime/text.js +25 -0
  264. package/dist/runtime/text.js.map +1 -0
  265. package/dist/runtime/types.d.ts +50 -76
  266. package/dist/runtime/types.d.ts.map +1 -1
  267. package/dist/runtime/usage-tracker.d.ts +37 -0
  268. package/dist/runtime/usage-tracker.d.ts.map +1 -0
  269. package/dist/runtime/usage-tracker.js +110 -0
  270. package/dist/runtime/usage-tracker.js.map +1 -0
  271. package/dist/tools/define-agent-tool.d.ts +3 -28
  272. package/dist/tools/define-agent-tool.d.ts.map +1 -1
  273. package/dist/tools/define-agent-tool.js +3 -28
  274. package/dist/tools/define-agent-tool.js.map +1 -1
  275. package/dist/tools/dispatcher.d.ts +11 -3
  276. package/dist/tools/dispatcher.d.ts.map +1 -1
  277. package/dist/tools/dispatcher.js +50 -8
  278. package/dist/tools/dispatcher.js.map +1 -1
  279. package/dist/tools/registry.d.ts +8 -10
  280. package/dist/tools/registry.d.ts.map +1 -1
  281. package/dist/tools/registry.js +19 -11
  282. package/dist/tools/registry.js.map +1 -1
  283. package/dist/tools/step/result-tool.d.ts.map +1 -1
  284. package/dist/tools/step/result-tool.js +8 -6
  285. package/dist/tools/step/result-tool.js.map +1 -1
  286. package/dist/tools/tool-contract.d.ts +1 -1
  287. package/dist/tools/tool-contract.d.ts.map +1 -1
  288. package/dist/tools/tool-contract.js.map +1 -1
  289. package/dist/tools/types.d.ts +77 -6
  290. package/dist/tools/types.d.ts.map +1 -1
  291. package/dist/tools/types.js.map +1 -1
  292. package/docs/CLI.md +59 -0
  293. package/docs/CONFIGURATION.md +91 -0
  294. package/docs/DRIVERS.md +75 -0
  295. package/docs/EVIDENCE.md +62 -0
  296. package/package.json +51 -59
  297. package/schemas/checkmate-config.v1.json +176 -0
  298. package/schemas/describe-result.v1.json +414 -0
  299. package/schemas/driver-descriptor.v1.json +66 -0
  300. package/schemas/run-request.v1.json +67 -0
  301. package/schemas/run-result.v1.json +333 -0
  302. package/schemas/validation-result.v1.json +86 -0
  303. package/dist/ai/response-processor.d.ts +0 -20
  304. package/dist/ai/response-processor.d.ts.map +0 -1
  305. package/dist/ai/response-processor.js +0 -62
  306. package/dist/ai/response-processor.js.map +0 -1
  307. package/dist/ai/token-pricing.d.ts +0 -13
  308. package/dist/ai/token-pricing.d.ts.map +0 -1
  309. package/dist/ai/token-pricing.js +0 -348
  310. package/dist/ai/token-pricing.js.map +0 -1
  311. package/dist/ai/token-tracker.d.ts +0 -33
  312. package/dist/ai/token-tracker.d.ts.map +0 -1
  313. package/dist/ai/token-tracker.js +0 -138
  314. package/dist/ai/token-tracker.js.map +0 -1
  315. package/dist/cli/create-examples.d.ts +0 -21
  316. package/dist/cli/create-examples.d.ts.map +0 -1
  317. package/dist/cli/create-examples.js +0 -116
  318. package/dist/cli/create-examples.js.map +0 -1
  319. package/dist/cli.d.ts +0 -15
  320. package/dist/cli.d.ts.map +0 -1
  321. package/dist/cli.js +0 -69
  322. package/dist/cli.js.map +0 -1
  323. package/dist/config/runtime-config.d.ts +0 -21
  324. package/dist/config/runtime-config.d.ts.map +0 -1
  325. package/dist/config/runtime-config.js +0 -98
  326. package/dist/config/runtime-config.js.map +0 -1
  327. package/dist/core.d.ts +0 -8
  328. package/dist/core.d.ts.map +0 -1
  329. package/dist/core.js +0 -4
  330. package/dist/core.js.map +0 -1
  331. package/dist/integrations/salesforce/authenticator.d.ts +0 -27
  332. package/dist/integrations/salesforce/authenticator.d.ts.map +0 -1
  333. package/dist/integrations/salesforce/authenticator.js +0 -27
  334. package/dist/integrations/salesforce/authenticator.js.map +0 -1
  335. package/dist/integrations/salesforce/cli-handler.d.ts +0 -14
  336. package/dist/integrations/salesforce/cli-handler.d.ts.map +0 -1
  337. package/dist/integrations/salesforce/cli-handler.js +0 -50
  338. package/dist/integrations/salesforce/cli-handler.js.map +0 -1
  339. package/dist/logging/index.d.ts +0 -2
  340. package/dist/logging/index.d.ts.map +0 -1
  341. package/dist/logging/index.js +0 -4
  342. package/dist/logging/index.js.map +0 -1
  343. package/dist/logging/logger.d.ts +0 -5
  344. package/dist/logging/logger.d.ts.map +0 -1
  345. package/dist/logging/logger.js +0 -15
  346. package/dist/logging/logger.js.map +0 -1
  347. package/dist/playwright.d.ts +0 -102
  348. package/dist/playwright.d.ts.map +0 -1
  349. package/dist/playwright.js +0 -116
  350. package/dist/playwright.js.map +0 -1
  351. package/dist/runtime/extension.d.ts +0 -274
  352. package/dist/runtime/extension.d.ts.map +0 -1
  353. package/dist/runtime/extension.js +0 -171
  354. package/dist/runtime/extension.js.map +0 -1
  355. package/dist/salesforce.d.ts +0 -71
  356. package/dist/salesforce.d.ts.map +0 -1
  357. package/dist/salesforce.js +0 -73
  358. package/dist/salesforce.js.map +0 -1
  359. package/dist/tools/browser/screenshot-service.d.ts.map +0 -1
  360. package/dist/tools/browser/screenshot-service.js.map +0 -1
  361. package/dist/tools/browser/snapshot-filter/index.d.ts.map +0 -1
  362. package/dist/tools/browser/snapshot-filter/index.js.map +0 -1
  363. package/dist/tools/browser/snapshot-filter/semantic-scorer.d.ts.map +0 -1
  364. package/dist/tools/browser/snapshot-filter/semantic-scorer.js.map +0 -1
  365. package/dist/tools/browser/snapshot-filter/snapshot-filter.d.ts +0 -4
  366. package/dist/tools/browser/snapshot-filter/snapshot-filter.d.ts.map +0 -1
  367. package/dist/tools/browser/snapshot-filter/snapshot-filter.js +0 -57
  368. package/dist/tools/browser/snapshot-filter/snapshot-filter.js.map +0 -1
  369. package/dist/tools/browser/snapshot-filter/tree-reconstructor.d.ts.map +0 -1
  370. package/dist/tools/browser/snapshot-filter/tree-reconstructor.js.map +0 -1
  371. package/dist/tools/browser/snapshot-service.d.ts +0 -19
  372. package/dist/tools/browser/snapshot-service.d.ts.map +0 -1
  373. package/dist/tools/browser/snapshot-service.js.map +0 -1
  374. package/dist/tools/browser/tool.d.ts +0 -34
  375. package/dist/tools/browser/tool.d.ts.map +0 -1
  376. package/dist/tools/browser/tool.js +0 -226
  377. package/dist/tools/browser/tool.js.map +0 -1
  378. package/dist/tools/browser/transient-state-tracker.d.ts +0 -16
  379. package/dist/tools/browser/transient-state-tracker.d.ts.map +0 -1
  380. package/dist/tools/browser/transient-state-tracker.js.map +0 -1
  381. package/dist/tools/salesforce/login-tool.d.ts +0 -7
  382. package/dist/tools/salesforce/login-tool.d.ts.map +0 -1
  383. package/dist/tools/salesforce/login-tool.js +0 -25
  384. package/dist/tools/salesforce/login-tool.js.map +0 -1
  385. package/docs/EXTENSIONS.md +0 -232
  386. package/docs/GUIDE.md +0 -465
  387. package/docs/ROADMAP.md +0 -47
  388. package/playwright.config.ts +0 -39
  389. package/test/examples/salesforce/trial-dev-org.spec.ts +0 -82
  390. package/test/examples/web/website-testing.spec.ts +0 -281
  391. /package/dist/{tools/browser → drivers/web/tools}/screenshot-service.js +0 -0
  392. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/index.d.ts +0 -0
  393. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/index.js +0 -0
  394. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/semantic-scorer.d.ts +0 -0
  395. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/semantic-scorer.js +0 -0
  396. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/tree-reconstructor.d.ts +0 -0
  397. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/tree-reconstructor.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-commands.d.ts","sourceRoot":"","sources":["../../src/cli/static-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC7F,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAqD,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAElH,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AA6BD,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE3G;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,kBAAkB,CAO1E;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,CAOtE;AAED,wBAAgB,yBAAyB,IAAI,kBAAkB,CAa9D;AAED,wBAAgB,uBAAuB,IAAI,gBAAgB,CAa1D"}
@@ -0,0 +1,83 @@
1
+ import { boundDiagnostics } from '../config/ingestion.js';
2
+ import { describeEnvironment, prepareRun, prepareRunSource } from '../api/prepare-run.js';
3
+ export async function validateStaticRequest(request, options = {}) {
4
+ const preparation = await prepareRun(request, options);
5
+ return validationResult(preparation);
6
+ }
7
+ export async function validateStaticSource(source, options = {}) {
8
+ const preparation = await prepareRunSource(source, options);
9
+ return validationResult(preparation);
10
+ }
11
+ function validationResult(preparation) {
12
+ if (preparation.ok === false) {
13
+ return {
14
+ kind: 'validation-result',
15
+ schemaVersion: 1,
16
+ status: preparation.status,
17
+ diagnostics: preparation.diagnostics,
18
+ };
19
+ }
20
+ return {
21
+ kind: 'validation-result',
22
+ schemaVersion: 1,
23
+ status: 'valid',
24
+ scenarioId: preparation.prepared.request.scenario.id,
25
+ policy: {
26
+ id: preparation.prepared.policy.id,
27
+ effectiveLimits: { ...preparation.prepared.effectiveLimits },
28
+ },
29
+ driver: {
30
+ id: preparation.prepared.driver.id,
31
+ contractVersion: preparation.prepared.driver.descriptor.driverContractVersion,
32
+ },
33
+ diagnostics: [],
34
+ };
35
+ }
36
+ export async function describeStaticEnvironment(options = {}) {
37
+ return describeEnvironment(options);
38
+ }
39
+ export function validationError(diagnostic) {
40
+ return {
41
+ kind: 'validation-result',
42
+ schemaVersion: 1,
43
+ status: 'invalid',
44
+ diagnostics: boundDiagnostics([diagnostic]),
45
+ };
46
+ }
47
+ export function describeError(diagnostic) {
48
+ return {
49
+ kind: 'describe-result',
50
+ schemaVersion: 1,
51
+ status: 'invalid',
52
+ diagnostics: boundDiagnostics([diagnostic]),
53
+ };
54
+ }
55
+ export function unexpectedValidationError() {
56
+ return {
57
+ kind: 'validation-result',
58
+ schemaVersion: 1,
59
+ status: 'error',
60
+ diagnostics: boundDiagnostics([
61
+ {
62
+ code: 'internal-error',
63
+ path: '',
64
+ message: 'validation failed because of an unexpected operational error',
65
+ },
66
+ ]),
67
+ };
68
+ }
69
+ export function unexpectedDescribeError() {
70
+ return {
71
+ kind: 'describe-result',
72
+ schemaVersion: 1,
73
+ status: 'error',
74
+ diagnostics: boundDiagnostics([
75
+ {
76
+ code: 'internal-error',
77
+ path: '',
78
+ message: 'description failed because of an unexpected operational error',
79
+ },
80
+ ]),
81
+ };
82
+ }
83
+ //# sourceMappingURL=static-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-commands.js","sourceRoot":"","sources":["../../src/cli/static-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Readable } from 'node:stream';
2
+ export declare const MAX_WORKER_STREAM_BYTES: number;
3
+ export type WorkerStreamSummary = Readonly<{
4
+ stream: 'stdout' | 'stderr';
5
+ bytes: number;
6
+ truncated: boolean;
7
+ }>;
8
+ export declare class WorkerStreamGuard {
9
+ private readonly name;
10
+ private readonly onActivity?;
11
+ private bytes;
12
+ private truncated;
13
+ private attached;
14
+ constructor(name: WorkerStreamSummary['stream'], onActivity?: (summary: WorkerStreamSummary) => void);
15
+ attach(stream: Readable | null): void;
16
+ dispose(stream: Readable | null): void;
17
+ summary(): WorkerStreamSummary;
18
+ private readonly onData;
19
+ }
20
+ //# sourceMappingURL=worker-stream-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-stream-guard.d.ts","sourceRoot":"","sources":["../../src/cli/worker-stream-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,eAAO,MAAM,uBAAuB,QAAY,CAAA;AAEhD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAC1C,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,OAAO,CAAA;CAClB,CAAC,CAAA;AAEF,qBAAa,iBAAiB;IAM5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAN7B,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAQ;gBAGN,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACnC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI;IAGrE,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI;IAOrC,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI;IAOtC,OAAO,IAAI,mBAAmB;IAI9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAStB;CACD"}
@@ -0,0 +1,41 @@
1
+ export const MAX_WORKER_STREAM_BYTES = 64 * 1024;
2
+ export class WorkerStreamGuard {
3
+ name;
4
+ onActivity;
5
+ bytes = 0;
6
+ truncated = false;
7
+ attached = false;
8
+ constructor(name, onActivity) {
9
+ this.name = name;
10
+ this.onActivity = onActivity;
11
+ }
12
+ attach(stream) {
13
+ if (!stream || this.attached)
14
+ return;
15
+ this.attached = true;
16
+ stream.on('data', this.onData);
17
+ stream.resume();
18
+ }
19
+ dispose(stream) {
20
+ if (!stream || !this.attached)
21
+ return;
22
+ stream.off('data', this.onData);
23
+ stream.destroy();
24
+ this.attached = false;
25
+ }
26
+ summary() {
27
+ return { stream: this.name, bytes: this.bytes, truncated: this.truncated };
28
+ }
29
+ onData = (chunk) => {
30
+ const size = typeof chunk === 'string' ? Buffer.byteLength(chunk, 'utf8') : chunk.byteLength;
31
+ const previous = this.bytes;
32
+ const wasTruncated = this.truncated;
33
+ this.bytes = Math.min(Number.MAX_SAFE_INTEGER, this.bytes + size);
34
+ if (this.bytes > MAX_WORKER_STREAM_BYTES)
35
+ this.truncated = true;
36
+ if (previous === 0 || (!wasTruncated && this.truncated)) {
37
+ this.onActivity?.(this.summary());
38
+ }
39
+ };
40
+ }
41
+ //# sourceMappingURL=worker-stream-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-stream-guard.js","sourceRoot":"","sources":["../../src/cli/worker-stream-guard.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAA;AAQhD,MAAM,OAAO,iBAAiB;IAMX;IACA;IANV,KAAK,GAAG,CAAC,CAAA;IACT,SAAS,GAAG,KAAK,CAAA;IACjB,QAAQ,GAAG,KAAK,CAAA;IAExB,YACkB,IAAmC,EACnC,UAAmD;QADnD,SAAI,GAAJ,IAAI,CAA+B;QACnC,eAAU,GAAV,UAAU,CAAyC;IAClE,CAAC;IAEJ,MAAM,CAAC,MAAuB;QAC7B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC;IAED,OAAO,CAAC,MAAuB;QAC9B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAM;QACrC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/B,MAAM,CAAC,OAAO,EAAE,CAAA;QAChB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,OAAO;QACN,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAA;IAC3E,CAAC;IAEgB,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;QAC1D,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAA;QAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAA;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAA;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;QACjE,IAAI,IAAI,CAAC,KAAK,GAAG,uBAAuB;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QAC/D,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QAClC,CAAC;IACF,CAAC,CAAA;CACD"}
@@ -0,0 +1,3 @@
1
+ export type WorkerProcess = Pick<NodeJS.Process, 'on' | 'send' | 'disconnect'>;
2
+ export declare function runWorkerProcess(workerProcess?: WorkerProcess): void;
3
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/cli/worker.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,YAAY,CAAC,CAAA;AAE9E,wBAAgB,gBAAgB,CAAC,aAAa,GAAE,aAAuB,GAAG,IAAI,CA6B7E"}
@@ -0,0 +1,111 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { resolve } from 'node:path';
3
+ import { executePreparedRun } from '../api/execute-prepared-run.js';
4
+ import { serializeJson } from '../contracts/serialize.js';
5
+ import { scrub } from '../redaction/scrub.js';
6
+ import { assertIpcFrameSize, diagnosticFrame, parseParentMessage, sendIpcFrame, terminalDigest, } from './protocol.js';
7
+ export function runWorkerProcess(workerProcess = process) {
8
+ const controller = new AbortController();
9
+ let started = false;
10
+ let runId;
11
+ workerProcess.on('message', (raw) => {
12
+ let message;
13
+ try {
14
+ message = parseParentMessage(raw);
15
+ }
16
+ catch {
17
+ return;
18
+ }
19
+ if (message.type === 'abort') {
20
+ controller.abort(message.signal);
21
+ return;
22
+ }
23
+ if (started)
24
+ return;
25
+ started = true;
26
+ runId = message.identity.runId;
27
+ void execute(message, controller, workerProcess).catch((error) => {
28
+ if (!runId)
29
+ return;
30
+ send(workerProcess, {
31
+ type: 'fatal',
32
+ runId,
33
+ diagnostic: fatalDiagnostic(error),
34
+ });
35
+ workerProcess.disconnect?.();
36
+ });
37
+ });
38
+ }
39
+ async function execute(message, controller, workerProcess) {
40
+ const runId = message.identity.runId;
41
+ const logger = workerLogger(runId, workerProcess);
42
+ const result = await executePreparedRun(message.prepared, message.identity, {
43
+ signal: controller.signal,
44
+ logger,
45
+ onCleanupStarted: () => send(workerProcess, { type: 'cleanup-started', runId }),
46
+ });
47
+ const resultJson = serializeJson(result);
48
+ const committed = result.reason !== 'result-write-failed';
49
+ if (!committed) {
50
+ const terminal = { type: 'terminal-inline', runId, committed: false, resultJson };
51
+ try {
52
+ assertIpcFrameSize(terminal);
53
+ send(workerProcess, terminal);
54
+ }
55
+ catch {
56
+ send(workerProcess, {
57
+ type: 'fatal',
58
+ runId,
59
+ diagnostic: {
60
+ code: 'worker.result-unavailable',
61
+ path: '',
62
+ message: 'The uncommitted terminal result exceeded the IPC frame limit',
63
+ },
64
+ });
65
+ }
66
+ workerProcess.disconnect?.();
67
+ return;
68
+ }
69
+ const digest = terminalDigest(resultJson);
70
+ const inline = { type: 'terminal-inline', runId, committed: true, resultJson, digest };
71
+ try {
72
+ assertIpcFrameSize(inline);
73
+ send(workerProcess, inline);
74
+ }
75
+ catch {
76
+ send(workerProcess, { type: 'terminal-file', runId, committed: true, digest });
77
+ }
78
+ workerProcess.disconnect?.();
79
+ }
80
+ function workerLogger(runId, workerProcess) {
81
+ const write = (level, message) => {
82
+ send(workerProcess, diagnosticFrame(runId, { code: `worker.log.${level}`, path: '', message }));
83
+ };
84
+ return {
85
+ debug: (message) => write('debug', message),
86
+ info: (message) => write('info', message),
87
+ warn: (message) => write('warn', message),
88
+ error: (message) => write('error', message),
89
+ };
90
+ }
91
+ function send(workerProcess, message) {
92
+ if (!workerProcess.send)
93
+ return;
94
+ try {
95
+ sendIpcFrame((frame) => workerProcess.send(frame), message);
96
+ }
97
+ catch {
98
+ return;
99
+ }
100
+ }
101
+ function fatalDiagnostic(error) {
102
+ return {
103
+ code: 'worker.fatal',
104
+ path: '',
105
+ message: scrub(error instanceof Error ? error.message : String(error)),
106
+ };
107
+ }
108
+ const entry = process.argv[1] ? resolve(process.argv[1]) : '';
109
+ if (entry === resolve(fileURLToPath(import.meta.url)))
110
+ runWorkerProcess();
111
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/cli/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { Diagnostic } from '../contracts/types.js';
2
+ export declare const INGESTION_LIMITS: Readonly<{
3
+ documentBytes: number;
4
+ maxDepth: 64;
5
+ maxValues: 10000;
6
+ maxSteps: 100;
7
+ maxIdCharacters: 128;
8
+ maxNameCharacters: 256;
9
+ maxStepTextBytes: number;
10
+ maxDiagnostics: 100;
11
+ maxDiagnosticBytes: number;
12
+ maxPreparedRunBytes: number;
13
+ }>;
14
+ export type InputFailureStatus = 'invalid' | 'error';
15
+ export type InputResult<T> = {
16
+ ok: true;
17
+ value: T;
18
+ } | {
19
+ ok: false;
20
+ status: InputFailureStatus;
21
+ diagnostics: [Diagnostic, ...Diagnostic[]];
22
+ };
23
+ export type JsonInputSource = {
24
+ kind: 'value';
25
+ value: unknown;
26
+ } | {
27
+ kind: 'file';
28
+ path: string;
29
+ } | {
30
+ kind: 'stdin';
31
+ stream: AsyncIterable<string | Uint8Array>;
32
+ };
33
+ export declare function acquireJsonInput(source: JsonInputSource, path?: string): Promise<InputResult<unknown>>;
34
+ export declare function readJsonDocument(filePath: string, path?: string): Promise<InputResult<unknown>>;
35
+ export declare function readJsonStream(stream: AsyncIterable<string | Uint8Array>, path?: string): Promise<InputResult<unknown>>;
36
+ export declare function parseJsonDocument(bytes: Uint8Array, path?: string): InputResult<unknown>;
37
+ export declare function inspectJsonStructure(value: unknown, path?: string): InputResult<unknown>;
38
+ export declare function requestLimitDiagnostics(input: {
39
+ scenario: {
40
+ id: string;
41
+ name?: string;
42
+ driver: {
43
+ id: string;
44
+ };
45
+ policy?: string;
46
+ steps: Array<{
47
+ id: string;
48
+ action: string;
49
+ expect: string;
50
+ }>;
51
+ };
52
+ }): Diagnostic[];
53
+ export declare function rawRequestLimitDiagnostics(input: unknown): Diagnostic[];
54
+ export declare function boundDiagnostics(diagnostics: readonly Diagnostic[]): [Diagnostic, ...Diagnostic[]];
55
+ export declare function appendPointer(path: string, member: string): string;
56
+ export declare function combineFailureStatus(...statuses: InputFailureStatus[]): InputFailureStatus;
57
+ export declare function normalizeSingleLine(value: string): string;
58
+ //# sourceMappingURL=ingestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion.d.ts","sourceRoot":"","sources":["../../src/config/ingestion.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,eAAO,MAAM,gBAAgB;;;;;;;;;;;EAW3B,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAA;AAEpD,MAAM,MAAM,WAAW,CAAC,CAAC,IACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,WAAW,EAAE,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CAAA;CAAE,CAAA;AAE/G,MAAM,MAAM,eAAe,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,CAAA;CAAE,CAAA;AAEhE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAIxG;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAsBjG;AAED,wBAAsB,cAAc,CACnC,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,EAC1C,IAAI,SAAK,GACP,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAc/B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,SAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAkBpF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAoCpF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC9C,QAAQ,EAAE;QACT,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,MAAM,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC5D,CAAA;CACD,GAAG,UAAU,EAAE,CAWf;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,EAAE,CA8BvE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CA4BlG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,QAAQ,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,CAE1F;AAcD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAezD"}
@@ -0,0 +1,283 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import { open } from 'node:fs/promises';
3
+ import { serializeJson } from '../contracts/serialize.js';
4
+ import { ownValue } from './record.js';
5
+ export const INGESTION_LIMITS = Object.freeze({
6
+ documentBytes: 256 * 1024,
7
+ maxDepth: 64,
8
+ maxValues: 10_000,
9
+ maxSteps: 100,
10
+ maxIdCharacters: 128,
11
+ maxNameCharacters: 256,
12
+ maxStepTextBytes: 16 * 1024,
13
+ maxDiagnostics: 100,
14
+ maxDiagnosticBytes: 64 * 1024,
15
+ maxPreparedRunBytes: 1024 * 1024,
16
+ });
17
+ export async function acquireJsonInput(source, path = '') {
18
+ if (source.kind === 'value')
19
+ return inspectJsonStructure(source.value, path);
20
+ if (source.kind === 'file')
21
+ return readJsonDocument(source.path, path);
22
+ return readJsonStream(source.stream, path);
23
+ }
24
+ export async function readJsonDocument(filePath, path = '') {
25
+ let file;
26
+ try {
27
+ file = await open(filePath, 'r');
28
+ }
29
+ catch (error) {
30
+ return fileFailure(error, path);
31
+ }
32
+ try {
33
+ const stat = await file.stat();
34
+ if (!stat.isFile())
35
+ return invalidFailure('input.unreadable', path, 'path must identify a regular file');
36
+ if (stat.size > INGESTION_LIMITS.documentBytes)
37
+ return tooLarge(path);
38
+ const buffer = Buffer.alloc(INGESTION_LIMITS.documentBytes + 1);
39
+ const { bytesRead } = await file.read(buffer, 0, buffer.length, 0);
40
+ if (bytesRead > INGESTION_LIMITS.documentBytes)
41
+ return tooLarge(path);
42
+ return parseJsonDocument(buffer.subarray(0, bytesRead), path);
43
+ }
44
+ catch (error) {
45
+ return fileFailure(error, path);
46
+ }
47
+ finally {
48
+ await file.close().catch(() => undefined);
49
+ }
50
+ }
51
+ export async function readJsonStream(stream, path = '') {
52
+ const chunks = [];
53
+ let bytes = 0;
54
+ try {
55
+ for await (const chunk of stream) {
56
+ const buffer = typeof chunk === 'string' ? Buffer.from(chunk) : Buffer.from(chunk);
57
+ bytes += buffer.byteLength;
58
+ if (bytes > INGESTION_LIMITS.documentBytes)
59
+ return tooLarge(path);
60
+ chunks.push(buffer);
61
+ }
62
+ }
63
+ catch {
64
+ return operationalFailure('input.read-failed', path, 'input stream could not be read');
65
+ }
66
+ return parseJsonDocument(Buffer.concat(chunks, bytes), path);
67
+ }
68
+ export function parseJsonDocument(bytes, path = '') {
69
+ if (bytes.byteLength > INGESTION_LIMITS.documentBytes)
70
+ return tooLarge(path);
71
+ let text;
72
+ try {
73
+ text = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
74
+ }
75
+ catch {
76
+ return invalidFailure('input.invalid-utf8', path, 'must be valid UTF-8');
77
+ }
78
+ let value;
79
+ try {
80
+ value = JSON.parse(text);
81
+ }
82
+ catch {
83
+ return invalidFailure('input.invalid-json', path, 'must be valid JSON');
84
+ }
85
+ return inspectJsonStructure(value, path);
86
+ }
87
+ export function inspectJsonStructure(value, path = '') {
88
+ const pending = [{ value, depth: 1, path }];
89
+ const visited = new WeakSet();
90
+ let values = 0;
91
+ while (pending.length > 0) {
92
+ const current = pending.pop();
93
+ values++;
94
+ if (values > INGESTION_LIMITS.maxValues) {
95
+ return invalidFailure('input.too-many-values', path, `must contain at most ${INGESTION_LIMITS.maxValues} values`);
96
+ }
97
+ if (current.depth > INGESTION_LIMITS.maxDepth) {
98
+ return invalidFailure('input.too-deep', current.path, `must not exceed depth ${INGESTION_LIMITS.maxDepth}`);
99
+ }
100
+ if (current.value === null || typeof current.value !== 'object')
101
+ continue;
102
+ if (visited.has(current.value))
103
+ continue;
104
+ visited.add(current.value);
105
+ if (!Array.isArray(current.value) && Object.getPrototypeOf(current.value) !== Object.prototype) {
106
+ return invalidFailure('input.non-json', current.path, 'must contain only JSON values');
107
+ }
108
+ const entries = Array.isArray(current.value)
109
+ ? current.value.map((entry, index) => [String(index), entry])
110
+ : Object.entries(current.value);
111
+ for (let index = entries.length - 1; index >= 0; index--) {
112
+ const [key, entry] = entries[index];
113
+ pending.push({ value: entry, depth: current.depth + 1, path: appendPointer(current.path, key) });
114
+ }
115
+ }
116
+ return { ok: true, value };
117
+ }
118
+ export function requestLimitDiagnostics(input) {
119
+ const diagnostics = [];
120
+ if (input.scenario.steps.length > INGESTION_LIMITS.maxSteps) {
121
+ diagnostics.push(limitDiagnostic('/scenario/steps', `${INGESTION_LIMITS.maxSteps} steps`));
122
+ }
123
+ for (const [index, step] of input.scenario.steps.entries()) {
124
+ const base = `/scenario/steps/${index}`;
125
+ checkText(diagnostics, step.action, `${base}/action`);
126
+ checkText(diagnostics, step.expect, `${base}/expect`);
127
+ }
128
+ return diagnostics;
129
+ }
130
+ export function rawRequestLimitDiagnostics(input) {
131
+ if (!isRecord(input))
132
+ return [];
133
+ const scenario = ownValue(input, 'scenario');
134
+ if (!isRecord(scenario))
135
+ return [];
136
+ const diagnostics = [];
137
+ checkRawId(diagnostics, ownValue(scenario, 'id'), '/scenario/id');
138
+ checkRawId(diagnostics, ownValue(scenario, 'policy'), '/scenario/policy');
139
+ const name = ownValue(scenario, 'name');
140
+ if (typeof name === 'string' && name.length > INGESTION_LIMITS.maxNameCharacters) {
141
+ diagnostics.push(limitDiagnostic('/scenario/name', `${INGESTION_LIMITS.maxNameCharacters} characters`));
142
+ }
143
+ const driver = ownValue(scenario, 'driver');
144
+ if (isRecord(driver))
145
+ checkRawId(diagnostics, ownValue(driver, 'id'), '/scenario/driver/id');
146
+ const steps = ownValue(scenario, 'steps');
147
+ if (!Array.isArray(steps))
148
+ return diagnostics;
149
+ if (steps.length > INGESTION_LIMITS.maxSteps) {
150
+ diagnostics.push(limitDiagnostic('/scenario/steps', `${INGESTION_LIMITS.maxSteps} steps`));
151
+ }
152
+ for (const [index, step] of steps.entries()) {
153
+ if (!isRecord(step))
154
+ continue;
155
+ const base = `/scenario/steps/${index}`;
156
+ checkRawId(diagnostics, ownValue(step, 'id'), `${base}/id`);
157
+ const action = ownValue(step, 'action');
158
+ const expectation = ownValue(step, 'expect');
159
+ if (typeof action === 'string')
160
+ checkText(diagnostics, action, `${base}/action`);
161
+ if (typeof expectation === 'string')
162
+ checkText(diagnostics, expectation, `${base}/expect`);
163
+ }
164
+ return diagnostics;
165
+ }
166
+ export function boundDiagnostics(diagnostics) {
167
+ const marker = {
168
+ code: 'diagnostics.truncated',
169
+ path: '',
170
+ message: 'additional diagnostics were omitted because the diagnostic limit was reached',
171
+ };
172
+ const accepted = [];
173
+ for (const diagnostic of diagnostics) {
174
+ const normalized = normalizeDiagnostic(diagnostic);
175
+ const candidate = [...accepted, normalized];
176
+ const countExceeded = candidate.length > INGESTION_LIMITS.maxDiagnostics;
177
+ const bytesExceeded = diagnosticBytes(candidate) > INGESTION_LIMITS.maxDiagnosticBytes;
178
+ if (countExceeded || bytesExceeded) {
179
+ while (accepted.length > 0 &&
180
+ (accepted.length + 1 > INGESTION_LIMITS.maxDiagnostics ||
181
+ diagnosticBytes([...accepted, marker]) > INGESTION_LIMITS.maxDiagnosticBytes)) {
182
+ accepted.pop();
183
+ }
184
+ accepted.push(marker);
185
+ break;
186
+ }
187
+ accepted.push(normalized);
188
+ }
189
+ return (accepted.length > 0 ? accepted : [marker]);
190
+ }
191
+ export function appendPointer(path, member) {
192
+ return `${path}/${member.replaceAll('~', '~0').replaceAll('/', '~1')}`;
193
+ }
194
+ export function combineFailureStatus(...statuses) {
195
+ return statuses.includes('error') ? 'error' : 'invalid';
196
+ }
197
+ function normalizeDiagnostic(diagnostic) {
198
+ return {
199
+ code: normalizeSingleLine(diagnostic.code) || 'diagnostic.invalid',
200
+ path: validPointer(diagnostic.path) ? diagnostic.path : '',
201
+ message: normalizeSingleLine(diagnostic.message) || 'diagnostic message was empty',
202
+ };
203
+ }
204
+ function diagnosticBytes(diagnostics) {
205
+ return Buffer.byteLength(serializeJson(diagnostics), 'utf8');
206
+ }
207
+ export function normalizeSingleLine(value) {
208
+ let normalized = '';
209
+ let replacingControls = false;
210
+ for (const character of value) {
211
+ const code = character.codePointAt(0);
212
+ const control = code <= 0x1f || (code >= 0x7f && code <= 0x9f);
213
+ if (control) {
214
+ if (!replacingControls)
215
+ normalized += ' ';
216
+ replacingControls = true;
217
+ }
218
+ else {
219
+ normalized += character;
220
+ replacingControls = false;
221
+ }
222
+ }
223
+ return normalized.trim();
224
+ }
225
+ function validPointer(path) {
226
+ if (path === '')
227
+ return true;
228
+ if (!path.startsWith('/'))
229
+ return false;
230
+ for (let index = 0; index < path.length; index++) {
231
+ if (path[index] !== '~')
232
+ continue;
233
+ if (path[index + 1] !== '0' && path[index + 1] !== '1')
234
+ return false;
235
+ index++;
236
+ }
237
+ for (const character of path) {
238
+ const code = character.codePointAt(0);
239
+ if (code <= 0x1f || (code >= 0x7f && code <= 0x9f))
240
+ return false;
241
+ }
242
+ return true;
243
+ }
244
+ function checkText(diagnostics, value, path) {
245
+ if (Buffer.byteLength(value, 'utf8') > INGESTION_LIMITS.maxStepTextBytes) {
246
+ diagnostics.push(limitDiagnostic(path, `${INGESTION_LIMITS.maxStepTextBytes} UTF-8 bytes`));
247
+ }
248
+ }
249
+ function checkRawId(diagnostics, value, path) {
250
+ if (typeof value === 'string' && value.length > INGESTION_LIMITS.maxIdCharacters) {
251
+ diagnostics.push(limitDiagnostic(path, `${INGESTION_LIMITS.maxIdCharacters} characters`));
252
+ }
253
+ }
254
+ function isRecord(value) {
255
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
256
+ }
257
+ function limitDiagnostic(path, maximum) {
258
+ return { code: 'input.limit-exceeded', path, message: `must not exceed ${maximum}` };
259
+ }
260
+ function tooLarge(path) {
261
+ return invalidFailure('input.too-large', path, `must not exceed ${INGESTION_LIMITS.documentBytes} bytes`);
262
+ }
263
+ function fileFailure(error, path) {
264
+ const code = errorCode(error);
265
+ if (code === 'ENOENT')
266
+ return invalidFailure('input.unreadable', path, 'file does not exist');
267
+ if (code === 'EACCES' || code === 'EPERM' || code === 'EISDIR') {
268
+ return invalidFailure('input.unreadable', path, 'file could not be read');
269
+ }
270
+ return operationalFailure('input.read-failed', path, 'file could not be read because of an operational error');
271
+ }
272
+ function errorCode(error) {
273
+ if (!error || typeof error !== 'object' || !Object.prototype.hasOwnProperty.call(error, 'code'))
274
+ return undefined;
275
+ return typeof error.code === 'string' ? error.code : undefined;
276
+ }
277
+ function invalidFailure(code, path, message) {
278
+ return { ok: false, status: 'invalid', diagnostics: [{ code, path, message }] };
279
+ }
280
+ function operationalFailure(code, path, message) {
281
+ return { ok: false, status: 'error', diagnostics: [{ code, path, message }] };
282
+ }
283
+ //# sourceMappingURL=ingestion.js.map