@sixb/core 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.d.ts +2 -2
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +28 -26
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/read-facade.d.ts +14 -16
- package/dist/actions/read-facade.d.ts.map +1 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-dispatch.d.ts +2 -0
- package/dist/actions/run-dispatch.d.ts.map +1 -1
- package/dist/actions/types/context.d.ts +18 -31
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/types/params.d.ts +2 -1
- package/dist/actions/types/params.d.ts.map +1 -1
- package/dist/actions/worker.js +1 -1
- package/dist/agents/index.js +41 -39
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/streams/index.js +2 -2
- package/dist/agents/streams/internal.js +2 -2
- package/dist/assert-never.d.ts +6 -0
- package/dist/assert-never.d.ts.map +1 -0
- package/dist/auth/client-address.d.ts +3 -0
- package/dist/auth/client-address.d.ts.map +1 -0
- package/dist/auth/csrf.d.ts +5 -1
- package/dist/auth/csrf.d.ts.map +1 -1
- package/dist/auth/errors.d.ts +12 -0
- package/dist/auth/errors.d.ts.map +1 -1
- package/dist/auth/index.d.ts +4 -3
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +16 -8
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +58 -41
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/session-cache.d.ts +10 -3
- package/dist/auth/session-cache.d.ts.map +1 -1
- package/dist/auth/sessions.d.ts +12 -0
- package/dist/auth/sessions.d.ts.map +1 -1
- package/dist/auth/strategy.d.ts +2 -0
- package/dist/auth/strategy.d.ts.map +1 -1
- package/dist/auth/strategy.js +4 -2
- package/dist/auth/strategy.js.map +1 -1
- package/dist/auth/types.d.ts +16 -15
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/index.js +3 -3
- package/dist/bootstrap/index.d.ts +1 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +45 -43
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/bootstrap/ontology-type-manifest.d.ts +8 -0
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/{chunk-m7cx05vp.js → chunk-00pfcqh4.js} +126 -59
- package/dist/{chunk-m7cx05vp.js.map → chunk-00pfcqh4.js.map} +13 -12
- package/dist/{chunk-nzsy3xrp.js → chunk-16jenmzw.js} +69 -44
- package/dist/{chunk-nzsy3xrp.js.map → chunk-16jenmzw.js.map} +7 -7
- package/dist/{chunk-y3ev53cq.js → chunk-2fv8sajb.js} +2 -2
- package/dist/{chunk-q5gz3g2j.js → chunk-2jntasmh.js} +13 -16
- package/dist/{chunk-q5gz3g2j.js.map → chunk-2jntasmh.js.map} +3 -3
- package/dist/chunk-3a338wrp.js +191 -0
- package/dist/chunk-3a338wrp.js.map +11 -0
- package/dist/{chunk-ybhz3j9g.js → chunk-3fpgxpsq.js} +104 -148
- package/dist/{chunk-ybhz3j9g.js.map → chunk-3fpgxpsq.js.map} +7 -8
- package/dist/{chunk-eyjzgav0.js → chunk-3nx8vj5a.js} +6 -4
- package/dist/chunk-3nx8vj5a.js.map +12 -0
- package/dist/{chunk-5tetw4hn.js → chunk-4tnrzqqh.js} +1 -1
- package/dist/{chunk-3ghw2t5q.js → chunk-4ypbe95r.js} +10 -16
- package/dist/chunk-4ypbe95r.js.map +10 -0
- package/dist/{chunk-2cxv584m.js → chunk-6rzb1g6h.js} +358 -248
- package/dist/chunk-6rzb1g6h.js.map +44 -0
- package/dist/{chunk-7zgecwy1.js → chunk-6x0pqh32.js} +12 -1
- package/dist/{chunk-7zgecwy1.js.map → chunk-6x0pqh32.js.map} +3 -3
- package/dist/{chunk-6ma8dvzc.js → chunk-728fp090.js} +49 -42
- package/dist/chunk-728fp090.js.map +15 -0
- package/dist/chunk-96yw3pwd.js.map +2 -2
- package/dist/{chunk-4k53sm9e.js → chunk-a0073121.js} +59 -59
- package/dist/{chunk-4k53sm9e.js.map → chunk-a0073121.js.map} +5 -5
- package/dist/{chunk-y1ahv8b7.js → chunk-bdhfn0ww.js} +1 -1
- package/dist/{chunk-kept9cdd.js → chunk-bxx3ms5t.js} +1 -1
- package/dist/{chunk-xtfryrfb.js → chunk-cbn96bve.js} +2 -2
- package/dist/{chunk-vsg0g7h9.js → chunk-d8yes9yx.js} +304 -45
- package/dist/chunk-d8yes9yx.js.map +20 -0
- package/dist/{chunk-vpxss818.js → chunk-drz59ve0.js} +9 -8
- package/dist/chunk-drz59ve0.js.map +10 -0
- package/dist/{chunk-7c2g3sz9.js → chunk-dsfw1bdr.js} +5 -5
- package/dist/{chunk-7c2g3sz9.js.map → chunk-dsfw1bdr.js.map} +1 -1
- package/dist/{chunk-qm535afa.js → chunk-dv4ct8mp.js} +66 -24
- package/dist/chunk-dv4ct8mp.js.map +15 -0
- package/dist/{chunk-t7dzd1tm.js → chunk-e2c5yxfe.js} +2 -2
- package/dist/{chunk-p6r1ex7t.js → chunk-ffwvdgk1.js} +5 -13
- package/dist/chunk-ffwvdgk1.js.map +10 -0
- package/dist/{chunk-tg4g4zh0.js → chunk-gct3m1da.js} +9 -9
- package/dist/{chunk-tg4g4zh0.js.map → chunk-gct3m1da.js.map} +3 -3
- package/dist/chunk-h89wz928.js +42 -0
- package/dist/chunk-h89wz928.js.map +10 -0
- package/dist/{chunk-b768c93y.js → chunk-hj0n3c2p.js} +83 -28
- package/dist/{chunk-b768c93y.js.map → chunk-hj0n3c2p.js.map} +5 -5
- package/dist/{chunk-hkw8rykk.js → chunk-ht4a7mjg.js} +74 -4
- package/dist/chunk-ht4a7mjg.js.map +15 -0
- package/dist/{chunk-7qnvhtcd.js → chunk-hxgj4kzd.js} +17 -17
- package/dist/{chunk-7qnvhtcd.js.map → chunk-hxgj4kzd.js.map} +5 -5
- package/dist/{chunk-bg2bs62d.js → chunk-jfdggg1p.js} +5 -5
- package/dist/{chunk-f06sf7rr.js → chunk-k4kkp58d.js} +18 -5
- package/dist/chunk-k4kkp58d.js.map +11 -0
- package/dist/{chunk-e1f1sqba.js → chunk-kxea54yg.js} +3 -3
- package/dist/{chunk-2h63nrde.js → chunk-ky7zpbtt.js} +5 -7
- package/dist/{chunk-2h63nrde.js.map → chunk-ky7zpbtt.js.map} +3 -4
- package/dist/chunk-m4ehq95f.js +9 -0
- package/dist/chunk-m4ehq95f.js.map +10 -0
- package/dist/{chunk-0mza4xb2.js → chunk-m8zkvep1.js} +2 -2
- package/dist/{chunk-xn686q2e.js → chunk-ma1mhh7w.js} +75 -57
- package/dist/{chunk-xn686q2e.js.map → chunk-ma1mhh7w.js.map} +3 -3
- package/dist/{chunk-yxb4c62x.js → chunk-mr60an99.js} +3 -2
- package/dist/{chunk-yxb4c62x.js.map → chunk-mr60an99.js.map} +3 -3
- package/dist/{chunk-g50nxqs5.js → chunk-pvgpckm1.js} +63 -20
- package/dist/chunk-pvgpckm1.js.map +20 -0
- package/dist/{chunk-jjwhy3rs.js → chunk-q2xghyft.js} +5 -5
- package/dist/chunk-rdghfsss.js.map +2 -2
- package/dist/{chunk-bbaa1fet.js → chunk-rzcjp5m2.js} +7 -3
- package/dist/chunk-rzcjp5m2.js.map +25 -0
- package/dist/{chunk-hzw7yv5g.js → chunk-rzkr70gr.js} +5 -1
- package/dist/{chunk-hzw7yv5g.js.map → chunk-rzkr70gr.js.map} +3 -3
- package/dist/{chunk-axndsymr.js → chunk-tw03bsmb.js} +2 -2
- package/dist/{chunk-axndsymr.js.map → chunk-tw03bsmb.js.map} +3 -3
- package/dist/{chunk-y0v18c2j.js → chunk-vef6qa14.js} +2 -2
- package/dist/{chunk-gzt6v1ja.js → chunk-vn3yh259.js} +1 -1
- package/dist/{chunk-sfypc7mk.js → chunk-wn7mznxc.js} +4 -4
- package/dist/{chunk-r5zythxp.js → chunk-wnxabtn4.js} +7 -7
- package/dist/{chunk-4ph94nhd.js → chunk-ww185kt6.js} +2 -2
- package/dist/{chunk-3h7ctayx.js → chunk-xgptywp0.js} +4 -3
- package/dist/chunk-xgptywp0.js.map +11 -0
- package/dist/{chunk-gswwr35f.js → chunk-y487ywrv.js} +4 -4
- package/dist/{chunk-bet1rb9h.js → chunk-y6vnvayj.js} +1 -1
- package/dist/{chunk-x9tmx3fc.js → chunk-ypj2wqtj.js} +3 -6
- package/dist/{chunk-x9tmx3fc.js.map → chunk-ypj2wqtj.js.map} +4 -4
- package/dist/{chunk-3bnt2wna.js → chunk-yvf2jqj8.js} +1 -1
- package/dist/{chunk-g2gezsg5.js → chunk-z9h698s8.js} +1 -1
- package/dist/{chunk-wjffn5m4.js → chunk-zdkcdshk.js} +3 -36
- package/dist/{chunk-wjffn5m4.js.map → chunk-zdkcdshk.js.map} +3 -4
- package/dist/{chunk-bfjv1adk.js → chunk-znw0zvy4.js} +1 -1
- package/dist/edits/types.d.ts +19 -19
- package/dist/edits/types.d.ts.map +1 -1
- package/dist/error-reporting/internal.js +3 -3
- package/dist/errors/catalog.d.ts +4 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/internal.js +1 -1
- package/dist/events/envelope.d.ts +0 -12
- package/dist/events/envelope.d.ts.map +1 -1
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +3 -3
- package/dist/events/service.d.ts +1 -2
- package/dist/events/service.d.ts.map +1 -1
- package/dist/events/toStoredEvent.d.ts +1 -2
- package/dist/events/toStoredEvent.d.ts.map +1 -1
- package/dist/events/types/index.d.ts +2 -1
- package/dist/events/types/index.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +1 -2
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +39 -37
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/primitive.d.ts +1 -2
- package/dist/execution/primitive.d.ts.map +1 -1
- package/dist/execution/primitive.js +38 -36
- package/dist/execution/primitive.js.map +3 -3
- package/dist/execution/request.d.ts +1 -2
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +39 -37
- package/dist/execution/request.js.map +3 -3
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +56 -50
- package/dist/index.js.map +1 -1
- package/dist/maintenance/ontology-maintenance.d.ts +11 -1
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
- package/dist/materialization/errors.d.ts +3 -1
- package/dist/materialization/errors.d.ts.map +1 -1
- package/dist/materialization/events.d.ts +27 -2
- package/dist/materialization/events.d.ts.map +1 -1
- package/dist/materializer/edits/commit.d.ts.map +1 -1
- package/dist/materializer/edits/operations.d.ts +2 -1
- package/dist/materializer/edits/operations.d.ts.map +1 -1
- package/dist/materializer/edits/plan.d.ts +2 -2
- package/dist/materializer/edits/plan.d.ts.map +1 -1
- package/dist/materializer/edits/user-refs.d.ts +30 -0
- package/dist/materializer/edits/user-refs.d.ts.map +1 -0
- package/dist/materializer/effective/build-events.d.ts +2 -2
- package/dist/materializer/effective/build-events.d.ts.map +1 -1
- package/dist/materializer/execution/scope.d.ts +11 -3
- package/dist/materializer/execution/scope.d.ts.map +1 -1
- package/dist/materializer/index.js +23 -21
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/projections/replacement-plan.d.ts +2 -0
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
- package/dist/materializer/telemetry/plan.d.ts +2 -2
- package/dist/materializer/telemetry/plan.d.ts.map +1 -1
- package/dist/models/execution/index.js +23 -21
- package/dist/models/execution/index.js.map +1 -1
- package/dist/models/index.js +1 -1
- package/dist/objects/execution.d.ts +21 -27
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +28 -26
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.js +27 -25
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/ir.d.ts +8 -1
- package/dist/objects/query/ir.d.ts.map +1 -1
- package/dist/objects/query/scalar-values.d.ts.map +1 -1
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts +1 -2
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts +2 -3
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/query-builder.d.ts +8 -10
- package/dist/objects/sdk/query-builder.d.ts.map +1 -1
- package/dist/objects/sdk/telemetry-channel.d.ts +1 -2
- package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
- package/dist/objects/sdk/where.d.ts +2 -3
- package/dist/objects/sdk/where.d.ts.map +1 -1
- package/dist/ontology/builders.d.ts +11 -10
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/index.d.ts +4 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +6 -4
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/inference/index.d.ts +34 -22
- package/dist/ontology/inference/index.d.ts.map +1 -1
- package/dist/ontology/internal.d.ts +1 -0
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +9 -7
- package/dist/ontology/internal.js.map +1 -1
- package/dist/ontology/primitives.d.ts +38 -0
- package/dist/ontology/primitives.d.ts.map +1 -0
- package/dist/ontology/query-capabilities.d.ts +38 -0
- package/dist/ontology/query-capabilities.d.ts.map +1 -0
- package/dist/ontology/refs.d.ts +23 -2
- package/dist/ontology/refs.d.ts.map +1 -1
- package/dist/ontology/registered.d.ts +16 -0
- package/dist/ontology/registered.d.ts.map +1 -0
- package/dist/ontology/registry.d.ts.map +1 -1
- package/dist/ontology/tokens.d.ts +35 -1
- package/dist/ontology/tokens.d.ts.map +1 -1
- package/dist/ontology/types.d.ts +18 -4
- package/dist/ontology/types.d.ts.map +1 -1
- package/dist/ontology/user-ref.d.ts +35 -0
- package/dist/ontology/user-ref.d.ts.map +1 -0
- package/dist/ontology/validation/definition.d.ts.map +1 -1
- package/dist/ontology/validation/index.d.ts +1 -1
- package/dist/ontology/validation/index.d.ts.map +1 -1
- package/dist/ontology/validation/normalize.d.ts.map +1 -1
- package/dist/ontology/validation/properties.d.ts +6 -1
- package/dist/ontology/validation/properties.d.ts.map +1 -1
- package/dist/ontology/validation/query.d.ts.map +1 -1
- package/dist/ontology/validation/schema.d.ts.map +1 -1
- package/dist/pipelines/index.js +26 -24
- package/dist/pipelines/index.js.map +1 -1
- package/dist/predicates/types.d.ts +53 -3
- package/dist/predicates/types.d.ts.map +1 -1
- package/dist/projections/builders.d.ts +19 -1
- package/dist/projections/builders.d.ts.map +1 -1
- package/dist/projections/internal.js +23 -21
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/validation.d.ts.map +1 -1
- package/dist/query.js +2 -2
- package/dist/queues/in-memory.d.ts +1 -1
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/runtime/create.d.ts +1 -1
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +5 -5
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.js +27 -25
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/sixb.d.ts +5 -5
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +171 -188
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/index.js +5 -5
- package/dist/sandboxes/sandbox.d.ts +4 -1
- package/dist/sandboxes/sandbox.d.ts.map +1 -1
- package/dist/shared/params/types.d.ts +4 -3
- package/dist/shared/params/types.d.ts.map +1 -1
- package/dist/shared/params/user-refs.d.ts +19 -0
- package/dist/shared/params/user-refs.d.ts.map +1 -0
- package/dist/shares/compiler.d.ts.map +1 -1
- package/dist/shares/internal.js +24 -22
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +2 -2
- package/dist/storage/action-runs/types.d.ts +1 -1
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +1 -1
- package/dist/storage/ai-limits/enforcement.js +2 -2
- package/dist/storage/auth/errors.d.ts +1 -1
- package/dist/storage/auth/errors.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/access-tokens.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/auth-storage.d.ts +2 -1
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/sessions.d.ts +8 -1
- package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
- package/dist/storage/auth/index.d.ts +1 -1
- package/dist/storage/auth/index.d.ts.map +1 -1
- package/dist/storage/auth/types.d.ts +77 -20
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +1 -1
- package/dist/storage/executions/provider.js +1 -1
- package/dist/storage/file-upload-sessions/in-memory.d.ts +9 -18
- package/dist/storage/file-upload-sessions/in-memory.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/index.d.ts +1 -1
- package/dist/storage/file-upload-sessions/index.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.d.ts +52 -0
- package/dist/storage/file-upload-sessions/provider.d.ts.map +1 -0
- package/dist/storage/file-upload-sessions/provider.js +24 -0
- package/dist/storage/file-upload-sessions/provider.js.map +9 -0
- package/dist/storage/file-upload-sessions/types.d.ts +19 -1
- package/dist/storage/file-upload-sessions/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/utils.d.ts +8 -2
- package/dist/storage/file-upload-sessions/utils.d.ts.map +1 -1
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +29 -25
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.js +11 -9
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
- package/dist/storage/ontology/commits.d.ts +6 -2
- package/dist/storage/ontology/commits.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/provider-work.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +14 -1
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +8 -2
- 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/projection-runs/provider.js +2 -2
- package/dist/storage/types.d.ts +1 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/workflow-interventions/index.d.ts +1 -1
- package/dist/storage/workflow-interventions/index.d.ts.map +1 -1
- package/dist/storage/workflow-interventions/types.d.ts +5 -8
- package/dist/storage/workflow-interventions/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +8 -8
- package/dist/syncs/index.js +27 -25
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/action-execution.d.ts +4 -0
- package/dist/testing/action-execution.d.ts.map +1 -1
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution.d.ts +1 -2
- package/dist/testing/execution.d.ts.map +1 -1
- package/dist/testing/file-upload-session-storage-contract.d.ts +12 -0
- package/dist/testing/file-upload-session-storage-contract.d.ts.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2035 -1358
- package/dist/testing/index.js.map +15 -13
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/object-query-contract.d.ts.map +1 -1
- package/dist/testing/ontology-contract-fixture.d.ts +8 -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/sandboxes-contract.d.ts.map +1 -1
- package/dist/testing/workflow-intervention-storage-contract.d.ts +8 -0
- package/dist/testing/workflow-intervention-storage-contract.d.ts.map +1 -0
- package/dist/webhooks/internal.js +24 -22
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/webhooks/types.d.ts +2 -2
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/workers/index.js +1 -1
- package/dist/workflows/index.js +42 -40
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/run-dispatch.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +2 -2
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/actions/index.ts +0 -3
- package/src/actions/read-facade.ts +102 -62
- package/src/actions/request.ts +13 -0
- package/src/actions/run-dispatch.ts +3 -0
- package/src/actions/types/context.ts +17 -65
- package/src/actions/types/params.ts +2 -1
- package/src/agents/authority.ts +1 -1
- package/src/assert-never.ts +7 -0
- package/src/auth/client-address.ts +12 -0
- package/src/auth/csrf.ts +14 -5
- package/src/auth/errors.ts +23 -0
- package/src/auth/index.ts +4 -3
- package/src/auth/runtime.ts +353 -297
- package/src/auth/session-cache.ts +18 -6
- package/src/auth/sessions.ts +30 -0
- package/src/auth/strategy.ts +2 -0
- package/src/auth/types.ts +15 -17
- package/src/bootstrap/index.ts +1 -0
- package/src/bootstrap/ontology-type-manifest.ts +112 -60
- package/src/edits/types.ts +47 -63
- package/src/errors/catalog.ts +4 -0
- package/src/events/envelope.ts +0 -13
- package/src/events/index.ts +1 -1
- package/src/events/service.ts +1 -11
- package/src/events/toStoredEvent.ts +1 -3
- package/src/events/types/index.ts +1 -1
- package/src/execution/agent.ts +1 -2
- package/src/execution/authorized-object-reader.ts +5 -7
- package/src/execution/primitive.ts +1 -2
- package/src/execution/request.ts +1 -2
- package/src/index.ts +8 -7
- package/src/maintenance/ontology-maintenance.ts +77 -1
- package/src/materialization/errors.ts +2 -0
- package/src/materialization/events.ts +27 -2
- package/src/materializer/README.md +2 -0
- package/src/materializer/edits/commit.ts +21 -12
- package/src/materializer/edits/operations.ts +32 -4
- package/src/materializer/edits/plan.ts +4 -5
- package/src/materializer/edits/user-refs.ts +115 -0
- package/src/materializer/effective/build-events.ts +4 -5
- package/src/materializer/execution/scope.ts +40 -7
- package/src/materializer/projections/replace.ts +2 -0
- package/src/materializer/projections/replacement-plan.ts +4 -0
- package/src/materializer/telemetry/append.ts +4 -12
- package/src/materializer/telemetry/plan.ts +4 -5
- package/src/objects/execution.ts +33 -62
- package/src/objects/query/executor.ts +12 -3
- package/src/objects/query/ir.ts +7 -0
- package/src/objects/query/planner.ts +1 -0
- package/src/objects/query/scalar-values.ts +19 -0
- package/src/objects/query/validate.ts +55 -44
- package/src/objects/sdk/object-handle.ts +8 -8
- package/src/objects/sdk/object-set.ts +8 -15
- package/src/objects/sdk/query-builder.ts +59 -71
- package/src/objects/sdk/telemetry-channel.ts +6 -7
- package/src/objects/sdk/where.ts +6 -13
- package/src/ontology/builders.ts +15 -11
- package/src/ontology/index.ts +4 -0
- package/src/ontology/inference/index.ts +56 -36
- package/src/ontology/internal.ts +1 -0
- package/src/ontology/json-schema.ts +12 -0
- package/src/ontology/primitives.ts +91 -0
- package/src/ontology/query-capabilities.ts +136 -0
- package/src/ontology/refs.ts +33 -6
- package/src/ontology/registered.ts +22 -0
- package/src/ontology/registry.ts +6 -3
- package/src/ontology/tokens.ts +41 -2
- package/src/ontology/types.ts +19 -3
- package/src/ontology/user-ref.ts +120 -0
- package/src/ontology/validation/definition.ts +2 -13
- package/src/ontology/validation/index.ts +1 -0
- package/src/ontology/validation/normalize.ts +39 -3
- package/src/ontology/validation/properties.ts +95 -19
- package/src/ontology/validation/query.ts +11 -42
- package/src/ontology/validation/schema.ts +16 -0
- package/src/predicates/types.ts +43 -33
- package/src/projections/builders.ts +24 -3
- package/src/projections/validation.ts +15 -1
- package/src/runtime/create.ts +2 -2
- package/src/runtime/host.ts +10 -12
- package/src/runtime/index.ts +3 -2
- package/src/runtime/sixb.ts +13 -23
- package/src/runtime/types.ts +277 -479
- package/src/sandboxes/sandbox.ts +4 -1
- package/src/shared/params/types.ts +4 -3
- package/src/shared/params/user-refs.ts +48 -0
- package/src/shares/compiler.ts +6 -16
- package/src/storage/action-runs/types.ts +1 -0
- package/src/storage/auth/errors.ts +0 -1
- package/src/storage/auth/in-memory/access-tokens.ts +5 -2
- package/src/storage/auth/in-memory/auth-storage.ts +49 -73
- package/src/storage/auth/in-memory/device-authorizations.ts +0 -2
- package/src/storage/auth/in-memory/sessions.ts +69 -1
- package/src/storage/auth/in-memory/shared.ts +13 -7
- package/src/storage/auth/index.ts +2 -1
- package/src/storage/auth/types.ts +72 -20
- package/src/storage/executions/validation.ts +1 -1
- package/src/storage/file-upload-sessions/in-memory.ts +64 -113
- package/src/storage/file-upload-sessions/index.ts +1 -0
- package/src/storage/file-upload-sessions/provider.ts +258 -0
- package/src/storage/file-upload-sessions/types.ts +20 -1
- package/src/storage/file-upload-sessions/utils.ts +25 -9
- package/src/storage/index.ts +3 -2
- package/src/storage/objects/in-memory/query.ts +13 -3
- package/src/storage/ontology/commits.ts +6 -2
- package/src/storage/ontology/in-memory/materializations.ts +6 -34
- package/src/storage/ontology/provider-header-validation.ts +57 -0
- package/src/storage/ontology/provider-work.ts +15 -3
- package/src/storage/ontology/provider.ts +59 -1
- package/src/storage/operation-scope.ts +1 -0
- package/src/storage/types.ts +0 -1
- package/src/storage/workflow-interventions/index.ts +0 -1
- package/src/storage/workflow-interventions/types.ts +5 -9
- package/src/testing/action-execution.ts +13 -3
- package/src/testing/auth-storage-contract.ts +253 -192
- package/src/testing/execution-storage-contract.ts +1 -2
- package/src/testing/execution.ts +4 -7
- package/src/testing/file-upload-session-storage-contract.ts +335 -0
- package/src/testing/index.ts +8 -0
- package/src/testing/materializer-storage-contract.ts +86 -4
- package/src/testing/object-query-contract.ts +121 -2
- package/src/testing/ontology-contract-fixture.ts +23 -3
- package/src/testing/ontology-storage-contract.ts +58 -0
- package/src/testing/sandboxes-contract.ts +27 -0
- package/src/testing/workflow-intervention-storage-contract.ts +203 -0
- package/src/webhooks/types.ts +2 -2
- package/src/workflows/run-dispatch.ts +12 -1
- package/src/workflows/snapshot.ts +16 -7
- package/src/workflows/types.ts +2 -2
- package/dist/chunk-2cxv584m.js.map +0 -43
- package/dist/chunk-3ghw2t5q.js.map +0 -10
- package/dist/chunk-3h7ctayx.js.map +0 -11
- package/dist/chunk-6ma8dvzc.js.map +0 -15
- package/dist/chunk-bbaa1fet.js.map +0 -25
- package/dist/chunk-eyjzgav0.js.map +0 -12
- package/dist/chunk-f06sf7rr.js.map +0 -11
- package/dist/chunk-g50nxqs5.js.map +0 -18
- package/dist/chunk-hkw8rykk.js.map +0 -15
- package/dist/chunk-p6r1ex7t.js.map +0 -10
- package/dist/chunk-qm535afa.js.map +0 -15
- package/dist/chunk-vpxss818.js.map +0 -10
- package/dist/chunk-vsg0g7h9.js.map +0 -17
- /package/dist/{chunk-y3ev53cq.js.map → chunk-2fv8sajb.js.map} +0 -0
- /package/dist/{chunk-5tetw4hn.js.map → chunk-4tnrzqqh.js.map} +0 -0
- /package/dist/{chunk-y1ahv8b7.js.map → chunk-bdhfn0ww.js.map} +0 -0
- /package/dist/{chunk-kept9cdd.js.map → chunk-bxx3ms5t.js.map} +0 -0
- /package/dist/{chunk-xtfryrfb.js.map → chunk-cbn96bve.js.map} +0 -0
- /package/dist/{chunk-t7dzd1tm.js.map → chunk-e2c5yxfe.js.map} +0 -0
- /package/dist/{chunk-bg2bs62d.js.map → chunk-jfdggg1p.js.map} +0 -0
- /package/dist/{chunk-e1f1sqba.js.map → chunk-kxea54yg.js.map} +0 -0
- /package/dist/{chunk-0mza4xb2.js.map → chunk-m8zkvep1.js.map} +0 -0
- /package/dist/{chunk-jjwhy3rs.js.map → chunk-q2xghyft.js.map} +0 -0
- /package/dist/{chunk-y0v18c2j.js.map → chunk-vef6qa14.js.map} +0 -0
- /package/dist/{chunk-gzt6v1ja.js.map → chunk-vn3yh259.js.map} +0 -0
- /package/dist/{chunk-sfypc7mk.js.map → chunk-wn7mznxc.js.map} +0 -0
- /package/dist/{chunk-r5zythxp.js.map → chunk-wnxabtn4.js.map} +0 -0
- /package/dist/{chunk-4ph94nhd.js.map → chunk-ww185kt6.js.map} +0 -0
- /package/dist/{chunk-gswwr35f.js.map → chunk-y487ywrv.js.map} +0 -0
- /package/dist/{chunk-bet1rb9h.js.map → chunk-y6vnvayj.js.map} +0 -0
- /package/dist/{chunk-3bnt2wna.js.map → chunk-yvf2jqj8.js.map} +0 -0
- /package/dist/{chunk-g2gezsg5.js.map → chunk-z9h698s8.js.map} +0 -0
- /package/dist/{chunk-bfjv1adk.js.map → chunk-znw0zvy4.js.map} +0 -0
package/src/sandboxes/sandbox.ts
CHANGED
|
@@ -16,7 +16,10 @@ export type SandboxStatus = "running" | "stopped" | "failed"
|
|
|
16
16
|
* default set at factory.create(...).
|
|
17
17
|
*/
|
|
18
18
|
export interface RunCommandOptions {
|
|
19
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Working directory for this call. Defaults to the sandbox's workingDirectory;
|
|
21
|
+
* relative paths resolve against it, while absolute paths override it.
|
|
22
|
+
*/
|
|
20
23
|
readonly cwd?: string
|
|
21
24
|
/** Merged on top of sandbox-level env. Per-call wins on collision. */
|
|
22
25
|
readonly env?: Readonly<Record<string, string>>
|
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
SchemaOrRef,
|
|
7
7
|
ValueType,
|
|
8
8
|
} from "../../ontology"
|
|
9
|
+
import type { RegisteredValueTypes } from "../../ontology/registered"
|
|
9
10
|
import type { QuantitativeTypeId } from "../../ontology/units"
|
|
10
11
|
|
|
11
12
|
type Simplify<T> = { [K in keyof T]: T[K] } & {}
|
|
@@ -57,14 +58,14 @@ type InferStructuredParamValue<
|
|
|
57
58
|
|
|
58
59
|
type InferParamSchemaValue<
|
|
59
60
|
TSchema extends SchemaOrRef,
|
|
60
|
-
TValueTypes extends readonly ValueType[] =
|
|
61
|
+
TValueTypes extends readonly ValueType[] = RegisteredValueTypes,
|
|
61
62
|
> = TSchema extends keyof ParamPrimitiveSchemaValues
|
|
62
63
|
? ParamPrimitiveSchemaValues[TSchema]
|
|
63
64
|
: InferStructuredParamValue<TSchema, TValueTypes>
|
|
64
65
|
|
|
65
66
|
type InferParamValue<
|
|
66
67
|
TParam extends ParamConfig,
|
|
67
|
-
TValueTypes extends readonly ValueType[] =
|
|
68
|
+
TValueTypes extends readonly ValueType[] = RegisteredValueTypes,
|
|
68
69
|
> = TParam["nullable"] extends true
|
|
69
70
|
? InferParamSchemaValue<TParam["schema"], TValueTypes> | null
|
|
70
71
|
: InferParamSchemaValue<TParam["schema"], TValueTypes>
|
|
@@ -72,7 +73,7 @@ type InferParamValue<
|
|
|
72
73
|
/** Infer the validated runtime input represented by a parameter config. */
|
|
73
74
|
export type InferParams<
|
|
74
75
|
TParams extends ParamsConfig,
|
|
75
|
-
TValueTypes extends readonly ValueType[] =
|
|
76
|
+
TValueTypes extends readonly ValueType[] = RegisteredValueTypes,
|
|
76
77
|
> = string extends keyof TParams
|
|
77
78
|
? Record<string, unknown>
|
|
78
79
|
: Simplify<
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { SchemaOrRef, ValueType } from "../../ontology"
|
|
2
|
+
import { isObjectRefSchema } from "../../ontology/refs"
|
|
3
|
+
import { collectUserRefIds, userReferenceProblem } from "../../ontology/user-ref"
|
|
4
|
+
import type { AuthStorage } from "../../storage/auth/types"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Reject params that reference a user who does not exist or is not active.
|
|
8
|
+
*
|
|
9
|
+
* Callers run it only when a new run is created: replaying an existing run keeps the params it was
|
|
10
|
+
* accepted with, even if a referenced user was suspended since.
|
|
11
|
+
*/
|
|
12
|
+
export async function assertParamUsersActive(input: {
|
|
13
|
+
readonly auth: AuthStorage | undefined
|
|
14
|
+
readonly projectId: string
|
|
15
|
+
readonly schemas: Readonly<Record<string, SchemaOrRef>>
|
|
16
|
+
readonly values: Readonly<Record<string, unknown>>
|
|
17
|
+
readonly valueTypesById: ReadonlyMap<string, ValueType>
|
|
18
|
+
/** Names one param in error messages, for example `Action param 'task.assign.assignee'`. */
|
|
19
|
+
readonly describe: (paramId: string) => string
|
|
20
|
+
readonly invalid: (message: string) => Error
|
|
21
|
+
}): Promise<void> {
|
|
22
|
+
const references: { readonly paramId: string; readonly id: string }[] = []
|
|
23
|
+
for (const [paramId, schema] of Object.entries(input.schemas)) {
|
|
24
|
+
if (isObjectRefSchema(schema)) continue
|
|
25
|
+
const ids = collectUserRefIds(schema, input.values[paramId], input.valueTypesById, new Set())
|
|
26
|
+
for (const id of ids) references.push({ paramId, id })
|
|
27
|
+
}
|
|
28
|
+
if (references.length === 0) return
|
|
29
|
+
|
|
30
|
+
const users = input.auth?.users
|
|
31
|
+
const statuses = new Map(
|
|
32
|
+
await Promise.all(
|
|
33
|
+
[...new Set(references.map((reference) => reference.id))].map(
|
|
34
|
+
async (id) =>
|
|
35
|
+
[
|
|
36
|
+
id,
|
|
37
|
+
users
|
|
38
|
+
? ((await users.getById({ projectId: input.projectId, id }))?.status ?? null)
|
|
39
|
+
: "unverifiable",
|
|
40
|
+
] as const
|
|
41
|
+
)
|
|
42
|
+
)
|
|
43
|
+
)
|
|
44
|
+
for (const { paramId, id } of references) {
|
|
45
|
+
const problem = userReferenceProblem(input.describe(paramId), id, statuses.get(id) ?? null)
|
|
46
|
+
if (problem) throw input.invalid(problem)
|
|
47
|
+
}
|
|
48
|
+
}
|
package/src/shares/compiler.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { ActionDefinitionCatalog } from "../actions"
|
|
2
2
|
import type { LinkPathSelection, LinkPathSelectionMode, ObjectRef } from "../ontology"
|
|
3
|
+
import { isPrimitiveSchema, primitiveTraits } from "../ontology/primitives"
|
|
3
4
|
import type { OntologyDefinitionCatalog } from "../ontology/registry"
|
|
4
|
-
import type { ObjectLink, ObjectType } from "../ontology/types"
|
|
5
|
+
import type { ObjectLink, ObjectType, PrimitiveSchema } from "../ontology/types"
|
|
5
6
|
import type {
|
|
6
7
|
ObjectReadLinkDefinitionSelection,
|
|
7
8
|
ObjectReadLinkSelection,
|
|
@@ -88,17 +89,6 @@ export function compileShareAccessPlan(input: CompileShareAccessPlanInput): Shar
|
|
|
88
89
|
return snapshotShareAccessPlan({ grants })
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
const SHAREABLE_PRIMITIVE_SCHEMAS = new Set([
|
|
92
|
-
"string",
|
|
93
|
-
"integer",
|
|
94
|
-
"double",
|
|
95
|
-
"decimal",
|
|
96
|
-
"boolean",
|
|
97
|
-
"date",
|
|
98
|
-
"timestamp",
|
|
99
|
-
"uuid",
|
|
100
|
-
])
|
|
101
|
-
|
|
102
92
|
/**
|
|
103
93
|
* V1 deliberately excludes references from shared Action params. A delegated caller cannot yet be
|
|
104
94
|
* authorized to resolve arbitrary object or blob references supplied at invocation time.
|
|
@@ -112,9 +102,9 @@ function assertShareableActionParams(input: {
|
|
|
112
102
|
const seenSchemas = new WeakSet<object>()
|
|
113
103
|
const resolvingValueTypes = new Set<string>()
|
|
114
104
|
|
|
115
|
-
const reject = (path: string, kind: "objectRef" |
|
|
105
|
+
const reject = (path: string, kind: "objectRef" | PrimitiveSchema): never => {
|
|
116
106
|
throw invalid(
|
|
117
|
-
`Share '${input.shareId}' Action '${input.actionId}' parameter '${path}' uses ${kind}. Shared Action parameters cannot contain objectRef or
|
|
107
|
+
`Share '${input.shareId}' Action '${input.actionId}' parameter '${path}' uses ${kind}. Shared Action parameters cannot contain objectRef, fileRef, or userRef in V1.`
|
|
118
108
|
)
|
|
119
109
|
}
|
|
120
110
|
|
|
@@ -126,8 +116,8 @@ function assertShareableActionParams(input: {
|
|
|
126
116
|
|
|
127
117
|
const walk = (schema: unknown, path: string): void => {
|
|
128
118
|
if (typeof schema === "string") {
|
|
129
|
-
if (schema
|
|
130
|
-
if (
|
|
119
|
+
if (!isPrimitiveSchema(schema)) malformed(path)
|
|
120
|
+
else if (primitiveTraits(schema)?.shareableParam !== true) reject(path, schema)
|
|
131
121
|
return
|
|
132
122
|
}
|
|
133
123
|
if (!isRecord(schema)) throw malformed(path)
|
|
@@ -27,6 +27,7 @@ export const ACTION_RUN_FAILURE_CODES = [
|
|
|
27
27
|
"runtime.cancelled",
|
|
28
28
|
"queue.enqueue_failed",
|
|
29
29
|
"action.phase_failed",
|
|
30
|
+
"action.read_conflict",
|
|
30
31
|
] as const satisfies readonly [SixbErrorCode, ...SixbErrorCode[]]
|
|
31
32
|
|
|
32
33
|
export type ActionRunFailureCode = (typeof ACTION_RUN_FAILURE_CODES)[number]
|
|
@@ -38,8 +38,11 @@ export class InMemoryAuthAccessTokenStore implements AuthAccessTokenStore {
|
|
|
38
38
|
const rows = [...this.state.accessTokens.values()]
|
|
39
39
|
.filter((token) => token.projectId === input.projectId)
|
|
40
40
|
.filter((token) => input.kind === undefined || token.kind === input.kind)
|
|
41
|
-
.filter(
|
|
42
|
-
|
|
41
|
+
.filter(
|
|
42
|
+
(token) =>
|
|
43
|
+
input.subject === undefined ||
|
|
44
|
+
(token.subject.type === input.subject.type && token.subject.id === input.subject.id)
|
|
45
|
+
)
|
|
43
46
|
.filter((token) => input.includeRevoked || !token.revokedAt)
|
|
44
47
|
.sort((a, b) => compareByCreatedAt(a, b, order))
|
|
45
48
|
const page = rows.slice(offset, input.limit === undefined ? undefined : offset + input.limit)
|
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
CompleteOidcSignInInput,
|
|
8
8
|
CompleteSignInResult,
|
|
9
9
|
GroupMembershipRecord,
|
|
10
|
+
GroupMembershipSource,
|
|
10
11
|
InvitationRecord,
|
|
11
12
|
SessionRecord,
|
|
12
13
|
SuspendUserAndRevokeSessionsInput,
|
|
@@ -30,7 +31,6 @@ import {
|
|
|
30
31
|
cloneRecord,
|
|
31
32
|
consumeMagicLinkRecord,
|
|
32
33
|
consumeOidcAttemptRecord,
|
|
33
|
-
createAccessTokenRecord,
|
|
34
34
|
createAuthStorageState,
|
|
35
35
|
createSessionRecord,
|
|
36
36
|
deviceAuthorizationKey,
|
|
@@ -43,6 +43,7 @@ import {
|
|
|
43
43
|
normalizeEmail,
|
|
44
44
|
normalizeGroupIds,
|
|
45
45
|
oidcAttemptKey,
|
|
46
|
+
removeGroupMembershipRecord,
|
|
46
47
|
revokeActiveSessionsForUser,
|
|
47
48
|
upsertGroupMembershipRecord,
|
|
48
49
|
userKey,
|
|
@@ -138,24 +139,22 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
138
139
|
)
|
|
139
140
|
}
|
|
140
141
|
if (
|
|
141
|
-
input.
|
|
142
|
-
input.
|
|
143
|
-
input.accessToken.subjectId !== authorization.approvedUserId ||
|
|
144
|
-
input.accessToken.createdBySessionId !== authorization.approvedSessionId
|
|
142
|
+
input.session.projectId !== input.projectId ||
|
|
143
|
+
input.session.userId !== authorization.approvedUserId
|
|
145
144
|
) {
|
|
146
145
|
throw new AuthStorageError(
|
|
147
146
|
"invalid_device_authorization",
|
|
148
|
-
"[Sixb] Device
|
|
147
|
+
"[Sixb] Device session is invalid."
|
|
149
148
|
)
|
|
150
149
|
}
|
|
151
|
-
const
|
|
150
|
+
const session = createSessionRecord(this.state, input.session)
|
|
152
151
|
const consumed = {
|
|
153
152
|
...authorization,
|
|
154
153
|
status: "consumed" as const,
|
|
155
154
|
consumedAt: new Date(input.completedAt),
|
|
156
155
|
}
|
|
157
156
|
this.state.deviceAuthorizations.set(key, cloneRecord(consumed))
|
|
158
|
-
return { authorization: cloneRecord(consumed),
|
|
157
|
+
return { authorization: cloneRecord(consumed), session: cloneRecord(session) }
|
|
159
158
|
}
|
|
160
159
|
|
|
161
160
|
async completeMagicLinkSignIn(
|
|
@@ -222,25 +221,6 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
222
221
|
)
|
|
223
222
|
}
|
|
224
223
|
|
|
225
|
-
if (
|
|
226
|
-
shouldCreateUser &&
|
|
227
|
-
!activeInvitation &&
|
|
228
|
-
input.allowUserCreationWithoutInvitation &&
|
|
229
|
-
input.requireNoActiveUsersForUserCreation &&
|
|
230
|
-
hasActiveUsers(this.state, projectId)
|
|
231
|
-
) {
|
|
232
|
-
consumeMagicLinkRecord(this.state, {
|
|
233
|
-
projectId,
|
|
234
|
-
id: input.magicLinkId,
|
|
235
|
-
tokenHash: input.tokenHash,
|
|
236
|
-
consumedAt: completedAt,
|
|
237
|
-
})
|
|
238
|
-
throw new AuthStorageError(
|
|
239
|
-
"user_creation_not_allowed",
|
|
240
|
-
`[Sixb] Magic link '${input.magicLinkId}' cannot create a user for project '${projectId}'.`
|
|
241
|
-
)
|
|
242
|
-
}
|
|
243
|
-
|
|
244
224
|
validateCompleteSessionInput(this.state, projectId, input.session)
|
|
245
225
|
assertSignInSessionAudience(projectId, input.session.audience, magicLink.audience)
|
|
246
226
|
|
|
@@ -283,8 +263,9 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
283
263
|
projectId,
|
|
284
264
|
user,
|
|
285
265
|
})
|
|
286
|
-
const memberships = this.
|
|
266
|
+
const memberships = this.applyGroups({
|
|
287
267
|
completedAt,
|
|
268
|
+
source: "manual",
|
|
288
269
|
groupIds: manualGroupIds,
|
|
289
270
|
projectId,
|
|
290
271
|
userId: user.id,
|
|
@@ -355,14 +336,6 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
355
336
|
)
|
|
356
337
|
}
|
|
357
338
|
|
|
358
|
-
if (!identity && user && (!input.autoLinkByVerifiedEmail || !input.emailVerified)) {
|
|
359
|
-
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
360
|
-
throw new AuthStorageError(
|
|
361
|
-
"email_link_not_allowed",
|
|
362
|
-
`[Sixb] OIDC identity cannot auto-link to user '${user.id}' for project '${projectId}'.`
|
|
363
|
-
)
|
|
364
|
-
}
|
|
365
|
-
|
|
366
339
|
if (user?.status === "suspended") {
|
|
367
340
|
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
368
341
|
throw new AuthStorageError(
|
|
@@ -371,14 +344,6 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
371
344
|
)
|
|
372
345
|
}
|
|
373
346
|
|
|
374
|
-
if (shouldCreateUser && !input.emailVerified) {
|
|
375
|
-
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
376
|
-
throw new AuthStorageError(
|
|
377
|
-
"user_creation_not_allowed",
|
|
378
|
-
`[Sixb] OIDC authorization attempt '${input.oidcAuthorizationAttemptId}' cannot create a user for project '${projectId}'.`
|
|
379
|
-
)
|
|
380
|
-
}
|
|
381
|
-
|
|
382
347
|
if (shouldCreateUser && !activeInvitation && !input.allowUserCreationWithoutInvitation) {
|
|
383
348
|
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
384
349
|
throw new AuthStorageError(
|
|
@@ -387,20 +352,6 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
387
352
|
)
|
|
388
353
|
}
|
|
389
354
|
|
|
390
|
-
if (
|
|
391
|
-
shouldCreateUser &&
|
|
392
|
-
!activeInvitation &&
|
|
393
|
-
input.allowUserCreationWithoutInvitation &&
|
|
394
|
-
input.requireNoActiveUsersForUserCreation &&
|
|
395
|
-
hasActiveUsers(this.state, projectId)
|
|
396
|
-
) {
|
|
397
|
-
this.consumeOidcAttempt(input, completedAt, projectId)
|
|
398
|
-
throw new AuthStorageError(
|
|
399
|
-
"user_creation_not_allowed",
|
|
400
|
-
`[Sixb] OIDC authorization attempt '${input.oidcAuthorizationAttemptId}' cannot create a user for project '${projectId}'.`
|
|
401
|
-
)
|
|
402
|
-
}
|
|
403
|
-
|
|
404
355
|
validateCompleteSessionInput(this.state, projectId, input.session)
|
|
405
356
|
assertSignInSessionAudience(projectId, input.session.audience, attempt.audience)
|
|
406
357
|
|
|
@@ -437,12 +388,19 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
437
388
|
projectId,
|
|
438
389
|
user,
|
|
439
390
|
})
|
|
440
|
-
const memberships = this.
|
|
391
|
+
const memberships = this.syncDirectoryGroups({
|
|
441
392
|
completedAt,
|
|
442
|
-
groupIds:
|
|
393
|
+
groupIds: input.directoryGroupIds,
|
|
443
394
|
projectId,
|
|
444
395
|
userId: user.id,
|
|
445
|
-
existing:
|
|
396
|
+
existing: this.applyGroups({
|
|
397
|
+
completedAt,
|
|
398
|
+
source: "manual",
|
|
399
|
+
groupIds: manualGroupIds,
|
|
400
|
+
projectId,
|
|
401
|
+
userId: user.id,
|
|
402
|
+
existing: invitation.memberships,
|
|
403
|
+
}),
|
|
446
404
|
})
|
|
447
405
|
|
|
448
406
|
const nextIdentity: UserIdentityRecord = {
|
|
@@ -536,10 +494,11 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
536
494
|
return { invitation, memberships }
|
|
537
495
|
}
|
|
538
496
|
|
|
539
|
-
private
|
|
497
|
+
private applyGroups(input: {
|
|
540
498
|
readonly completedAt: Date
|
|
541
499
|
readonly groupIds: readonly string[]
|
|
542
500
|
readonly projectId: string
|
|
501
|
+
readonly source: GroupMembershipSource
|
|
543
502
|
readonly userId: string
|
|
544
503
|
readonly existing: readonly GroupMembershipRecord[]
|
|
545
504
|
}): readonly GroupMembershipRecord[] {
|
|
@@ -550,13 +509,40 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
550
509
|
projectId: input.projectId,
|
|
551
510
|
userId: input.userId,
|
|
552
511
|
groupId,
|
|
553
|
-
source:
|
|
512
|
+
source: input.source,
|
|
554
513
|
createdAt: input.completedAt,
|
|
555
514
|
})
|
|
556
515
|
)
|
|
557
516
|
}
|
|
558
517
|
return memberships
|
|
559
518
|
}
|
|
519
|
+
// Directory memberships become exactly `groupIds`. A group the user already holds from another
|
|
520
|
+
// source keeps that source, and memberships from other sources are never removed.
|
|
521
|
+
private syncDirectoryGroups(input: {
|
|
522
|
+
readonly completedAt: Date
|
|
523
|
+
readonly groupIds?: readonly string[]
|
|
524
|
+
readonly projectId: string
|
|
525
|
+
readonly userId: string
|
|
526
|
+
readonly existing: readonly GroupMembershipRecord[]
|
|
527
|
+
}): readonly GroupMembershipRecord[] {
|
|
528
|
+
if (!input.groupIds) {
|
|
529
|
+
return input.existing
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
const groupIds = normalizeGroupIds(input.groupIds)
|
|
533
|
+
const stale = [...this.state.groupMemberships.values()].filter(
|
|
534
|
+
(membership) =>
|
|
535
|
+
membership.projectId === input.projectId &&
|
|
536
|
+
membership.userId === input.userId &&
|
|
537
|
+
membership.source === "directory" &&
|
|
538
|
+
!groupIds.includes(membership.groupId)
|
|
539
|
+
)
|
|
540
|
+
for (const membership of stale) {
|
|
541
|
+
removeGroupMembershipRecord(this.state, membership)
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
return this.applyGroups({ ...input, groupIds, source: "directory" })
|
|
545
|
+
}
|
|
560
546
|
|
|
561
547
|
private createSignInSession(input: {
|
|
562
548
|
readonly projectId: string
|
|
@@ -602,16 +588,6 @@ function restoreMap<TKey, TValue>(target: Map<TKey, TValue>, snapshot: Map<TKey,
|
|
|
602
588
|
}
|
|
603
589
|
}
|
|
604
590
|
|
|
605
|
-
function hasActiveUsers(state: AuthStorageState, projectId: string): boolean {
|
|
606
|
-
for (const user of state.users.values()) {
|
|
607
|
-
if (user.projectId === projectId && user.status === "active") {
|
|
608
|
-
return true
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
return false
|
|
613
|
-
}
|
|
614
|
-
|
|
615
591
|
function assertSignInSessionAudience(
|
|
616
592
|
projectId: string,
|
|
617
593
|
sessionAudience: string,
|
|
@@ -45,8 +45,6 @@ export class InMemoryAuthDeviceAuthorizationStore implements AuthDeviceAuthoriza
|
|
|
45
45
|
deviceCodeHash: assertNonEmpty(input.deviceCodeHash, "Device code hash"),
|
|
46
46
|
userCode: assertNonEmpty(input.userCode, "User code"),
|
|
47
47
|
clientName: assertNonEmpty(input.clientName, "Client name"),
|
|
48
|
-
tokenName: assertNonEmpty(input.tokenName, "Token name"),
|
|
49
|
-
tokenExpiresAt: new Date(input.tokenExpiresAt),
|
|
50
48
|
status: "pending",
|
|
51
49
|
createdAt: new Date(input.createdAt),
|
|
52
50
|
expiresAt: new Date(input.expiresAt),
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { AuthSessionAudience } from "../../../auth/audience"
|
|
2
2
|
import { AuthStorageError } from "../errors"
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
AuthSessionStore,
|
|
5
|
+
CreateAuthSessionInput,
|
|
6
|
+
RotateSessionRefreshTokenResult,
|
|
7
|
+
SessionRecord,
|
|
8
|
+
} from "../types"
|
|
4
9
|
import type { AuthStorageState } from "./shared"
|
|
5
10
|
import {
|
|
6
11
|
cloneDate,
|
|
@@ -73,6 +78,7 @@ export class InMemoryAuthSessionStore implements AuthSessionStore {
|
|
|
73
78
|
const session = this.state.sessions.get(sessionKey(params.projectId, params.id))
|
|
74
79
|
if (
|
|
75
80
|
!session ||
|
|
81
|
+
session.bearer ||
|
|
76
82
|
session.audience !== params.audience ||
|
|
77
83
|
session.tokenHash !== params.tokenHash ||
|
|
78
84
|
!isActiveSession(session, params.now)
|
|
@@ -83,6 +89,67 @@ export class InMemoryAuthSessionStore implements AuthSessionStore {
|
|
|
83
89
|
return cloneRecord(session)
|
|
84
90
|
}
|
|
85
91
|
|
|
92
|
+
async findValidByAccessTokenHash(params: {
|
|
93
|
+
readonly projectId: string
|
|
94
|
+
readonly id: string
|
|
95
|
+
readonly tokenHash: string
|
|
96
|
+
readonly now: Date
|
|
97
|
+
}): Promise<SessionRecord | null> {
|
|
98
|
+
const session = this.state.sessions.get(sessionKey(params.projectId, params.id))
|
|
99
|
+
if (
|
|
100
|
+
!session?.bearer ||
|
|
101
|
+
session.tokenHash !== params.tokenHash ||
|
|
102
|
+
session.bearer.accessExpiresAt <= params.now ||
|
|
103
|
+
!isActiveSession(session, params.now)
|
|
104
|
+
) {
|
|
105
|
+
return null
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return cloneRecord(session)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async rotateRefreshToken(
|
|
112
|
+
params: Parameters<AuthSessionStore["rotateRefreshToken"]>[0]
|
|
113
|
+
): Promise<RotateSessionRefreshTokenResult> {
|
|
114
|
+
const key = sessionKey(params.projectId, params.id)
|
|
115
|
+
const session = this.state.sessions.get(key)
|
|
116
|
+
if (!session?.bearer || !isActiveSession(session, params.now)) {
|
|
117
|
+
return { status: "invalid" }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const { bearer } = session
|
|
121
|
+
const replacedRecently =
|
|
122
|
+
bearer.previousRefreshTokenHash === params.refreshTokenHash &&
|
|
123
|
+
bearer.refreshedAt !== undefined &&
|
|
124
|
+
params.now.getTime() - bearer.refreshedAt.getTime() <= params.reuseGraceMs
|
|
125
|
+
if (bearer.refreshTokenHash !== params.refreshTokenHash && !replacedRecently) {
|
|
126
|
+
if (bearer.previousRefreshTokenHash !== params.refreshTokenHash) {
|
|
127
|
+
return { status: "invalid" }
|
|
128
|
+
}
|
|
129
|
+
this.state.sessions.set(key, cloneRecord({ ...session, revokedAt: cloneDate(params.now) }))
|
|
130
|
+
return { status: "reused" }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const requestedExpiresAt = session.absoluteExpiresAt
|
|
134
|
+
? new Date(Math.min(params.next.expiresAt.getTime(), session.absoluteExpiresAt.getTime()))
|
|
135
|
+
: params.next.expiresAt
|
|
136
|
+
const next: SessionRecord = {
|
|
137
|
+
...session,
|
|
138
|
+
tokenHash: params.next.tokenHash,
|
|
139
|
+
expiresAt: new Date(Math.max(session.expiresAt.getTime(), requestedExpiresAt.getTime())),
|
|
140
|
+
lastSeenAt: cloneDate(params.now),
|
|
141
|
+
bearer: {
|
|
142
|
+
clientName: bearer.clientName,
|
|
143
|
+
accessExpiresAt: cloneDate(params.next.accessExpiresAt),
|
|
144
|
+
refreshTokenHash: params.next.refreshTokenHash,
|
|
145
|
+
previousRefreshTokenHash: bearer.refreshTokenHash,
|
|
146
|
+
refreshedAt: cloneDate(params.now),
|
|
147
|
+
},
|
|
148
|
+
}
|
|
149
|
+
this.state.sessions.set(key, cloneRecord(next))
|
|
150
|
+
return { status: "rotated", session: cloneRecord(next) }
|
|
151
|
+
}
|
|
152
|
+
|
|
86
153
|
async renewIfValid(params: {
|
|
87
154
|
readonly projectId: string
|
|
88
155
|
readonly id: string
|
|
@@ -95,6 +162,7 @@ export class InMemoryAuthSessionStore implements AuthSessionStore {
|
|
|
95
162
|
const session = this.state.sessions.get(key)
|
|
96
163
|
if (
|
|
97
164
|
!session ||
|
|
165
|
+
session.bearer ||
|
|
98
166
|
session.audience !== params.audience ||
|
|
99
167
|
session.tokenHash !== params.tokenHash ||
|
|
100
168
|
!isActiveSession(session, params.now)
|
|
@@ -320,6 +320,13 @@ export function createSessionRecord(
|
|
|
320
320
|
absoluteExpiresAt: input.absoluteExpiresAt ? cloneDate(input.absoluteExpiresAt) : undefined,
|
|
321
321
|
userAgent: input.userAgent,
|
|
322
322
|
ipAddress: input.ipAddress,
|
|
323
|
+
bearer: input.bearer
|
|
324
|
+
? {
|
|
325
|
+
clientName: assertNonEmpty(input.bearer.clientName, "Session client name"),
|
|
326
|
+
accessExpiresAt: cloneDate(input.bearer.accessExpiresAt),
|
|
327
|
+
refreshTokenHash: assertNonEmpty(input.bearer.refreshTokenHash, "Refresh token hash"),
|
|
328
|
+
}
|
|
329
|
+
: undefined,
|
|
323
330
|
}
|
|
324
331
|
|
|
325
332
|
state.sessions.set(sessionKey(projectId, id), cloneRecord(session))
|
|
@@ -398,11 +405,11 @@ export function createAccessTokenRecord(
|
|
|
398
405
|
const id = assertNonEmpty(input.id, "Access token id")
|
|
399
406
|
const projectId = assertNonEmpty(input.projectId, "Project id")
|
|
400
407
|
const name = assertNonEmpty(input.name, "Access token name")
|
|
401
|
-
const subjectId = assertNonEmpty(input.
|
|
408
|
+
const subjectId = assertNonEmpty(input.subject.id, "Access token subject id")
|
|
402
409
|
const tokenHash = assertNonEmpty(input.tokenHash, "Access token hash")
|
|
403
410
|
|
|
404
|
-
assertAccessTokenSubject(input.kind, input.
|
|
405
|
-
assertAccessTokenSubjectExists(state, projectId, input.
|
|
411
|
+
assertAccessTokenSubject(input.kind, input.subject.type)
|
|
412
|
+
assertAccessTokenSubjectExists(state, projectId, input.subject.type, subjectId)
|
|
406
413
|
|
|
407
414
|
const key = accessTokenKey(projectId, id)
|
|
408
415
|
if (state.accessTokens.has(key)) {
|
|
@@ -417,8 +424,7 @@ export function createAccessTokenRecord(
|
|
|
417
424
|
projectId,
|
|
418
425
|
name,
|
|
419
426
|
kind: input.kind,
|
|
420
|
-
|
|
421
|
-
subjectId,
|
|
427
|
+
subject: { type: input.subject.type, id: subjectId },
|
|
422
428
|
tokenHash,
|
|
423
429
|
groupIds: normalizeOptionalGroupIds(input.groupIds),
|
|
424
430
|
createdByPrincipal: input.createdByPrincipal,
|
|
@@ -484,7 +490,7 @@ export function removeGroupMembershipRecord(
|
|
|
484
490
|
|
|
485
491
|
function assertAccessTokenSubject(
|
|
486
492
|
kind: CreateAuthAccessTokenInput["kind"],
|
|
487
|
-
subjectType: CreateAuthAccessTokenInput["
|
|
493
|
+
subjectType: CreateAuthAccessTokenInput["subject"]["type"]
|
|
488
494
|
): void {
|
|
489
495
|
if (
|
|
490
496
|
(kind === "personal" && subjectType === "user") ||
|
|
@@ -502,7 +508,7 @@ function assertAccessTokenSubject(
|
|
|
502
508
|
function assertAccessTokenSubjectExists(
|
|
503
509
|
state: AuthStorageState,
|
|
504
510
|
projectId: string,
|
|
505
|
-
subjectType: CreateAuthAccessTokenInput["
|
|
511
|
+
subjectType: CreateAuthAccessTokenInput["subject"]["type"],
|
|
506
512
|
subjectId: string
|
|
507
513
|
): void {
|
|
508
514
|
if (subjectType === "user") {
|
|
@@ -3,7 +3,6 @@ export { AuthStorageError } from "./errors"
|
|
|
3
3
|
export { InMemoryAuthStorage } from "./in-memory"
|
|
4
4
|
export type {
|
|
5
5
|
AccessTokenRecord,
|
|
6
|
-
AccessTokenSubjectType,
|
|
7
6
|
AuthAccessTokenStore,
|
|
8
7
|
AuthDeviceAuthorizationStore,
|
|
9
8
|
AuthGroupMembershipStore,
|
|
@@ -16,6 +15,7 @@ export type {
|
|
|
16
15
|
AuthStorage,
|
|
17
16
|
AuthUserIdentityStore,
|
|
18
17
|
AuthUserStore,
|
|
18
|
+
BearerSessionState,
|
|
19
19
|
CompleteAuthSessionInput,
|
|
20
20
|
CompleteDeviceAuthorizationInput,
|
|
21
21
|
CompleteDeviceAuthorizationResult,
|
|
@@ -47,6 +47,7 @@ export type {
|
|
|
47
47
|
MagicLinkRecord,
|
|
48
48
|
OidcAuthorizationAttemptRecord,
|
|
49
49
|
ReconcileAuthServiceAccountGroupMembershipsInput,
|
|
50
|
+
RotateSessionRefreshTokenResult,
|
|
50
51
|
ServiceAccountGroupMembershipRecord,
|
|
51
52
|
ServiceAccountRecord,
|
|
52
53
|
ServiceAccountStatus,
|