@sixb/core 0.1.12 → 0.1.13
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/index.d.ts +3 -2
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +14 -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.js +1 -1
- package/dist/auth/types.d.ts +8 -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-q5gz3g2j.js → chunk-0321g649.js} +2 -16
- package/dist/{chunk-q5gz3g2j.js.map → chunk-0321g649.js.map} +2 -2
- package/dist/{chunk-e1f1sqba.js → chunk-04h4t2b5.js} +3 -3
- package/dist/{chunk-y3ev53cq.js → chunk-2fv8sajb.js} +2 -2
- package/dist/{chunk-3bnt2wna.js → chunk-2hbhn1ff.js} +1 -1
- 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-g50nxqs5.js → chunk-63fp9x3q.js} +63 -20
- package/dist/chunk-63fp9x3q.js.map +20 -0
- package/dist/{chunk-qm535afa.js → chunk-693f3zn8.js} +66 -24
- package/dist/chunk-693f3zn8.js.map +15 -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-898y24dd.js} +49 -42
- package/dist/chunk-898y24dd.js.map +15 -0
- package/dist/{chunk-7qnvhtcd.js → chunk-91wthfwe.js} +17 -17
- package/dist/{chunk-7qnvhtcd.js.map → chunk-91wthfwe.js.map} +5 -5
- package/dist/chunk-96yw3pwd.js.map +2 -2
- package/dist/{chunk-2cxv584m.js → chunk-9pfw47qx.js} +309 -204
- package/dist/chunk-9pfw47qx.js.map +44 -0
- 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-jjwhy3rs.js → chunk-a69fkrtr.js} +5 -5
- package/dist/{chunk-y1ahv8b7.js → chunk-bdhfn0ww.js} +1 -1
- package/dist/{chunk-4ph94nhd.js → chunk-bep5rrdq.js} +2 -2
- package/dist/{chunk-kept9cdd.js → chunk-bxx3ms5t.js} +1 -1
- package/dist/{chunk-xtfryrfb.js → chunk-cbn96bve.js} +2 -2
- package/dist/{chunk-nzsy3xrp.js → chunk-cvrbhvtr.js} +69 -44
- package/dist/{chunk-nzsy3xrp.js.map → chunk-cvrbhvtr.js.map} +7 -7
- package/dist/{chunk-vsg0g7h9.js → chunk-d8yes9yx.js} +304 -45
- package/dist/chunk-d8yes9yx.js.map +20 -0
- package/dist/{chunk-tg4g4zh0.js → chunk-darm7eeg.js} +9 -9
- package/dist/{chunk-tg4g4zh0.js.map → chunk-darm7eeg.js.map} +3 -3
- 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-p6r1ex7t.js → chunk-ffwvdgk1.js} +5 -13
- package/dist/chunk-ffwvdgk1.js.map +10 -0
- package/dist/{chunk-r5zythxp.js → chunk-gbcrz0gr.js} +7 -7
- package/dist/{chunk-ybhz3j9g.js → chunk-gc226ten.js} +104 -148
- package/dist/{chunk-ybhz3j9g.js.map → chunk-gc226ten.js.map} +7 -8
- package/dist/{chunk-3ghw2t5q.js → chunk-gmt22nxx.js} +10 -16
- package/dist/chunk-gmt22nxx.js.map +10 -0
- package/dist/chunk-h89wz928.js +42 -0
- package/dist/chunk-h89wz928.js.map +10 -0
- package/dist/{chunk-hkw8rykk.js → chunk-ht4a7mjg.js} +74 -4
- package/dist/chunk-ht4a7mjg.js.map +15 -0
- package/dist/{chunk-t7dzd1tm.js → chunk-jhyc777j.js} +2 -2
- package/dist/{chunk-xn686q2e.js → chunk-jmwy25mf.js} +75 -57
- package/dist/{chunk-xn686q2e.js.map → chunk-jmwy25mf.js.map} +3 -3
- package/dist/{chunk-f06sf7rr.js → chunk-k4kkp58d.js} +18 -5
- package/dist/chunk-k4kkp58d.js.map +11 -0
- 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-b768c93y.js → chunk-mf6hwpzh.js} +83 -28
- package/dist/{chunk-b768c93y.js.map → chunk-mf6hwpzh.js.map} +5 -5
- 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-n33e8dz8.js +191 -0
- package/dist/chunk-n33e8dz8.js.map +11 -0
- package/dist/chunk-rdghfsss.js.map +2 -2
- package/dist/{chunk-m7cx05vp.js → chunk-rqtdtm43.js} +126 -59
- package/dist/{chunk-m7cx05vp.js.map → chunk-rqtdtm43.js.map} +13 -12
- 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-sfypc7mk.js → chunk-s24qbp32.js} +4 -4
- 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-bg2bs62d.js → chunk-w9bp61e7.js} +5 -5
- 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-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/in-memory/access-tokens.d.ts.map +1 -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 +62 -13
- 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 +1951 -1242
- 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/index.ts +3 -2
- package/src/auth/runtime.ts +299 -277
- package/src/auth/session-cache.ts +18 -6
- package/src/auth/sessions.ts +30 -0
- package/src/auth/types.ts +7 -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/in-memory/access-tokens.ts +5 -2
- package/src/storage/auth/in-memory/auth-storage.ts +5 -8
- 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 +57 -13
- 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 +149 -62
- 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-e1f1sqba.js.map → chunk-04h4t2b5.js.map} +0 -0
- /package/dist/{chunk-y3ev53cq.js.map → chunk-2fv8sajb.js.map} +0 -0
- /package/dist/{chunk-3bnt2wna.js.map → chunk-2hbhn1ff.js.map} +0 -0
- /package/dist/{chunk-5tetw4hn.js.map → chunk-4tnrzqqh.js.map} +0 -0
- /package/dist/{chunk-jjwhy3rs.js.map → chunk-a69fkrtr.js.map} +0 -0
- /package/dist/{chunk-y1ahv8b7.js.map → chunk-bdhfn0ww.js.map} +0 -0
- /package/dist/{chunk-4ph94nhd.js.map → chunk-bep5rrdq.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-r5zythxp.js.map → chunk-gbcrz0gr.js.map} +0 -0
- /package/dist/{chunk-t7dzd1tm.js.map → chunk-jhyc777j.js.map} +0 -0
- /package/dist/{chunk-0mza4xb2.js.map → chunk-m8zkvep1.js.map} +0 -0
- /package/dist/{chunk-sfypc7mk.js.map → chunk-s24qbp32.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-bg2bs62d.js.map → chunk-w9bp61e7.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-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)
|
|
@@ -30,7 +30,6 @@ import {
|
|
|
30
30
|
cloneRecord,
|
|
31
31
|
consumeMagicLinkRecord,
|
|
32
32
|
consumeOidcAttemptRecord,
|
|
33
|
-
createAccessTokenRecord,
|
|
34
33
|
createAuthStorageState,
|
|
35
34
|
createSessionRecord,
|
|
36
35
|
deviceAuthorizationKey,
|
|
@@ -138,24 +137,22 @@ export class InMemoryAuthStorage implements AuthStorage {
|
|
|
138
137
|
)
|
|
139
138
|
}
|
|
140
139
|
if (
|
|
141
|
-
input.
|
|
142
|
-
input.
|
|
143
|
-
input.accessToken.subjectId !== authorization.approvedUserId ||
|
|
144
|
-
input.accessToken.createdBySessionId !== authorization.approvedSessionId
|
|
140
|
+
input.session.projectId !== input.projectId ||
|
|
141
|
+
input.session.userId !== authorization.approvedUserId
|
|
145
142
|
) {
|
|
146
143
|
throw new AuthStorageError(
|
|
147
144
|
"invalid_device_authorization",
|
|
148
|
-
"[Sixb] Device
|
|
145
|
+
"[Sixb] Device session is invalid."
|
|
149
146
|
)
|
|
150
147
|
}
|
|
151
|
-
const
|
|
148
|
+
const session = createSessionRecord(this.state, input.session)
|
|
152
149
|
const consumed = {
|
|
153
150
|
...authorization,
|
|
154
151
|
status: "consumed" as const,
|
|
155
152
|
consumedAt: new Date(input.completedAt),
|
|
156
153
|
}
|
|
157
154
|
this.state.deviceAuthorizations.set(key, cloneRecord(consumed))
|
|
158
|
-
return { authorization: cloneRecord(consumed),
|
|
155
|
+
return { authorization: cloneRecord(consumed), session: cloneRecord(session) }
|
|
159
156
|
}
|
|
160
157
|
|
|
161
158
|
async completeMagicLinkSignIn(
|
|
@@ -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,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { AccessTokenKind, AuthSessionAudience, Principal } from "../../auth"
|
|
2
|
+
import type { AuthorizablePrincipal } from "../../execution/types"
|
|
2
3
|
|
|
3
4
|
export type UserStatus = "active" | "suspended"
|
|
4
5
|
export type ServiceAccountStatus = "active" | "suspended"
|
|
5
6
|
export type InvitationStatus = "pending" | "accepted" | "revoked"
|
|
6
7
|
export type GroupMembershipSource = "invitation" | "manual" | "agent"
|
|
7
|
-
export type AccessTokenSubjectType = "user" | "serviceAccount"
|
|
8
8
|
export type DeviceAuthorizationStatus = "pending" | "approved" | "denied" | "consumed"
|
|
9
9
|
export const MAX_PENDING_DEVICE_AUTHORIZATIONS = 100
|
|
10
10
|
|
|
@@ -54,6 +54,7 @@ export interface SessionRecord {
|
|
|
54
54
|
readonly projectId: string
|
|
55
55
|
readonly userId: string
|
|
56
56
|
readonly strategyId: string
|
|
57
|
+
/** The web app a browser session belongs to. A bearer session belongs to none and ignores it. */
|
|
57
58
|
readonly audience: AuthSessionAudience
|
|
58
59
|
readonly tokenHash: string
|
|
59
60
|
readonly createdAt: Date
|
|
@@ -65,15 +66,36 @@ export interface SessionRecord {
|
|
|
65
66
|
// view. Display only — never used for authorization.
|
|
66
67
|
readonly userAgent?: string
|
|
67
68
|
readonly ipAddress?: string
|
|
69
|
+
/** Present when a native client holds the session as bearer tokens instead of a cookie. */
|
|
70
|
+
readonly bearer?: BearerSessionState
|
|
68
71
|
}
|
|
69
72
|
|
|
73
|
+
/**
|
|
74
|
+
* A native client's credentials for its session. `tokenHash` on the session is the current access
|
|
75
|
+
* token's hash; the refresh token rotates on every refresh.
|
|
76
|
+
*/
|
|
77
|
+
export interface BearerSessionState {
|
|
78
|
+
/** Self-reported client label, such as "sixb CLI on alex-mbp". Display only. */
|
|
79
|
+
readonly clientName: string
|
|
80
|
+
readonly accessExpiresAt: Date
|
|
81
|
+
readonly refreshTokenHash: string
|
|
82
|
+
/** The refresh token the last rotation replaced, accepted briefly in case its response was lost. */
|
|
83
|
+
readonly previousRefreshTokenHash?: string
|
|
84
|
+
readonly refreshedAt?: Date
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type RotateSessionRefreshTokenResult =
|
|
88
|
+
| { readonly status: "rotated"; readonly session: SessionRecord }
|
|
89
|
+
/** A replaced refresh token came back after the grace window; the session is now revoked. */
|
|
90
|
+
| { readonly status: "reused" }
|
|
91
|
+
| { readonly status: "invalid" }
|
|
92
|
+
|
|
70
93
|
export interface AccessTokenRecord {
|
|
71
94
|
readonly id: string
|
|
72
95
|
readonly projectId: string
|
|
73
96
|
readonly name: string
|
|
74
97
|
readonly kind: AccessTokenKind
|
|
75
|
-
readonly
|
|
76
|
-
readonly subjectId: string
|
|
98
|
+
readonly subject: AuthorizablePrincipal
|
|
77
99
|
readonly tokenHash: string
|
|
78
100
|
/**
|
|
79
101
|
* Optional group constraint. Undefined means "inherit every current group";
|
|
@@ -148,8 +170,6 @@ export interface DeviceAuthorizationRecord {
|
|
|
148
170
|
readonly deviceCodeHash: string
|
|
149
171
|
readonly userCode: string
|
|
150
172
|
readonly clientName: string
|
|
151
|
-
readonly tokenName: string
|
|
152
|
-
readonly tokenExpiresAt: Date
|
|
153
173
|
readonly status: DeviceAuthorizationStatus
|
|
154
174
|
readonly approvedUserId?: string
|
|
155
175
|
readonly approvedSessionId?: string
|
|
@@ -273,6 +293,7 @@ export interface CreateAuthSessionInput {
|
|
|
273
293
|
readonly absoluteExpiresAt?: Date
|
|
274
294
|
readonly userAgent?: string
|
|
275
295
|
readonly ipAddress?: string
|
|
296
|
+
readonly bearer?: Pick<BearerSessionState, "clientName" | "accessExpiresAt" | "refreshTokenHash">
|
|
276
297
|
}
|
|
277
298
|
|
|
278
299
|
export interface CreateAuthAccessTokenInput {
|
|
@@ -280,8 +301,7 @@ export interface CreateAuthAccessTokenInput {
|
|
|
280
301
|
readonly projectId: string
|
|
281
302
|
readonly name: string
|
|
282
303
|
readonly kind: AccessTokenKind
|
|
283
|
-
readonly
|
|
284
|
-
readonly subjectId: string
|
|
304
|
+
readonly subject: AuthorizablePrincipal
|
|
285
305
|
readonly tokenHash: string
|
|
286
306
|
readonly groupIds?: readonly string[]
|
|
287
307
|
readonly createdByPrincipal?: Principal
|
|
@@ -293,8 +313,7 @@ export interface CreateAuthAccessTokenInput {
|
|
|
293
313
|
export interface ListAuthAccessTokensInput {
|
|
294
314
|
readonly projectId: string
|
|
295
315
|
readonly kind?: AccessTokenKind
|
|
296
|
-
readonly
|
|
297
|
-
readonly subjectId?: string
|
|
316
|
+
readonly subject?: AuthorizablePrincipal
|
|
298
317
|
readonly includeRevoked?: boolean
|
|
299
318
|
readonly limit?: number
|
|
300
319
|
readonly offset?: number
|
|
@@ -385,8 +404,6 @@ export interface CreateDeviceAuthorizationInput {
|
|
|
385
404
|
readonly deviceCodeHash: string
|
|
386
405
|
readonly userCode: string
|
|
387
406
|
readonly clientName: string
|
|
388
|
-
readonly tokenName: string
|
|
389
|
-
readonly tokenExpiresAt: Date
|
|
390
407
|
readonly createdAt: Date
|
|
391
408
|
readonly expiresAt: Date
|
|
392
409
|
}
|
|
@@ -395,13 +412,14 @@ export interface CompleteDeviceAuthorizationInput {
|
|
|
395
412
|
readonly projectId: string
|
|
396
413
|
readonly id: string
|
|
397
414
|
readonly deviceCodeHash: string
|
|
398
|
-
|
|
415
|
+
/** The bearer session to start for the approving user. */
|
|
416
|
+
readonly session: CreateAuthSessionInput & { readonly bearer: BearerSessionState }
|
|
399
417
|
readonly completedAt: Date
|
|
400
418
|
}
|
|
401
419
|
|
|
402
420
|
export interface CompleteDeviceAuthorizationResult {
|
|
403
421
|
readonly authorization: DeviceAuthorizationRecord
|
|
404
|
-
readonly
|
|
422
|
+
readonly session: SessionRecord
|
|
405
423
|
}
|
|
406
424
|
|
|
407
425
|
export interface CompleteMagicLinkSignInInput {
|
|
@@ -523,6 +541,7 @@ export interface AuthSessionStore {
|
|
|
523
541
|
readonly userId: string
|
|
524
542
|
readonly now: Date
|
|
525
543
|
}): Promise<readonly SessionRecord[]>
|
|
544
|
+
/** A live browser (cookie) session whose secret hashes to `tokenHash`. */
|
|
526
545
|
findValidByTokenHash(params: {
|
|
527
546
|
readonly projectId: string
|
|
528
547
|
readonly id: string
|
|
@@ -530,6 +549,31 @@ export interface AuthSessionStore {
|
|
|
530
549
|
readonly tokenHash: string
|
|
531
550
|
readonly now: Date
|
|
532
551
|
}): Promise<SessionRecord | null>
|
|
552
|
+
/** A live bearer session whose current, unexpired access token hashes to `tokenHash`. */
|
|
553
|
+
findValidByAccessTokenHash(params: {
|
|
554
|
+
readonly projectId: string
|
|
555
|
+
readonly id: string
|
|
556
|
+
readonly tokenHash: string
|
|
557
|
+
readonly now: Date
|
|
558
|
+
}): Promise<SessionRecord | null>
|
|
559
|
+
/**
|
|
560
|
+
* Atomically replace a live bearer session's tokens. The current refresh token rotates; the one
|
|
561
|
+
* it replaced also rotates within `reuseGraceMs` of that replacement. Presenting it later revokes
|
|
562
|
+
* the session. `next.expiresAt` extends the idle deadline, never past the absolute one.
|
|
563
|
+
*/
|
|
564
|
+
rotateRefreshToken(params: {
|
|
565
|
+
readonly projectId: string
|
|
566
|
+
readonly id: string
|
|
567
|
+
readonly refreshTokenHash: string
|
|
568
|
+
readonly now: Date
|
|
569
|
+
readonly reuseGraceMs: number
|
|
570
|
+
readonly next: {
|
|
571
|
+
readonly tokenHash: string
|
|
572
|
+
readonly accessExpiresAt: Date
|
|
573
|
+
readonly refreshTokenHash: string
|
|
574
|
+
readonly expiresAt: Date
|
|
575
|
+
}
|
|
576
|
+
}): Promise<RotateSessionRefreshTokenResult>
|
|
533
577
|
renewIfValid(params: {
|
|
534
578
|
readonly projectId: string
|
|
535
579
|
readonly id: string
|
|
@@ -340,7 +340,7 @@ async function validateCredential(
|
|
|
340
340
|
`[Sixb] Authority access token '${credential.id}' does not exist in project '${record.projectId}'.`
|
|
341
341
|
)
|
|
342
342
|
}
|
|
343
|
-
if (token.
|
|
343
|
+
if (!principalsEqual(token.subject, principal)) {
|
|
344
344
|
throw new ExecutionStorageError(
|
|
345
345
|
"invalid_credential",
|
|
346
346
|
`[Sixb] Authority access token '${credential.id}' does not belong to principal '${principal.id}'.`
|