@sixb/core 0.1.1 → 0.1.3
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.
- package/README.md +31 -20
- package/dist/actions/commit-edits.d.ts +0 -2
- package/dist/actions/commit-edits.d.ts.map +1 -1
- package/dist/actions/execution.d.ts +21 -0
- package/dist/actions/execution.d.ts.map +1 -0
- package/dist/actions/index.d.ts +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +38 -24
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/registry.d.ts +16 -7
- package/dist/actions/registry.d.ts.map +1 -1
- package/dist/actions/request.d.ts +3 -2
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-dispatch.d.ts +21 -0
- package/dist/actions/run-dispatch.d.ts.map +1 -0
- package/dist/actions/types/context.d.ts +2 -2
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validation.d.ts +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +7 -7
- package/dist/actions/worker.js.map +1 -1
- package/dist/agents/adapters.d.ts +21 -1
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +31 -0
- package/dist/agents/authority.d.ts.map +1 -0
- package/dist/agents/context.js +2 -2
- package/dist/agents/dispatch.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +2 -2
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +48 -0
- package/dist/agents/execution.d.ts.map +1 -0
- package/dist/agents/index.d.ts +12 -9
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +77 -18
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/prompt.d.ts +8 -2
- package/dist/agents/prompt.d.ts.map +1 -1
- package/dist/agents/request.d.ts +6 -2
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/streams.d.ts +29 -3
- package/dist/agents/streams.d.ts.map +1 -1
- package/dist/agents/streams.js +22 -3
- package/dist/agents/streams.js.map +1 -1
- package/dist/agents/thread-context-projection.d.ts +19 -0
- package/dist/agents/thread-context-projection.d.ts.map +1 -0
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/tool-result.d.ts +6 -0
- package/dist/agents/tool-result.d.ts.map +1 -0
- package/dist/agents/types.d.ts +39 -3
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +3 -3
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/auth/attribution.d.ts +17 -0
- package/dist/auth/attribution.d.ts.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +11 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +4 -4
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +24 -11
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +2 -1
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +8 -4
- package/dist/authorization/index.js.map +1 -1
- package/dist/blob-storage/browser.js +2 -2
- package/dist/blob-storage/execution.d.ts +16 -0
- package/dist/blob-storage/execution.d.ts.map +1 -0
- package/dist/blob-storage/index.js +3 -3
- package/dist/bootstrap/discovery.d.ts +90 -24
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +63 -60
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/in-memory.d.ts.map +1 -1
- package/dist/broker/index.js +2 -2
- package/dist/broker/types.d.ts +5 -0
- package/dist/broker/types.d.ts.map +1 -1
- package/dist/chunk-0172wgm9.js +333 -0
- package/dist/chunk-0172wgm9.js.map +11 -0
- package/dist/chunk-177ed2mp.js +3118 -0
- package/dist/chunk-177ed2mp.js.map +46 -0
- package/dist/chunk-1ywq4hzk.js +607 -0
- package/dist/chunk-1ywq4hzk.js.map +14 -0
- package/dist/chunk-261ag4t4.js +252 -0
- package/dist/chunk-261ag4t4.js.map +12 -0
- package/dist/{chunk-y2ygpd0m.js → chunk-3j7573mj.js} +2 -2
- package/dist/{chunk-y2ygpd0m.js.map → chunk-3j7573mj.js.map} +2 -2
- package/dist/{chunk-p7vj8xgb.js → chunk-3rsf30p4.js} +81 -58
- package/dist/chunk-3rsf30p4.js.map +35 -0
- package/dist/chunk-4aw0jwk0.js +118 -0
- package/dist/chunk-4aw0jwk0.js.map +10 -0
- package/dist/{chunk-md9jbrm9.js → chunk-4gz41why.js} +1 -1
- package/dist/chunk-4p9rh7jj.js +164 -0
- package/dist/chunk-4p9rh7jj.js.map +12 -0
- package/dist/chunk-4z3n1dzt.js +1206 -0
- package/dist/chunk-4z3n1dzt.js.map +23 -0
- package/dist/chunk-5gd7tpv6.js +28 -0
- package/dist/chunk-5gd7tpv6.js.map +11 -0
- package/dist/{chunk-867jxh7c.js → chunk-5sz8ta9r.js} +6 -295
- package/dist/chunk-5sz8ta9r.js.map +16 -0
- package/dist/chunk-62c7t4jc.js +27 -0
- package/dist/chunk-62c7t4jc.js.map +11 -0
- package/dist/chunk-63te770v.js.map +1 -1
- package/dist/{chunk-xz5g49bp.js → chunk-6gjqgd3d.js} +3 -1
- package/dist/chunk-6gjqgd3d.js.map +11 -0
- package/dist/{chunk-6rzdtvn5.js → chunk-8b55ygje.js} +1 -1
- package/dist/chunk-8m5ejdpn.js +33 -0
- package/dist/chunk-8m5ejdpn.js.map +10 -0
- package/dist/chunk-96swp2wd.js +47 -0
- package/dist/chunk-96swp2wd.js.map +10 -0
- package/dist/chunk-979ww6b3.js +298 -0
- package/dist/chunk-979ww6b3.js.map +12 -0
- package/dist/{chunk-ya6brh8a.js → chunk-9t8f5xfx.js} +10 -5
- package/dist/chunk-9t8f5xfx.js.map +11 -0
- package/dist/{chunk-r82k4z7z.js → chunk-a31h57d5.js} +2 -2
- package/dist/{chunk-t72dvahb.js → chunk-bhxaq2nn.js} +61 -44
- package/dist/chunk-bhxaq2nn.js.map +12 -0
- package/dist/chunk-bv41fmjn.js +3294 -0
- package/dist/chunk-bv41fmjn.js.map +35 -0
- package/dist/chunk-c6cfqydk.js +128 -0
- package/dist/chunk-c6cfqydk.js.map +13 -0
- package/dist/chunk-c8bw2b6c.js +317 -0
- package/dist/chunk-c8bw2b6c.js.map +11 -0
- package/dist/{chunk-qzyemcj7.js → chunk-ckxfnx7f.js} +2 -2
- package/dist/chunk-cy0n5dms.js +27 -0
- package/dist/chunk-cy0n5dms.js.map +11 -0
- package/dist/{chunk-xt6qx9sh.js → chunk-d2adj15j.js} +91 -9
- package/dist/chunk-d2adj15j.js.map +37 -0
- package/dist/{chunk-avppcgt6.js → chunk-d6y2wsfg.js} +241 -144
- package/dist/chunk-d6y2wsfg.js.map +15 -0
- package/dist/chunk-dsrkgtnh.js +50 -0
- package/dist/chunk-dsrkgtnh.js.map +10 -0
- package/dist/{chunk-50kv63vj.js → chunk-dysw7nsm.js} +118 -26
- package/dist/chunk-dysw7nsm.js.map +14 -0
- package/dist/{chunk-rjqm6ksg.js → chunk-ettb0cy4.js} +725 -266
- package/dist/chunk-ettb0cy4.js.map +45 -0
- package/dist/chunk-ezake7g1.js +32 -0
- package/dist/chunk-ezake7g1.js.map +11 -0
- package/dist/{chunk-b1bqvhpe.js → chunk-f1cyvnrk.js} +14 -34
- package/dist/chunk-f1cyvnrk.js.map +13 -0
- package/dist/{chunk-yn947ck3.js → chunk-f2rt4vkh.js} +48 -29
- package/dist/chunk-f2rt4vkh.js.map +14 -0
- package/dist/{chunk-hb9xcx9c.js → chunk-fmx1sz2h.js} +117 -56
- package/dist/chunk-fmx1sz2h.js.map +15 -0
- package/dist/{chunk-f6kyyeef.js → chunk-ghteq96b.js} +8 -8
- package/dist/{chunk-f6kyyeef.js.map → chunk-ghteq96b.js.map} +4 -4
- package/dist/chunk-h9kxd41f.js +271 -0
- package/dist/chunk-h9kxd41f.js.map +11 -0
- package/dist/chunk-htq0qh7z.js +59 -0
- package/dist/chunk-htq0qh7z.js.map +11 -0
- package/dist/chunk-km4rkj4t.js +402 -0
- package/dist/chunk-km4rkj4t.js.map +14 -0
- package/dist/chunk-kqxgf6kv.js +898 -0
- package/dist/chunk-kqxgf6kv.js.map +15 -0
- package/dist/chunk-n5x5y80a.js +137 -0
- package/dist/chunk-n5x5y80a.js.map +10 -0
- package/dist/chunk-nf4r78r4.js +44 -0
- package/dist/chunk-nf4r78r4.js.map +10 -0
- package/dist/chunk-pxtrxm3p.js +55 -0
- package/dist/chunk-pxtrxm3p.js.map +11 -0
- package/dist/chunk-qer6am8w.js +133 -0
- package/dist/chunk-qer6am8w.js.map +11 -0
- package/dist/{chunk-sb0shdvv.js → chunk-rdeagz6b.js} +3 -3
- package/dist/{chunk-sb0shdvv.js.map → chunk-rdeagz6b.js.map} +3 -3
- package/dist/chunk-rhrbz7d4.js +36 -0
- package/dist/chunk-rhrbz7d4.js.map +10 -0
- package/dist/{chunk-53s4asfm.js → chunk-rnshztfq.js} +2 -2
- package/dist/chunk-t0jjkep3.js +35 -0
- package/dist/chunk-t0jjkep3.js.map +10 -0
- package/dist/{chunk-be9vm29v.js → chunk-t8t39h7v.js} +1 -1
- package/dist/{chunk-be9vm29v.js.map → chunk-t8t39h7v.js.map} +3 -3
- package/dist/chunk-t9xghkva.js +28 -0
- package/dist/chunk-t9xghkva.js.map +10 -0
- package/dist/{chunk-nbywkytr.js → chunk-ttba8x6z.js} +13 -33
- package/dist/chunk-ttba8x6z.js.map +15 -0
- package/dist/{chunk-8kv2sez0.js → chunk-vybf6pkp.js} +1 -1
- package/dist/chunk-wb4051cx.js +404 -0
- package/dist/chunk-wb4051cx.js.map +12 -0
- package/dist/{chunk-4tvj3ate.js → chunk-wtmzkcht.js} +4 -3
- package/dist/chunk-wtmzkcht.js.map +11 -0
- package/dist/{chunk-xqbtf4wn.js → chunk-xc7hq65b.js} +5 -3
- package/dist/{chunk-xqbtf4wn.js.map → chunk-xc7hq65b.js.map} +3 -3
- package/dist/{chunk-v5c085yp.js → chunk-xhy826cz.js} +3 -2
- package/dist/chunk-xhy826cz.js.map +10 -0
- package/dist/chunk-xkthy56g.js +33 -0
- package/dist/chunk-xkthy56g.js.map +11 -0
- package/dist/{chunk-raq0x6bd.js → chunk-xmggaxg4.js} +2199 -380
- package/dist/chunk-xmggaxg4.js.map +54 -0
- package/dist/{chunk-6zrpewy4.js → chunk-z3zp0bj1.js} +1 -1
- package/dist/chunk-z8j83gzd.js +90 -0
- package/dist/chunk-z8j83gzd.js.map +10 -0
- package/dist/chunk-zcnhxkvd.js +7 -0
- package/dist/chunk-zcnhxkvd.js.map +10 -0
- package/dist/chunk-zpw39qhj.js +194 -0
- package/dist/chunk-zpw39qhj.js.map +10 -0
- package/dist/chunk-zqqz8052.js +3 -0
- package/dist/{storage/projection-runs/lifecycle.js.map → chunk-zqqz8052.js.map} +1 -1
- package/dist/{chunk-hz8m927w.js → chunk-zqysyfjt.js} +1 -1
- package/dist/connectors/builders.d.ts +2 -1
- package/dist/connectors/builders.d.ts.map +1 -1
- package/dist/connectors/connections/authorizations.d.ts +64 -0
- package/dist/connectors/connections/authorizations.d.ts.map +1 -0
- package/dist/connectors/connections/capability.d.ts +7 -0
- package/dist/connectors/connections/capability.d.ts.map +1 -0
- package/dist/connectors/connections/command-context.d.ts +23 -0
- package/dist/connectors/connections/command-context.d.ts.map +1 -0
- package/dist/connectors/connections/contracts.d.ts +127 -0
- package/dist/connectors/connections/contracts.d.ts.map +1 -0
- package/dist/connectors/connections/credential-codec.d.ts +15 -0
- package/dist/connectors/connections/credential-codec.d.ts.map +1 -0
- package/dist/connectors/connections/credential-mutations.d.ts +63 -0
- package/dist/connectors/connections/credential-mutations.d.ts.map +1 -0
- package/dist/connectors/connections/execution.d.ts +20 -0
- package/dist/connectors/connections/execution.d.ts.map +1 -0
- package/dist/connectors/connections/internal.d.ts +5 -0
- package/dist/connectors/connections/internal.d.ts.map +1 -0
- package/dist/connectors/connections/internal.js +16 -0
- package/dist/connectors/connections/internal.js.map +9 -0
- package/dist/connectors/connections/provider-operation.d.ts +7 -0
- package/dist/connectors/connections/provider-operation.d.ts.map +1 -0
- package/dist/connectors/connections/request.d.ts +84 -0
- package/dist/connectors/connections/request.d.ts.map +1 -0
- package/dist/connectors/connections/runs.d.ts +51 -0
- package/dist/connectors/connections/runs.d.ts.map +1 -0
- package/dist/connectors/connections/service.d.ts +52 -0
- package/dist/connectors/connections/service.d.ts.map +1 -0
- package/dist/connectors/connections/storage-boundary.d.ts +3 -0
- package/dist/connectors/connections/storage-boundary.d.ts.map +1 -0
- package/dist/connectors/connections/tokens.d.ts +32 -0
- package/dist/connectors/connections/tokens.d.ts.map +1 -0
- package/dist/connectors/connections/validation.d.ts +27 -0
- package/dist/connectors/connections/validation.d.ts.map +1 -0
- package/dist/connectors/connections/views.d.ts +7 -0
- package/dist/connectors/connections/views.d.ts.map +1 -0
- package/dist/connectors/credentials.d.ts +25 -0
- package/dist/connectors/credentials.d.ts.map +1 -0
- package/dist/connectors/errors.d.ts +35 -3
- package/dist/connectors/errors.d.ts.map +1 -1
- package/dist/connectors/execution.d.ts +19 -0
- package/dist/connectors/execution.d.ts.map +1 -0
- package/dist/connectors/index.d.ts +5 -3
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/service.d.ts +23 -0
- package/dist/connectors/service.d.ts.map +1 -0
- package/dist/connectors/types.d.ts +94 -2
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/datasets/execution.d.ts +8 -0
- package/dist/datasets/execution.d.ts.map +1 -0
- package/dist/error-reporting/capability.d.ts +4 -49
- package/dist/error-reporting/capability.d.ts.map +1 -1
- package/dist/error-reporting/internal.d.ts +2 -2
- package/dist/error-reporting/internal.d.ts.map +1 -1
- package/dist/error-reporting/internal.js +10 -4
- package/dist/error-reporting/internal.js.map +1 -1
- package/dist/error-reporting/reporter.d.ts +4 -1
- package/dist/error-reporting/reporter.d.ts.map +1 -1
- package/dist/error-reporting/reports.d.ts +64 -0
- package/dist/error-reporting/reports.d.ts.map +1 -0
- package/dist/error-reporting/types.d.ts +88 -34
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +141 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/internal.d.ts +68 -0
- package/dist/errors/internal.d.ts.map +1 -0
- package/dist/errors/internal.js +29 -0
- package/dist/errors/internal.js.map +9 -0
- package/dist/errors/types.d.ts +20 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/events/definitions.d.ts +0 -1
- package/dist/events/definitions.d.ts.map +1 -1
- package/dist/events/execution.d.ts +13 -0
- package/dist/events/execution.d.ts.map +1 -0
- package/dist/events/index.d.ts +3 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +10 -8
- package/dist/events/index.js.map +1 -1
- package/dist/events/outbox-dispatcher.d.ts +4 -2
- package/dist/events/outbox-dispatcher.d.ts.map +1 -1
- package/dist/events/{runtime.d.ts → service.d.ts} +13 -14
- package/dist/events/service.d.ts.map +1 -0
- package/dist/events/types/pipelines.d.ts +4 -1
- package/dist/events/types/pipelines.d.ts.map +1 -1
- package/dist/events/types/syncs.d.ts +3 -0
- package/dist/events/types/syncs.d.ts.map +1 -1
- package/dist/events/types/workflows.d.ts +4 -2
- package/dist/events/types/workflows.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +42 -0
- package/dist/execution/agent.d.ts.map +1 -0
- package/dist/execution/agent.js +73 -0
- package/dist/execution/agent.js.map +9 -0
- package/dist/execution/authorization.d.ts +60 -0
- package/dist/execution/authorization.d.ts.map +1 -0
- package/dist/execution/dispatch.d.ts +8 -0
- package/dist/execution/dispatch.d.ts.map +1 -0
- package/dist/execution/durable.d.ts +37 -0
- package/dist/execution/durable.d.ts.map +1 -0
- package/dist/execution/index.d.ts +2 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/primitive.d.ts +21 -0
- package/dist/execution/primitive.d.ts.map +1 -0
- package/dist/execution/primitive.js +91 -0
- package/dist/execution/primitive.js.map +10 -0
- package/dist/execution/request.d.ts +38 -0
- package/dist/execution/request.d.ts.map +1 -0
- package/dist/execution/request.js +100 -0
- package/dist/execution/request.js.map +10 -0
- package/dist/execution/scopes.d.ts +30 -0
- package/dist/execution/scopes.d.ts.map +1 -0
- package/dist/execution/types.d.ts +111 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/index.d.ts +31 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +133 -105
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +0 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/lake-storage/index.js +5 -5
- package/dist/logging/execution.d.ts +9 -0
- package/dist/logging/execution.d.ts.map +1 -0
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +8 -8
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/{runtime.d.ts → service.d.ts} +7 -7
- package/dist/logging/{runtime.d.ts.map → service.d.ts.map} +1 -1
- package/dist/logging/types.js +2 -2
- package/dist/materialization/events.d.ts +1 -0
- package/dist/materialization/events.d.ts.map +1 -1
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +2 -2
- package/dist/materialization/model.d.ts +30 -17
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/edits/apply.d.ts +6 -1
- package/dist/materializer/edits/apply.d.ts.map +1 -1
- package/dist/materializer/edits/commit.d.ts +2 -1
- package/dist/materializer/edits/commit.d.ts.map +1 -1
- package/dist/materializer/edits/load-state.d.ts +1 -1
- package/dist/materializer/edits/load-state.d.ts.map +1 -1
- package/dist/materializer/edits/operations.d.ts +1 -13
- package/dist/materializer/edits/operations.d.ts.map +1 -1
- package/dist/materializer/edits/plan.d.ts +2 -1
- package/dist/materializer/edits/plan.d.ts.map +1 -1
- package/dist/materializer/edits/working-state.d.ts +38 -8
- package/dist/materializer/edits/working-state.d.ts.map +1 -1
- package/dist/materializer/effective/build-events.d.ts +1 -0
- package/dist/materializer/effective/build-events.d.ts.map +1 -1
- package/dist/materializer/effective/diff.d.ts +7 -0
- package/dist/materializer/effective/diff.d.ts.map +1 -1
- package/dist/materializer/effective/load-state.d.ts +0 -2
- package/dist/materializer/effective/load-state.d.ts.map +1 -1
- package/dist/materializer/effective/resolve.d.ts +19 -2
- package/dist/materializer/effective/resolve.d.ts.map +1 -1
- package/dist/materializer/execution/commit-lifecycle.d.ts +2 -2
- package/dist/materializer/execution/commit-lifecycle.d.ts.map +1 -1
- package/dist/materializer/execution/plan-stream.d.ts.map +1 -1
- package/dist/materializer/execution/scope.d.ts +26 -0
- package/dist/materializer/execution/scope.d.ts.map +1 -0
- package/dist/materializer/execution/work-executor.d.ts.map +1 -1
- package/dist/materializer/execution/work-records.d.ts +6 -5
- package/dist/materializer/execution/work-records.d.ts.map +1 -1
- package/dist/materializer/index.d.ts +2 -2
- package/dist/materializer/index.d.ts.map +1 -1
- package/dist/materializer/index.js +33 -18
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/materializer.d.ts +37 -5
- package/dist/materializer/materializer.d.ts.map +1 -1
- package/dist/materializer/projections/finish-run.d.ts +2 -1
- package/dist/materializer/projections/finish-run.d.ts.map +1 -1
- package/dist/materializer/projections/replace.d.ts +2 -1
- package/dist/materializer/projections/replace.d.ts.map +1 -1
- package/dist/materializer/projections/replacement-plan.d.ts +1 -0
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
- package/dist/materializer/shared/batching.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/materializer/telemetry/append.d.ts +2 -1
- package/dist/materializer/telemetry/append.d.ts.map +1 -1
- package/dist/materializer/telemetry/plan.d.ts +7 -1
- package/dist/materializer/telemetry/plan.d.ts.map +1 -1
- package/dist/objects/action/request.d.ts +3 -3
- package/dist/objects/action/request.d.ts.map +1 -1
- package/dist/objects/context/index.d.ts +1 -1
- package/dist/objects/context/index.d.ts.map +1 -1
- package/dist/objects/context/types.d.ts +5 -0
- package/dist/objects/context/types.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +100 -0
- package/dist/objects/execution.d.ts.map +1 -0
- package/dist/objects/index.js +40 -24
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/materializer-adapter.d.ts +1 -1
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/query/executor.d.ts +3 -8
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.d.ts +2 -2
- package/dist/objects/query/index.d.ts.map +1 -1
- package/dist/objects/query/index.js +9 -13
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/planner.d.ts +0 -3
- package/dist/objects/query/planner.d.ts.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts +2 -2
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts +2 -0
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.d.ts +2 -0
- package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
- package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
- package/dist/objects/service/action-service.d.ts +3 -2
- package/dist/objects/service/action-service.d.ts.map +1 -1
- package/dist/objects/service/list-service.d.ts +1 -1
- package/dist/objects/telemetry/history.d.ts +2 -0
- package/dist/objects/telemetry/history.d.ts.map +1 -1
- package/dist/objects/telemetry/write-batch.d.ts.map +1 -1
- package/dist/ontology/index.d.ts +1 -1
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +5 -5
- package/dist/ontology/internal.js +4 -4
- package/dist/ontology/registry.d.ts +15 -2
- package/dist/ontology/registry.d.ts.map +1 -1
- package/dist/pipelines/execution.d.ts +19 -0
- package/dist/pipelines/execution.d.ts.map +1 -0
- package/dist/pipelines/index.d.ts +1 -0
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +68 -0
- package/dist/pipelines/index.js.map +9 -0
- package/dist/pipelines/request.d.ts +6 -9
- package/dist/pipelines/request.d.ts.map +1 -1
- package/dist/pipelines/run-dispatch.d.ts +47 -0
- package/dist/pipelines/run-dispatch.d.ts.map +1 -0
- package/dist/projections/builders.d.ts +19 -8
- package/dist/projections/builders.d.ts.map +1 -1
- package/dist/projections/capability.d.ts +7 -0
- package/dist/projections/capability.d.ts.map +1 -0
- package/dist/projections/execution.d.ts +19 -0
- package/dist/projections/execution.d.ts.map +1 -0
- package/dist/projections/index.d.ts +5 -2
- package/dist/projections/index.d.ts.map +1 -1
- package/dist/projections/internal.d.ts +8 -11
- package/dist/projections/internal.d.ts.map +1 -1
- package/dist/projections/internal.js +48 -6
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/ownership.d.ts +2 -2
- package/dist/projections/ownership.d.ts.map +1 -1
- package/dist/projections/registry.d.ts +21 -11
- package/dist/projections/registry.d.ts.map +1 -1
- package/dist/projections/revision.d.ts +2 -2
- package/dist/projections/revision.d.ts.map +1 -1
- package/dist/projections/run-dispatch.d.ts +37 -0
- package/dist/projections/run-dispatch.d.ts.map +1 -0
- package/dist/projections/run-id.d.ts +3 -0
- package/dist/projections/run-id.d.ts.map +1 -0
- package/dist/projections/timestamp.d.ts +3 -0
- package/dist/projections/timestamp.d.ts.map +1 -0
- package/dist/projections/types.d.ts +12 -0
- package/dist/projections/types.d.ts.map +1 -1
- package/dist/projections/validation.d.ts +2 -2
- package/dist/projections/validation.d.ts.map +1 -1
- package/dist/queues/in-memory.d.ts +11 -10
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +1 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +59 -42
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/rules/execution.d.ts +14 -0
- package/dist/rules/execution.d.ts.map +1 -0
- package/dist/rules/index.d.ts +1 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/validation.d.ts +1 -2
- package/dist/rules/validation.d.ts.map +1 -1
- package/dist/runtime/ai-cost.d.ts +8 -0
- package/dist/runtime/ai-cost.d.ts.map +1 -0
- package/dist/runtime/ai-usage.d.ts +8 -0
- package/dist/runtime/ai-usage.d.ts.map +1 -0
- package/dist/runtime/create.d.ts +7 -5
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +35 -0
- package/dist/runtime/definitions.d.ts.map +1 -0
- package/dist/runtime/host.d.ts +123 -0
- package/dist/runtime/host.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +6 -5
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +4 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +6 -2
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/ontology-mutations.d.ts +4 -2
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts +42 -0
- package/dist/runtime/resolve-definitions.d.ts.map +1 -0
- package/dist/runtime/sixb.d.ts +43 -219
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +16 -216
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +3 -6
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/runtime.d.ts +7 -2
- package/dist/scheduler/runtime.d.ts.map +1 -1
- package/dist/schedules/execution.d.ts +6 -0
- package/dist/schedules/execution.d.ts.map +1 -0
- package/dist/schedules/index.js +9 -7
- package/dist/schedules/index.js.map +1 -1
- package/dist/schedules/types.d.ts +1 -3
- package/dist/schedules/types.d.ts.map +1 -1
- package/dist/security/every.d.ts +4 -1
- package/dist/security/every.d.ts.map +1 -1
- package/dist/security/grants.d.ts +4 -1
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +3 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/registry.d.ts +42 -0
- package/dist/security/registry.d.ts.map +1 -0
- package/dist/security/types.d.ts +7 -12
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +2 -0
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/storage/action-runs/failure.d.ts +7 -0
- package/dist/storage/action-runs/failure.d.ts.map +1 -0
- package/dist/storage/action-runs/failure.js +14 -0
- package/dist/storage/action-runs/failure.js.map +9 -0
- package/dist/storage/action-runs/idempotency.d.ts.map +1 -1
- package/dist/storage/action-runs/in-memory.d.ts +3 -1
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/index.d.ts +2 -1
- package/dist/storage/action-runs/index.d.ts.map +1 -1
- package/dist/storage/action-runs/provider.d.ts +10 -0
- package/dist/storage/action-runs/provider.d.ts.map +1 -0
- package/dist/storage/action-runs/provider.js +13 -0
- package/dist/storage/action-runs/provider.js.map +9 -0
- package/dist/storage/action-runs/types.d.ts +37 -18
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/agents/errors.d.ts +1 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +22 -5
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +2 -2
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +41 -0
- package/dist/storage/agents/provider.d.ts.map +1 -0
- package/dist/storage/agents/provider.js +28 -0
- package/dist/storage/agents/provider.js.map +9 -0
- package/dist/storage/agents/types.d.ts +83 -26
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +61 -0
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -0
- package/dist/storage/ai-cost/codec.d.ts +14 -0
- package/dist/storage/ai-cost/codec.d.ts.map +1 -0
- package/dist/storage/ai-cost/errors.d.ts +7 -0
- package/dist/storage/ai-cost/errors.d.ts.map +1 -0
- package/dist/storage/ai-cost/in-memory.d.ts +32 -0
- package/dist/storage/ai-cost/in-memory.d.ts.map +1 -0
- package/dist/storage/ai-cost/index.d.ts +6 -0
- package/dist/storage/ai-cost/index.d.ts.map +1 -0
- package/dist/storage/ai-cost/provider.d.ts +7 -0
- package/dist/storage/ai-cost/provider.d.ts.map +1 -0
- package/dist/storage/ai-cost/provider.js +132 -0
- package/dist/storage/ai-cost/provider.js.map +10 -0
- package/dist/storage/ai-cost/types.d.ts +154 -0
- package/dist/storage/ai-cost/types.d.ts.map +1 -0
- package/dist/storage/ai-cost/validation.d.ts +7 -0
- package/dist/storage/ai-cost/validation.d.ts.map +1 -0
- package/dist/storage/ai-usage/errors.d.ts +8 -0
- package/dist/storage/ai-usage/errors.d.ts.map +1 -0
- package/dist/storage/ai-usage/in-memory.d.ts +28 -0
- package/dist/storage/ai-usage/in-memory.d.ts.map +1 -0
- package/dist/storage/ai-usage/index.d.ts +8 -0
- package/dist/storage/ai-usage/index.d.ts.map +1 -0
- package/dist/storage/ai-usage/record.d.ts +6 -0
- package/dist/storage/ai-usage/record.d.ts.map +1 -0
- package/dist/storage/ai-usage/types.d.ts +89 -0
- package/dist/storage/ai-usage/types.d.ts.map +1 -0
- package/dist/storage/ai-usage/usage.d.ts +11 -0
- package/dist/storage/ai-usage/usage.d.ts.map +1 -0
- package/dist/storage/auth/types.d.ts +1 -0
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/errors.d.ts +12 -0
- package/dist/storage/connector-connections/errors.d.ts.map +1 -0
- package/dist/storage/connector-connections/in-memory.d.ts +81 -0
- package/dist/storage/connector-connections/in-memory.d.ts.map +1 -0
- package/dist/storage/connector-connections/index.d.ts +7 -0
- package/dist/storage/connector-connections/index.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/authorizations.d.ts +20 -0
- package/dist/storage/connector-connections/provider/authorizations.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/connections.d.ts +17 -0
- package/dist/storage/connector-connections/provider/connections.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/runs.d.ts +14 -0
- package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider/shared.d.ts +74 -0
- package/dist/storage/connector-connections/provider/shared.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider.d.ts +49 -0
- package/dist/storage/connector-connections/provider.d.ts.map +1 -0
- package/dist/storage/connector-connections/provider.js +1025 -0
- package/dist/storage/connector-connections/provider.js.map +14 -0
- package/dist/storage/connector-connections/types.d.ts +402 -0
- package/dist/storage/connector-connections/types.d.ts.map +1 -0
- package/dist/storage/executions/errors.d.ts +8 -0
- package/dist/storage/executions/errors.d.ts.map +1 -0
- package/dist/storage/executions/in-memory.d.ts +21 -0
- package/dist/storage/executions/in-memory.d.ts.map +1 -0
- package/dist/storage/executions/index.d.ts +5 -0
- package/dist/storage/executions/index.d.ts.map +1 -0
- package/dist/storage/executions/provider.d.ts +29 -0
- package/dist/storage/executions/provider.d.ts.map +1 -0
- package/dist/storage/executions/provider.js +208 -0
- package/dist/storage/executions/provider.js.map +10 -0
- package/dist/storage/executions/run-link.d.ts +24 -0
- package/dist/storage/executions/run-link.d.ts.map +1 -0
- package/dist/storage/executions/types.d.ts +62 -0
- package/dist/storage/executions/types.d.ts.map +1 -0
- package/dist/storage/executions/validation.d.ts +13 -0
- package/dist/storage/executions/validation.d.ts.map +1 -0
- package/dist/storage/in-memory/index.d.ts +25 -5
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +30 -17
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +99 -29
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/ontology/commits.d.ts +1 -0
- package/dist/storage/ontology/commits.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/index.d.ts +1 -0
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-state.d.ts +3 -2
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations-work.d.ts +2 -2
- package/dist/storage/ontology/in-memory/materializations-work.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +3 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/shared-state.d.ts +7 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +3 -2
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/materializations.d.ts +53 -5
- package/dist/storage/ontology/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/outbox.d.ts +8 -2
- package/dist/storage/ontology/outbox.d.ts.map +1 -1
- package/dist/storage/ontology/provider-work.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +5 -22
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +6 -7
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +1 -1
- package/dist/storage/pipeline-runs/idempotency.d.ts +3 -0
- package/dist/storage/pipeline-runs/idempotency.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/in-memory.d.ts +5 -1
- package/dist/storage/pipeline-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/pipeline-runs/index.d.ts +3 -1
- package/dist/storage/pipeline-runs/index.d.ts.map +1 -1
- package/dist/storage/pipeline-runs/provider.d.ts +10 -0
- package/dist/storage/pipeline-runs/provider.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/provider.js +11 -0
- package/dist/storage/pipeline-runs/provider.js.map +9 -0
- package/dist/storage/pipeline-runs/types.d.ts +30 -14
- package/dist/storage/pipeline-runs/types.d.ts.map +1 -1
- package/dist/storage/projection-runs/in-memory.d.ts +8 -3
- package/dist/storage/projection-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/projection-runs/index.d.ts +2 -2
- package/dist/storage/projection-runs/index.d.ts.map +1 -1
- package/dist/storage/projection-runs/lifecycle.d.ts +14 -8
- package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.d.ts +13 -0
- package/dist/storage/projection-runs/provider.d.ts.map +1 -0
- package/dist/storage/projection-runs/{lifecycle.js → provider.js} +15 -4
- package/dist/storage/projection-runs/provider.js.map +9 -0
- package/dist/storage/projection-runs/types.d.ts +28 -11
- package/dist/storage/projection-runs/types.d.ts.map +1 -1
- package/dist/storage/run-listing.d.ts +8 -9
- package/dist/storage/run-listing.d.ts.map +1 -1
- package/dist/storage/sync-runs/idempotency.d.ts +3 -0
- package/dist/storage/sync-runs/idempotency.d.ts.map +1 -0
- package/dist/storage/sync-runs/in-memory.d.ts +5 -1
- package/dist/storage/sync-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/sync-runs/index.d.ts +3 -1
- package/dist/storage/sync-runs/index.d.ts.map +1 -1
- package/dist/storage/sync-runs/provider.d.ts +10 -0
- package/dist/storage/sync-runs/provider.d.ts.map +1 -0
- package/dist/storage/sync-runs/provider.js +11 -0
- package/dist/storage/sync-runs/provider.js.map +9 -0
- package/dist/storage/sync-runs/types.d.ts +28 -11
- package/dist/storage/sync-runs/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +22 -15
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/webhook-runs/errors.d.ts +3 -0
- package/dist/storage/webhook-runs/errors.d.ts.map +1 -1
- package/dist/storage/webhook-runs/in-memory.d.ts +13 -1
- package/dist/storage/webhook-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/webhook-runs/index.d.ts +3 -2
- package/dist/storage/webhook-runs/index.d.ts.map +1 -1
- package/dist/storage/webhook-runs/provider.d.ts +10 -0
- package/dist/storage/webhook-runs/provider.d.ts.map +1 -0
- package/dist/storage/webhook-runs/provider.js +11 -0
- package/dist/storage/webhook-runs/provider.js.map +9 -0
- package/dist/storage/webhook-runs/types.d.ts +37 -11
- package/dist/storage/webhook-runs/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts +6 -2
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/index.d.ts +2 -1
- package/dist/storage/workflow-runs/index.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.d.ts +19 -0
- package/dist/storage/workflow-runs/provider.d.ts.map +1 -0
- package/dist/storage/workflow-runs/provider.js +20 -0
- package/dist/storage/workflow-runs/provider.js.map +9 -0
- package/dist/storage/workflow-runs/types.d.ts +28 -30
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/execution.d.ts +18 -0
- package/dist/syncs/execution.d.ts.map +1 -0
- package/dist/syncs/index.d.ts +3 -1
- package/dist/syncs/index.d.ts.map +1 -1
- package/dist/syncs/index.js +67 -0
- package/dist/syncs/index.js.map +9 -0
- package/dist/syncs/request.d.ts +6 -16
- package/dist/syncs/request.d.ts.map +1 -1
- package/dist/syncs/run-dispatch.d.ts +47 -0
- package/dist/syncs/run-dispatch.d.ts.map +1 -0
- package/dist/syncs/sources.d.ts +8 -0
- package/dist/syncs/sources.d.ts.map +1 -0
- package/dist/syncs/types.d.ts +16 -9
- package/dist/syncs/types.d.ts.map +1 -1
- package/dist/testing/action-execution.d.ts +12 -0
- package/dist/testing/action-execution.d.ts.map +1 -0
- package/dist/testing/agent-execution.d.ts +14 -0
- package/dist/testing/agent-execution.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts +12 -4
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-cost-storage-contract.d.ts +12 -0
- package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -0
- package/dist/testing/ai-usage-storage-contract.d.ts +13 -0
- package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/connector-connection-storage-contract.d.ts +16 -0
- package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -0
- package/dist/testing/execution-storage-contract.d.ts +15 -0
- package/dist/testing/execution-storage-contract.d.ts.map +1 -0
- package/dist/testing/execution.d.ts +23 -0
- package/dist/testing/execution.d.ts.map +1 -0
- package/dist/testing/index.d.ts +13 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4754 -1592
- package/dist/testing/index.js.map +26 -13
- package/dist/testing/materializer-fixture.d.ts +2 -2
- package/dist/testing/materializer-fixture.d.ts.map +1 -1
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-contract-fixture.d.ts +1 -0
- package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/pipeline-execution.d.ts +16 -0
- package/dist/testing/pipeline-execution.d.ts.map +1 -0
- package/dist/testing/projection-execution.d.ts +20 -0
- package/dist/testing/projection-execution.d.ts.map +1 -0
- package/dist/testing/projection-run-storage-contract.d.ts +9 -4
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/testing/sync-execution.d.ts +16 -0
- package/dist/testing/sync-execution.d.ts.map +1 -0
- package/dist/testing/webhook-execution.d.ts +12 -0
- package/dist/testing/webhook-execution.d.ts.map +1 -0
- package/dist/testing/webhook-run-storage-contract.d.ts +11 -0
- package/dist/testing/webhook-run-storage-contract.d.ts.map +1 -0
- package/dist/testing/workflow-execution.d.ts +23 -0
- package/dist/testing/workflow-execution.d.ts.map +1 -0
- package/dist/webhooks/index.d.ts +2 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/internal.d.ts +2 -0
- package/dist/webhooks/internal.d.ts.map +1 -0
- package/dist/webhooks/internal.js +152 -0
- package/dist/webhooks/internal.js.map +10 -0
- package/dist/webhooks/registry.d.ts +18 -4
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/run-admission.d.ts +25 -0
- package/dist/webhooks/run-admission.d.ts.map +1 -0
- package/dist/webhooks/types.d.ts +8 -5
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/workers/index.js +29 -20
- package/dist/workers/index.js.map +4 -4
- package/dist/workers/queue-delivery.d.ts +7 -7
- package/dist/workers/queue-delivery.d.ts.map +1 -1
- package/dist/workers/queue-worker.d.ts +32 -11
- package/dist/workers/queue-worker.d.ts.map +1 -1
- package/dist/workflows/execution.d.ts +52 -0
- package/dist/workflows/execution.d.ts.map +1 -0
- package/dist/workflows/failure.d.ts +28 -0
- package/dist/workflows/failure.d.ts.map +1 -0
- package/dist/workflows/index.d.ts +4 -2
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +67 -36
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts +2 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +59 -0
- package/dist/workflows/run-dispatch.d.ts.map +1 -0
- package/dist/workflows/types.d.ts +38 -8
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +113 -5
- package/src/actions/commit-edits.ts +0 -3
- package/src/actions/execution.ts +83 -0
- package/src/actions/index.ts +1 -1
- package/src/actions/registry.ts +22 -10
- package/src/actions/request.ts +55 -177
- package/src/actions/run-dispatch.ts +276 -0
- package/src/actions/types/context.ts +2 -4
- package/src/actions/validation.ts +2 -2
- package/src/agents/adapters.ts +71 -26
- package/src/agents/authority.ts +189 -0
- package/src/agents/dispatch.ts +1 -6
- package/src/agents/errors.ts +4 -2
- package/src/agents/execution.ts +266 -0
- package/src/agents/index.ts +33 -4
- package/src/agents/prompt.ts +47 -7
- package/src/agents/request.ts +158 -13
- package/src/agents/streams.ts +150 -3
- package/src/agents/thread-context-projection.ts +93 -0
- package/src/agents/tool-definition.ts +17 -2
- package/src/agents/tool-result.ts +61 -0
- package/src/agents/types.ts +49 -5
- package/src/agents/validation.ts +3 -3
- package/src/auth/attribution.ts +48 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/runtime.ts +5 -5
- package/src/authorization/decision.ts +75 -14
- package/src/authorization/grant-kinds.ts +9 -0
- package/src/authorization/index.ts +2 -0
- package/src/blob-storage/execution.ts +78 -0
- package/src/bootstrap/discovery.ts +88 -268
- package/src/bootstrap/index.ts +2 -13
- package/src/broker/in-memory.ts +8 -1
- package/src/broker/types.ts +5 -0
- package/src/connectors/builders.ts +37 -2
- package/src/connectors/connections/authorizations.ts +646 -0
- package/src/connectors/connections/capability.ts +59 -0
- package/src/connectors/connections/command-context.ts +98 -0
- package/src/connectors/connections/contracts.ts +208 -0
- package/src/connectors/connections/credential-codec.ts +48 -0
- package/src/connectors/connections/credential-mutations.ts +574 -0
- package/src/connectors/connections/execution.ts +138 -0
- package/src/connectors/connections/internal.ts +17 -0
- package/src/connectors/connections/provider-operation.ts +41 -0
- package/src/connectors/connections/request.ts +447 -0
- package/src/connectors/connections/runs.ts +702 -0
- package/src/connectors/connections/service.ts +644 -0
- package/src/connectors/connections/storage-boundary.ts +13 -0
- package/src/connectors/connections/tokens.ts +292 -0
- package/src/connectors/connections/validation.ts +316 -0
- package/src/connectors/connections/views.ts +37 -0
- package/src/connectors/credentials.ts +149 -0
- package/src/connectors/errors.ts +111 -3
- package/src/connectors/execution.ts +157 -0
- package/src/connectors/index.ts +26 -2
- package/src/connectors/service.ts +142 -0
- package/src/connectors/types.ts +156 -7
- package/src/datasets/execution.ts +24 -0
- package/src/error-reporting/capability.ts +33 -106
- package/src/error-reporting/internal.ts +3 -1
- package/src/error-reporting/reporter.ts +19 -3
- package/src/error-reporting/reports.ts +172 -0
- package/src/error-reporting/types.ts +97 -43
- package/src/errors/catalog.ts +149 -0
- package/src/errors/internal.ts +322 -0
- package/src/errors/types.ts +21 -0
- package/src/events/definitions.ts +0 -4
- package/src/events/execution.ts +45 -0
- package/src/events/index.ts +15 -14
- package/src/events/outbox-dispatcher.ts +53 -18
- package/src/events/{runtime.ts → service.ts} +19 -23
- package/src/events/types/pipelines.ts +4 -1
- package/src/events/types/syncs.ts +3 -0
- package/src/events/types/workflows.ts +4 -2
- package/src/execution/agent.ts +130 -0
- package/src/execution/authorization.ts +409 -0
- package/src/execution/dispatch.ts +7 -0
- package/src/execution/durable.ts +193 -0
- package/src/execution/index.ts +12 -0
- package/src/execution/primitive.ts +50 -0
- package/src/execution/request.ts +109 -0
- package/src/execution/scopes.ts +198 -0
- package/src/execution/types.ts +113 -0
- package/src/http/api-routes.ts +3 -3
- package/src/index.ts +122 -9
- package/src/json.ts +0 -4
- package/src/logging/execution.ts +28 -0
- package/src/logging/index.ts +4 -4
- package/src/logging/{runtime.ts → service.ts} +7 -7
- package/src/materialization/events.ts +1 -0
- package/src/materialization/index.ts +2 -0
- package/src/materialization/model.ts +34 -18
- package/src/materializer/README.md +9 -13
- package/src/materializer/edits/apply.ts +55 -2
- package/src/materializer/edits/commit.ts +85 -28
- package/src/materializer/edits/load-state.ts +79 -16
- package/src/materializer/edits/operations.ts +80 -37
- package/src/materializer/edits/plan.ts +95 -22
- package/src/materializer/edits/working-state.ts +93 -55
- package/src/materializer/effective/build-events.ts +2 -0
- package/src/materializer/effective/diff.ts +22 -0
- package/src/materializer/effective/load-state.ts +0 -31
- package/src/materializer/effective/resolve.ts +140 -9
- package/src/materializer/execution/commit-lifecycle.ts +9 -1
- package/src/materializer/execution/plan-stream.ts +33 -9
- package/src/materializer/execution/scope.ts +95 -0
- package/src/materializer/execution/work-executor.ts +6 -2
- package/src/materializer/execution/work-records.ts +42 -7
- package/src/materializer/index.ts +9 -1
- package/src/materializer/materializer.ts +67 -5
- package/src/materializer/projections/entry-validator.ts +23 -1
- package/src/materializer/projections/finish-run.ts +29 -11
- package/src/materializer/projections/replace.ts +55 -22
- package/src/materializer/projections/replacement-plan.ts +39 -7
- package/src/materializer/shared/batching.ts +4 -1
- package/src/materializer/shared/normalize.ts +16 -19
- package/src/materializer/telemetry/append.ts +57 -26
- package/src/materializer/telemetry/plan.ts +15 -6
- package/src/objects/action/request.ts +5 -5
- package/src/objects/context/index.ts +1 -0
- package/src/objects/context/types.ts +6 -0
- package/src/objects/execution.ts +346 -0
- package/src/objects/materializer-adapter.ts +1 -23
- package/src/objects/query/executor.ts +15 -29
- package/src/objects/query/index.ts +1 -2
- package/src/objects/query/planner.ts +0 -6
- package/src/objects/sdk/object-handle.ts +2 -2
- package/src/objects/sdk/object-set.ts +17 -7
- package/src/objects/sdk/runtime-query-executor.ts +9 -2
- package/src/objects/sdk/telemetry-channel.ts +5 -1
- package/src/objects/service/action-service.ts +5 -2
- package/src/objects/service/list-service.ts +1 -1
- package/src/objects/telemetry/history.ts +8 -3
- package/src/objects/telemetry/write-batch.ts +0 -2
- package/src/ontology/index.ts +6 -1
- package/src/ontology/registry.ts +16 -2
- package/src/pipelines/execution.ts +105 -0
- package/src/pipelines/index.ts +7 -0
- package/src/pipelines/request.ts +32 -26
- package/src/pipelines/run-dispatch.ts +308 -0
- package/src/projections/builders.ts +100 -44
- package/src/projections/capability.ts +37 -0
- package/src/projections/execution.ts +85 -0
- package/src/projections/index.ts +8 -1
- package/src/projections/internal.ts +21 -61
- package/src/projections/ownership.ts +2 -2
- package/src/projections/registry.ts +33 -11
- package/src/projections/revision.ts +11 -5
- package/src/projections/run-dispatch.ts +497 -0
- package/src/projections/run-id.ts +20 -0
- package/src/projections/timestamp.ts +66 -0
- package/src/projections/types.ts +19 -0
- package/src/projections/validation.ts +27 -3
- package/src/queues/in-memory.ts +37 -11
- package/src/queues/index.ts +10 -2
- package/src/queues/types.ts +78 -45
- package/src/rules/execution.ts +49 -0
- package/src/rules/index.ts +0 -1
- package/src/rules/validation.ts +2 -6
- package/src/runtime/ai-cost.ts +15 -0
- package/src/runtime/ai-usage.ts +17 -0
- package/src/runtime/create.ts +28 -68
- package/src/runtime/definitions.ts +44 -0
- package/src/runtime/host.ts +377 -0
- package/src/runtime/index.ts +5 -13
- package/src/runtime/internal.ts +12 -0
- package/src/runtime/ontology-mutations.ts +5 -3
- package/src/runtime/resolve-definitions.ts +238 -0
- package/src/runtime/sixb.ts +95 -822
- package/src/runtime/types.ts +17 -290
- package/src/scheduler/index.ts +1 -1
- package/src/scheduler/runtime.ts +37 -6
- package/src/schedules/execution.ts +14 -0
- package/src/schedules/types.ts +0 -8
- package/src/security/every.ts +4 -0
- package/src/security/grants.ts +13 -1
- package/src/security/index.ts +3 -1
- package/src/security/registry.ts +107 -0
- package/src/security/types.ts +8 -12
- package/src/security/validation.ts +7 -0
- package/src/storage/action-runs/failure.ts +64 -0
- package/src/storage/action-runs/idempotency.ts +3 -1
- package/src/storage/action-runs/in-memory.ts +39 -9
- package/src/storage/action-runs/index.ts +3 -0
- package/src/storage/action-runs/provider.ts +25 -0
- package/src/storage/action-runs/types.ts +61 -27
- package/src/storage/agents/errors.ts +1 -0
- package/src/storage/agents/in-memory.ts +219 -14
- package/src/storage/agents/index.ts +7 -1
- package/src/storage/agents/provider.ts +252 -0
- package/src/storage/agents/types.ts +96 -22
- package/src/storage/ai-cost/analytics.ts +602 -0
- package/src/storage/ai-cost/codec.ts +136 -0
- package/src/storage/ai-cost/errors.ts +12 -0
- package/src/storage/ai-cost/in-memory.ts +164 -0
- package/src/storage/ai-cost/index.ts +35 -0
- package/src/storage/ai-cost/provider.ts +20 -0
- package/src/storage/ai-cost/types.ts +193 -0
- package/src/storage/ai-cost/validation.ts +337 -0
- package/src/storage/ai-usage/errors.ts +13 -0
- package/src/storage/ai-usage/in-memory.ts +162 -0
- package/src/storage/ai-usage/index.ts +21 -0
- package/src/storage/ai-usage/record.ts +74 -0
- package/src/storage/ai-usage/types.ts +102 -0
- package/src/storage/ai-usage/usage.ts +104 -0
- package/src/storage/auth/types.ts +1 -0
- package/src/storage/connector-connections/errors.ts +24 -0
- package/src/storage/connector-connections/in-memory.ts +1377 -0
- package/src/storage/connector-connections/index.ts +66 -0
- package/src/storage/connector-connections/provider/authorizations.ts +446 -0
- package/src/storage/connector-connections/provider/connections.ts +291 -0
- package/src/storage/connector-connections/provider/runs.ts +369 -0
- package/src/storage/connector-connections/provider/shared.ts +342 -0
- package/src/storage/connector-connections/provider.ts +219 -0
- package/src/storage/connector-connections/types.ts +546 -0
- package/src/storage/executions/errors.ts +21 -0
- package/src/storage/executions/in-memory.ts +75 -0
- package/src/storage/executions/index.ts +16 -0
- package/src/storage/executions/provider.ts +292 -0
- package/src/storage/executions/run-link.ts +70 -0
- package/src/storage/executions/types.ts +49 -0
- package/src/storage/executions/validation.ts +370 -0
- package/src/storage/in-memory/index.ts +100 -16
- package/src/storage/index.ts +191 -15
- package/src/storage/ontology/commits.ts +1 -0
- package/src/storage/ontology/in-memory/index.ts +2 -0
- package/src/storage/ontology/in-memory/materializations-finalization.ts +2 -1
- package/src/storage/ontology/in-memory/materializations-state.ts +10 -0
- package/src/storage/ontology/in-memory/materializations-work.ts +2 -1
- package/src/storage/ontology/in-memory/materializations.ts +132 -9
- package/src/storage/ontology/in-memory/outbox.ts +1 -1
- package/src/storage/ontology/in-memory/shared-state.ts +12 -1
- package/src/storage/ontology/index.ts +6 -0
- package/src/storage/ontology/materializations.ts +53 -4
- package/src/storage/ontology/outbox.ts +13 -2
- package/src/storage/ontology/provider-header-validation.ts +1 -0
- package/src/storage/ontology/provider-work.ts +33 -14
- package/src/storage/ontology/provider.ts +72 -52
- package/src/storage/operation-scope.ts +2 -0
- package/src/storage/pipeline-runs/idempotency.ts +14 -0
- package/src/storage/pipeline-runs/in-memory.ts +88 -8
- package/src/storage/pipeline-runs/index.ts +5 -1
- package/src/storage/pipeline-runs/provider.ts +25 -0
- package/src/storage/pipeline-runs/types.ts +37 -14
- package/src/storage/projection-runs/in-memory.ts +93 -24
- package/src/storage/projection-runs/index.ts +4 -0
- package/src/storage/projection-runs/lifecycle.ts +165 -36
- package/src/storage/projection-runs/provider.ts +34 -0
- package/src/storage/projection-runs/types.ts +34 -11
- package/src/storage/run-listing.ts +22 -13
- package/src/storage/sync-runs/idempotency.ts +18 -0
- package/src/storage/sync-runs/in-memory.ts +90 -7
- package/src/storage/sync-runs/index.ts +4 -1
- package/src/storage/sync-runs/provider.ts +25 -0
- package/src/storage/sync-runs/types.ts +35 -11
- package/src/storage/types.ts +46 -17
- package/src/storage/webhook-runs/errors.ts +14 -0
- package/src/storage/webhook-runs/in-memory.ts +84 -9
- package/src/storage/webhook-runs/index.ts +5 -1
- package/src/storage/webhook-runs/provider.ts +30 -0
- package/src/storage/webhook-runs/types.ts +52 -11
- package/src/storage/workflow-runs/in-memory.ts +89 -55
- package/src/storage/workflow-runs/index.ts +2 -0
- package/src/storage/workflow-runs/provider.ts +70 -0
- package/src/storage/workflow-runs/types.ts +36 -25
- package/src/syncs/builders.ts +2 -2
- package/src/syncs/execution.ts +78 -0
- package/src/syncs/index.ts +13 -0
- package/src/syncs/request.ts +32 -43
- package/src/syncs/run-dispatch.ts +312 -0
- package/src/syncs/sources.ts +20 -0
- package/src/syncs/types.ts +32 -8
- package/src/testing/action-execution.ts +61 -0
- package/src/testing/agent-execution.ts +81 -0
- package/src/testing/agent-storage-contract.ts +498 -64
- package/src/testing/ai-cost-storage-contract.ts +320 -0
- package/src/testing/ai-usage-storage-contract.ts +528 -0
- package/src/testing/auth-storage-contract.ts +17 -1
- package/src/testing/broker-contract.ts +16 -1
- package/src/testing/connector-connection-storage-contract.ts +1052 -0
- package/src/testing/execution-storage-contract.ts +435 -0
- package/src/testing/execution.ts +48 -0
- package/src/testing/index.ts +57 -0
- package/src/testing/materializer-fixture.ts +11 -3
- package/src/testing/materializer-storage-contract.ts +333 -13
- package/src/testing/ontology-contract-fixture.ts +35 -2
- package/src/testing/ontology-storage-contract.ts +75 -14
- package/src/testing/pipeline-execution.ts +64 -0
- package/src/testing/projection-execution.ts +98 -0
- package/src/testing/projection-run-storage-contract.ts +215 -29
- package/src/testing/queues-contract.ts +40 -51
- package/src/testing/sync-execution.ts +61 -0
- package/src/testing/webhook-execution.ts +47 -0
- package/src/testing/webhook-run-storage-contract.ts +240 -0
- package/src/testing/workflow-execution.ts +77 -0
- package/src/webhooks/index.ts +2 -1
- package/src/webhooks/internal.ts +5 -0
- package/src/webhooks/registry.ts +60 -36
- package/src/webhooks/run-admission.ts +172 -0
- package/src/webhooks/types.ts +8 -5
- package/src/workers/queue-delivery.ts +25 -22
- package/src/workers/queue-worker.ts +76 -33
- package/src/workflows/execution.ts +313 -0
- package/src/workflows/failure.ts +63 -0
- package/src/workflows/index.ts +10 -1
- package/src/workflows/request.ts +39 -118
- package/src/workflows/run-dispatch.ts +359 -0
- package/src/workflows/types.ts +39 -8
- package/dist/actions/runtime.d.ts +0 -11
- package/dist/actions/runtime.d.ts.map +0 -1
- package/dist/agents/runtime.d.ts +0 -41
- package/dist/agents/runtime.d.ts.map +0 -1
- package/dist/chunk-4hwxq5e6.js +0 -49
- package/dist/chunk-4hwxq5e6.js.map +0 -10
- package/dist/chunk-4tvj3ate.js.map +0 -11
- package/dist/chunk-50kv63vj.js.map +0 -12
- package/dist/chunk-86459jn0.js +0 -1091
- package/dist/chunk-86459jn0.js.map +0 -22
- package/dist/chunk-867jxh7c.js.map +0 -19
- package/dist/chunk-9k3hgv8h.js +0 -352
- package/dist/chunk-9k3hgv8h.js.map +0 -13
- package/dist/chunk-avppcgt6.js.map +0 -14
- package/dist/chunk-b1bqvhpe.js.map +0 -13
- package/dist/chunk-b5dp7gaf.js +0 -1092
- package/dist/chunk-b5dp7gaf.js.map +0 -26
- package/dist/chunk-bh8bwma3.js +0 -37
- package/dist/chunk-bh8bwma3.js.map +0 -10
- package/dist/chunk-btcsywk4.js +0 -985
- package/dist/chunk-btcsywk4.js.map +0 -15
- package/dist/chunk-exrfbt2d.js +0 -354
- package/dist/chunk-exrfbt2d.js.map +0 -17
- package/dist/chunk-hb9xcx9c.js.map +0 -14
- package/dist/chunk-k25jm1x5.js +0 -102
- package/dist/chunk-k25jm1x5.js.map +0 -10
- package/dist/chunk-k6j72mtt.js +0 -9
- package/dist/chunk-k6j72mtt.js.map +0 -10
- package/dist/chunk-m9w0artv.js +0 -554
- package/dist/chunk-m9w0artv.js.map +0 -13
- package/dist/chunk-nbywkytr.js.map +0 -16
- package/dist/chunk-p7vj8xgb.js.map +0 -34
- package/dist/chunk-raq0x6bd.js.map +0 -48
- package/dist/chunk-rgzed50y.js +0 -1445
- package/dist/chunk-rgzed50y.js.map +0 -22
- package/dist/chunk-rjqm6ksg.js.map +0 -44
- package/dist/chunk-t72dvahb.js.map +0 -12
- package/dist/chunk-v5c085yp.js.map +0 -10
- package/dist/chunk-xt6qx9sh.js.map +0 -36
- package/dist/chunk-xz5g49bp.js.map +0 -11
- package/dist/chunk-ya6brh8a.js.map +0 -11
- package/dist/chunk-yn947ck3.js.map +0 -14
- package/dist/connectors/runtime.d.ts +0 -13
- package/dist/connectors/runtime.d.ts.map +0 -1
- package/dist/events/runtime.d.ts.map +0 -1
- package/dist/objects/contexts.d.ts +0 -45
- package/dist/objects/contexts.d.ts.map +0 -1
- package/dist/objects/helpers.d.ts +0 -7
- package/dist/objects/helpers.d.ts.map +0 -1
- package/dist/runtime/scoped.d.ts +0 -158
- package/dist/runtime/scoped.d.ts.map +0 -1
- package/dist/security/runtime.d.ts +0 -16
- package/dist/security/runtime.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/in-memory.d.ts +0 -18
- package/dist/storage/webhook-deliveries/in-memory.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/index.d.ts +0 -3
- package/dist/storage/webhook-deliveries/index.d.ts.map +0 -1
- package/dist/storage/webhook-deliveries/types.d.ts +0 -43
- package/dist/storage/webhook-deliveries/types.d.ts.map +0 -1
- package/dist/workflows/runtime.d.ts +0 -33
- package/dist/workflows/runtime.d.ts.map +0 -1
- package/src/actions/runtime.ts +0 -31
- package/src/agents/runtime.ts +0 -124
- package/src/connectors/runtime.ts +0 -100
- package/src/objects/contexts.ts +0 -64
- package/src/objects/helpers.ts +0 -18
- package/src/runtime/scoped.ts +0 -436
- package/src/security/runtime.ts +0 -101
- package/src/storage/webhook-deliveries/in-memory.ts +0 -108
- package/src/storage/webhook-deliveries/index.ts +0 -9
- package/src/storage/webhook-deliveries/types.ts +0 -41
- package/src/workflows/runtime.ts +0 -68
- /package/dist/{chunk-md9jbrm9.js.map → chunk-4gz41why.js.map} +0 -0
- /package/dist/{chunk-6rzdtvn5.js.map → chunk-8b55ygje.js.map} +0 -0
- /package/dist/{chunk-r82k4z7z.js.map → chunk-a31h57d5.js.map} +0 -0
- /package/dist/{chunk-qzyemcj7.js.map → chunk-ckxfnx7f.js.map} +0 -0
- /package/dist/{chunk-53s4asfm.js.map → chunk-rnshztfq.js.map} +0 -0
- /package/dist/{chunk-8kv2sez0.js.map → chunk-vybf6pkp.js.map} +0 -0
- /package/dist/{chunk-6zrpewy4.js.map → chunk-z3zp0bj1.js.map} +0 -0
- /package/dist/{chunk-hz8m927w.js.map → chunk-zqysyfjt.js.map} +0 -0
|
@@ -81,6 +81,7 @@ class InMemoryQueueStore {
|
|
|
81
81
|
queueId,
|
|
82
82
|
job,
|
|
83
83
|
state: "queued",
|
|
84
|
+
failure: null,
|
|
84
85
|
leaseId: null,
|
|
85
86
|
claimedAt: null,
|
|
86
87
|
leaseExpiresAt: null
|
|
@@ -180,6 +181,7 @@ class InMemoryQueue {
|
|
|
180
181
|
async fail(params) {
|
|
181
182
|
const record = this.requireActiveLease(params);
|
|
182
183
|
record.state = "failed";
|
|
184
|
+
record.failure = structuredClone(params.failure);
|
|
183
185
|
clearLease(record);
|
|
184
186
|
}
|
|
185
187
|
async renewLease(params) {
|
|
@@ -236,4 +238,4 @@ class InMemoryQueues {
|
|
|
236
238
|
}
|
|
237
239
|
export { QueueError, InMemoryQueues };
|
|
238
240
|
|
|
239
|
-
//# debugId=
|
|
241
|
+
//# debugId=CCF3BA9256C63ED464756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/queues/errors.ts", "../src/queues/in-memory.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Error for queue invariants and invalid queue operations.\n */\nexport class QueueError extends Error {\n readonly name = \"QueueError\"\n}\n",
|
|
6
|
+
"import { randomUUID } from \"node:crypto\"\nimport type { SixbErrorCode } from \"../errors/types\"\nimport { QueueError } from \"./errors\"\nimport type {\n ActionQueueJobFailureCode,\n ActionRunRequestedQueueJob,\n AgentQueueJob,\n AgentQueueJobFailureCode,\n ClaimedQueueJob,\n NewQueueJob,\n PipelineQueueJobFailureCode,\n PipelineRunRequestedQueueJob,\n ProjectionQueueJobFailureCode,\n ProjectionRunRequestedQueueJob,\n Queue,\n QueueJob,\n QueueJobFailure,\n Queues,\n SyncQueueJobFailureCode,\n SyncRunRequestedQueueJob,\n WorkflowQueueJob,\n WorkflowQueueJobFailureCode,\n} from \"./types\"\n\ntype QueueRecordState = \"queued\" | \"completed\" | \"failed\"\n\ninterface QueueRecord<TQueueJob extends QueueJob = QueueJob> {\n readonly sequence: number\n readonly queueId: string\n job: TQueueJob\n // A leased job stays \"queued\" until a worker completes or fails it.\n state: QueueRecordState\n failure: QueueJobFailure | null\n leaseId: string | null\n claimedAt: string | null\n leaseExpiresAt: string | null\n}\n\nfunction assertNonEmpty(value: string, fieldName: string): void {\n if (value.trim().length === 0) {\n throw new QueueError(`[Sixb] Queue ${fieldName} must not be empty`)\n }\n}\n\nfunction parseTimestamp(value: string, fieldName: string): number {\n const timestamp = Date.parse(value)\n\n if (Number.isNaN(timestamp)) {\n throw new QueueError(`[Sixb] Queue ${fieldName} must be a valid timestamp`)\n }\n\n return timestamp\n}\n\nfunction assertPositiveNumber(value: number, fieldName: string): void {\n if (!Number.isFinite(value) || value <= 0) {\n throw new QueueError(`[Sixb] Queue ${fieldName} must be greater than 0`)\n }\n}\n\nfunction clearLease(record: QueueRecord): void {\n record.leaseId = null\n record.claimedAt = null\n record.leaseExpiresAt = null\n}\n\n// Best-effort ordering is part of the contract; this keeps the in-memory provider deterministic.\nfunction compareQueueRecords(left: QueueRecord, right: QueueRecord): number {\n const availableDifference =\n parseTimestamp(left.job.availableAt, \"job.availableAt\") -\n parseTimestamp(right.job.availableAt, \"job.availableAt\")\n\n if (availableDifference !== 0) {\n return availableDifference\n }\n\n const createdDifference =\n parseTimestamp(left.job.createdAt, \"job.createdAt\") -\n parseTimestamp(right.job.createdAt, \"job.createdAt\")\n\n if (createdDifference !== 0) {\n return createdDifference\n }\n\n return left.sequence - right.sequence\n}\n\nfunction createQueueJob<TQueueJob extends QueueJob>(\n projectId: string,\n newJob: NewQueueJob<TQueueJob>\n): TQueueJob {\n const createdAt = new Date().toISOString()\n const availableAt = newJob.availableAt ?? createdAt\n parseTimestamp(availableAt, \"availableAt\")\n\n return {\n id: newJob.id ?? randomUUID(),\n projectId,\n createdAt,\n availableAt,\n attempt: 0,\n metadata: newJob.metadata ? structuredClone(newJob.metadata) : undefined,\n type: newJob.type,\n payload: structuredClone(newJob.payload),\n } as TQueueJob\n}\n\nfunction leaseExpiresAtMs(record: QueueRecord): number | null {\n if (!record.leaseId || !record.leaseExpiresAt) {\n return null\n }\n\n return parseTimestamp(record.leaseExpiresAt, \"leaseExpiresAt\")\n}\n\nfunction toClaimedQueueJob<TQueueJob extends QueueJob>(\n record: QueueRecord<TQueueJob>\n): ClaimedQueueJob<TQueueJob> {\n if (!record.leaseId || !record.claimedAt || !record.leaseExpiresAt) {\n throw new QueueError(`[Sixb] Queue job '${record.job.id}' is not currently leased`)\n }\n\n return {\n leaseId: record.leaseId,\n claimedAt: record.claimedAt,\n leaseExpiresAt: record.leaseExpiresAt,\n job: structuredClone(record.job),\n }\n}\n\nclass InMemoryQueueStore {\n private readonly recordsByProject = new Map<string, QueueRecord[]>()\n private nextSequence = 1\n\n add<TQueueJob extends QueueJob>(projectId: string, queueId: string, job: TQueueJob): void {\n const records = this.getOrCreateRecords(projectId)\n records.push({\n sequence: this.nextSequence,\n queueId,\n job,\n state: \"queued\",\n failure: null,\n leaseId: null,\n claimedAt: null,\n leaseExpiresAt: null,\n })\n this.nextSequence += 1\n }\n\n list<TQueueJob extends QueueJob>(projectId: string, queueId: string): QueueRecord<TQueueJob>[] {\n const records = this.recordsByProject.get(projectId) ?? []\n return records.filter((record) => record.queueId === queueId) as QueueRecord<TQueueJob>[]\n }\n\n find<TQueueJob extends QueueJob>(\n projectId: string,\n queueId: string,\n jobId: string\n ): QueueRecord<TQueueJob> | null {\n return (\n this.list<TQueueJob>(projectId, queueId).find((record) => record.job.id === jobId) ?? null\n )\n }\n\n private getOrCreateRecords(projectId: string): QueueRecord[] {\n const existing = this.recordsByProject.get(projectId)\n if (existing) {\n return existing\n }\n\n const records: QueueRecord[] = []\n this.recordsByProject.set(projectId, records)\n return records\n }\n}\n\nclass InMemoryQueue<TQueueJob extends QueueJob, TFailureCode extends SixbErrorCode>\n implements Queue<TQueueJob, TFailureCode>\n{\n constructor(\n private readonly store: InMemoryQueueStore,\n private readonly queueId: string\n ) {\n assertNonEmpty(queueId, \"queueId\")\n }\n\n async enqueue(params: {\n projectId: string\n jobs: readonly NewQueueJob<TQueueJob>[]\n }): Promise<readonly TQueueJob[]> {\n assertNonEmpty(params.projectId, \"projectId\")\n\n if (params.jobs.length === 0) {\n return []\n }\n\n const createdJobs = params.jobs.map((job) => {\n if (job.id !== undefined) assertNonEmpty(job.id, \"job.id\")\n const existing = job.id\n ? this.store.find<TQueueJob>(params.projectId, this.queueId, job.id)\n : null\n if (existing) return existing.job\n\n const created = createQueueJob(params.projectId, job)\n this.store.add(params.projectId, this.queueId, created)\n return created\n })\n\n return createdJobs.map((job) => structuredClone(job))\n }\n\n async claim(params: {\n projectId: string\n workerId: string\n limit?: number\n leaseMs?: number\n }): Promise<readonly ClaimedQueueJob<TQueueJob>[]> {\n assertNonEmpty(params.projectId, \"projectId\")\n assertNonEmpty(params.workerId, \"workerId\")\n\n const limit = params.limit ?? 1\n if (limit <= 0) {\n return []\n }\n\n const leaseMs = params.leaseMs ?? 30_000\n assertPositiveNumber(leaseMs, \"leaseMs\")\n\n const now = Date.now()\n const claimable = this.store\n .list<TQueueJob>(params.projectId, this.queueId)\n .filter((record) => {\n if (record.state !== \"queued\") {\n return false\n }\n\n if (parseTimestamp(record.job.availableAt, \"job.availableAt\") > now) {\n return false\n }\n\n const expiresAt = leaseExpiresAtMs(record)\n return expiresAt === null || expiresAt <= now\n })\n .sort(compareQueueRecords)\n .slice(0, limit)\n\n const claimedAt = new Date(now).toISOString()\n\n return claimable.map((record) => {\n // Attempts count claims so redelivery after lease expiry or retry is visible to workers.\n record.job = {\n ...record.job,\n attempt: record.job.attempt + 1,\n }\n record.leaseId = randomUUID()\n record.claimedAt = claimedAt\n record.leaseExpiresAt = new Date(now + leaseMs).toISOString()\n\n return toClaimedQueueJob(record)\n })\n }\n\n async complete(params: { projectId: string; jobId: string; leaseId: string }): Promise<void> {\n const record = this.requireActiveLease(params)\n record.state = \"completed\"\n clearLease(record)\n }\n\n async retry(params: {\n projectId: string\n jobId: string\n leaseId: string\n availableAt?: string\n }): Promise<void> {\n const record = this.requireActiveLease(params)\n const availableAt = params.availableAt ?? new Date().toISOString()\n parseTimestamp(availableAt, \"availableAt\")\n\n record.job = {\n ...record.job,\n availableAt,\n }\n clearLease(record)\n }\n\n async fail(params: {\n projectId: string\n jobId: string\n leaseId: string\n failure: QueueJobFailure<TFailureCode>\n }): Promise<void> {\n const record = this.requireActiveLease(params)\n record.state = \"failed\"\n record.failure = structuredClone(params.failure)\n clearLease(record)\n }\n\n async renewLease(params: {\n projectId: string\n jobId: string\n leaseId: string\n leaseMs: number\n }): Promise<ClaimedQueueJob<TQueueJob> | null> {\n assertPositiveNumber(params.leaseMs, \"leaseMs\")\n\n const record = this.store.find<TQueueJob>(params.projectId, this.queueId, params.jobId)\n if (!record || record.state !== \"queued\") {\n return null\n }\n\n const now = Date.now()\n const expiresAt = leaseExpiresAtMs(record)\n if (record.leaseId !== params.leaseId || expiresAt === null) {\n return null\n }\n\n if (expiresAt <= now) {\n return null\n }\n\n record.leaseExpiresAt = new Date(now + params.leaseMs).toISOString()\n return toClaimedQueueJob(record)\n }\n\n private requireActiveLease(params: {\n projectId: string\n jobId: string\n leaseId: string\n }): QueueRecord<TQueueJob> {\n assertNonEmpty(params.projectId, \"projectId\")\n assertNonEmpty(params.jobId, \"jobId\")\n assertNonEmpty(params.leaseId, \"leaseId\")\n\n const record = this.store.find<TQueueJob>(params.projectId, this.queueId, params.jobId)\n\n if (!record) {\n throw new QueueError(`[Sixb] Unknown queue job '${params.jobId}'`)\n }\n\n if (record.state !== \"queued\") {\n throw new QueueError(`[Sixb] Queue job '${params.jobId}' is no longer active`)\n }\n\n if (record.leaseId !== params.leaseId || !record.leaseExpiresAt) {\n throw new QueueError(`[Sixb] Lease mismatch for queue job '${params.jobId}'`)\n }\n\n const expiresAt = leaseExpiresAtMs(record)\n if (expiresAt === null || expiresAt <= Date.now()) {\n throw new QueueError(`[Sixb] Lease for queue job '${params.jobId}' has expired`)\n }\n\n return record\n }\n}\n\nexport class InMemoryQueues implements Queues {\n readonly scope = \"process\" as const\n private readonly store = new InMemoryQueueStore()\n\n readonly syncRuns = new InMemoryQueue<SyncRunRequestedQueueJob, SyncQueueJobFailureCode>(\n this.store,\n \"sync.runs\"\n )\n readonly pipelines = new InMemoryQueue<PipelineRunRequestedQueueJob, PipelineQueueJobFailureCode>(\n this.store,\n \"pipeline.runs\"\n )\n readonly projections = new InMemoryQueue<\n ProjectionRunRequestedQueueJob,\n ProjectionQueueJobFailureCode\n >(this.store, \"projection.runs\")\n readonly workflows = new InMemoryQueue<WorkflowQueueJob, WorkflowQueueJobFailureCode>(\n this.store,\n \"workflow.runs\"\n )\n readonly actions = new InMemoryQueue<ActionRunRequestedQueueJob, ActionQueueJobFailureCode>(\n this.store,\n \"action.runs\"\n )\n readonly agents = new InMemoryQueue<AgentQueueJob, AgentQueueJobFailureCode>(\n this.store,\n \"agent.runs\"\n )\n\n /** Nothing to reach: the store is a field of this object. */\n health(): Promise<void> {\n return Promise.resolve()\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "CCF3BA9256C63ED464756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/connectors/types.ts
|
|
3
|
+
function isOAuthConnectorAdapter(value) {
|
|
4
|
+
return "authentication" in value && value.authentication?.type === "oauth2";
|
|
5
|
+
}
|
|
6
|
+
function isOAuthConnectorDefinition(value) {
|
|
7
|
+
return isOAuthConnectorAdapter(value.adapter);
|
|
8
|
+
}
|
|
9
|
+
function isStaticConnectorDefinition(value) {
|
|
10
|
+
return !isOAuthConnectorDefinition(value);
|
|
11
|
+
}
|
|
12
|
+
function isConnectorDefinition(value) {
|
|
13
|
+
if (!isRecord(value)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const adapter = value.adapter;
|
|
17
|
+
if (value.kind === "connector" && typeof value.id === "string" && isRecord(adapter) && typeof adapter.type === "string" && typeof adapter.connect === "function") {
|
|
18
|
+
if (adapter.authentication === undefined)
|
|
19
|
+
return true;
|
|
20
|
+
const authentication = adapter.authentication;
|
|
21
|
+
if (!isRecord(authentication) || authentication.type !== "oauth2")
|
|
22
|
+
return false;
|
|
23
|
+
return typeof authentication.authorizationUrl === "function" && typeof authentication.exchangeCode === "function" && typeof authentication.refresh === "function" && typeof adapter.discoverAccounts === "function";
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
function isRecord(value) {
|
|
28
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { isOAuthConnectorAdapter, isOAuthConnectorDefinition, isStaticConnectorDefinition, isConnectorDefinition };
|
|
32
|
+
|
|
33
|
+
//# debugId=39E9DA47E39EE2BC64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/connectors/types.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { WebhookDefinition } from \"../webhooks/types\"\n\n/**\n * Runtime context passed to connector adapters when Sixb establishes a connection.\n *\n * Connectors can use this to scope logs, build cache keys, or attach cancellation\n * to long-running startup work.\n */\nexport interface ConnectorContext {\n readonly projectId: string\n readonly connectorId: string\n readonly signal: AbortSignal\n}\n\n/**\n * Minimal contract for a Sixb connector adapter.\n *\n * Adapters are responsible for creating and optionally tearing down a client for an\n * external system. They should return the client shape that feels natural for that system.\n */\nexport interface ConnectorAdapter<TType extends string = string, TClient = unknown> {\n readonly type: TType\n readonly authentication?: never\n readonly webhooks?: readonly WebhookDefinition<unknown, TClient>[]\n connect(context: ConnectorContext): Promise<TClient> | TClient\n disconnect?(client: TClient): Promise<void> | void\n}\n\n/** One OAuth token set normalized by an OAuth connector adapter. */\nexport interface ConnectorOAuthCredentials {\n readonly accessToken: string\n readonly refreshToken?: string\n readonly tokenType?: string\n readonly scopes?: readonly string[]\n readonly expiresAt?: Date\n}\n\n/** Public, non-secret account information returned for framework-owned selection UI. */\nexport interface ConnectorAccountCandidate {\n readonly id: string\n readonly label: string\n readonly description?: string\n readonly avatarUrl?: string\n}\n\n/** V1 intentionally supports project-owned connector connections only. */\nexport interface ProjectConnectorConnectionOwner {\n readonly type: \"project\"\n}\n\nexport type ConnectorConnectionOwner = ProjectConnectorConnectionOwner\n\n/** Stable application-defined lookup key for one connector connection. */\nexport interface ConnectorConnectionSelector {\n readonly owner: ConnectorConnectionOwner\n readonly slot: string\n}\n\n/** Stable, non-secret metadata shared by connector connection consumers. */\nexport interface ConnectorConnectionMetadata extends ConnectorConnectionSelector {\n readonly id: string\n readonly connectorId: string\n readonly account: ConnectorAccountCandidate\n}\n\n/** Credential protection required when an OAuth connector uses durable connection storage. */\nexport interface ConnectorConnectionOptions {\n /** Canonical base64url encoding of exactly 32 random bytes, shared by storage replicas. */\n readonly encryptionKey: string\n}\n\nexport interface OAuthConnectorAuthorizationContext extends ConnectorContext {\n readonly redirectUri: string\n}\n\nexport interface OAuthConnectorAuthorizationUrlInput {\n readonly state: string\n readonly codeChallenge: string\n readonly codeChallengeMethod: \"S256\"\n}\n\nexport interface OAuthConnectorCodeExchangeInput {\n readonly code: string\n readonly codeVerifier: string\n}\n\nexport interface ConnectorConnectionClientContext extends ConnectorContext {\n readonly connectionId: string\n readonly account: ConnectorAccountCandidate\n readonly tokenSource: ConnectorTokenSource\n}\n\n/** One delivered token, bound to the credential revision that produced it. */\nexport interface ConnectorAccessToken {\n readonly accessToken: string\n readonly tokenType?: string\n /** Report this exact token as rejected so Sixb can refresh only its credential revision. */\n invalidate(): void\n}\n\n/** Live credential source owned by Sixb. Adapters must resolve a token for each request. */\nexport interface ConnectorTokenSource {\n get(): Promise<ConnectorAccessToken>\n}\n\n/**\n * OAuth-backed connector adapter. Sixb owns persistence, OAuth state, refresh coordination and UI;\n * the adapter owns provider protocol details and typed client creation.\n */\nexport interface ConnectorOAuth2Authentication {\n readonly type: \"oauth2\"\n authorizationUrl(\n context: OAuthConnectorAuthorizationContext,\n input: OAuthConnectorAuthorizationUrlInput\n ): Promise<string | URL> | string | URL\n exchangeCode(\n context: OAuthConnectorAuthorizationContext,\n input: OAuthConnectorCodeExchangeInput\n ): Promise<ConnectorOAuthCredentials> | ConnectorOAuthCredentials\n refresh(\n context: ConnectorContext,\n credentials: ConnectorOAuthCredentials\n ): Promise<ConnectorOAuthCredentials> | ConnectorOAuthCredentials\n /**\n * Revokes the grant idempotently. An already revoked or invalid grant must resolve successfully\n * so Sixb can converge after losing an earlier provider response.\n */\n revoke?(context: ConnectorContext, credentials: ConnectorOAuthCredentials): Promise<void> | void\n}\n\nexport interface OAuthConnectorAdapter<TType extends string = string, TClient = unknown> {\n readonly type: TType\n readonly authentication: ConnectorOAuth2Authentication\n readonly webhooks?: undefined\n discoverAccounts(\n context: ConnectorContext,\n credentials: ConnectorOAuthCredentials\n ): Promise<readonly ConnectorAccountCandidate[]> | readonly ConnectorAccountCandidate[]\n connect(context: ConnectorConnectionClientContext): Promise<TClient> | TClient\n}\n\nexport type AnyConnectorAdapter = ConnectorAdapter | OAuthConnectorAdapter\n\n/**\n * Inert connector definition registered with Sixb.\n *\n * Definitions are safe to export from `connectors/` modules. The runtime turns them into\n * live clients when `sixb.connector(...)` is called.\n */\nexport interface ConnectorDefinition<\n TId extends string = string,\n TAdapter extends AnyConnectorAdapter = AnyConnectorAdapter,\n> {\n readonly kind: \"connector\"\n readonly id: TId\n readonly adapter: TAdapter\n}\n\nexport type StaticConnectorDefinition = ConnectorDefinition<string, ConnectorAdapter>\n\n/** Infer the connected client type returned by a connector adapter. */\nexport type ConnectorClient<TAdapter extends AnyConnectorAdapter> = Awaited<\n ReturnType<TAdapter[\"connect\"]>\n>\n\nexport function isOAuthConnectorAdapter(\n value: AnyConnectorAdapter\n): value is OAuthConnectorAdapter {\n return \"authentication\" in value && value.authentication?.type === \"oauth2\"\n}\n\nexport function isOAuthConnectorDefinition(\n value: ConnectorDefinition\n): value is ConnectorDefinition<string, OAuthConnectorAdapter> {\n return isOAuthConnectorAdapter(value.adapter)\n}\n\nexport function isStaticConnectorDefinition(\n value: ConnectorDefinition\n): value is StaticConnectorDefinition {\n return !isOAuthConnectorDefinition(value)\n}\n\nexport function isConnectorDefinition(value: unknown): value is ConnectorDefinition {\n if (!isRecord(value)) {\n return false\n }\n\n const adapter = value.adapter\n if (\n value.kind === \"connector\" &&\n typeof value.id === \"string\" &&\n isRecord(adapter) &&\n typeof adapter.type === \"string\" &&\n typeof adapter.connect === \"function\"\n ) {\n if (adapter.authentication === undefined) return true\n const authentication = adapter.authentication\n if (!isRecord(authentication) || authentication.type !== \"oauth2\") return false\n return (\n typeof authentication.authorizationUrl === \"function\" &&\n typeof authentication.exchangeCode === \"function\" &&\n typeof authentication.refresh === \"function\" &&\n typeof adapter.discoverAccounts === \"function\"\n )\n }\n\n return false\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;AAqKO,SAAS,uBAAuB,CACrC,OACgC;AAAA,EAChC,OAAO,oBAAoB,SAAS,MAAM,gBAAgB,SAAS;AAAA;AAG9D,SAAS,0BAA0B,CACxC,OAC6D;AAAA,EAC7D,OAAO,wBAAwB,MAAM,OAAO;AAAA;AAGvC,SAAS,2BAA2B,CACzC,OACoC;AAAA,EACpC,OAAO,CAAC,2BAA2B,KAAK;AAAA;AAGnC,SAAS,qBAAqB,CAAC,OAA8C;AAAA,EAClF,IAAI,CAAC,SAAS,KAAK,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,MAAM;AAAA,EACtB,IACE,MAAM,SAAS,eACf,OAAO,MAAM,OAAO,YACpB,SAAS,OAAO,KAChB,OAAO,QAAQ,SAAS,YACxB,OAAO,QAAQ,YAAY,YAC3B;AAAA,IACA,IAAI,QAAQ,mBAAmB;AAAA,MAAW,OAAO;AAAA,IACjD,MAAM,iBAAiB,QAAQ;AAAA,IAC/B,IAAI,CAAC,SAAS,cAAc,KAAK,eAAe,SAAS;AAAA,MAAU,OAAO;AAAA,IAC1E,OACE,OAAO,eAAe,qBAAqB,cAC3C,OAAO,eAAe,iBAAiB,cACvC,OAAO,eAAe,YAAY,cAClC,OAAO,QAAQ,qBAAqB;AAAA,EAExC;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,QAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAAA;",
|
|
8
|
+
"debugId": "39E9DA47E39EE2BC64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/projections/timestamp.ts
|
|
3
|
+
var DATASET_TIMESTAMP = /^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{2})(?::(\d{2})(?:\.(\d{1,9}))?)?)?([zZ]|[+-]\d{2}:?\d{2})?$/;
|
|
4
|
+
function parseDatasetTimestamp(value) {
|
|
5
|
+
if (value instanceof Date)
|
|
6
|
+
return Number.isNaN(value.getTime()) ? null : value;
|
|
7
|
+
if (typeof value !== "string")
|
|
8
|
+
return null;
|
|
9
|
+
const match = DATASET_TIMESTAMP.exec(value.trim());
|
|
10
|
+
if (!match)
|
|
11
|
+
return null;
|
|
12
|
+
const [, year, month, day, hour, minute, second, fraction, zone] = match;
|
|
13
|
+
const offsetMinutes = parseZoneOffsetMinutes(zone);
|
|
14
|
+
if (offsetMinutes === null)
|
|
15
|
+
return null;
|
|
16
|
+
const components = {
|
|
17
|
+
year: Number(year),
|
|
18
|
+
month: Number(month),
|
|
19
|
+
day: Number(day),
|
|
20
|
+
hour: hour === undefined ? 0 : Number(hour),
|
|
21
|
+
minute: minute === undefined ? 0 : Number(minute),
|
|
22
|
+
second: second === undefined ? 0 : Number(second),
|
|
23
|
+
milliseconds: fraction === undefined ? 0 : Math.trunc(Number(`0.${fraction}`) * 1000)
|
|
24
|
+
};
|
|
25
|
+
const wallClock = Date.UTC(components.year, components.month - 1, components.day, components.hour, components.minute, components.second, components.milliseconds);
|
|
26
|
+
if (!wallClockMatchesComponents(wallClock, components))
|
|
27
|
+
return null;
|
|
28
|
+
return new Date(wallClock - offsetMinutes * 60000);
|
|
29
|
+
}
|
|
30
|
+
function parseZoneOffsetMinutes(zone) {
|
|
31
|
+
if (zone === undefined || zone === "Z" || zone === "z")
|
|
32
|
+
return 0;
|
|
33
|
+
const digits = zone.slice(1).replace(":", "");
|
|
34
|
+
const hours = Number(digits.slice(0, 2));
|
|
35
|
+
const minutes = Number(digits.slice(2, 4));
|
|
36
|
+
if (hours > 23 || minutes > 59)
|
|
37
|
+
return null;
|
|
38
|
+
return (zone[0] === "-" ? -1 : 1) * (hours * 60 + minutes);
|
|
39
|
+
}
|
|
40
|
+
function wallClockMatchesComponents(wallClock, components) {
|
|
41
|
+
const date = new Date(wallClock);
|
|
42
|
+
return date.getUTCFullYear() === components.year && date.getUTCMonth() === components.month - 1 && date.getUTCDate() === components.day && date.getUTCHours() === components.hour && date.getUTCMinutes() === components.minute && date.getUTCSeconds() === components.second;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { parseDatasetTimestamp };
|
|
46
|
+
|
|
47
|
+
//# debugId=E9A28815FA1B574C64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/projections/timestamp.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"const DATASET_TIMESTAMP =\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?)?([zZ]|[+-]\\d{2}:?\\d{2})?$/\n\ninterface TimestampComponents {\n readonly year: number\n readonly month: number\n readonly day: number\n readonly hour: number\n readonly minute: number\n readonly second: number\n readonly milliseconds: number\n}\n\n/** Parses a projection dataset timestamp, interpreting zone-less values as UTC. */\nexport function parseDatasetTimestamp(value: unknown): Date | null {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value\n if (typeof value !== \"string\") return null\n\n const match = DATASET_TIMESTAMP.exec(value.trim())\n if (!match) return null\n const [, year, month, day, hour, minute, second, fraction, zone] = match\n const offsetMinutes = parseZoneOffsetMinutes(zone)\n if (offsetMinutes === null) return null\n\n const components: TimestampComponents = {\n year: Number(year),\n month: Number(month),\n day: Number(day),\n hour: hour === undefined ? 0 : Number(hour),\n minute: minute === undefined ? 0 : Number(minute),\n second: second === undefined ? 0 : Number(second),\n milliseconds: fraction === undefined ? 0 : Math.trunc(Number(`0.${fraction}`) * 1000),\n }\n const wallClock = Date.UTC(\n components.year,\n components.month - 1,\n components.day,\n components.hour,\n components.minute,\n components.second,\n components.milliseconds\n )\n if (!wallClockMatchesComponents(wallClock, components)) return null\n return new Date(wallClock - offsetMinutes * 60_000)\n}\n\nfunction parseZoneOffsetMinutes(zone: string | undefined): number | null {\n if (zone === undefined || zone === \"Z\" || zone === \"z\") return 0\n const digits = zone.slice(1).replace(\":\", \"\")\n const hours = Number(digits.slice(0, 2))\n const minutes = Number(digits.slice(2, 4))\n if (hours > 23 || minutes > 59) return null\n return (zone[0] === \"-\" ? -1 : 1) * (hours * 60 + minutes)\n}\n\nfunction wallClockMatchesComponents(wallClock: number, components: TimestampComponents): boolean {\n const date = new Date(wallClock)\n return (\n date.getUTCFullYear() === components.year &&\n date.getUTCMonth() === components.month - 1 &&\n date.getUTCDate() === components.day &&\n date.getUTCHours() === components.hour &&\n date.getUTCMinutes() === components.minute &&\n date.getUTCSeconds() === components.second\n )\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;AAAA,IAAM,oBACJ;AAaK,SAAS,qBAAqB,CAAC,OAA6B;AAAA,EACjE,IAAI,iBAAiB;AAAA,IAAM,OAAO,OAAO,MAAM,MAAM,QAAQ,CAAC,IAAI,OAAO;AAAA,EACzE,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EAEtC,MAAM,QAAQ,kBAAkB,KAAK,MAAM,KAAK,CAAC;AAAA,EACjD,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACnB,SAAS,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,UAAU,QAAQ;AAAA,EACnE,MAAM,gBAAgB,uBAAuB,IAAI;AAAA,EACjD,IAAI,kBAAkB;AAAA,IAAM,OAAO;AAAA,EAEnC,MAAM,aAAkC;AAAA,IACtC,MAAM,OAAO,IAAI;AAAA,IACjB,OAAO,OAAO,KAAK;AAAA,IACnB,KAAK,OAAO,GAAG;AAAA,IACf,MAAM,SAAS,YAAY,IAAI,OAAO,IAAI;AAAA,IAC1C,QAAQ,WAAW,YAAY,IAAI,OAAO,MAAM;AAAA,IAChD,QAAQ,WAAW,YAAY,IAAI,OAAO,MAAM;AAAA,IAChD,cAAc,aAAa,YAAY,IAAI,KAAK,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtF;AAAA,EACA,MAAM,YAAY,KAAK,IACrB,WAAW,MACX,WAAW,QAAQ,GACnB,WAAW,KACX,WAAW,MACX,WAAW,QACX,WAAW,QACX,WAAW,YACb;AAAA,EACA,IAAI,CAAC,2BAA2B,WAAW,UAAU;AAAA,IAAG,OAAO;AAAA,EAC/D,OAAO,IAAI,KAAK,YAAY,gBAAgB,KAAM;AAAA;AAGpD,SAAS,sBAAsB,CAAC,MAAyC;AAAA,EACvE,IAAI,SAAS,aAAa,SAAS,OAAO,SAAS;AAAA,IAAK,OAAO;AAAA,EAC/D,MAAM,SAAS,KAAK,MAAM,CAAC,EAAE,QAAQ,KAAK,EAAE;AAAA,EAC5C,MAAM,QAAQ,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,EACvC,MAAM,UAAU,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,EACzC,IAAI,QAAQ,MAAM,UAAU;AAAA,IAAI,OAAO;AAAA,EACvC,QAAQ,KAAK,OAAO,MAAM,KAAK,MAAM,QAAQ,KAAK;AAAA;AAGpD,SAAS,0BAA0B,CAAC,WAAmB,YAA0C;AAAA,EAC/F,MAAM,OAAO,IAAI,KAAK,SAAS;AAAA,EAC/B,OACE,KAAK,eAAe,MAAM,WAAW,QACrC,KAAK,YAAY,MAAM,WAAW,QAAQ,KAC1C,KAAK,WAAW,MAAM,WAAW,OACjC,KAAK,YAAY,MAAM,WAAW,QAClC,KAAK,cAAc,MAAM,WAAW,UACpC,KAAK,cAAc,MAAM,WAAW;AAAA;",
|
|
8
|
+
"debugId": "E9A28815FA1B574C64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/schedules/errors.ts
|
|
3
|
+
class ScheduleValidationError extends Error {
|
|
4
|
+
name = "ScheduleValidationError";
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
class CronValidationError extends Error {
|
|
8
|
+
name = "CronValidationError";
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// src/schedules/cron.ts
|
|
12
|
+
function parseInteger(input, fieldName) {
|
|
13
|
+
if (!/^\d+$/.test(input)) {
|
|
14
|
+
throw new CronValidationError(`Invalid ${fieldName}: '${input}'.`);
|
|
15
|
+
}
|
|
16
|
+
return Number.parseInt(input, 10);
|
|
17
|
+
}
|
|
18
|
+
function createCronFieldMatcher(params) {
|
|
19
|
+
const { field, min, max, fieldName } = params;
|
|
20
|
+
const normalize = params.normalize ?? ((value) => value);
|
|
21
|
+
const input = field.trim();
|
|
22
|
+
if (!input) {
|
|
23
|
+
throw new CronValidationError(`Empty cron ${fieldName} field.`);
|
|
24
|
+
}
|
|
25
|
+
if (input === "*") {
|
|
26
|
+
return {
|
|
27
|
+
isAny: true,
|
|
28
|
+
values: null,
|
|
29
|
+
matches: () => true
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const allowed = new Set;
|
|
33
|
+
const segments = input.split(",");
|
|
34
|
+
for (const segment of segments) {
|
|
35
|
+
if (!segment) {
|
|
36
|
+
throw new CronValidationError(`Invalid cron ${fieldName} field: '${input}'.`);
|
|
37
|
+
}
|
|
38
|
+
const stepParts = segment.split("/");
|
|
39
|
+
if (stepParts.length > 2) {
|
|
40
|
+
throw new CronValidationError(`Invalid cron ${fieldName} segment: '${segment}'.`);
|
|
41
|
+
}
|
|
42
|
+
const base = stepParts[0];
|
|
43
|
+
const step = stepParts[1] === undefined ? 1 : parseInteger(stepParts[1], `cron ${fieldName} step for '${segment}'`);
|
|
44
|
+
if (step <= 0) {
|
|
45
|
+
throw new CronValidationError(`Cron ${fieldName} step must be > 0 in segment '${segment}'.`);
|
|
46
|
+
}
|
|
47
|
+
let rangeStart;
|
|
48
|
+
let rangeEnd;
|
|
49
|
+
if (base === "*") {
|
|
50
|
+
rangeStart = min;
|
|
51
|
+
rangeEnd = max;
|
|
52
|
+
} else if (base.includes("-")) {
|
|
53
|
+
const [rawStart, rawEnd] = base.split("-");
|
|
54
|
+
if (!rawStart || !rawEnd) {
|
|
55
|
+
throw new CronValidationError(`Invalid cron ${fieldName} range: '${base}'.`);
|
|
56
|
+
}
|
|
57
|
+
rangeStart = parseInteger(rawStart, `cron ${fieldName} range start for '${base}'`);
|
|
58
|
+
rangeEnd = parseInteger(rawEnd, `cron ${fieldName} range end for '${base}'`);
|
|
59
|
+
} else {
|
|
60
|
+
const value = parseInteger(base, `cron ${fieldName} value '${base}'`);
|
|
61
|
+
rangeStart = value;
|
|
62
|
+
rangeEnd = value;
|
|
63
|
+
}
|
|
64
|
+
if (rangeStart > rangeEnd) {
|
|
65
|
+
throw new CronValidationError(`Cron ${fieldName} range start must be <= end in segment '${segment}'.`);
|
|
66
|
+
}
|
|
67
|
+
for (let value = rangeStart;value <= rangeEnd; value += step) {
|
|
68
|
+
const normalized = normalize(value);
|
|
69
|
+
if (normalized < min || normalized > max) {
|
|
70
|
+
throw new CronValidationError(`Cron ${fieldName} value ${value} is outside range ${min}-${max}.`);
|
|
71
|
+
}
|
|
72
|
+
allowed.add(normalized);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
isAny: false,
|
|
77
|
+
values: allowed,
|
|
78
|
+
matches(value) {
|
|
79
|
+
const normalized = normalize(value);
|
|
80
|
+
return allowed.has(normalized);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function createCronMatcher(expression) {
|
|
85
|
+
const parts = expression.trim().split(/\s+/);
|
|
86
|
+
if (parts.length !== 5) {
|
|
87
|
+
throw new CronValidationError(`Invalid cron expression '${expression}'. Expected 5 fields (minute hour day month weekday).`);
|
|
88
|
+
}
|
|
89
|
+
const [minuteField, hourField, dayOfMonthField, monthField, dayOfWeekField] = parts;
|
|
90
|
+
const minute = createCronFieldMatcher({
|
|
91
|
+
field: minuteField,
|
|
92
|
+
min: 0,
|
|
93
|
+
max: 59,
|
|
94
|
+
fieldName: "minute"
|
|
95
|
+
});
|
|
96
|
+
const hour = createCronFieldMatcher({
|
|
97
|
+
field: hourField,
|
|
98
|
+
min: 0,
|
|
99
|
+
max: 23,
|
|
100
|
+
fieldName: "hour"
|
|
101
|
+
});
|
|
102
|
+
const dayOfMonth = createCronFieldMatcher({
|
|
103
|
+
field: dayOfMonthField,
|
|
104
|
+
min: 1,
|
|
105
|
+
max: 31,
|
|
106
|
+
fieldName: "day-of-month"
|
|
107
|
+
});
|
|
108
|
+
const month = createCronFieldMatcher({
|
|
109
|
+
field: monthField,
|
|
110
|
+
min: 1,
|
|
111
|
+
max: 12,
|
|
112
|
+
fieldName: "month"
|
|
113
|
+
});
|
|
114
|
+
const dayOfWeek = createCronFieldMatcher({
|
|
115
|
+
field: dayOfWeekField,
|
|
116
|
+
min: 0,
|
|
117
|
+
max: 6,
|
|
118
|
+
fieldName: "day-of-week",
|
|
119
|
+
normalize: (value) => value === 7 ? 0 : value
|
|
120
|
+
});
|
|
121
|
+
return (now) => {
|
|
122
|
+
if (!minute.matches(now.getMinutes()))
|
|
123
|
+
return false;
|
|
124
|
+
if (!hour.matches(now.getHours()))
|
|
125
|
+
return false;
|
|
126
|
+
if (!month.matches(now.getMonth() + 1))
|
|
127
|
+
return false;
|
|
128
|
+
const dayOfMonthMatches = dayOfMonth.matches(now.getDate());
|
|
129
|
+
const dayOfWeekMatches = dayOfWeek.matches(now.getDay());
|
|
130
|
+
const dayMatches = dayOfMonth.isAny || dayOfWeek.isAny ? dayOfMonthMatches && dayOfWeekMatches : dayOfMonthMatches || dayOfWeekMatches;
|
|
131
|
+
return dayMatches;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/schedules/next-occurrence.ts
|
|
136
|
+
var MAX_SEARCH_MS = 4 * 365.25 * 24 * 60 * 60 * 1000;
|
|
137
|
+
var timezoneFormatterCache = new Map;
|
|
138
|
+
function getTimezoneFormatter(timezone) {
|
|
139
|
+
let formatter = timezoneFormatterCache.get(timezone);
|
|
140
|
+
if (!formatter) {
|
|
141
|
+
formatter = new Intl.DateTimeFormat("en-US", {
|
|
142
|
+
timeZone: timezone,
|
|
143
|
+
year: "numeric",
|
|
144
|
+
month: "numeric",
|
|
145
|
+
day: "numeric",
|
|
146
|
+
hour: "numeric",
|
|
147
|
+
minute: "numeric",
|
|
148
|
+
weekday: "short",
|
|
149
|
+
hour12: false
|
|
150
|
+
});
|
|
151
|
+
timezoneFormatterCache.set(timezone, formatter);
|
|
152
|
+
}
|
|
153
|
+
return formatter;
|
|
154
|
+
}
|
|
155
|
+
function getLocalComponents(date, timezone) {
|
|
156
|
+
if (timezone === undefined) {
|
|
157
|
+
return {
|
|
158
|
+
minute: date.getUTCMinutes(),
|
|
159
|
+
hour: date.getUTCHours(),
|
|
160
|
+
dayOfMonth: date.getUTCDate(),
|
|
161
|
+
month: date.getUTCMonth() + 1,
|
|
162
|
+
dayOfWeek: date.getUTCDay()
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const formatter = getTimezoneFormatter(timezone);
|
|
166
|
+
const parts = formatter.formatToParts(date);
|
|
167
|
+
const get = (type) => {
|
|
168
|
+
const part = parts.find((p) => p.type === type);
|
|
169
|
+
if (!part)
|
|
170
|
+
throw new CronValidationError(`Failed to extract ${type} for timezone ${timezone}.`);
|
|
171
|
+
return part.value;
|
|
172
|
+
};
|
|
173
|
+
const weekdayStr = get("weekday");
|
|
174
|
+
const weekdayMap = {
|
|
175
|
+
Sun: 0,
|
|
176
|
+
Mon: 1,
|
|
177
|
+
Tue: 2,
|
|
178
|
+
Wed: 3,
|
|
179
|
+
Thu: 4,
|
|
180
|
+
Fri: 5,
|
|
181
|
+
Sat: 6
|
|
182
|
+
};
|
|
183
|
+
return {
|
|
184
|
+
minute: Number.parseInt(get("minute"), 10),
|
|
185
|
+
hour: Number.parseInt(get("hour"), 10) % 24,
|
|
186
|
+
dayOfMonth: Number.parseInt(get("day"), 10),
|
|
187
|
+
month: Number.parseInt(get("month"), 10),
|
|
188
|
+
dayOfWeek: weekdayMap[weekdayStr] ?? 0
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function matchesDay(dayOfMonth, dayOfWeek, comp) {
|
|
192
|
+
const domMatches = dayOfMonth.matches(comp.dayOfMonth);
|
|
193
|
+
const dowMatches = dayOfWeek.matches(comp.dayOfWeek);
|
|
194
|
+
if (dayOfMonth.isAny || dayOfWeek.isAny) {
|
|
195
|
+
return domMatches && dowMatches;
|
|
196
|
+
}
|
|
197
|
+
return domMatches || dowMatches;
|
|
198
|
+
}
|
|
199
|
+
function nextCronOccurrence(expression, after, timezone) {
|
|
200
|
+
const parts = expression.trim().split(/\s+/);
|
|
201
|
+
if (parts.length !== 5) {
|
|
202
|
+
throw new CronValidationError(`Invalid cron expression '${expression}'. Expected 5 fields (minute hour day month weekday).`);
|
|
203
|
+
}
|
|
204
|
+
const [minuteField, hourField, dayOfMonthField, monthField, dayOfWeekField] = parts;
|
|
205
|
+
const minuteMatcher = createCronFieldMatcher({
|
|
206
|
+
field: minuteField,
|
|
207
|
+
min: 0,
|
|
208
|
+
max: 59,
|
|
209
|
+
fieldName: "minute"
|
|
210
|
+
});
|
|
211
|
+
const hourMatcher = createCronFieldMatcher({
|
|
212
|
+
field: hourField,
|
|
213
|
+
min: 0,
|
|
214
|
+
max: 23,
|
|
215
|
+
fieldName: "hour"
|
|
216
|
+
});
|
|
217
|
+
const dayOfMonthMatcher = createCronFieldMatcher({
|
|
218
|
+
field: dayOfMonthField,
|
|
219
|
+
min: 1,
|
|
220
|
+
max: 31,
|
|
221
|
+
fieldName: "day-of-month"
|
|
222
|
+
});
|
|
223
|
+
const monthMatcher = createCronFieldMatcher({
|
|
224
|
+
field: monthField,
|
|
225
|
+
min: 1,
|
|
226
|
+
max: 12,
|
|
227
|
+
fieldName: "month"
|
|
228
|
+
});
|
|
229
|
+
const dayOfWeekMatcher = createCronFieldMatcher({
|
|
230
|
+
field: dayOfWeekField,
|
|
231
|
+
min: 0,
|
|
232
|
+
max: 6,
|
|
233
|
+
fieldName: "day-of-week",
|
|
234
|
+
normalize: (value) => value === 7 ? 0 : value
|
|
235
|
+
});
|
|
236
|
+
const startMs = after.getTime();
|
|
237
|
+
let candidateMs = Math.ceil(startMs / 60000) * 60000;
|
|
238
|
+
if (candidateMs <= startMs)
|
|
239
|
+
candidateMs += 60000;
|
|
240
|
+
const limitMs = startMs + MAX_SEARCH_MS;
|
|
241
|
+
while (candidateMs <= limitMs) {
|
|
242
|
+
const candidate = new Date(candidateMs);
|
|
243
|
+
const comp = getLocalComponents(candidate, timezone);
|
|
244
|
+
if (!monthMatcher.matches(comp.month)) {
|
|
245
|
+
if (timezone === undefined) {
|
|
246
|
+
const next = findNextMatchingMonth(candidate, monthMatcher);
|
|
247
|
+
candidateMs = next.getTime();
|
|
248
|
+
} else {
|
|
249
|
+
candidateMs += ((24 - comp.hour) * 60 - comp.minute) * 60000;
|
|
250
|
+
}
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (!matchesDay(dayOfMonthMatcher, dayOfWeekMatcher, comp)) {
|
|
254
|
+
if (timezone === undefined) {
|
|
255
|
+
const next = new Date(candidateMs);
|
|
256
|
+
next.setUTCDate(next.getUTCDate() + 1);
|
|
257
|
+
next.setUTCHours(0, 0, 0, 0);
|
|
258
|
+
candidateMs = next.getTime();
|
|
259
|
+
} else {
|
|
260
|
+
candidateMs += ((24 - comp.hour) * 60 - comp.minute) * 60000;
|
|
261
|
+
}
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (!hourMatcher.matches(comp.hour)) {
|
|
265
|
+
if (timezone === undefined) {
|
|
266
|
+
const next = new Date(candidateMs);
|
|
267
|
+
next.setUTCHours(next.getUTCHours() + 1, 0, 0, 0);
|
|
268
|
+
candidateMs = next.getTime();
|
|
269
|
+
} else {
|
|
270
|
+
candidateMs += (60 - comp.minute) * 60000;
|
|
271
|
+
}
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (!minuteMatcher.matches(comp.minute)) {
|
|
275
|
+
candidateMs += 60000;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
return candidate;
|
|
279
|
+
}
|
|
280
|
+
throw new CronValidationError(`No matching occurrence found for '${expression}' within 4 years.`);
|
|
281
|
+
}
|
|
282
|
+
function findNextMatchingMonth(current, monthMatcher) {
|
|
283
|
+
const d = new Date(current);
|
|
284
|
+
d.setUTCDate(1);
|
|
285
|
+
d.setUTCHours(0, 0, 0, 0);
|
|
286
|
+
d.setUTCMonth(d.getUTCMonth() + 1);
|
|
287
|
+
for (let i = 0;i < 48; i++) {
|
|
288
|
+
if (monthMatcher.matches(d.getUTCMonth() + 1)) {
|
|
289
|
+
return d;
|
|
290
|
+
}
|
|
291
|
+
d.setUTCMonth(d.getUTCMonth() + 1);
|
|
292
|
+
}
|
|
293
|
+
return d;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { ScheduleValidationError, CronValidationError, createCronFieldMatcher, createCronMatcher, nextCronOccurrence };
|
|
297
|
+
|
|
298
|
+
//# debugId=99F060BDE8225E7864756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/schedules/errors.ts", "../src/schedules/cron.ts", "../src/schedules/next-occurrence.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export class ScheduleValidationError extends Error {\n readonly name = \"ScheduleValidationError\"\n}\n\nexport class CronValidationError extends Error {\n readonly name = \"CronValidationError\"\n}\n",
|
|
6
|
+
"import { CronValidationError } from \"./errors\"\n\nexport interface CronFieldMatcher {\n readonly isAny: boolean\n readonly values: ReadonlySet<number> | null\n matches(value: number): boolean\n}\n\nfunction parseInteger(input: string, fieldName: string): number {\n if (!/^\\d+$/.test(input)) {\n throw new CronValidationError(`Invalid ${fieldName}: '${input}'.`)\n }\n\n return Number.parseInt(input, 10)\n}\n\nexport function createCronFieldMatcher(params: {\n field: string\n min: number\n max: number\n fieldName: string\n normalize?: (value: number) => number\n}): CronFieldMatcher {\n const { field, min, max, fieldName } = params\n const normalize = params.normalize ?? ((value: number) => value)\n const input = field.trim()\n\n if (!input) {\n throw new CronValidationError(`Empty cron ${fieldName} field.`)\n }\n\n if (input === \"*\") {\n return {\n isAny: true,\n values: null,\n matches: () => true,\n }\n }\n\n const allowed = new Set<number>()\n const segments = input.split(\",\")\n\n for (const segment of segments) {\n if (!segment) {\n throw new CronValidationError(`Invalid cron ${fieldName} field: '${input}'.`)\n }\n\n const stepParts = segment.split(\"/\")\n if (stepParts.length > 2) {\n throw new CronValidationError(`Invalid cron ${fieldName} segment: '${segment}'.`)\n }\n\n const base = stepParts[0]\n const step =\n stepParts[1] === undefined\n ? 1\n : parseInteger(stepParts[1], `cron ${fieldName} step for '${segment}'`)\n\n if (step <= 0) {\n throw new CronValidationError(`Cron ${fieldName} step must be > 0 in segment '${segment}'.`)\n }\n\n let rangeStart: number\n let rangeEnd: number\n\n if (base === \"*\") {\n rangeStart = min\n rangeEnd = max\n } else if (base.includes(\"-\")) {\n const [rawStart, rawEnd] = base.split(\"-\")\n if (!rawStart || !rawEnd) {\n throw new CronValidationError(`Invalid cron ${fieldName} range: '${base}'.`)\n }\n\n rangeStart = parseInteger(rawStart, `cron ${fieldName} range start for '${base}'`)\n rangeEnd = parseInteger(rawEnd, `cron ${fieldName} range end for '${base}'`)\n } else {\n const value = parseInteger(base, `cron ${fieldName} value '${base}'`)\n rangeStart = value\n rangeEnd = value\n }\n\n if (rangeStart > rangeEnd) {\n throw new CronValidationError(\n `Cron ${fieldName} range start must be <= end in segment '${segment}'.`\n )\n }\n\n for (let value = rangeStart; value <= rangeEnd; value += step) {\n const normalized = normalize(value)\n if (normalized < min || normalized > max) {\n throw new CronValidationError(\n `Cron ${fieldName} value ${value} is outside range ${min}-${max}.`\n )\n }\n allowed.add(normalized)\n }\n }\n\n return {\n isAny: false,\n values: allowed,\n matches(value: number) {\n const normalized = normalize(value)\n return allowed.has(normalized)\n },\n }\n}\n\nexport function createCronMatcher(expression: string): (now: Date) => boolean {\n const parts = expression.trim().split(/\\s+/)\n if (parts.length !== 5) {\n throw new CronValidationError(\n `Invalid cron expression '${expression}'. Expected 5 fields (minute hour day month weekday).`\n )\n }\n\n const [minuteField, hourField, dayOfMonthField, monthField, dayOfWeekField] = parts\n\n const minute = createCronFieldMatcher({\n field: minuteField,\n min: 0,\n max: 59,\n fieldName: \"minute\",\n })\n const hour = createCronFieldMatcher({\n field: hourField,\n min: 0,\n max: 23,\n fieldName: \"hour\",\n })\n const dayOfMonth = createCronFieldMatcher({\n field: dayOfMonthField,\n min: 1,\n max: 31,\n fieldName: \"day-of-month\",\n })\n const month = createCronFieldMatcher({\n field: monthField,\n min: 1,\n max: 12,\n fieldName: \"month\",\n })\n const dayOfWeek = createCronFieldMatcher({\n field: dayOfWeekField,\n min: 0,\n max: 6,\n fieldName: \"day-of-week\",\n normalize: (value) => (value === 7 ? 0 : value),\n })\n\n return (now: Date) => {\n if (!minute.matches(now.getMinutes())) return false\n if (!hour.matches(now.getHours())) return false\n if (!month.matches(now.getMonth() + 1)) return false\n\n const dayOfMonthMatches = dayOfMonth.matches(now.getDate())\n const dayOfWeekMatches = dayOfWeek.matches(now.getDay())\n const dayMatches =\n dayOfMonth.isAny || dayOfWeek.isAny\n ? dayOfMonthMatches && dayOfWeekMatches\n : dayOfMonthMatches || dayOfWeekMatches\n\n return dayMatches\n }\n}\n",
|
|
7
|
+
"import { type CronFieldMatcher, createCronFieldMatcher } from \"./cron\"\nimport { CronValidationError } from \"./errors\"\n\nconst MAX_SEARCH_MS = 4 * 365.25 * 24 * 60 * 60 * 1000 // ~4 years\n\ninterface LocalComponents {\n minute: number\n hour: number\n dayOfMonth: number\n month: number // 1-based\n dayOfWeek: number // 0=Sunday\n}\n\n// Intl.DateTimeFormat construction is expensive (~30-100µs each); the search\n// loop in nextCronOccurrence calls getLocalComponents many times for sparse\n// crons, so we cache one formatter per timezone for the lifetime of the process.\nconst timezoneFormatterCache = new Map<string, Intl.DateTimeFormat>()\n\nfunction getTimezoneFormatter(timezone: string): Intl.DateTimeFormat {\n let formatter = timezoneFormatterCache.get(timezone)\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n weekday: \"short\",\n hour12: false,\n })\n timezoneFormatterCache.set(timezone, formatter)\n }\n return formatter\n}\n\nfunction getLocalComponents(date: Date, timezone: string | undefined): LocalComponents {\n if (timezone === undefined) {\n return {\n minute: date.getUTCMinutes(),\n hour: date.getUTCHours(),\n dayOfMonth: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n dayOfWeek: date.getUTCDay(),\n }\n }\n\n const formatter = getTimezoneFormatter(timezone)\n const parts = formatter.formatToParts(date)\n const get = (type: Intl.DateTimeFormatPartTypes): string => {\n const part = parts.find((p) => p.type === type)\n if (!part) throw new CronValidationError(`Failed to extract ${type} for timezone ${timezone}.`)\n return part.value\n }\n\n const weekdayStr = get(\"weekday\")\n const weekdayMap: Record<string, number> = {\n Sun: 0,\n Mon: 1,\n Tue: 2,\n Wed: 3,\n Thu: 4,\n Fri: 5,\n Sat: 6,\n }\n\n return {\n minute: Number.parseInt(get(\"minute\"), 10),\n hour: Number.parseInt(get(\"hour\"), 10) % 24,\n dayOfMonth: Number.parseInt(get(\"day\"), 10),\n month: Number.parseInt(get(\"month\"), 10),\n dayOfWeek: weekdayMap[weekdayStr] ?? 0,\n }\n}\n\nfunction matchesDay(\n dayOfMonth: CronFieldMatcher,\n dayOfWeek: CronFieldMatcher,\n comp: LocalComponents\n): boolean {\n const domMatches = dayOfMonth.matches(comp.dayOfMonth)\n const dowMatches = dayOfWeek.matches(comp.dayOfWeek)\n\n if (dayOfMonth.isAny || dayOfWeek.isAny) {\n return domMatches && dowMatches\n }\n return domMatches || dowMatches\n}\n\n/**\n * Compute the next occurrence of a cron expression after `after`.\n *\n * The returned Date is always in UTC. When `timezone` is provided, the cron\n * fields are evaluated against wall-clock time in that timezone.\n *\n * The current minute is never returned — the earliest possible result is\n * `after` rounded up to the next whole minute.\n */\nexport function nextCronOccurrence(expression: string, after: Date, timezone?: string): Date {\n const parts = expression.trim().split(/\\s+/)\n if (parts.length !== 5) {\n throw new CronValidationError(\n `Invalid cron expression '${expression}'. Expected 5 fields (minute hour day month weekday).`\n )\n }\n\n const [minuteField, hourField, dayOfMonthField, monthField, dayOfWeekField] = parts\n\n const minuteMatcher = createCronFieldMatcher({\n field: minuteField,\n min: 0,\n max: 59,\n fieldName: \"minute\",\n })\n const hourMatcher = createCronFieldMatcher({\n field: hourField,\n min: 0,\n max: 23,\n fieldName: \"hour\",\n })\n const dayOfMonthMatcher = createCronFieldMatcher({\n field: dayOfMonthField,\n min: 1,\n max: 31,\n fieldName: \"day-of-month\",\n })\n const monthMatcher = createCronFieldMatcher({\n field: monthField,\n min: 1,\n max: 12,\n fieldName: \"month\",\n })\n const dayOfWeekMatcher = createCronFieldMatcher({\n field: dayOfWeekField,\n min: 0,\n max: 6,\n fieldName: \"day-of-week\",\n normalize: (value) => (value === 7 ? 0 : value),\n })\n\n // Start from the next whole minute after `after`\n const startMs = after.getTime()\n let candidateMs = Math.ceil(startMs / 60_000) * 60_000\n if (candidateMs <= startMs) candidateMs += 60_000\n\n const limitMs = startMs + MAX_SEARCH_MS\n\n while (candidateMs <= limitMs) {\n const candidate = new Date(candidateMs)\n const comp = getLocalComponents(candidate, timezone)\n\n // Month check — skip ahead if no match\n if (!monthMatcher.matches(comp.month)) {\n if (timezone === undefined) {\n const next = findNextMatchingMonth(candidate, monthMatcher)\n candidateMs = next.getTime()\n } else {\n // Skip to next local day boundary, then continue\n candidateMs += ((24 - comp.hour) * 60 - comp.minute) * 60_000\n }\n continue\n }\n\n // Day check — skip ahead if no match\n if (!matchesDay(dayOfMonthMatcher, dayOfWeekMatcher, comp)) {\n if (timezone === undefined) {\n const next = new Date(candidateMs)\n next.setUTCDate(next.getUTCDate() + 1)\n next.setUTCHours(0, 0, 0, 0)\n candidateMs = next.getTime()\n } else {\n // Skip to next local day boundary\n candidateMs += ((24 - comp.hour) * 60 - comp.minute) * 60_000\n }\n continue\n }\n\n // Hour check — skip ahead if no match\n if (!hourMatcher.matches(comp.hour)) {\n if (timezone === undefined) {\n const next = new Date(candidateMs)\n next.setUTCHours(next.getUTCHours() + 1, 0, 0, 0)\n candidateMs = next.getTime()\n } else {\n // Skip to next local hour boundary\n candidateMs += (60 - comp.minute) * 60_000\n }\n continue\n }\n\n // Minute check\n if (!minuteMatcher.matches(comp.minute)) {\n candidateMs += 60_000\n continue\n }\n\n return candidate\n }\n\n throw new CronValidationError(`No matching occurrence found for '${expression}' within 4 years.`)\n}\n\nfunction findNextMatchingMonth(current: Date, monthMatcher: CronFieldMatcher): Date {\n const d = new Date(current)\n d.setUTCDate(1)\n d.setUTCHours(0, 0, 0, 0)\n d.setUTCMonth(d.getUTCMonth() + 1)\n\n for (let i = 0; i < 48; i++) {\n if (monthMatcher.matches(d.getUTCMonth() + 1)) {\n return d\n }\n d.setUTCMonth(d.getUTCMonth() + 1)\n }\n\n return d\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "99F060BDE8225E7864756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
nextCronOccurrence
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-979ww6b3.js";
|
|
5
5
|
|
|
6
6
|
// src/scheduler/errors.ts
|
|
7
7
|
class SchedulerError extends Error {
|
|
@@ -13,6 +13,7 @@ class SchedulerValidationError extends Error {
|
|
|
13
13
|
}
|
|
14
14
|
// src/scheduler/runtime.ts
|
|
15
15
|
var DEFAULT_EMIT_DRAIN_TIMEOUT_MS = 5000;
|
|
16
|
+
var MAX_TIMER_DELAY_MS = 2147483647;
|
|
16
17
|
|
|
17
18
|
class SchedulerRuntime {
|
|
18
19
|
schedules;
|
|
@@ -39,8 +40,12 @@ class SchedulerRuntime {
|
|
|
39
40
|
}
|
|
40
41
|
const now = this.now();
|
|
41
42
|
for (const schedule of this.schedules) {
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
try {
|
|
44
|
+
const next = nextCronOccurrence(schedule.trigger.expression, now, schedule.trigger.timezone);
|
|
45
|
+
this.nextOccurrences.set(schedule.id, next);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error(`[Sixb] Scheduler failed to compute next occurrence for '${schedule.id}':`, error);
|
|
48
|
+
}
|
|
44
49
|
}
|
|
45
50
|
this.armTimer();
|
|
46
51
|
this.started = true;
|
|
@@ -86,7 +91,7 @@ class SchedulerRuntime {
|
|
|
86
91
|
}
|
|
87
92
|
if (earliest === null)
|
|
88
93
|
return;
|
|
89
|
-
const delayMs = Math.max(0, earliest.getTime() - this.now().getTime());
|
|
94
|
+
const delayMs = Math.min(Math.max(0, earliest.getTime() - this.now().getTime()), MAX_TIMER_DELAY_MS);
|
|
90
95
|
this.timer = setTimeout(() => this.tick(), delayMs);
|
|
91
96
|
}
|
|
92
97
|
tick() {
|
|
@@ -133,4 +138,4 @@ function isCronSchedule(schedule) {
|
|
|
133
138
|
}
|
|
134
139
|
export { SchedulerError, SchedulerValidationError, SchedulerRuntime };
|
|
135
140
|
|
|
136
|
-
//# debugId=
|
|
141
|
+
//# debugId=D42DA56033AA99DC64756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/scheduler/errors.ts", "../src/scheduler/runtime.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export class SchedulerError extends Error {\n readonly name = \"SchedulerError\"\n}\n\nexport class SchedulerValidationError extends Error {\n readonly name = \"SchedulerValidationError\"\n}\n",
|
|
6
|
+
"import type { DomainEventLog } from \"../events\"\nimport { nextCronOccurrence } from \"../schedules/next-occurrence\"\nimport type { CronScheduleDefinition, ScheduleDefinition } from \"../schedules/types\"\nimport { SchedulerValidationError } from \"./errors\"\n\n/** Matches the `onError` flush budget: long enough for a healthy broker, short enough to shut down. */\nconst DEFAULT_EMIT_DRAIN_TIMEOUT_MS = 5_000\n\n/**\n * Largest delay `setTimeout` accepts before it overflows its 32-bit counter.\n *\n * Node coerces anything larger to `1`, so an unclamped monthly or yearly occurrence would fire\n * immediately, find nothing due, and re-arm on the next tick -- spinning the event loop and\n * emitting a `TimeoutOverflowWarning` for every re-arm until the occurrence came into range.\n */\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport interface SchedulerRuntimeOptions {\n schedules: readonly ScheduleDefinition[]\n events: DomainEventLog\n now?: () => Date\n}\n\n/** Process lifecycle surface exposed by SixbHost. */\nexport interface SchedulerController {\n start(): Promise<void>\n stop(): Promise<void>\n}\n\nexport class SchedulerRuntime implements SchedulerController {\n private readonly schedules: readonly CronScheduleDefinition[]\n private readonly events: DomainEventLog\n private readonly now: () => Date\n private started = false\n private timer: ReturnType<typeof setTimeout> | null = null\n private readonly nextOccurrences = new Map<string, Date>()\n private readonly pendingEmits = new Set<Promise<void>>()\n\n constructor(options: SchedulerRuntimeOptions) {\n this.schedules = options.schedules.filter(isCronSchedule)\n this.events = options.events\n this.now = options.now ?? (() => new Date())\n }\n\n async start(): Promise<void> {\n if (this.started) return\n\n const seenIds = new Set<string>()\n for (const schedule of this.schedules) {\n if (seenIds.has(schedule.id)) {\n throw new SchedulerValidationError(`Duplicate schedule id '${schedule.id}'.`)\n }\n seenIds.add(schedule.id)\n }\n\n const now = this.now()\n for (const schedule of this.schedules) {\n // Syntactically valid expressions can still have no reachable occurrence -- `0 0 30 2 *`\n // parses but never matches. `tick()` already tolerates that per schedule; start-up must\n // agree, or one unschedulable expression stops every other schedule in the project and\n // crash-loops the scheduler role.\n try {\n const next = nextCronOccurrence(schedule.trigger.expression, now, schedule.trigger.timezone)\n this.nextOccurrences.set(schedule.id, next)\n } catch (error) {\n console.error(\n `[Sixb] Scheduler failed to compute next occurrence for '${schedule.id}':`,\n error\n )\n }\n }\n\n this.armTimer()\n this.started = true\n }\n\n async stop(): Promise<void> {\n if (this.timer !== null) {\n clearTimeout(this.timer)\n this.timer = null\n }\n this.nextOccurrences.clear()\n this.started = false\n await this.drainEmits()\n }\n\n /**\n * Wait for in-flight `schedule.triggered` emits so shutdown does not return mid-delivery.\n *\n * Bounded on purpose. `emit` never rejects, so an emit that never *settles* — a broker that accepts\n * the call and then hangs — would make `stop()` wait forever, turning a provider stall into a\n * process that cannot shut down. Losing the wait is recoverable; losing shutdown is not.\n */\n private async drainEmits(timeoutMs = DEFAULT_EMIT_DRAIN_TIMEOUT_MS): Promise<void> {\n if (this.pendingEmits.size === 0) return\n\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n const drained = await Promise.race([\n Promise.all([...this.pendingEmits]).then(() => true),\n new Promise<false>((resolve) => {\n timer = setTimeout(() => resolve(false), timeoutMs)\n }),\n ])\n if (!drained) {\n console.error(\n `[Sixb] Timed out after ${timeoutMs}ms waiting for ${this.pendingEmits.size} schedule emit(s) to settle.`\n )\n }\n } finally {\n if (timer) clearTimeout(timer)\n }\n }\n\n private armTimer(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer)\n this.timer = null\n }\n\n let earliest: Date | null = null\n for (const date of this.nextOccurrences.values()) {\n if (earliest === null || date.getTime() < earliest.getTime()) {\n earliest = date\n }\n }\n\n if (earliest === null) return\n\n // Waking early is harmless: `tick()` re-arms from the same occurrence map, so a clamped delay\n // just becomes several sleeps instead of one.\n const delayMs = Math.min(\n Math.max(0, earliest.getTime() - this.now().getTime()),\n MAX_TIMER_DELAY_MS\n )\n this.timer = setTimeout(() => this.tick(), delayMs)\n }\n\n private tick(): void {\n const now = this.now()\n\n // Collect all due schedules\n const dueSchedules: Array<{ schedule: CronScheduleDefinition; occurrenceAt: Date }> = []\n for (const schedule of this.schedules) {\n const occurrence = this.nextOccurrences.get(schedule.id)\n if (occurrence && occurrence.getTime() <= now.getTime()) {\n dueSchedules.push({ schedule, occurrenceAt: occurrence })\n }\n }\n\n // Emit events and recalculate next occurrences\n for (const { schedule, occurrenceAt } of dueSchedules) {\n const occurrenceAtIso = occurrenceAt.toISOString()\n // `emit` reports instead of rejecting, so nothing is swallowed here. The previous\n // `void this.events.append(...)` inside a `try` could not observe a rejection at all: a broker\n // outage meant the schedule silently never fired.\n this.track(\n this.events.emit(\n {\n events: [\n {\n type: \"schedule.triggered\",\n payload: {\n scheduleId: schedule.id,\n occurrenceAt: occurrenceAtIso,\n triggeredAt: now.toISOString(),\n occurrenceKey: `${schedule.id}:${occurrenceAtIso}`,\n },\n },\n ],\n },\n { source: \"Sixb\" }\n )\n )\n\n // Calculate next from the logical occurrence time (not now) to avoid drift\n try {\n const next = nextCronOccurrence(\n schedule.trigger.expression,\n occurrenceAt,\n schedule.trigger.timezone\n )\n this.nextOccurrences.set(schedule.id, next)\n } catch (error) {\n console.error(\n `[Sixb] Scheduler failed to compute next occurrence for '${schedule.id}':`,\n error\n )\n this.nextOccurrences.delete(schedule.id)\n }\n }\n\n this.armTimer()\n }\n\n /** Keep in-flight emits awaitable so `stop()` does not return mid-delivery. */\n private track(emit: Promise<void>): void {\n const tracked = emit.finally(() => this.pendingEmits.delete(tracked))\n this.pendingEmits.add(tracked)\n }\n}\n\nfunction isCronSchedule(schedule: ScheduleDefinition): schedule is CronScheduleDefinition {\n return schedule.trigger.type === \"cron\"\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "D42DA56033AA99DC64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|