reqon-dsl 0.2.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 (388) hide show
  1. package/.claude/settings.local.json +31 -0
  2. package/.claude/skills/api-integration.md +125 -0
  3. package/.claude/skills/database-schema.md +51 -0
  4. package/.claude/skills/dsl-design.md +80 -0
  5. package/.claude/skills/property-testing.md +143 -0
  6. package/.claude/skills/reqon/SKILL.md +44 -0
  7. package/.claude/skills/reqon/references/examples.md +206 -0
  8. package/.claude/skills/reqon/references/syntax.md +263 -0
  9. package/.claude/skills/vscode-extension.md +113 -0
  10. package/.github/dependabot.yml +32 -0
  11. package/.github/pull_request_template.md +21 -0
  12. package/.github/workflows/ci.yml +174 -0
  13. package/.github/workflows/release.yml +73 -0
  14. package/CLAUDE.md +72 -0
  15. package/CONTRIBUTING.md +161 -0
  16. package/README.md +235 -0
  17. package/TODO.md +51 -0
  18. package/dist/ast/index.d.ts +1 -0
  19. package/dist/ast/index.js +1 -0
  20. package/dist/ast/nodes.d.ts +237 -0
  21. package/dist/ast/nodes.js +12 -0
  22. package/dist/auth/auth.test.d.ts +1 -0
  23. package/dist/auth/auth.test.js +255 -0
  24. package/dist/auth/circuit-breaker.d.ts +115 -0
  25. package/dist/auth/circuit-breaker.js +267 -0
  26. package/dist/auth/credentials.d.ts +91 -0
  27. package/dist/auth/credentials.js +169 -0
  28. package/dist/auth/index.d.ts +5 -0
  29. package/dist/auth/index.js +8 -0
  30. package/dist/auth/oauth2-provider.d.ts +41 -0
  31. package/dist/auth/oauth2-provider.js +131 -0
  32. package/dist/auth/rate-limiter.d.ts +61 -0
  33. package/dist/auth/rate-limiter.js +380 -0
  34. package/dist/auth/token-store.d.ts +30 -0
  35. package/dist/auth/token-store.js +148 -0
  36. package/dist/auth/types.d.ts +142 -0
  37. package/dist/auth/types.js +1 -0
  38. package/dist/cli.d.ts +2 -0
  39. package/dist/cli.js +270 -0
  40. package/dist/errors/errors.test.d.ts +1 -0
  41. package/dist/errors/errors.test.js +165 -0
  42. package/dist/errors/index.d.ts +83 -0
  43. package/dist/errors/index.js +159 -0
  44. package/dist/execution/execution.test.d.ts +1 -0
  45. package/dist/execution/execution.test.js +246 -0
  46. package/dist/execution/index.d.ts +4 -0
  47. package/dist/execution/index.js +2 -0
  48. package/dist/execution/state.d.ts +136 -0
  49. package/dist/execution/state.js +82 -0
  50. package/dist/execution/store.d.ts +52 -0
  51. package/dist/execution/store.js +120 -0
  52. package/dist/index.d.ts +27 -0
  53. package/dist/index.js +57 -0
  54. package/dist/integration.test.d.ts +1 -0
  55. package/dist/integration.test.js +168 -0
  56. package/dist/interpreter/context.d.ts +15 -0
  57. package/dist/interpreter/context.js +29 -0
  58. package/dist/interpreter/evaluator.d.ts +5 -0
  59. package/dist/interpreter/evaluator.js +223 -0
  60. package/dist/interpreter/evaluator.test.d.ts +1 -0
  61. package/dist/interpreter/evaluator.test.js +512 -0
  62. package/dist/interpreter/executor.d.ts +131 -0
  63. package/dist/interpreter/executor.js +663 -0
  64. package/dist/interpreter/fetch-handler.d.ts +43 -0
  65. package/dist/interpreter/fetch-handler.js +203 -0
  66. package/dist/interpreter/http.d.ts +57 -0
  67. package/dist/interpreter/http.js +210 -0
  68. package/dist/interpreter/http.test.d.ts +1 -0
  69. package/dist/interpreter/http.test.js +299 -0
  70. package/dist/interpreter/index.d.ts +7 -0
  71. package/dist/interpreter/index.js +7 -0
  72. package/dist/interpreter/pagination.d.ts +63 -0
  73. package/dist/interpreter/pagination.js +155 -0
  74. package/dist/interpreter/progress.test.d.ts +1 -0
  75. package/dist/interpreter/progress.test.js +216 -0
  76. package/dist/interpreter/schema-matcher.d.ts +16 -0
  77. package/dist/interpreter/schema-matcher.js +136 -0
  78. package/dist/interpreter/schema-matcher.test.d.ts +1 -0
  79. package/dist/interpreter/schema-matcher.test.js +122 -0
  80. package/dist/interpreter/signals.d.ts +57 -0
  81. package/dist/interpreter/signals.js +73 -0
  82. package/dist/interpreter/step-handlers/for-handler.d.ts +17 -0
  83. package/dist/interpreter/step-handlers/for-handler.js +51 -0
  84. package/dist/interpreter/step-handlers/index.d.ts +8 -0
  85. package/dist/interpreter/step-handlers/index.js +8 -0
  86. package/dist/interpreter/step-handlers/map-handler.d.ts +10 -0
  87. package/dist/interpreter/step-handlers/map-handler.js +20 -0
  88. package/dist/interpreter/step-handlers/match-handler.d.ts +27 -0
  89. package/dist/interpreter/step-handlers/match-handler.js +61 -0
  90. package/dist/interpreter/step-handlers/store-handler.d.ts +13 -0
  91. package/dist/interpreter/step-handlers/store-handler.js +66 -0
  92. package/dist/interpreter/step-handlers/types.d.ts +15 -0
  93. package/dist/interpreter/step-handlers/types.js +1 -0
  94. package/dist/interpreter/step-handlers/validate-handler.d.ts +10 -0
  95. package/dist/interpreter/step-handlers/validate-handler.js +26 -0
  96. package/dist/interpreter/step-handlers/webhook-handler.d.ts +36 -0
  97. package/dist/interpreter/step-handlers/webhook-handler.js +104 -0
  98. package/dist/lexer/index.d.ts +10 -0
  99. package/dist/lexer/index.js +12 -0
  100. package/dist/lexer/lexer.d.ts +24 -0
  101. package/dist/lexer/lexer.js +264 -0
  102. package/dist/lexer/lexer.test.d.ts +1 -0
  103. package/dist/lexer/lexer.test.js +259 -0
  104. package/dist/lexer/tokens.d.ts +69 -0
  105. package/dist/lexer/tokens.js +146 -0
  106. package/dist/loader/index.d.ts +36 -0
  107. package/dist/loader/index.js +220 -0
  108. package/dist/loader/loader.test.d.ts +1 -0
  109. package/dist/loader/loader.test.js +287 -0
  110. package/dist/oas/index.d.ts +4 -0
  111. package/dist/oas/index.js +2 -0
  112. package/dist/oas/loader.d.ts +21 -0
  113. package/dist/oas/loader.js +82 -0
  114. package/dist/oas/oas.test.d.ts +1 -0
  115. package/dist/oas/oas.test.js +218 -0
  116. package/dist/oas/validator.d.ts +12 -0
  117. package/dist/oas/validator.js +227 -0
  118. package/dist/parser/base.d.ts +33 -0
  119. package/dist/parser/base.js +97 -0
  120. package/dist/parser/expressions.d.ts +27 -0
  121. package/dist/parser/expressions.js +248 -0
  122. package/dist/parser/expressions.test.d.ts +1 -0
  123. package/dist/parser/expressions.test.js +378 -0
  124. package/dist/parser/index.d.ts +3 -0
  125. package/dist/parser/index.js +3 -0
  126. package/dist/parser/match.test.d.ts +1 -0
  127. package/dist/parser/match.test.js +254 -0
  128. package/dist/parser/parser.d.ts +68 -0
  129. package/dist/parser/parser.js +1229 -0
  130. package/dist/parser/parser.test.d.ts +1 -0
  131. package/dist/parser/parser.test.js +333 -0
  132. package/dist/parser/schedule.test.d.ts +1 -0
  133. package/dist/parser/schedule.test.js +241 -0
  134. package/dist/plugin.d.ts +35 -0
  135. package/dist/plugin.js +68 -0
  136. package/dist/scheduler/cron-parser.d.ts +32 -0
  137. package/dist/scheduler/cron-parser.js +198 -0
  138. package/dist/scheduler/cron-parser.test.d.ts +1 -0
  139. package/dist/scheduler/cron-parser.test.js +188 -0
  140. package/dist/scheduler/index.d.ts +3 -0
  141. package/dist/scheduler/index.js +2 -0
  142. package/dist/scheduler/scheduler.d.ts +81 -0
  143. package/dist/scheduler/scheduler.js +376 -0
  144. package/dist/scheduler/types.d.ts +65 -0
  145. package/dist/scheduler/types.js +1 -0
  146. package/dist/stores/factory.d.ts +36 -0
  147. package/dist/stores/factory.js +73 -0
  148. package/dist/stores/file.d.ts +60 -0
  149. package/dist/stores/file.js +173 -0
  150. package/dist/stores/file.test.d.ts +1 -0
  151. package/dist/stores/file.test.js +165 -0
  152. package/dist/stores/index.d.ts +6 -0
  153. package/dist/stores/index.js +5 -0
  154. package/dist/stores/memory.d.ts +19 -0
  155. package/dist/stores/memory.js +51 -0
  156. package/dist/stores/memory.test.d.ts +1 -0
  157. package/dist/stores/memory.test.js +157 -0
  158. package/dist/stores/postgrest.d.ts +55 -0
  159. package/dist/stores/postgrest.js +217 -0
  160. package/dist/stores/stores.test.d.ts +1 -0
  161. package/dist/stores/stores.test.js +158 -0
  162. package/dist/stores/types.d.ts +31 -0
  163. package/dist/stores/types.js +26 -0
  164. package/dist/sync/index.d.ts +4 -0
  165. package/dist/sync/index.js +2 -0
  166. package/dist/sync/state.d.ts +69 -0
  167. package/dist/sync/state.js +66 -0
  168. package/dist/sync/store.d.ts +49 -0
  169. package/dist/sync/store.js +93 -0
  170. package/dist/sync/sync.test.d.ts +1 -0
  171. package/dist/sync/sync.test.js +221 -0
  172. package/dist/utils/async.d.ts +7 -0
  173. package/dist/utils/async.js +9 -0
  174. package/dist/utils/file.d.ts +38 -0
  175. package/dist/utils/file.js +92 -0
  176. package/dist/utils/index.d.ts +4 -0
  177. package/dist/utils/index.js +4 -0
  178. package/dist/utils/logger.d.ts +34 -0
  179. package/dist/utils/logger.js +39 -0
  180. package/dist/utils/path.d.ts +12 -0
  181. package/dist/utils/path.js +41 -0
  182. package/dist/webhook/index.d.ts +8 -0
  183. package/dist/webhook/index.js +7 -0
  184. package/dist/webhook/server.d.ts +84 -0
  185. package/dist/webhook/server.js +319 -0
  186. package/dist/webhook/store.d.ts +67 -0
  187. package/dist/webhook/store.js +193 -0
  188. package/dist/webhook/types.d.ts +88 -0
  189. package/dist/webhook/types.js +6 -0
  190. package/docusaurus/README.md +41 -0
  191. package/docusaurus/docs/advanced/execution-state.md +283 -0
  192. package/docusaurus/docs/advanced/extending-reqon.md +388 -0
  193. package/docusaurus/docs/advanced/multi-file-missions.md +250 -0
  194. package/docusaurus/docs/advanced/parallel-execution.md +353 -0
  195. package/docusaurus/docs/api-reference.md +443 -0
  196. package/docusaurus/docs/authentication/api-key.md +339 -0
  197. package/docusaurus/docs/authentication/basic.md +276 -0
  198. package/docusaurus/docs/authentication/bearer.md +282 -0
  199. package/docusaurus/docs/authentication/oauth2.md +317 -0
  200. package/docusaurus/docs/authentication/overview.md +251 -0
  201. package/docusaurus/docs/cli.md +229 -0
  202. package/docusaurus/docs/core-concepts/actions.md +286 -0
  203. package/docusaurus/docs/core-concepts/missions.md +264 -0
  204. package/docusaurus/docs/core-concepts/schemas.md +353 -0
  205. package/docusaurus/docs/core-concepts/sources.md +339 -0
  206. package/docusaurus/docs/core-concepts/stores.md +332 -0
  207. package/docusaurus/docs/dsl-syntax/expressions.md +361 -0
  208. package/docusaurus/docs/dsl-syntax/fetch.md +293 -0
  209. package/docusaurus/docs/dsl-syntax/for-loops.md +324 -0
  210. package/docusaurus/docs/dsl-syntax/map.md +345 -0
  211. package/docusaurus/docs/dsl-syntax/match.md +387 -0
  212. package/docusaurus/docs/dsl-syntax/pipelines.md +397 -0
  213. package/docusaurus/docs/dsl-syntax/validate.md +401 -0
  214. package/docusaurus/docs/error-handling/dead-letter-queues.md +399 -0
  215. package/docusaurus/docs/error-handling/flow-control.md +337 -0
  216. package/docusaurus/docs/error-handling/retry-strategies.md +368 -0
  217. package/docusaurus/docs/examples.md +488 -0
  218. package/docusaurus/docs/getting-started.md +256 -0
  219. package/docusaurus/docs/http/circuit-breaker.md +401 -0
  220. package/docusaurus/docs/http/incremental-sync.md +394 -0
  221. package/docusaurus/docs/http/pagination.md +361 -0
  222. package/docusaurus/docs/http/rate-limiting.md +383 -0
  223. package/docusaurus/docs/http/requests.md +328 -0
  224. package/docusaurus/docs/http/retry.md +402 -0
  225. package/docusaurus/docs/intro.md +90 -0
  226. package/docusaurus/docs/openapi/loading-specs.md +305 -0
  227. package/docusaurus/docs/openapi/operation-calls.md +314 -0
  228. package/docusaurus/docs/openapi/overview.md +212 -0
  229. package/docusaurus/docs/openapi/response-validation.md +344 -0
  230. package/docusaurus/docs/scheduling/cron.md +305 -0
  231. package/docusaurus/docs/scheduling/daemon-mode.md +317 -0
  232. package/docusaurus/docs/scheduling/intervals.md +289 -0
  233. package/docusaurus/docs/scheduling/overview.md +231 -0
  234. package/docusaurus/docs/stores/custom-adapters.md +376 -0
  235. package/docusaurus/docs/stores/file.md +236 -0
  236. package/docusaurus/docs/stores/memory.md +193 -0
  237. package/docusaurus/docs/stores/overview.md +274 -0
  238. package/docusaurus/docs/stores/postgrest.md +316 -0
  239. package/docusaurus/docusaurus.config.ts +148 -0
  240. package/docusaurus/package-lock.json +18029 -0
  241. package/docusaurus/package.json +47 -0
  242. package/docusaurus/sidebars.ts +155 -0
  243. package/docusaurus/src/components/HomepageFeatures/index.tsx +105 -0
  244. package/docusaurus/src/components/HomepageFeatures/styles.module.css +12 -0
  245. package/docusaurus/src/css/custom.css +169 -0
  246. package/docusaurus/src/pages/index.module.css +48 -0
  247. package/docusaurus/src/pages/index.tsx +110 -0
  248. package/docusaurus/src/pages/markdown-page.md +7 -0
  249. package/docusaurus/static/.nojekyll +0 -0
  250. package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
  251. package/docusaurus/static/img/docusaurus.png +0 -0
  252. package/docusaurus/static/img/favicon.ico +0 -0
  253. package/docusaurus/static/img/logo.svg +10 -0
  254. package/docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
  255. package/docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
  256. package/docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
  257. package/docusaurus/tsconfig.json +8 -0
  258. package/examples/README.md +112 -0
  259. package/examples/error-handling/README.md +150 -0
  260. package/examples/error-handling/payment-processor.vague +287 -0
  261. package/examples/github-sync/README.md +74 -0
  262. package/examples/github-sync/fetch-issues.vague +47 -0
  263. package/examples/github-sync/fetch-prs.vague +40 -0
  264. package/examples/github-sync/mission.vague +101 -0
  265. package/examples/github-sync/normalize.vague +70 -0
  266. package/examples/jsonplaceholder/README.md +28 -0
  267. package/examples/jsonplaceholder/posts.vague +48 -0
  268. package/examples/petstore/README.md +35 -0
  269. package/examples/petstore/openapi.yaml +97 -0
  270. package/examples/petstore/sync.vague +52 -0
  271. package/examples/temporal-comparison/README.md +297 -0
  272. package/examples/temporal-comparison/reconciliation.vague +355 -0
  273. package/examples/temporal-comparison/temporal/activities/index.ts +8 -0
  274. package/examples/temporal-comparison/temporal/activities/shipstation.ts +225 -0
  275. package/examples/temporal-comparison/temporal/activities/shopify.ts +257 -0
  276. package/examples/temporal-comparison/temporal/activities/storage.ts +198 -0
  277. package/examples/temporal-comparison/temporal/activities/stripe.ts +169 -0
  278. package/examples/temporal-comparison/temporal/activities/validation.ts +205 -0
  279. package/examples/temporal-comparison/temporal/client/schedule.ts +218 -0
  280. package/examples/temporal-comparison/temporal/config/retry.ts +63 -0
  281. package/examples/temporal-comparison/temporal/types/index.ts +129 -0
  282. package/examples/temporal-comparison/temporal/workers/main.ts +130 -0
  283. package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +262 -0
  284. package/examples/xero/README.md +88 -0
  285. package/examples/xero/invoices.vague +189 -0
  286. package/package.json +40 -0
  287. package/src/api-integration.test.ts +954 -0
  288. package/src/ast/index.ts +1 -0
  289. package/src/ast/nodes.ts +310 -0
  290. package/src/auth/auth.test.ts +326 -0
  291. package/src/auth/circuit-breaker.test.ts +390 -0
  292. package/src/auth/circuit-breaker.ts +379 -0
  293. package/src/auth/credentials.test.ts +273 -0
  294. package/src/auth/credentials.ts +246 -0
  295. package/src/auth/index.ts +40 -0
  296. package/src/auth/oauth2-provider.ts +177 -0
  297. package/src/auth/rate-limiter.ts +459 -0
  298. package/src/auth/token-store.ts +177 -0
  299. package/src/auth/types.ts +159 -0
  300. package/src/benchmark/e2e.bench.ts +288 -0
  301. package/src/benchmark/evaluator.bench.ts +331 -0
  302. package/src/benchmark/fixtures.ts +295 -0
  303. package/src/benchmark/index.ts +108 -0
  304. package/src/benchmark/lexer.bench.ts +69 -0
  305. package/src/benchmark/parser.bench.ts +103 -0
  306. package/src/benchmark/resilience.bench.ts +193 -0
  307. package/src/benchmark/store.bench.ts +147 -0
  308. package/src/benchmark/utils.ts +230 -0
  309. package/src/cli.ts +313 -0
  310. package/src/errors/errors.test.ts +234 -0
  311. package/src/errors/index.ts +223 -0
  312. package/src/execution/execution.test.ts +307 -0
  313. package/src/execution/index.ts +21 -0
  314. package/src/execution/state.ts +207 -0
  315. package/src/execution/store.ts +188 -0
  316. package/src/index.ts +169 -0
  317. package/src/integration.test.ts +192 -0
  318. package/src/interpreter/context.ts +57 -0
  319. package/src/interpreter/evaluator.test.ts +796 -0
  320. package/src/interpreter/evaluator.ts +245 -0
  321. package/src/interpreter/executor.ts +946 -0
  322. package/src/interpreter/fetch-handler.ts +302 -0
  323. package/src/interpreter/http.test.ts +423 -0
  324. package/src/interpreter/http.ts +308 -0
  325. package/src/interpreter/index.ts +32 -0
  326. package/src/interpreter/pagination.ts +207 -0
  327. package/src/interpreter/progress.test.ts +276 -0
  328. package/src/interpreter/schema-matcher.test.ts +160 -0
  329. package/src/interpreter/schema-matcher.ts +168 -0
  330. package/src/interpreter/signals.ts +73 -0
  331. package/src/interpreter/step-handlers/for-handler.ts +65 -0
  332. package/src/interpreter/step-handlers/index.ts +17 -0
  333. package/src/interpreter/step-handlers/map-handler.ts +24 -0
  334. package/src/interpreter/step-handlers/match-handler.ts +101 -0
  335. package/src/interpreter/step-handlers/store-handler.ts +78 -0
  336. package/src/interpreter/step-handlers/types.ts +17 -0
  337. package/src/interpreter/step-handlers/validate-handler.ts +30 -0
  338. package/src/interpreter/step-handlers/webhook-handler.ts +142 -0
  339. package/src/lexer/index.ts +18 -0
  340. package/src/lexer/lexer.test.ts +316 -0
  341. package/src/lexer/tokens.ts +179 -0
  342. package/src/loader/index.ts +288 -0
  343. package/src/loader/loader.test.ts +360 -0
  344. package/src/oas/index.ts +4 -0
  345. package/src/oas/loader.ts +126 -0
  346. package/src/oas/oas.test.ts +254 -0
  347. package/src/oas/validator.ts +299 -0
  348. package/src/parser/base.ts +124 -0
  349. package/src/parser/expressions.test.ts +525 -0
  350. package/src/parser/expressions.ts +314 -0
  351. package/src/parser/index.ts +3 -0
  352. package/src/parser/match.test.ts +296 -0
  353. package/src/parser/parser.test.ts +739 -0
  354. package/src/parser/parser.ts +1469 -0
  355. package/src/parser/schedule.test.ts +287 -0
  356. package/src/parser/webhook.test.ts +248 -0
  357. package/src/plugin.ts +83 -0
  358. package/src/scheduler/cron-parser.test.ts +236 -0
  359. package/src/scheduler/cron-parser.ts +236 -0
  360. package/src/scheduler/index.ts +10 -0
  361. package/src/scheduler/scheduler.ts +443 -0
  362. package/src/scheduler/types.ts +71 -0
  363. package/src/stores/factory.ts +104 -0
  364. package/src/stores/file.test.ts +276 -0
  365. package/src/stores/file.ts +211 -0
  366. package/src/stores/index.ts +6 -0
  367. package/src/stores/memory.test.ts +238 -0
  368. package/src/stores/memory.ts +63 -0
  369. package/src/stores/postgrest.test.ts +488 -0
  370. package/src/stores/postgrest.ts +263 -0
  371. package/src/stores/stores.test.ts +197 -0
  372. package/src/stores/types.ts +58 -0
  373. package/src/sync/index.ts +16 -0
  374. package/src/sync/state.ts +126 -0
  375. package/src/sync/store.ts +139 -0
  376. package/src/sync/sync.test.ts +271 -0
  377. package/src/utils/async.ts +10 -0
  378. package/src/utils/file.ts +106 -0
  379. package/src/utils/index.ts +14 -0
  380. package/src/utils/logger.ts +53 -0
  381. package/src/utils/path.ts +47 -0
  382. package/src/webhook/index.ts +15 -0
  383. package/src/webhook/server.test.ts +253 -0
  384. package/src/webhook/server.ts +389 -0
  385. package/src/webhook/store.ts +239 -0
  386. package/src/webhook/types.ts +93 -0
  387. package/tsconfig.json +17 -0
  388. package/vitest.config.ts +39 -0
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Auth provider interface - abstracts token retrieval and refresh
3
+ */
4
+ export interface AuthProvider {
5
+ /** Get a valid access token (refreshing if needed) */
6
+ getToken(): Promise<string>;
7
+
8
+ /** Force a token refresh */
9
+ refreshToken?(): Promise<string>;
10
+
11
+ /** Get token metadata (for monitoring) */
12
+ getTokenInfo?(): TokenInfo;
13
+ }
14
+
15
+ export interface TokenInfo {
16
+ /** When the access token expires */
17
+ expiresAt?: Date;
18
+ /** When the refresh token expires (for non-use expiry tracking) */
19
+ refreshExpiresAt?: Date;
20
+ /** Last time the token was successfully used */
21
+ lastUsedAt?: Date;
22
+ /** Connection/tenant identifier */
23
+ connectionId?: string;
24
+ }
25
+
26
+ /**
27
+ * OAuth2 token set - what gets stored
28
+ */
29
+ export interface OAuth2Tokens {
30
+ accessToken: string;
31
+ refreshToken?: string;
32
+ expiresAt?: Date;
33
+ refreshExpiresAt?: Date;
34
+ tokenType?: string;
35
+ scope?: string;
36
+ }
37
+
38
+ /**
39
+ * Token store interface - pluggable storage backend
40
+ */
41
+ export interface TokenStore {
42
+ /** Get tokens for a connection */
43
+ get(connectionId: string): Promise<OAuth2Tokens | null>;
44
+
45
+ /** Store tokens for a connection */
46
+ set(connectionId: string, tokens: OAuth2Tokens): Promise<void>;
47
+
48
+ /** Delete tokens for a connection */
49
+ delete(connectionId: string): Promise<void>;
50
+
51
+ /** Update last used timestamp */
52
+ touch(connectionId: string): Promise<void>;
53
+
54
+ /** List all connections (for proactive refresh) */
55
+ list(): Promise<string[]>;
56
+ }
57
+
58
+ /**
59
+ * OAuth2 configuration for token refresh
60
+ */
61
+ export interface OAuth2Config {
62
+ tokenEndpoint: string;
63
+ clientId: string;
64
+ clientSecret?: string;
65
+ /** Seconds before expiry to trigger refresh (default: 300 = 5 min) */
66
+ refreshBuffer?: number;
67
+ }
68
+
69
+ /**
70
+ * Rate limit information extracted from response headers
71
+ */
72
+ export interface RateLimitInfo {
73
+ /** Requests remaining in current window */
74
+ remaining?: number;
75
+ /** Total requests allowed in window */
76
+ limit?: number;
77
+ /** When the rate limit resets (Unix timestamp or Date) */
78
+ resetAt?: Date;
79
+ /** Retry after N seconds (from 429 response) */
80
+ retryAfter?: number;
81
+ }
82
+
83
+ /**
84
+ * Rate limit strategy
85
+ */
86
+ export type RateLimitStrategy = 'pause' | 'throttle' | 'fail';
87
+
88
+ /**
89
+ * Rate limit configuration
90
+ */
91
+ export interface RateLimitConfig {
92
+ /** Strategy when rate limited (default: 'pause') */
93
+ strategy?: RateLimitStrategy;
94
+ /** Max seconds to wait before failing (default: 300) */
95
+ maxWait?: number;
96
+ /** Log warning after waiting this many seconds (default: 10) */
97
+ notifyAt?: number;
98
+ /** Fallback rate limit if no headers (requests per minute) */
99
+ fallbackRpm?: number;
100
+ }
101
+
102
+ /**
103
+ * Rate limit event - emitted when rate limiting occurs
104
+ */
105
+ export interface RateLimitEvent {
106
+ source: string;
107
+ endpoint?: string;
108
+ waitSeconds: number;
109
+ remaining?: number;
110
+ resetAt?: Date;
111
+ strategy: RateLimitStrategy;
112
+ }
113
+
114
+ /**
115
+ * Rate limit event handlers
116
+ */
117
+ export interface RateLimitCallbacks {
118
+ /** Called when rate limited and waiting */
119
+ onRateLimited?: (event: RateLimitEvent) => void;
120
+ /** Called when rate limit wait is complete */
121
+ onResumed?: (event: { source: string; endpoint?: string; waitedSeconds: number }) => void;
122
+ /** Called periodically during long waits */
123
+ onWaiting?: (event: RateLimitEvent & { elapsedSeconds: number }) => void;
124
+ }
125
+
126
+ /**
127
+ * Rate limiter interface - tracks and enforces rate limits
128
+ */
129
+ export interface RateLimiter {
130
+ /** Check if we should proceed with a request */
131
+ canProceed(source: string, endpoint?: string): Promise<boolean>;
132
+
133
+ /** Wait until we can proceed (blocks if rate limited) */
134
+ waitForCapacity(source: string, endpoint?: string): Promise<void>;
135
+
136
+ /** Record rate limit info from a response */
137
+ recordResponse(source: string, info: RateLimitInfo, endpoint?: string): void;
138
+
139
+ /** Get current rate limit status */
140
+ getStatus(source: string, endpoint?: string): RateLimitStatus;
141
+
142
+ /** Configure rate limiting for a source */
143
+ configure(source: string, config: RateLimitConfig): void;
144
+
145
+ /** Set event callbacks */
146
+ setCallbacks(callbacks: RateLimitCallbacks): void;
147
+
148
+ /** Get delay for throttle mode (returns 0 if no throttling needed) */
149
+ getThrottleDelay(source: string, endpoint?: string): number;
150
+ }
151
+
152
+ export interface RateLimitStatus {
153
+ remaining?: number;
154
+ limit?: number;
155
+ resetAt?: Date;
156
+ isLimited: boolean;
157
+ /** Seconds until reset (if limited) */
158
+ resetInSeconds?: number;
159
+ }
@@ -0,0 +1,288 @@
1
+ /**
2
+ * End-to-end execution benchmarks
3
+ */
4
+
5
+ import { parse, execute } from '../index.js';
6
+ import { MissionExecutor } from '../interpreter/index.js';
7
+ import { MemoryStore } from '../stores/memory.js';
8
+ import { BenchmarkSuite } from './utils.js';
9
+ import {
10
+ SIMPLE_DSL,
11
+ MEDIUM_DSL,
12
+ COMPLEX_DSL,
13
+ EXPRESSION_HEAVY_DSL,
14
+ MATCH_HEAVY_DSL,
15
+ generateLargeDSL,
16
+ } from './fixtures.js';
17
+
18
+ // DSL for benchmarking with pre-populated stores (no network)
19
+ const STORE_ONLY_DSL = `
20
+ mission "store-processing"
21
+ store input in memory
22
+ store output in memory
23
+
24
+ action process
25
+ for item in input where item.active == true
26
+ map item -> {
27
+ id: item.id,
28
+ fullName: item.firstName + " " + item.lastName,
29
+ score: item.value * 2,
30
+ category: match item.tier
31
+ when "A" then "premium"
32
+ when "B" then "standard"
33
+ else "basic"
34
+ end
35
+ }
36
+ validate
37
+ assume id is string
38
+ assume score is number
39
+ store mapped in output with key: mapped.id
40
+ end
41
+ `;
42
+
43
+ const COMPLEX_STORE_DSL = `
44
+ mission "complex-store-processing"
45
+ store users in memory
46
+ store orders in memory
47
+ store reports in memory
48
+
49
+ action processUsers
50
+ for user in users where user.active == true
51
+ map user -> {
52
+ userId: user.id,
53
+ displayName: user.firstName + " " + user.lastName,
54
+ tier: match user.score
55
+ when score >= 90 then "platinum"
56
+ when score >= 70 then "gold"
57
+ when score >= 50 then "silver"
58
+ else "bronze"
59
+ end,
60
+ eligible: user.verified == true and user.age >= 18
61
+ }
62
+ validate
63
+ assume userId is string
64
+ assume displayName is string
65
+ store mapped in reports with key: mapped.userId
66
+ end
67
+
68
+ action processOrders
69
+ for order in orders
70
+ for report in reports where report.userId == order.userId
71
+ map { order: order, report: report } -> {
72
+ orderId: order.id,
73
+ userId: order.userId,
74
+ total: order.amount * 100,
75
+ discount: match report.tier
76
+ when "platinum" then order.amount * 0.2
77
+ when "gold" then order.amount * 0.15
78
+ when "silver" then order.amount * 0.1
79
+ else order.amount * 0.05
80
+ end,
81
+ status: order.status
82
+ }
83
+ store mapped in reports with key: mapped.orderId, partial: true
84
+ end
85
+ end
86
+
87
+ run processUsers then processOrders
88
+ `;
89
+
90
+ // Generate test data for stores
91
+ function generateUsers(count: number): Record<string, unknown>[] {
92
+ const users: Record<string, unknown>[] = [];
93
+ const firstNames = ['John', 'Jane', 'Bob', 'Alice', 'Charlie', 'Diana'];
94
+ const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Davis'];
95
+ const tiers = ['A', 'B', 'C'];
96
+
97
+ for (let i = 0; i < count; i++) {
98
+ users.push({
99
+ id: `user-${i}`,
100
+ firstName: firstNames[i % firstNames.length],
101
+ lastName: lastNames[i % lastNames.length],
102
+ email: `user${i}@example.com`,
103
+ age: 20 + (i % 50),
104
+ value: Math.floor(Math.random() * 100),
105
+ score: Math.floor(Math.random() * 100),
106
+ tier: tiers[i % tiers.length],
107
+ active: Math.random() > 0.2,
108
+ verified: Math.random() > 0.3,
109
+ });
110
+ }
111
+ return users;
112
+ }
113
+
114
+ function generateOrders(
115
+ count: number,
116
+ userCount: number
117
+ ): Record<string, unknown>[] {
118
+ const orders: Record<string, unknown>[] = [];
119
+ const statuses = ['pending', 'completed', 'cancelled'];
120
+
121
+ for (let i = 0; i < count; i++) {
122
+ orders.push({
123
+ id: `order-${i}`,
124
+ userId: `user-${i % userCount}`,
125
+ amount: Math.floor(Math.random() * 500) + 10,
126
+ status: statuses[i % statuses.length],
127
+ items: Math.floor(Math.random() * 10) + 1,
128
+ });
129
+ }
130
+ return orders;
131
+ }
132
+
133
+ export async function runE2EBenchmarks(): Promise<void> {
134
+ // Parse-only benchmarks
135
+ const parseSuite = new BenchmarkSuite('Parse (Lexer + Parser)');
136
+
137
+ parseSuite.addSync('simple', () => {
138
+ return parse(SIMPLE_DSL);
139
+ });
140
+
141
+ parseSuite.addSync('medium', () => {
142
+ return parse(MEDIUM_DSL);
143
+ });
144
+
145
+ parseSuite.addSync('complex', () => {
146
+ return parse(COMPLEX_DSL);
147
+ });
148
+
149
+ parseSuite.addSync('expression-heavy', () => {
150
+ return parse(EXPRESSION_HEAVY_DSL);
151
+ });
152
+
153
+ parseSuite.addSync('match-heavy', () => {
154
+ return parse(MATCH_HEAVY_DSL);
155
+ });
156
+
157
+ const largeDsl20 = generateLargeDSL(20);
158
+ parseSuite.addSync('large-20-actions', () => {
159
+ return parse(largeDsl20);
160
+ }, { iterations: 500 });
161
+
162
+ parseSuite.print();
163
+
164
+ // Execution benchmarks with pre-populated stores
165
+ const execSuite = new BenchmarkSuite('Execute (with pre-populated stores)');
166
+
167
+ // Small dataset (100 items)
168
+ const smallUsers = generateUsers(100);
169
+ const smallOrders = generateOrders(200, 100);
170
+
171
+ await execSuite.addAsync('store-processing-100-items', async () => {
172
+ const inputStore = new MemoryStore('input');
173
+ for (const user of smallUsers) {
174
+ await inputStore.set(user.id as string, user);
175
+ }
176
+
177
+ const outputStore = new MemoryStore('output');
178
+
179
+ await execute(STORE_ONLY_DSL, {
180
+ dryRun: true,
181
+ stores: {
182
+ input: inputStore,
183
+ output: outputStore,
184
+ },
185
+ });
186
+ }, { iterations: 100, warmupIterations: 10 });
187
+
188
+ // Medium dataset (500 items)
189
+ const mediumUsers = generateUsers(500);
190
+ const mediumOrders = generateOrders(1000, 500);
191
+
192
+ await execSuite.addAsync('store-processing-500-items', async () => {
193
+ const inputStore = new MemoryStore('input');
194
+ for (const user of mediumUsers) {
195
+ await inputStore.set(user.id as string, user);
196
+ }
197
+
198
+ const outputStore = new MemoryStore('output');
199
+
200
+ await execute(STORE_ONLY_DSL, {
201
+ dryRun: true,
202
+ stores: {
203
+ input: inputStore,
204
+ output: outputStore,
205
+ },
206
+ });
207
+ }, { iterations: 50, warmupIterations: 5 });
208
+
209
+ // Complex processing with multiple stores
210
+ await execSuite.addAsync('complex-processing-100-users-200-orders', async () => {
211
+ const usersStore = new MemoryStore('users');
212
+ const ordersStore = new MemoryStore('orders');
213
+ const reportsStore = new MemoryStore('reports');
214
+
215
+ for (const user of smallUsers) {
216
+ await usersStore.set(user.id as string, user);
217
+ }
218
+ for (const order of smallOrders) {
219
+ await ordersStore.set(order.id as string, order);
220
+ }
221
+
222
+ await execute(COMPLEX_STORE_DSL, {
223
+ dryRun: true,
224
+ stores: {
225
+ users: usersStore,
226
+ orders: ordersStore,
227
+ reports: reportsStore,
228
+ },
229
+ });
230
+ }, { iterations: 50, warmupIterations: 5 });
231
+
232
+ await execSuite.addAsync('complex-processing-500-users-1000-orders', async () => {
233
+ const usersStore = new MemoryStore('users');
234
+ const ordersStore = new MemoryStore('orders');
235
+ const reportsStore = new MemoryStore('reports');
236
+
237
+ for (const user of mediumUsers) {
238
+ await usersStore.set(user.id as string, user);
239
+ }
240
+ for (const order of mediumOrders) {
241
+ await ordersStore.set(order.id as string, order);
242
+ }
243
+
244
+ await execute(COMPLEX_STORE_DSL, {
245
+ dryRun: true,
246
+ stores: {
247
+ users: usersStore,
248
+ orders: ordersStore,
249
+ reports: reportsStore,
250
+ },
251
+ });
252
+ }, { iterations: 20, warmupIterations: 3 });
253
+
254
+ execSuite.print();
255
+
256
+ // Executor instantiation benchmarks
257
+ const executorSuite = new BenchmarkSuite('MissionExecutor Instantiation');
258
+
259
+ executorSuite.addSync('basic-config', () => {
260
+ return new MissionExecutor({});
261
+ });
262
+
263
+ executorSuite.addSync('full-config', () => {
264
+ return new MissionExecutor({
265
+ dryRun: true,
266
+ verbose: false,
267
+ stores: {},
268
+ auth: { api: { type: 'bearer', token: 'test' } },
269
+ });
270
+ });
271
+
272
+ executorSuite.addSync('with-stores', () => {
273
+ return new MissionExecutor({
274
+ stores: {
275
+ store1: new MemoryStore('store1'),
276
+ store2: new MemoryStore('store2'),
277
+ store3: new MemoryStore('store3'),
278
+ },
279
+ });
280
+ });
281
+
282
+ executorSuite.print();
283
+ }
284
+
285
+ // Run if executed directly
286
+ if (import.meta.url === `file://${process.argv[1]}`) {
287
+ runE2EBenchmarks().catch(console.error);
288
+ }