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,305 @@
1
+ ---
2
+ sidebar_position: 2
3
+ ---
4
+
5
+ # Cron Expressions
6
+
7
+ Reqon supports full cron expression syntax for precise scheduling.
8
+
9
+ ## Syntax
10
+
11
+ ```vague
12
+ schedule: cron "minute hour day month weekday"
13
+ ```
14
+
15
+ ## Field Reference
16
+
17
+ | Field | Values | Special Characters |
18
+ |-------|--------|-------------------|
19
+ | Minute | 0-59 | * , - / |
20
+ | Hour | 0-23 | * , - / |
21
+ | Day of Month | 1-31 | * , - / |
22
+ | Month | 1-12 | * , - / |
23
+ | Day of Week | 0-6 (0=Sunday) | * , - / |
24
+
25
+ ## Special Characters
26
+
27
+ | Character | Meaning | Example |
28
+ |-----------|---------|---------|
29
+ | `*` | Any value | `* * * * *` = every minute |
30
+ | `,` | Value list | `0,30 * * * *` = minute 0 and 30 |
31
+ | `-` | Range | `0 9-17 * * *` = 9am to 5pm |
32
+ | `/` | Step | `*/15 * * * *` = every 15 minutes |
33
+
34
+ ## Common Patterns
35
+
36
+ ### Every Minute
37
+
38
+ ```vague
39
+ schedule: cron "* * * * *"
40
+ ```
41
+
42
+ ### Every Hour
43
+
44
+ ```vague
45
+ // At minute 0
46
+ schedule: cron "0 * * * *"
47
+ ```
48
+
49
+ ### Every N Minutes
50
+
51
+ ```vague
52
+ // Every 5 minutes
53
+ schedule: cron "*/5 * * * *"
54
+
55
+ // Every 15 minutes
56
+ schedule: cron "*/15 * * * *"
57
+
58
+ // Every 30 minutes
59
+ schedule: cron "*/30 * * * *"
60
+ ```
61
+
62
+ ### Every N Hours
63
+
64
+ ```vague
65
+ // Every 2 hours
66
+ schedule: cron "0 */2 * * *"
67
+
68
+ // Every 6 hours
69
+ schedule: cron "0 */6 * * *"
70
+
71
+ // Every 12 hours
72
+ schedule: cron "0 */12 * * *"
73
+ ```
74
+
75
+ ### Daily
76
+
77
+ ```vague
78
+ // At midnight
79
+ schedule: cron "0 0 * * *"
80
+
81
+ // At 6am
82
+ schedule: cron "0 6 * * *"
83
+
84
+ // At 9am
85
+ schedule: cron "0 9 * * *"
86
+
87
+ // At 11pm
88
+ schedule: cron "0 23 * * *"
89
+ ```
90
+
91
+ ### Multiple Times Per Day
92
+
93
+ ```vague
94
+ // At 9am and 5pm
95
+ schedule: cron "0 9,17 * * *"
96
+
97
+ // At midnight, 8am, 4pm
98
+ schedule: cron "0 0,8,16 * * *"
99
+ ```
100
+
101
+ ### Weekly
102
+
103
+ ```vague
104
+ // Every Sunday at midnight
105
+ schedule: cron "0 0 * * 0"
106
+
107
+ // Every Monday at 9am
108
+ schedule: cron "0 9 * * 1"
109
+
110
+ // Every Friday at 5pm
111
+ schedule: cron "0 17 * * 5"
112
+ ```
113
+
114
+ ### Weekdays Only
115
+
116
+ ```vague
117
+ // Weekdays at 9am
118
+ schedule: cron "0 9 * * 1-5"
119
+
120
+ // Weekdays every hour during business hours
121
+ schedule: cron "0 9-17 * * 1-5"
122
+ ```
123
+
124
+ ### Weekends Only
125
+
126
+ ```vague
127
+ // Weekends at noon
128
+ schedule: cron "0 12 * * 0,6"
129
+ ```
130
+
131
+ ### Monthly
132
+
133
+ ```vague
134
+ // First of month at midnight
135
+ schedule: cron "0 0 1 * *"
136
+
137
+ // First of month at 6am
138
+ schedule: cron "0 6 1 * *"
139
+
140
+ // 15th of month at noon
141
+ schedule: cron "0 12 15 * *"
142
+
143
+ // Last day approach: run on 28th
144
+ schedule: cron "0 0 28 * *"
145
+ ```
146
+
147
+ ### Quarterly
148
+
149
+ ```vague
150
+ // First day of quarter at 6am
151
+ schedule: cron "0 6 1 1,4,7,10 *"
152
+ ```
153
+
154
+ ### Yearly
155
+
156
+ ```vague
157
+ // January 1st at midnight
158
+ schedule: cron "0 0 1 1 *"
159
+
160
+ // First Monday of year (approximate)
161
+ schedule: cron "0 9 1-7 1 1"
162
+ ```
163
+
164
+ ## Complex Examples
165
+
166
+ ### Business Hours Only
167
+
168
+ ```vague
169
+ // Every 30 minutes, 9am-5pm, weekdays
170
+ schedule: cron "*/30 9-17 * * 1-5"
171
+ ```
172
+
173
+ ### Night Batch Jobs
174
+
175
+ ```vague
176
+ // At 2am every day
177
+ schedule: cron "0 2 * * *"
178
+ ```
179
+
180
+ ### Multiple Specific Times
181
+
182
+ ```vague
183
+ // 8am, 12pm, 6pm every day
184
+ schedule: cron "0 8,12,18 * * *"
185
+ ```
186
+
187
+ ### End of Month (Approximation)
188
+
189
+ ```vague
190
+ // 28th of every month
191
+ schedule: cron "0 0 28 * *"
192
+ ```
193
+
194
+ ## Timezone Handling
195
+
196
+ Cron expressions use the system timezone by default.
197
+
198
+ ### Specify Timezone
199
+
200
+ ```vague
201
+ mission TimezoneSync {
202
+ schedule: cron "0 9 * * *"
203
+ timezone: "America/New_York"
204
+ }
205
+ ```
206
+
207
+ ### UTC
208
+
209
+ ```vague
210
+ mission UTCSync {
211
+ schedule: cron "0 9 * * *"
212
+ timezone: "UTC"
213
+ }
214
+ ```
215
+
216
+ ## Testing Cron Expressions
217
+
218
+ ### Dry Run
219
+
220
+ ```bash
221
+ reqon ./mission.vague --dry-run
222
+ # Shows: Next run at: 2024-01-20 09:00:00
223
+ ```
224
+
225
+ ### Validate Expression
226
+
227
+ ```bash
228
+ reqon --validate-cron "0 9 * * *"
229
+ # Valid cron expression
230
+ # Next 5 runs:
231
+ # 2024-01-20 09:00:00
232
+ # 2024-01-21 09:00:00
233
+ # 2024-01-22 09:00:00
234
+ # 2024-01-23 09:00:00
235
+ # 2024-01-24 09:00:00
236
+ ```
237
+
238
+ ## Best Practices
239
+
240
+ ### Avoid Midnight
241
+
242
+ Many systems run jobs at midnight, causing load spikes:
243
+
244
+ ```vague
245
+ // Instead of 0 0 * * *
246
+ schedule: cron "0 3 * * *" // 3am
247
+ ```
248
+
249
+ ### Spread Load
250
+
251
+ Stagger related jobs:
252
+
253
+ ```vague
254
+ mission SyncCustomers {
255
+ schedule: cron "0 * * * *" // On the hour
256
+ }
257
+
258
+ mission SyncOrders {
259
+ schedule: cron "15 * * * *" // 15 past
260
+ }
261
+
262
+ mission SyncProducts {
263
+ schedule: cron "30 * * * *" // 30 past
264
+ }
265
+ ```
266
+
267
+ ### Consider Execution Time
268
+
269
+ Account for job duration:
270
+
271
+ ```vague
272
+ // If job takes 10 minutes, don't schedule every 5
273
+ schedule: cron "*/15 * * * *" // Every 15 minutes
274
+
275
+ // Or use skipIfRunning
276
+ skipIfRunning: true
277
+ ```
278
+
279
+ ## Troubleshooting
280
+
281
+ ### Wrong Times
282
+
283
+ Check timezone settings:
284
+
285
+ ```bash
286
+ date # System time
287
+ TZ=UTC date # UTC time
288
+ ```
289
+
290
+ ### Missed Runs
291
+
292
+ If daemon was down, jobs don't backfill. Consider:
293
+
294
+ ```vague
295
+ retryOnFailure: { maxAttempts: 3 }
296
+ ```
297
+
298
+ ### Expression Errors
299
+
300
+ Validate syntax:
301
+
302
+ ```bash
303
+ reqon --validate-cron "invalid"
304
+ # Error: Invalid cron expression
305
+ ```
@@ -0,0 +1,317 @@
1
+ ---
2
+ sidebar_position: 4
3
+ ---
4
+
5
+ # Daemon Mode
6
+
7
+ Daemon mode runs Reqon as a long-running service, executing scheduled missions automatically.
8
+
9
+ ## Starting the Daemon
10
+
11
+ ```bash
12
+ reqon ./missions/ --daemon
13
+ ```
14
+
15
+ ## How It Works
16
+
17
+ 1. Daemon loads all missions from the specified path
18
+ 2. Parses schedule configurations
19
+ 3. Runs missions according to their schedules
20
+ 4. Continues until stopped
21
+
22
+ ## Command Options
23
+
24
+ ```bash
25
+ reqon ./missions/ --daemon [options]
26
+
27
+ Options:
28
+ --auth <file> Credentials file
29
+ --verbose Enable detailed logging
30
+ --check-interval How often to check schedules (default: 1000ms)
31
+ ```
32
+
33
+ ## Example Setup
34
+
35
+ ### Mission Files
36
+
37
+ ```
38
+ missions/
39
+ ├── sync-customers.vague
40
+ ├── sync-orders.vague
41
+ └── daily-report.vague
42
+ ```
43
+
44
+ ### sync-customers.vague
45
+
46
+ ```vague
47
+ mission SyncCustomers {
48
+ schedule: every 15 minutes
49
+
50
+ source API { auth: bearer, base: "https://api.example.com" }
51
+ store customers: file("customers")
52
+
53
+ action Sync {
54
+ get "/customers" { since: lastSync }
55
+ store response -> customers { key: .id, upsert: true }
56
+ }
57
+
58
+ run Sync
59
+ }
60
+ ```
61
+
62
+ ### Running
63
+
64
+ ```bash
65
+ reqon ./missions/ --daemon --auth ./credentials.json --verbose
66
+ ```
67
+
68
+ ## Process Management
69
+
70
+ ### Foreground
71
+
72
+ ```bash
73
+ reqon ./missions/ --daemon
74
+ ```
75
+
76
+ Press Ctrl+C to stop.
77
+
78
+ ### Background (Linux)
79
+
80
+ ```bash
81
+ nohup reqon ./missions/ --daemon > reqon.log 2>&1 &
82
+ ```
83
+
84
+ ### Systemd Service
85
+
86
+ Create `/etc/systemd/system/reqon.service`:
87
+
88
+ ```ini
89
+ [Unit]
90
+ Description=Reqon Data Sync Daemon
91
+ After=network.target
92
+
93
+ [Service]
94
+ Type=simple
95
+ User=reqon
96
+ WorkingDirectory=/opt/reqon
97
+ ExecStart=/usr/bin/npx reqon ./missions/ --daemon --auth ./credentials.json
98
+ Restart=on-failure
99
+ RestartSec=10
100
+
101
+ [Install]
102
+ WantedBy=multi-user.target
103
+ ```
104
+
105
+ Enable and start:
106
+
107
+ ```bash
108
+ sudo systemctl enable reqon
109
+ sudo systemctl start reqon
110
+ ```
111
+
112
+ ### Docker
113
+
114
+ Dockerfile:
115
+
116
+ ```dockerfile
117
+ FROM node:20-alpine
118
+
119
+ WORKDIR /app
120
+ COPY package*.json ./
121
+ RUN npm install
122
+
123
+ COPY . .
124
+
125
+ CMD ["npx", "reqon", "./missions/", "--daemon"]
126
+ ```
127
+
128
+ docker-compose.yml:
129
+
130
+ ```yaml
131
+ version: '3'
132
+ services:
133
+ reqon:
134
+ build: .
135
+ volumes:
136
+ - ./missions:/app/missions
137
+ - ./credentials.json:/app/credentials.json
138
+ - reqon-data:/app/.vague-data
139
+ environment:
140
+ - NODE_ENV=production
141
+ restart: unless-stopped
142
+
143
+ volumes:
144
+ reqon-data:
145
+ ```
146
+
147
+ ## Graceful Shutdown
148
+
149
+ Reqon handles SIGINT and SIGTERM:
150
+
151
+ 1. Stops accepting new runs
152
+ 2. Waits for in-progress missions to complete
153
+ 3. Saves state
154
+ 4. Exits cleanly
155
+
156
+ ```bash
157
+ # Graceful stop
158
+ kill -TERM $(pgrep -f "reqon.*daemon")
159
+
160
+ # Or with systemd
161
+ systemctl stop reqon
162
+ ```
163
+
164
+ ## Health Checks
165
+
166
+ ### Status Endpoint
167
+
168
+ Enable HTTP health endpoint:
169
+
170
+ ```bash
171
+ reqon ./missions/ --daemon --health-port 8080
172
+ ```
173
+
174
+ Check health:
175
+
176
+ ```bash
177
+ curl http://localhost:8080/health
178
+ # {"status":"ok","uptime":3600,"missionsLoaded":3}
179
+ ```
180
+
181
+ ### File-Based Health
182
+
183
+ ```vague
184
+ mission HealthCheck {
185
+ schedule: every 1 minute
186
+
187
+ action Check {
188
+ store { status: "ok", timestamp: now() } -> health
189
+ }
190
+ }
191
+ ```
192
+
193
+ Monitor the health store file.
194
+
195
+ ## Logging
196
+
197
+ ### Log Levels
198
+
199
+ ```bash
200
+ # Default logging
201
+ reqon ./missions/ --daemon
202
+
203
+ # Verbose logging
204
+ reqon ./missions/ --daemon --verbose
205
+
206
+ # Environment variable
207
+ REQON_LOG_LEVEL=debug reqon ./missions/ --daemon
208
+ ```
209
+
210
+ ### Log Output
211
+
212
+ ```
213
+ [2024-01-20 09:00:00] [INFO] Starting Reqon daemon
214
+ [2024-01-20 09:00:00] [INFO] Loaded 3 missions
215
+ [2024-01-20 09:00:00] [INFO] SyncCustomers: Next run at 09:15:00
216
+ [2024-01-20 09:00:00] [INFO] SyncOrders: Next run at 09:05:00
217
+ [2024-01-20 09:00:00] [INFO] DailyReport: Next run at 2024-01-21 00:00:00
218
+ [2024-01-20 09:05:00] [INFO] SyncOrders: Starting run
219
+ [2024-01-20 09:05:02] [INFO] SyncOrders: Completed (2.1s)
220
+ ```
221
+
222
+ ### Structured Logging
223
+
224
+ ```bash
225
+ REQON_LOG_FORMAT=json reqon ./missions/ --daemon
226
+ ```
227
+
228
+ ```json
229
+ {"timestamp":"2024-01-20T09:00:00Z","level":"info","message":"Starting run","mission":"SyncCustomers"}
230
+ ```
231
+
232
+ ## Monitoring
233
+
234
+ ### Metrics
235
+
236
+ Export metrics with `--metrics-port`:
237
+
238
+ ```bash
239
+ reqon ./missions/ --daemon --metrics-port 9090
240
+ ```
241
+
242
+ Prometheus format:
243
+
244
+ ```
245
+ # HELP reqon_mission_runs_total Total mission runs
246
+ reqon_mission_runs_total{mission="SyncCustomers",status="success"} 142
247
+ reqon_mission_runs_total{mission="SyncCustomers",status="failure"} 3
248
+
249
+ # HELP reqon_mission_duration_seconds Mission run duration
250
+ reqon_mission_duration_seconds{mission="SyncCustomers",quantile="0.5"} 2.1
251
+ ```
252
+
253
+ ### Alerting
254
+
255
+ Create alerting rules:
256
+
257
+ ```yaml
258
+ groups:
259
+ - name: reqon
260
+ rules:
261
+ - alert: ReqonMissionFailing
262
+ expr: rate(reqon_mission_runs_total{status="failure"}[5m]) > 0.1
263
+ for: 10m
264
+ labels:
265
+ severity: warning
266
+ annotations:
267
+ summary: "Mission {{ $labels.mission }} is failing"
268
+ ```
269
+
270
+ ## Best Practices
271
+
272
+ ### Use Separate Credentials
273
+
274
+ ```bash
275
+ # Production credentials
276
+ reqon ./missions/ --daemon --auth ./prod-credentials.json
277
+ ```
278
+
279
+ ### Run as Non-Root
280
+
281
+ ```bash
282
+ # Create dedicated user
283
+ useradd -r -s /bin/false reqon
284
+
285
+ # Run as that user
286
+ sudo -u reqon reqon ./missions/ --daemon
287
+ ```
288
+
289
+ ### Persistent Storage
290
+
291
+ Ensure `.vague-data` is on persistent storage:
292
+
293
+ ```yaml
294
+ volumes:
295
+ - /var/lib/reqon:/app/.vague-data
296
+ ```
297
+
298
+ ### Health Monitoring
299
+
300
+ Always enable health checks:
301
+
302
+ ```bash
303
+ reqon ./missions/ --daemon --health-port 8080
304
+ ```
305
+
306
+ ### Log Rotation
307
+
308
+ ```bash
309
+ # Use logrotate
310
+ /var/log/reqon/*.log {
311
+ daily
312
+ rotate 7
313
+ compress
314
+ missingok
315
+ notifempty
316
+ }
317
+ ```