@sixb/core 0.1.11 → 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/builders/params.d.ts +1 -22
- package/dist/actions/builders/params.d.ts.map +1 -1
- package/dist/actions/index.d.ts +2 -2
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +33 -30
- 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 +11 -44
- package/dist/actions/types/params.d.ts.map +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +3 -2
- package/dist/actions/worker.js.map +2 -2
- package/dist/agents/errors.d.ts +1 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +15 -9
- package/dist/agents/execution.d.ts.map +1 -1
- package/dist/agents/ids.d.ts +2 -0
- package/dist/agents/ids.d.ts.map +1 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +52 -44
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/sandbox.d.ts +5 -0
- package/dist/agents/sandbox.d.ts.map +1 -0
- package/dist/agents/streams/index.js +4 -3
- package/dist/agents/streams/index.js.map +1 -1
- package/dist/agents/streams/internal.js +4 -3
- package/dist/agents/streams/internal.js.map +1 -1
- package/dist/agents/validation.d.ts.map +1 -1
- 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 +15 -7
- 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 +5 -4
- package/dist/authorization/index.js.map +1 -1
- package/dist/bootstrap/index.d.ts +1 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +54 -48
- 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-d63nnr5b.js → chunk-04h4t2b5.js} +39 -53
- package/dist/{chunk-d63nnr5b.js.map → chunk-04h4t2b5.js.map} +5 -6
- package/dist/chunk-2fv8sajb.js +84 -0
- package/dist/chunk-2fv8sajb.js.map +10 -0
- package/dist/{chunk-1yefycb1.js → chunk-2hbhn1ff.js} +2 -2
- package/dist/{chunk-ap0g1g74.js → chunk-3nx8vj5a.js} +43 -6
- package/dist/chunk-3nx8vj5a.js.map +12 -0
- package/dist/{chunk-wjasrj67.js → chunk-3qpcrcj8.js} +1 -1
- package/dist/{chunk-0y39rgsb.js → chunk-4tnrzqqh.js} +1 -1
- package/dist/chunk-58geavnf.js +29 -0
- package/dist/chunk-58geavnf.js.map +10 -0
- package/dist/{chunk-01kj2pbh.js → chunk-63fp9x3q.js} +97 -67
- package/dist/chunk-63fp9x3q.js.map +20 -0
- package/dist/{chunk-7bs40fe1.js → chunk-69266efg.js} +83 -2
- package/dist/chunk-69266efg.js.map +12 -0
- package/dist/{chunk-sepyxgpc.js → chunk-693f3zn8.js} +70 -28
- 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-c5rkjrgp.js → chunk-7ytf06d3.js} +1 -1
- package/dist/{chunk-a0e6x5hd.js → chunk-898y24dd.js} +165 -90
- package/dist/chunk-898y24dd.js.map +15 -0
- package/dist/{chunk-mrp7k0pw.js → chunk-91kcnbf0.js} +9 -14
- package/dist/chunk-91kcnbf0.js.map +10 -0
- package/dist/{chunk-z0s4axeh.js → chunk-91wthfwe.js} +97 -21
- package/dist/{chunk-z0s4axeh.js.map → chunk-91wthfwe.js.map} +8 -7
- package/dist/{chunk-yv79ncbv.js → chunk-96yw3pwd.js} +3 -3
- package/dist/chunk-96yw3pwd.js.map +10 -0
- package/dist/chunk-98cw09sw.js.map +2 -2
- package/dist/{chunk-g00bfdq6.js → chunk-9pfw47qx.js} +318 -257
- package/dist/chunk-9pfw47qx.js.map +44 -0
- package/dist/{chunk-5hz0fnca.js → chunk-a0073121.js} +64 -60
- package/dist/chunk-a0073121.js.map +12 -0
- package/dist/{chunk-cfvakeax.js → chunk-a69fkrtr.js} +5 -5
- package/dist/{chunk-72w2pxk7.js → chunk-bdhfn0ww.js} +11 -3
- package/dist/{chunk-72w2pxk7.js.map → chunk-bdhfn0ww.js.map} +3 -3
- package/dist/chunk-bep5rrdq.js +81 -0
- package/dist/chunk-bep5rrdq.js.map +10 -0
- package/dist/chunk-bxx3ms5t.js +29 -0
- package/dist/chunk-bxx3ms5t.js.map +10 -0
- package/dist/{chunk-v2vcg0w6.js → chunk-cbn96bve.js} +2 -2
- package/dist/{chunk-860dwwy0.js → chunk-cd234ba4.js} +22 -12
- package/dist/chunk-cd234ba4.js.map +14 -0
- package/dist/{chunk-gq8vhakp.js → chunk-cvrbhvtr.js} +292 -104
- package/dist/chunk-cvrbhvtr.js.map +46 -0
- package/dist/{chunk-ms2tmn1k.js → chunk-d8yes9yx.js} +355 -100
- package/dist/chunk-d8yes9yx.js.map +20 -0
- package/dist/{chunk-pr2h4bv4.js → chunk-darm7eeg.js} +9 -9
- package/dist/{chunk-pr2h4bv4.js.map → chunk-darm7eeg.js.map} +3 -3
- package/dist/chunk-dmn70ztd.js.map +2 -2
- package/dist/chunk-drz59ve0.js +57 -0
- package/dist/chunk-drz59ve0.js.map +10 -0
- package/dist/{chunk-skz0hst3.js → chunk-dsfw1bdr.js} +6 -86
- package/dist/{chunk-skz0hst3.js.map → chunk-dsfw1bdr.js.map} +3 -3
- package/dist/{chunk-g6cke204.js → chunk-f85hpqnm.js} +1 -1
- package/dist/{chunk-vsj3mdfj.js → chunk-fc5zfxy1.js} +1 -1
- package/dist/chunk-ffwvdgk1.js +85 -0
- package/dist/chunk-ffwvdgk1.js.map +10 -0
- package/dist/chunk-gbcrz0gr.js +552 -0
- package/dist/chunk-gbcrz0gr.js.map +17 -0
- package/dist/{chunk-gqm76kse.js → chunk-gc226ten.js} +434 -177
- package/dist/chunk-gc226ten.js.map +62 -0
- package/dist/{chunk-awbhdqyc.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-aa6z4a19.js → chunk-hgqpcmyr.js} +2 -1
- package/dist/chunk-hgqpcmyr.js.map +12 -0
- package/dist/{chunk-gqh45d2n.js → chunk-ht4a7mjg.js} +76 -6
- package/dist/chunk-ht4a7mjg.js.map +15 -0
- package/dist/{chunk-x9m9x2eq.js → chunk-jhyc777j.js} +3 -3
- package/dist/{chunk-fh8kgex1.js → chunk-jmwy25mf.js} +76 -58
- package/dist/{chunk-fh8kgex1.js.map → chunk-jmwy25mf.js.map} +3 -3
- package/dist/{chunk-rb1xx120.js → chunk-k4kkp58d.js} +25 -8
- package/dist/chunk-k4kkp58d.js.map +11 -0
- package/dist/{chunk-jsy70480.js → chunk-ky7zpbtt.js} +366 -98
- package/dist/chunk-ky7zpbtt.js.map +19 -0
- package/dist/chunk-m4ehq95f.js +9 -0
- package/dist/chunk-m4ehq95f.js.map +10 -0
- package/dist/{chunk-17kfctj6.js → chunk-m8zkvep1.js} +2 -2
- package/dist/{chunk-z0271qkp.js → chunk-mdnw7nj8.js} +8 -6
- package/dist/chunk-mdnw7nj8.js.map +15 -0
- package/dist/{chunk-4zhmdsx6.js → chunk-mf6hwpzh.js} +121 -28
- package/dist/{chunk-4zhmdsx6.js.map → chunk-mf6hwpzh.js.map} +6 -6
- package/dist/{chunk-z30bv4ga.js → chunk-mr60an99.js} +5 -3
- package/dist/{chunk-z30bv4ga.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-p1683c0v.js +104 -0
- package/dist/chunk-p1683c0v.js.map +11 -0
- package/dist/{chunk-9qsh3p5y.js → chunk-rb143ggb.js} +1 -1
- package/dist/{chunk-653vwrzr.js → chunk-rdghfsss.js} +1 -1
- package/dist/chunk-rdghfsss.js.map +10 -0
- package/dist/{chunk-ftv470j8.js → chunk-rqtdtm43.js} +365 -67
- package/dist/chunk-rqtdtm43.js.map +50 -0
- package/dist/{chunk-dz5h08xv.js → chunk-rzcjp5m2.js} +28 -9
- package/dist/chunk-rzcjp5m2.js.map +25 -0
- package/dist/{chunk-f4w3yp4f.js → chunk-rzkr70gr.js} +108 -21
- package/dist/chunk-rzkr70gr.js.map +13 -0
- package/dist/{chunk-3ckk0xfj.js → chunk-s24qbp32.js} +18 -13
- package/dist/{chunk-3ckk0xfj.js.map → chunk-s24qbp32.js.map} +3 -3
- package/dist/{chunk-f0rwz2vh.js → chunk-t6f3tdnr.js} +2 -54
- package/dist/chunk-t6f3tdnr.js.map +10 -0
- package/dist/{chunk-93csa55g.js → chunk-tw03bsmb.js} +11 -5
- package/dist/chunk-tw03bsmb.js.map +11 -0
- package/dist/chunk-vef6qa14.js +363 -0
- package/dist/chunk-vef6qa14.js.map +14 -0
- package/dist/{chunk-92vk7gta.js → chunk-vn3yh259.js} +1 -1
- package/dist/{chunk-g91qxjj0.js → chunk-w9bp61e7.js} +5 -5
- package/dist/{chunk-b19g04jk.js → chunk-xgptywp0.js} +4 -3
- package/dist/chunk-xgptywp0.js.map +11 -0
- package/dist/{chunk-g53f0e4j.js → chunk-xnx96gfy.js} +45 -17
- package/dist/{chunk-g53f0e4j.js.map → chunk-xnx96gfy.js.map} +3 -3
- package/dist/{chunk-1824gssz.js → chunk-y487ywrv.js} +4 -4
- package/dist/{chunk-7apz6hg4.js → chunk-y6vnvayj.js} +8 -4
- package/dist/chunk-y6vnvayj.js.map +10 -0
- package/dist/{chunk-wf88w4kp.js → chunk-ypj2wqtj.js} +3 -6
- package/dist/{chunk-wf88w4kp.js.map → chunk-ypj2wqtj.js.map} +4 -4
- package/dist/chunk-z3y5kg1x.js +14 -0
- package/dist/chunk-z3y5kg1x.js.map +10 -0
- package/dist/{chunk-38zv5rkr.js → chunk-z9h698s8.js} +1 -1
- package/dist/{chunk-38zv5rkr.js.map → chunk-z9h698s8.js.map} +2 -2
- package/dist/{chunk-8vj0rjgs.js → chunk-zdkcdshk.js} +3 -36
- package/dist/{chunk-8vj0rjgs.js.map → chunk-zdkcdshk.js.map} +3 -4
- package/dist/{chunk-358caqf5.js → chunk-znw0zvy4.js} +2 -2
- package/dist/datasets/validation.d.ts +4 -0
- package/dist/datasets/validation.d.ts.map +1 -1
- package/dist/datasets/write.d.ts.map +1 -1
- package/dist/datasets/write.js +5 -4
- package/dist/datasets/write.js.map +1 -1
- package/dist/edits/types.d.ts +19 -19
- package/dist/edits/types.d.ts.map +1 -1
- package/dist/error-reporting/capability.d.ts +3 -2
- package/dist/error-reporting/capability.d.ts.map +1 -1
- package/dist/error-reporting/internal.js +5 -4
- package/dist/error-reporting/internal.js.map +1 -1
- package/dist/error-reporting/reports.d.ts +10 -0
- package/dist/error-reporting/reports.d.ts.map +1 -1
- package/dist/error-reporting/types.d.ts +10 -2
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +16 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/failure-message.d.ts +8 -0
- package/dist/errors/failure-message.d.ts.map +1 -0
- package/dist/errors/internal.d.ts.map +1 -1
- package/dist/errors/internal.js +3 -2
- package/dist/errors/internal.js.map +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 +5 -4
- package/dist/events/index.js.map +1 -1
- 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 +48 -43
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +3 -0
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/kernel-operation.d.ts +4 -0
- package/dist/execution/kernel-operation.d.ts.map +1 -0
- package/dist/execution/primitive.d.ts +1 -2
- package/dist/execution/primitive.d.ts.map +1 -1
- package/dist/execution/primitive.js +47 -42
- 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 +48 -43
- package/dist/execution/request.js.map +3 -3
- package/dist/execution/types.d.ts +6 -0
- package/dist/execution/types.d.ts.map +1 -1
- package/dist/index.d.ts +20 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +77 -62
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.js +5 -4
- package/dist/lake-storage/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 +4 -2
- 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/materialization/index.d.ts +1 -0
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +3 -3
- package/dist/materialization/model.d.ts +2 -0
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materialization/vectors.d.ts +19 -0
- package/dist/materialization/vectors.d.ts.map +1 -0
- package/dist/materializer/context.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/edits/vector-authority.d.ts +6 -0
- package/dist/materializer/edits/vector-authority.d.ts.map +1 -0
- package/dist/materializer/edits/vectors.d.ts +6 -0
- package/dist/materializer/edits/vectors.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/effective/validate.d.ts.map +1 -1
- package/dist/materializer/effective/vector-indexing.d.ts +7 -0
- package/dist/materializer/effective/vector-indexing.d.ts.map +1 -0
- package/dist/materializer/effective/vectors.d.ts +6 -0
- package/dist/materializer/effective/vectors.d.ts.map +1 -0
- package/dist/materializer/execution/scope.d.ts +11 -3
- package/dist/materializer/execution/scope.d.ts.map +1 -1
- package/dist/materializer/execution/work-executor.d.ts +2 -1
- package/dist/materializer/execution/work-executor.d.ts.map +1 -1
- package/dist/materializer/index.js +30 -27
- 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/shared/normalize.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/catalog-index.d.ts +15 -0
- package/dist/models/catalog-index.d.ts.map +1 -0
- package/dist/models/catalog.d.ts +27 -6
- package/dist/models/catalog.d.ts.map +1 -1
- package/dist/models/decision/catalog.d.ts +12 -0
- package/dist/models/decision/catalog.d.ts.map +1 -0
- package/dist/models/decision/errors.d.ts +7 -0
- package/dist/models/decision/errors.d.ts.map +1 -0
- package/dist/models/decision/output.d.ts +50 -0
- package/dist/models/decision/output.d.ts.map +1 -0
- package/dist/models/decision/questions.d.ts +14 -0
- package/dist/models/decision/questions.d.ts.map +1 -0
- package/dist/models/decision/runtime.d.ts +7 -0
- package/dist/models/decision/runtime.d.ts.map +1 -0
- package/dist/models/decision/types.d.ts +92 -0
- package/dist/models/decision/types.d.ts.map +1 -0
- package/dist/models/decision/validation.d.ts +7 -0
- package/dist/models/decision/validation.d.ts.map +1 -0
- package/dist/models/definitions.d.ts +1 -1
- package/dist/models/definitions.d.ts.map +1 -1
- package/dist/models/embedding-model.d.ts +60 -0
- package/dist/models/embedding-model.d.ts.map +1 -0
- package/dist/models/execution/binding.d.ts +2 -0
- package/dist/models/execution/binding.d.ts.map +1 -1
- package/dist/models/execution/embedding.d.ts +5 -0
- package/dist/models/execution/embedding.d.ts.map +1 -0
- package/dist/models/execution/index.js +32 -27
- package/dist/models/execution/index.js.map +1 -1
- package/dist/models/execution/model-call-recorder.d.ts +5 -1
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
- package/dist/models/execution/session.d.ts +21 -0
- package/dist/models/execution/session.d.ts.map +1 -0
- package/dist/models/execution.d.ts.map +1 -1
- package/dist/models/generation-types.d.ts +2 -0
- package/dist/models/generation-types.d.ts.map +1 -1
- package/dist/models/index.d.ts +9 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +17 -7
- package/dist/models/index.js.map +1 -1
- package/dist/models/pricing.d.ts +3 -2
- package/dist/models/pricing.d.ts.map +1 -1
- package/dist/objects/authorized-ontology-view.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +21 -26
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +33 -30
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/query/executor.d.ts +3 -0
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.d.ts +2 -0
- package/dist/objects/query/index.d.ts.map +1 -1
- package/dist/objects/query/index.js +42 -30
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/ir.d.ts +14 -3
- package/dist/objects/query/ir.d.ts.map +1 -1
- package/dist/objects/query/normalize.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 +6 -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/query-executor.d.ts +2 -0
- package/dist/objects/sdk/query-executor.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.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/objects/vectors/handle.d.ts +4 -0
- package/dist/objects/vectors/handle.d.ts.map +1 -0
- package/dist/objects/vectors/indexing-batch.d.ts +6 -0
- package/dist/objects/vectors/indexing-batch.d.ts.map +1 -0
- package/dist/objects/vectors/indexing-generate.d.ts +11 -0
- package/dist/objects/vectors/indexing-generate.d.ts.map +1 -0
- package/dist/objects/vectors/indexing-runtime.d.ts +7 -0
- package/dist/objects/vectors/indexing-runtime.d.ts.map +1 -0
- package/dist/objects/vectors/indexing-shared.d.ts +17 -0
- package/dist/objects/vectors/indexing-shared.d.ts.map +1 -0
- package/dist/objects/vectors/indexing-single.d.ts +4 -0
- package/dist/objects/vectors/indexing-single.d.ts.map +1 -0
- package/dist/objects/vectors/indexing-store-batch.d.ts +6 -0
- package/dist/objects/vectors/indexing-store-batch.d.ts.map +1 -0
- package/dist/objects/vectors/indexing.d.ts +7 -0
- package/dist/objects/vectors/indexing.d.ts.map +1 -0
- package/dist/objects/vectors/profile.d.ts +13 -0
- package/dist/objects/vectors/profile.d.ts.map +1 -0
- package/dist/objects/vectors/query.d.ts +5 -0
- package/dist/objects/vectors/query.d.ts.map +1 -0
- package/dist/objects/vectors/resolve-query.d.ts +6 -0
- package/dist/objects/vectors/resolve-query.d.ts.map +1 -0
- package/dist/objects/vectors/types.d.ts +11 -0
- package/dist/objects/vectors/types.d.ts.map +1 -0
- package/dist/ontology/builders.d.ts +11 -10
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/index.d.ts +5 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +7 -5
- 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 +10 -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 +26 -13
- 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 +3 -0
- package/dist/ontology/validation/definition.d.ts.map +1 -0
- 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 +1 -1
- package/dist/ontology/validation/schema.d.ts.map +1 -1
- package/dist/ontology/vector-profiles.d.ts +4 -0
- package/dist/ontology/vector-profiles.d.ts.map +1 -0
- package/dist/pipelines/index.js +32 -29
- 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 +28 -25
- 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 +3 -2
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +1 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +5 -0
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/runtime/create.d.ts +4 -3
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +10 -7
- 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.d.ts +3 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +49 -1
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +11 -6
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +182 -187
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/auth.d.ts +16 -0
- package/dist/sandboxes/auth.d.ts.map +1 -0
- package/dist/sandboxes/config.d.ts +5 -0
- package/dist/sandboxes/config.d.ts.map +1 -0
- package/dist/sandboxes/configuration.d.ts +41 -0
- package/dist/sandboxes/configuration.d.ts.map +1 -0
- package/dist/sandboxes/environment.d.ts +13 -0
- package/dist/sandboxes/environment.d.ts.map +1 -0
- package/dist/sandboxes/errors.d.ts +1 -1
- package/dist/sandboxes/errors.d.ts.map +1 -1
- package/dist/sandboxes/index.d.ts +6 -1
- package/dist/sandboxes/index.d.ts.map +1 -1
- package/dist/sandboxes/index.js +16 -3
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/sandboxes/sandbox.d.ts +39 -4
- package/dist/sandboxes/sandbox.d.ts.map +1 -1
- package/dist/shared/params/builders.d.ts +25 -0
- package/dist/shared/params/builders.d.ts.map +1 -0
- package/dist/shared/params/types.d.ts +48 -0
- package/dist/shared/params/types.d.ts.map +1 -0
- package/dist/shared/params/user-refs.d.ts +19 -0
- package/dist/shared/params/user-refs.d.ts.map +1 -0
- package/dist/shared/params/validation.d.ts +15 -0
- package/dist/shared/params/validation.d.ts.map +1 -0
- package/dist/shares/compiler.d.ts.map +1 -1
- package/dist/shares/internal.js +29 -26
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +4 -3
- package/dist/storage/action-runs/failure.js.map +1 -1
- package/dist/storage/action-runs/provider.js +1 -1
- 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/in-memory.d.ts +2 -1
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +1 -1
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +5 -1
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +8 -4
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +49 -0
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +1 -0
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
- package/dist/storage/ai-cost/index.d.ts +1 -1
- package/dist/storage/ai-cost/index.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +2 -2
- package/dist/storage/ai-cost/types.d.ts +14 -2
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +4 -3
- package/dist/storage/ai-limits/enforcement.js.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.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 +3 -2
- package/dist/storage/connector-connections/provider.js.map +2 -2
- package/dist/storage/executions/provider.d.ts +3 -3
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +13 -11
- package/dist/storage/executions/provider.js.map +3 -3
- package/dist/storage/executions/types.d.ts +3 -0
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/executions/validation.d.ts.map +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 +8 -6
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +37 -30
- 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/objects/in-memory/read-source.d.ts +5 -0
- package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/storage.d.ts +7 -0
- package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
- package/dist/storage/objects/types.d.ts +2 -0
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/ontology/commits.d.ts +7 -2
- package/dist/storage/ontology/commits.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/index.d.ts +4 -0
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +2 -0
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/shared-state.d.ts +7 -0
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/vector-indexing.d.ts +44 -0
- package/dist/storage/ontology/in-memory/vector-indexing.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/vectors.d.ts +31 -0
- package/dist/storage/ontology/in-memory/vectors.d.ts.map +1 -0
- package/dist/storage/ontology/index.d.ts +6 -0
- package/dist/storage/ontology/index.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 +9 -3
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/ontology/vector-indexing.d.ts +94 -0
- package/dist/storage/ontology/vector-indexing.d.ts.map +1 -0
- package/dist/storage/ontology/vectors.d.ts +56 -0
- package/dist/storage/ontology/vectors.d.ts.map +1 -0
- 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 +4 -3
- package/dist/storage/projection-runs/provider.js.map +1 -1
- package/dist/storage/types.d.ts +2 -2
- 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 +10 -8
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/syncs/index.js +33 -30
- 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/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-cost-storage-contract.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 +2351 -1263
- package/dist/testing/index.js.map +19 -17
- 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/object-read-scope-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/queues-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 +29 -26
- 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 +3 -2
- package/dist/workers/index.js.map +2 -2
- package/dist/workflows/failure.d.ts.map +1 -1
- package/dist/workflows/index.js +51 -45
- 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/builders/params.ts +1 -48
- 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 +16 -75
- package/src/actions/validation.ts +7 -84
- package/src/agents/authority.ts +1 -1
- package/src/agents/errors.ts +3 -0
- package/src/agents/execution.ts +67 -15
- package/src/agents/ids.ts +8 -0
- package/src/agents/index.ts +1 -0
- package/src/agents/request.ts +11 -0
- package/src/agents/sandbox.ts +44 -0
- package/src/agents/validation.ts +2 -108
- 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/datasets/validation.ts +40 -11
- package/src/datasets/write.ts +8 -11
- package/src/edits/types.ts +47 -63
- package/src/error-reporting/capability.ts +11 -0
- package/src/error-reporting/reports.ts +23 -0
- package/src/error-reporting/types.ts +12 -1
- package/src/errors/catalog.ts +16 -0
- package/src/errors/failure-message.ts +15 -0
- package/src/errors/internal.ts +57 -25
- 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/authorization.ts +12 -5
- package/src/execution/authorized-object-reader.ts +42 -9
- package/src/execution/kernel-operation.ts +27 -0
- package/src/execution/primitive.ts +1 -2
- package/src/execution/request.ts +1 -2
- package/src/execution/scopes.ts +2 -0
- package/src/execution/types.ts +4 -4
- package/src/index.ts +68 -8
- package/src/lake-storage/in-memory.ts +5 -3
- package/src/maintenance/ontology-maintenance.ts +77 -1
- package/src/materialization/errors.ts +4 -2
- package/src/materialization/events.ts +27 -2
- package/src/materialization/index.ts +1 -0
- package/src/materialization/model.ts +2 -0
- package/src/materialization/vectors.ts +18 -0
- package/src/materializer/README.md +16 -0
- package/src/materializer/context.ts +10 -0
- package/src/materializer/edits/commit.ts +29 -13
- 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/edits/vector-authority.ts +108 -0
- package/src/materializer/edits/vectors.ts +100 -0
- package/src/materializer/effective/build-events.ts +4 -5
- package/src/materializer/effective/validate.ts +10 -3
- package/src/materializer/effective/vector-indexing.ts +84 -0
- package/src/materializer/effective/vectors.ts +47 -0
- package/src/materializer/execution/scope.ts +40 -7
- package/src/materializer/execution/work-executor.ts +11 -3
- package/src/materializer/projections/replace.ts +3 -1
- package/src/materializer/projections/replacement-plan.ts +4 -0
- package/src/materializer/shared/normalize.ts +11 -0
- package/src/materializer/telemetry/append.ts +5 -13
- package/src/materializer/telemetry/plan.ts +4 -5
- package/src/models/catalog-index.ts +38 -0
- package/src/models/catalog.ts +66 -38
- package/src/models/decision/catalog.ts +32 -0
- package/src/models/decision/errors.ts +18 -0
- package/src/models/decision/output.ts +101 -0
- package/src/models/decision/questions.ts +29 -0
- package/src/models/decision/runtime.ts +188 -0
- package/src/models/decision/types.ts +109 -0
- package/src/models/decision/validation.ts +335 -0
- package/src/models/definitions.ts +1 -1
- package/src/models/embedding-model.ts +129 -0
- package/src/models/execution/README.md +63 -0
- package/src/models/execution/binding.ts +2 -0
- package/src/models/execution/embedding.ts +133 -0
- package/src/models/execution/model-call-recorder.ts +42 -30
- package/src/models/execution/session.ts +81 -0
- package/src/models/execution.ts +10 -52
- package/src/models/generation-types.ts +2 -0
- package/src/models/index.ts +37 -0
- package/src/models/pricing.ts +1 -2
- package/src/objects/authorized-ontology-view.ts +12 -8
- package/src/objects/execution.ts +34 -61
- package/src/objects/query/executor.ts +25 -7
- package/src/objects/query/explain.ts +7 -2
- package/src/objects/query/index.ts +2 -0
- package/src/objects/query/ir.ts +13 -2
- package/src/objects/query/normalize.ts +5 -1
- package/src/objects/query/planner.ts +1 -0
- package/src/objects/query/scalar-values.ts +19 -0
- package/src/objects/query/validate.ts +129 -117
- package/src/objects/sdk/object-handle.ts +11 -8
- package/src/objects/sdk/object-set.ts +9 -15
- package/src/objects/sdk/query-builder.ts +66 -72
- package/src/objects/sdk/query-executor.ts +2 -1
- package/src/objects/sdk/runtime-query-executor.ts +6 -2
- package/src/objects/sdk/telemetry-channel.ts +6 -7
- package/src/objects/sdk/where.ts +6 -13
- package/src/objects/vectors/README.md +59 -0
- package/src/objects/vectors/handle.ts +91 -0
- package/src/objects/vectors/indexing-batch.ts +163 -0
- package/src/objects/vectors/indexing-generate.ts +184 -0
- package/src/objects/vectors/indexing-runtime.ts +17 -0
- package/src/objects/vectors/indexing-shared.ts +188 -0
- package/src/objects/vectors/indexing-single.ts +51 -0
- package/src/objects/vectors/indexing-store-batch.ts +62 -0
- package/src/objects/vectors/indexing.ts +23 -0
- package/src/objects/vectors/profile.ts +64 -0
- package/src/objects/vectors/query.ts +16 -0
- package/src/objects/vectors/resolve-query.ts +89 -0
- package/src/objects/vectors/types.ts +10 -0
- package/src/ontology/builders.ts +15 -11
- package/src/ontology/index.ts +6 -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 +14 -3
- package/src/ontology/tokens.ts +41 -2
- package/src/ontology/types.ts +28 -12
- package/src/ontology/user-ref.ts +120 -0
- package/src/ontology/validation/definition.ts +93 -0
- package/src/ontology/validation/index.ts +1 -0
- package/src/ontology/validation/normalize.ts +39 -3
- package/src/ontology/validation/properties.ts +109 -23
- package/src/ontology/validation/query.ts +44 -92
- package/src/ontology/validation/schema.ts +101 -23
- package/src/ontology/vector-profiles.ts +35 -0
- package/src/predicates/types.ts +43 -33
- package/src/projections/builders.ts +24 -3
- package/src/projections/validation.ts +15 -1
- package/src/queues/in-memory.ts +5 -0
- package/src/queues/index.ts +1 -0
- package/src/queues/types.ts +10 -0
- package/src/runtime/create.ts +7 -6
- package/src/runtime/host.ts +44 -10
- package/src/runtime/index.ts +3 -2
- package/src/runtime/internal.ts +3 -0
- package/src/runtime/resolve-definitions.ts +19 -1
- package/src/runtime/sixb.ts +25 -17
- package/src/runtime/types.ts +288 -478
- package/src/sandboxes/README.md +41 -0
- package/src/sandboxes/auth.ts +17 -0
- package/src/sandboxes/config.ts +37 -0
- package/src/sandboxes/configuration.ts +268 -0
- package/src/sandboxes/environment.ts +107 -0
- package/src/sandboxes/errors.ts +1 -1
- package/src/sandboxes/index.ts +15 -0
- package/src/sandboxes/sandbox.ts +42 -4
- package/src/shared/params/builders.ts +50 -0
- package/src/shared/params/types.ts +85 -0
- package/src/shared/params/user-refs.ts +48 -0
- package/src/shared/params/validation.ts +114 -0
- package/src/shares/compiler.ts +6 -16
- package/src/storage/action-runs/types.ts +1 -0
- package/src/storage/agents/in-memory.ts +25 -1
- package/src/storage/agents/index.ts +3 -0
- package/src/storage/agents/provider.ts +105 -0
- package/src/storage/agents/types.ts +54 -0
- package/src/storage/ai-cost/analytics.ts +59 -21
- package/src/storage/ai-cost/index.ts +1 -0
- package/src/storage/ai-cost/types.ts +19 -2
- 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/provider.ts +24 -12
- package/src/storage/executions/types.ts +1 -0
- package/src/storage/executions/validation.ts +8 -4
- 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 +18 -3
- package/src/storage/objects/in-memory/query.ts +38 -14
- package/src/storage/objects/in-memory/read-scope.ts +9 -2
- package/src/storage/objects/in-memory/read-source.ts +5 -0
- package/src/storage/objects/in-memory/selected-reader.ts +5 -1
- package/src/storage/objects/in-memory/storage.ts +19 -1
- package/src/storage/objects/types.ts +2 -0
- package/src/storage/ontology/commits.ts +7 -2
- package/src/storage/ontology/in-memory/index.ts +20 -0
- package/src/storage/ontology/in-memory/materializations.ts +19 -34
- package/src/storage/ontology/in-memory/shared-state.ts +9 -0
- package/src/storage/ontology/in-memory/vector-indexing.ts +179 -0
- package/src/storage/ontology/in-memory/vectors.ts +73 -0
- package/src/storage/ontology/index.ts +14 -0
- 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/ontology/vector-indexing.ts +98 -0
- package/src/storage/ontology/vectors.ts +48 -0
- package/src/storage/operation-scope.ts +2 -0
- package/src/storage/types.ts +3 -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/agent-storage-contract.ts +246 -0
- package/src/testing/ai-cost-storage-contract.ts +134 -0
- 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 +162 -27
- package/src/testing/object-read-scope-contract.ts +1 -5
- package/src/testing/ontology-contract-fixture.ts +23 -3
- package/src/testing/ontology-storage-contract.ts +58 -0
- package/src/testing/queues-contract.ts +31 -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/failure.ts +10 -4
- package/src/workflows/run-dispatch.ts +12 -1
- package/src/workflows/snapshot.ts +16 -7
- package/src/workflows/types.ts +2 -2
- package/src/workflows/validation.ts +2 -2
- package/dist/chunk-01kj2pbh.js.map +0 -19
- package/dist/chunk-5hz0fnca.js.map +0 -12
- package/dist/chunk-653vwrzr.js.map +0 -10
- package/dist/chunk-7apz6hg4.js.map +0 -10
- package/dist/chunk-7bs40fe1.js.map +0 -12
- package/dist/chunk-860dwwy0.js.map +0 -14
- package/dist/chunk-93csa55g.js.map +0 -11
- package/dist/chunk-a0e6x5hd.js.map +0 -14
- package/dist/chunk-aa6z4a19.js.map +0 -12
- package/dist/chunk-ap0g1g74.js.map +0 -11
- package/dist/chunk-awbhdqyc.js.map +0 -10
- package/dist/chunk-b19g04jk.js.map +0 -11
- package/dist/chunk-dz5h08xv.js.map +0 -25
- package/dist/chunk-f0rwz2vh.js.map +0 -11
- package/dist/chunk-f4w3yp4f.js.map +0 -12
- package/dist/chunk-ftv470j8.js.map +0 -45
- package/dist/chunk-g00bfdq6.js.map +0 -43
- package/dist/chunk-gq8vhakp.js.map +0 -44
- package/dist/chunk-gqh45d2n.js.map +0 -15
- package/dist/chunk-gqm76kse.js.map +0 -58
- package/dist/chunk-jsy70480.js.map +0 -15
- package/dist/chunk-mrp7k0pw.js.map +0 -10
- package/dist/chunk-ms2tmn1k.js.map +0 -17
- package/dist/chunk-rb1xx120.js.map +0 -11
- package/dist/chunk-sepyxgpc.js.map +0 -15
- package/dist/chunk-yv79ncbv.js.map +0 -10
- package/dist/chunk-z0271qkp.js.map +0 -15
- package/dist/chunk-z3y411fq.js +0 -99
- package/dist/chunk-z3y411fq.js.map +0 -11
- /package/dist/{chunk-1yefycb1.js.map → chunk-2hbhn1ff.js.map} +0 -0
- /package/dist/{chunk-wjasrj67.js.map → chunk-3qpcrcj8.js.map} +0 -0
- /package/dist/{chunk-0y39rgsb.js.map → chunk-4tnrzqqh.js.map} +0 -0
- /package/dist/{chunk-c5rkjrgp.js.map → chunk-7ytf06d3.js.map} +0 -0
- /package/dist/{chunk-cfvakeax.js.map → chunk-a69fkrtr.js.map} +0 -0
- /package/dist/{chunk-v2vcg0w6.js.map → chunk-cbn96bve.js.map} +0 -0
- /package/dist/{chunk-g6cke204.js.map → chunk-f85hpqnm.js.map} +0 -0
- /package/dist/{chunk-vsj3mdfj.js.map → chunk-fc5zfxy1.js.map} +0 -0
- /package/dist/{chunk-x9m9x2eq.js.map → chunk-jhyc777j.js.map} +0 -0
- /package/dist/{chunk-17kfctj6.js.map → chunk-m8zkvep1.js.map} +0 -0
- /package/dist/{chunk-9qsh3p5y.js.map → chunk-rb143ggb.js.map} +0 -0
- /package/dist/{chunk-92vk7gta.js.map → chunk-vn3yh259.js.map} +0 -0
- /package/dist/{chunk-g91qxjj0.js.map → chunk-w9bp61e7.js.map} +0 -0
- /package/dist/{chunk-1824gssz.js.map → chunk-y487ywrv.js.map} +0 -0
- /package/dist/{chunk-358caqf5.js.map → chunk-znw0zvy4.js.map} +0 -0
package/src/auth/runtime.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
type AccessTokenRecord,
|
|
19
19
|
type AuthStorage,
|
|
20
20
|
AuthStorageError,
|
|
21
|
+
type CompleteDeviceAuthorizationInput,
|
|
21
22
|
type InvitationRecord,
|
|
22
23
|
type ServiceAccountGroupMembershipRecord,
|
|
23
24
|
type ServiceAccountRecord,
|
|
@@ -31,7 +32,8 @@ import {
|
|
|
31
32
|
hashAccessTokenSecret,
|
|
32
33
|
parseAccessTokenValue,
|
|
33
34
|
} from "./access-tokens"
|
|
34
|
-
import type
|
|
35
|
+
import { type AuthSessionAudience, DEFAULT_AUTH_SESSION_AUDIENCE } from "./audience"
|
|
36
|
+
import { getRequestClientAddress } from "./client-address"
|
|
35
37
|
import {
|
|
36
38
|
getCookie,
|
|
37
39
|
type ResolvedAuthCookieOptions,
|
|
@@ -39,7 +41,15 @@ import {
|
|
|
39
41
|
} from "./cookies"
|
|
40
42
|
import { AuthRuntimeError } from "./errors"
|
|
41
43
|
import { SessionCache } from "./session-cache"
|
|
42
|
-
import {
|
|
44
|
+
import {
|
|
45
|
+
type BearerSessionTokens,
|
|
46
|
+
createBearerSessionTokens,
|
|
47
|
+
hashSessionSecret,
|
|
48
|
+
parseBearerSessionToken,
|
|
49
|
+
parseSessionCookieValue,
|
|
50
|
+
SESSION_ACCESS_TOKEN_PREFIX,
|
|
51
|
+
SESSION_REFRESH_TOKEN_PREFIX,
|
|
52
|
+
} from "./sessions"
|
|
43
53
|
import type {
|
|
44
54
|
AuthenticatedAuthSession,
|
|
45
55
|
AuthenticatedRequestAuthSession,
|
|
@@ -59,12 +69,12 @@ import type {
|
|
|
59
69
|
GetInvitationOptionsResult,
|
|
60
70
|
GetMembershipOptionsResult,
|
|
61
71
|
InvitationDeliveryAuthStrategy,
|
|
72
|
+
InvitationDestination,
|
|
62
73
|
InvitationGroupOption,
|
|
63
74
|
InvitationRecipientStatus,
|
|
64
75
|
InviteDeliveryResult,
|
|
65
76
|
InviteDeliveryStatus,
|
|
66
77
|
InviteUserInput,
|
|
67
|
-
InviteUserOptions,
|
|
68
78
|
InviteUserResult,
|
|
69
79
|
ListInvitationsInput,
|
|
70
80
|
ListInvitationsResult,
|
|
@@ -76,7 +86,6 @@ import type {
|
|
|
76
86
|
ListServiceAccountsResult,
|
|
77
87
|
MemberSummary,
|
|
78
88
|
MembershipCapabilities,
|
|
79
|
-
Principal,
|
|
80
89
|
ReactivateMemberInput,
|
|
81
90
|
ReactivateMemberResult,
|
|
82
91
|
ResolvedAuthConfig,
|
|
@@ -86,10 +95,10 @@ import type {
|
|
|
86
95
|
RevokePersonalAccessTokenInput,
|
|
87
96
|
RevokeServiceAccountAccessTokenInput,
|
|
88
97
|
RevokeServiceAccountAccessTokenResult,
|
|
89
|
-
SecurityContext,
|
|
90
98
|
SixbAuthConfig,
|
|
91
99
|
SuspendMemberInput,
|
|
92
100
|
SuspendMemberResult,
|
|
101
|
+
UnauthenticatedAuthSession,
|
|
93
102
|
UpdateMemberGroupsInput,
|
|
94
103
|
UpdateMemberGroupsResult,
|
|
95
104
|
} from "./types"
|
|
@@ -100,7 +109,6 @@ import {
|
|
|
100
109
|
resolveAuthConfig,
|
|
101
110
|
resolveAuthSessionAudience,
|
|
102
111
|
resolveInvitationExpiresAt,
|
|
103
|
-
sanitizeReturnTo,
|
|
104
112
|
} from "./validation"
|
|
105
113
|
|
|
106
114
|
export {
|
|
@@ -117,6 +125,12 @@ export {
|
|
|
117
125
|
const SESSION_TOUCH_INTERVAL_MS = 60_000
|
|
118
126
|
const ACCESS_TOKEN_TOUCH_INTERVAL_MS = 60_000
|
|
119
127
|
|
|
128
|
+
// A native client's access token is sent on every request, so a leaked one must stop working soon.
|
|
129
|
+
const BEARER_ACCESS_TOKEN_TTL_MS = 15 * 60_000
|
|
130
|
+
// A replaced refresh token still rotates this long after its replacement, so a client whose refresh
|
|
131
|
+
// response was lost can retry. Later, it means a copy is in use and the session is revoked.
|
|
132
|
+
const REFRESH_REUSE_GRACE_MS = 60_000
|
|
133
|
+
|
|
120
134
|
export interface AuthRuntimeOptions {
|
|
121
135
|
readonly projectId: string
|
|
122
136
|
readonly storage: Storage
|
|
@@ -211,7 +225,7 @@ export class AuthRuntime {
|
|
|
211
225
|
): Promise<AuthSessionResult>
|
|
212
226
|
async getSession(
|
|
213
227
|
request: Request,
|
|
214
|
-
options: AuthSessionResolutionOptions & { readonly credentialSource: "
|
|
228
|
+
options: AuthSessionResolutionOptions & { readonly credentialSource: "any" }
|
|
215
229
|
): Promise<AuthRequestResult>
|
|
216
230
|
async getSession(
|
|
217
231
|
request: Request,
|
|
@@ -226,22 +240,20 @@ export class AuthRuntime {
|
|
|
226
240
|
}
|
|
227
241
|
|
|
228
242
|
const audience = resolveAuthSessionAudience(options.audience)
|
|
229
|
-
const credentialSource = options.credentialSource ?? "session"
|
|
230
243
|
|
|
231
|
-
if (credentialSource
|
|
232
|
-
const authorizationHeader = request.headers.get("authorization")
|
|
244
|
+
if (options.credentialSource === "any") {
|
|
233
245
|
const tokenValue = getBearerAccessTokenValue(request)
|
|
246
|
+
if (tokenValue?.startsWith(SESSION_ACCESS_TOKEN_PREFIX)) {
|
|
247
|
+
return this.resolveBearerSession(tokenValue)
|
|
248
|
+
}
|
|
234
249
|
if (tokenValue) {
|
|
235
250
|
return this.resolveAccessTokenSession(request, tokenValue)
|
|
236
251
|
}
|
|
237
252
|
|
|
238
|
-
|
|
253
|
+
// An Authorization header that is not a usable token never falls back to the cookie.
|
|
254
|
+
if (request.headers.get("authorization")) {
|
|
239
255
|
return { authenticated: false, reason: "invalid_access_token" }
|
|
240
256
|
}
|
|
241
|
-
|
|
242
|
-
if (credentialSource === "accessToken") {
|
|
243
|
-
return { authenticated: false, reason: "missing_access_token" }
|
|
244
|
-
}
|
|
245
257
|
}
|
|
246
258
|
|
|
247
259
|
return this.resolveCookieSession(request, audience, options.sessionActivity)
|
|
@@ -269,6 +281,7 @@ export class AuthRuntime {
|
|
|
269
281
|
const cached = this.sessionCache?.get({
|
|
270
282
|
sessionId: parts.sessionId,
|
|
271
283
|
tokenHash,
|
|
284
|
+
transport: "cookie",
|
|
272
285
|
audience,
|
|
273
286
|
nowMs,
|
|
274
287
|
})
|
|
@@ -311,48 +324,142 @@ export class AuthRuntime {
|
|
|
311
324
|
sessionRenewed = true
|
|
312
325
|
}
|
|
313
326
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
327
|
+
if (!sessionRenewed) {
|
|
328
|
+
await this.touchSessionLastSeen(storage, session, now)
|
|
329
|
+
}
|
|
330
|
+
const result = await this.authenticateSession(storage, session, tokenHash, now)
|
|
331
|
+
return result.authenticated && sessionRenewed ? { ...result, sessionRenewed: true } : result
|
|
332
|
+
}
|
|
318
333
|
|
|
319
|
-
|
|
320
|
-
|
|
334
|
+
private async resolveBearerSession(tokenValue: string): Promise<AuthSessionResult> {
|
|
335
|
+
const parts = parseBearerSessionToken(SESSION_ACCESS_TOKEN_PREFIX, tokenValue)
|
|
336
|
+
if (!parts) {
|
|
337
|
+
return { authenticated: false, reason: "invalid_access_token" }
|
|
321
338
|
}
|
|
322
339
|
|
|
323
|
-
|
|
324
|
-
|
|
340
|
+
const tokenHash = hashSessionSecret(parts.sessionSecret)
|
|
341
|
+
const now = new Date()
|
|
342
|
+
const cached = this.sessionCache?.get({
|
|
343
|
+
sessionId: parts.sessionId,
|
|
344
|
+
tokenHash,
|
|
345
|
+
transport: "bearer",
|
|
346
|
+
nowMs: now.getTime(),
|
|
347
|
+
})
|
|
348
|
+
if (cached) {
|
|
349
|
+
return cached
|
|
325
350
|
}
|
|
326
351
|
|
|
327
|
-
const
|
|
352
|
+
const storage = this.requireAuthStorage()
|
|
353
|
+
const session = await storage.sessions.findValidByAccessTokenHash({
|
|
328
354
|
projectId: this.projectId,
|
|
329
|
-
|
|
355
|
+
id: parts.sessionId,
|
|
356
|
+
tokenHash,
|
|
357
|
+
now,
|
|
330
358
|
})
|
|
359
|
+
if (!session) {
|
|
360
|
+
return { authenticated: false, reason: "invalid_access_token" }
|
|
361
|
+
}
|
|
331
362
|
|
|
332
|
-
|
|
333
|
-
|
|
363
|
+
await this.touchSessionLastSeen(storage, session, now)
|
|
364
|
+
return this.authenticateSession(storage, session, tokenHash, now)
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Resolve a live session's user and groups, the same way for cookies and bearer tokens. */
|
|
368
|
+
private async authenticateSession(
|
|
369
|
+
storage: AuthStorage,
|
|
370
|
+
session: SessionRecord,
|
|
371
|
+
tokenHash: string,
|
|
372
|
+
now: Date
|
|
373
|
+
): Promise<AuthSessionResult> {
|
|
374
|
+
const member = await this.loadActiveUser(storage, session.userId)
|
|
375
|
+
if (!member.authenticated) {
|
|
376
|
+
return member
|
|
334
377
|
}
|
|
335
378
|
|
|
336
379
|
const result: AuthenticatedAuthSession = {
|
|
337
380
|
authenticated: true,
|
|
338
381
|
credentialSource: "session",
|
|
339
|
-
principal: { type: "user", id: user.id },
|
|
340
|
-
user,
|
|
382
|
+
principal: { type: "user", id: member.user.id },
|
|
383
|
+
user: member.user,
|
|
341
384
|
session,
|
|
342
|
-
groupIds:
|
|
385
|
+
groupIds: member.groupIds,
|
|
343
386
|
}
|
|
344
|
-
|
|
345
387
|
this.sessionCache?.set({
|
|
346
|
-
sessionId:
|
|
388
|
+
sessionId: session.id,
|
|
347
389
|
tokenHash,
|
|
348
|
-
audience,
|
|
390
|
+
audience: session.audience,
|
|
349
391
|
session: result,
|
|
350
|
-
nowMs,
|
|
392
|
+
nowMs: now.getTime(),
|
|
351
393
|
sessionExpiresAtMs: session.expiresAt.getTime(),
|
|
352
394
|
sessionAbsoluteExpiresAtMs: session.absoluteExpiresAt?.getTime(),
|
|
353
395
|
})
|
|
396
|
+
return result
|
|
397
|
+
}
|
|
354
398
|
|
|
355
|
-
|
|
399
|
+
/**
|
|
400
|
+
* The session a native client starts when the user approves it, and its first tokens. The caller
|
|
401
|
+
* stores the session in the same transaction that consumes the approval.
|
|
402
|
+
*/
|
|
403
|
+
prepareBearerSession(input: {
|
|
404
|
+
readonly userId: string
|
|
405
|
+
readonly clientName: string
|
|
406
|
+
readonly now: Date
|
|
407
|
+
}): {
|
|
408
|
+
readonly session: CompleteDeviceAuthorizationInput["session"]
|
|
409
|
+
readonly tokens: BearerSessionTokens
|
|
410
|
+
} {
|
|
411
|
+
const sessionId = `ses_${randomUUID()}`
|
|
412
|
+
const tokens = createBearerSessionTokens(sessionId)
|
|
413
|
+
return {
|
|
414
|
+
tokens,
|
|
415
|
+
session: {
|
|
416
|
+
id: sessionId,
|
|
417
|
+
projectId: this.projectId,
|
|
418
|
+
userId: input.userId,
|
|
419
|
+
strategyId: "device",
|
|
420
|
+
// A native session belongs to no web app. The column needs a value; nothing reads it.
|
|
421
|
+
audience: DEFAULT_AUTH_SESSION_AUDIENCE,
|
|
422
|
+
tokenHash: tokens.tokenHash,
|
|
423
|
+
createdAt: input.now,
|
|
424
|
+
...this.createSessionDeadlines(input.now),
|
|
425
|
+
bearer: {
|
|
426
|
+
clientName: input.clientName,
|
|
427
|
+
accessExpiresAt: new Date(input.now.getTime() + BEARER_ACCESS_TOKEN_TTL_MS),
|
|
428
|
+
refreshTokenHash: tokens.refreshTokenHash,
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Trade a native client's refresh token for new tokens. Returns null when the token is not
|
|
436
|
+
* accepted; a replaced token presented after the grace window also revokes its session.
|
|
437
|
+
*/
|
|
438
|
+
async refreshSession(
|
|
439
|
+
refreshToken: string
|
|
440
|
+
): Promise<{ readonly tokens: BearerSessionTokens; readonly session: SessionRecord } | null> {
|
|
441
|
+
const parts = parseBearerSessionToken(SESSION_REFRESH_TOKEN_PREFIX, refreshToken)
|
|
442
|
+
if (!parts || !this.isEnabled()) {
|
|
443
|
+
return null
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const now = new Date()
|
|
447
|
+
const tokens = createBearerSessionTokens(parts.sessionId)
|
|
448
|
+
const result = await this.requireAuthStorage().sessions.rotateRefreshToken({
|
|
449
|
+
projectId: this.projectId,
|
|
450
|
+
id: parts.sessionId,
|
|
451
|
+
refreshTokenHash: hashSessionSecret(parts.sessionSecret),
|
|
452
|
+
now,
|
|
453
|
+
reuseGraceMs: REFRESH_REUSE_GRACE_MS,
|
|
454
|
+
next: {
|
|
455
|
+
tokenHash: tokens.tokenHash,
|
|
456
|
+
accessExpiresAt: new Date(now.getTime() + BEARER_ACCESS_TOKEN_TTL_MS),
|
|
457
|
+
refreshTokenHash: tokens.refreshTokenHash,
|
|
458
|
+
expiresAt: new Date(now.getTime() + this.config.session.idleTimeoutMs),
|
|
459
|
+
},
|
|
460
|
+
})
|
|
461
|
+
this.sessionCache?.invalidate(parts.sessionId)
|
|
462
|
+
return result.status === "rotated" ? { tokens, session: result.session } : null
|
|
356
463
|
}
|
|
357
464
|
|
|
358
465
|
private canRenewSession(session: SessionRecord, nowMs: number): boolean {
|
|
@@ -397,41 +504,25 @@ export class AuthRuntime {
|
|
|
397
504
|
|
|
398
505
|
await this.touchAccessTokenLastUsed(storage, accessToken, request, now)
|
|
399
506
|
|
|
400
|
-
if (accessToken.
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
})
|
|
405
|
-
|
|
406
|
-
if (!user) {
|
|
407
|
-
return { authenticated: false, reason: "missing_user" }
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
if (user.status === "suspended") {
|
|
411
|
-
return { authenticated: false, reason: "suspended_user" }
|
|
507
|
+
if (accessToken.subject.type === "user") {
|
|
508
|
+
const member = await this.loadActiveUser(storage, accessToken.subject.id)
|
|
509
|
+
if (!member.authenticated) {
|
|
510
|
+
return member
|
|
412
511
|
}
|
|
413
512
|
|
|
414
|
-
const memberships = await storage.groupMemberships.listForUser({
|
|
415
|
-
projectId: this.projectId,
|
|
416
|
-
userId: user.id,
|
|
417
|
-
})
|
|
418
|
-
|
|
419
513
|
return {
|
|
420
514
|
authenticated: true,
|
|
421
515
|
credentialSource: "accessToken",
|
|
422
|
-
principal: { type: "user", id: user.id },
|
|
423
|
-
user,
|
|
516
|
+
principal: { type: "user", id: member.user.id },
|
|
517
|
+
user: member.user,
|
|
424
518
|
accessToken,
|
|
425
|
-
groupIds: constrainTokenGroupIds(
|
|
426
|
-
memberships.map((membership) => membership.groupId),
|
|
427
|
-
accessToken
|
|
428
|
-
),
|
|
519
|
+
groupIds: constrainTokenGroupIds(member.groupIds, accessToken),
|
|
429
520
|
}
|
|
430
521
|
}
|
|
431
522
|
|
|
432
523
|
const serviceAccount = await storage.serviceAccounts.getById({
|
|
433
524
|
projectId: this.projectId,
|
|
434
|
-
id: accessToken.
|
|
525
|
+
id: accessToken.subject.id,
|
|
435
526
|
})
|
|
436
527
|
|
|
437
528
|
if (!serviceAccount) {
|
|
@@ -460,12 +551,32 @@ export class AuthRuntime {
|
|
|
460
551
|
}
|
|
461
552
|
}
|
|
462
553
|
|
|
463
|
-
/**
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
554
|
+
/** Resolve a user and their current groups the same way for every credential. */
|
|
555
|
+
private async loadActiveUser(
|
|
556
|
+
storage: AuthStorage,
|
|
557
|
+
userId: string
|
|
558
|
+
): Promise<
|
|
559
|
+
| UnauthenticatedAuthSession
|
|
560
|
+
| { readonly authenticated: true; readonly user: UserRecord; readonly groupIds: string[] }
|
|
561
|
+
> {
|
|
562
|
+
const user = await storage.users.getById({ projectId: this.projectId, id: userId })
|
|
563
|
+
if (!user) {
|
|
564
|
+
return { authenticated: false, reason: "missing_user" }
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
if (user.status === "suspended") {
|
|
568
|
+
return { authenticated: false, reason: "suspended_user" }
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
const memberships = await storage.groupMemberships.listForUser({
|
|
572
|
+
projectId: this.projectId,
|
|
573
|
+
userId,
|
|
574
|
+
})
|
|
575
|
+
return {
|
|
576
|
+
authenticated: true,
|
|
577
|
+
user,
|
|
578
|
+
groupIds: memberships.map((membership) => membership.groupId),
|
|
579
|
+
}
|
|
469
580
|
}
|
|
470
581
|
|
|
471
582
|
// Best-effort refresh of `lastSeenAt` for the active-sessions view. Throttled,
|
|
@@ -503,109 +614,34 @@ export class AuthRuntime {
|
|
|
503
614
|
id: accessToken.id,
|
|
504
615
|
lastUsedAt: now,
|
|
505
616
|
userAgent: request.headers.get("user-agent")?.trim() || undefined,
|
|
506
|
-
ipAddress:
|
|
617
|
+
ipAddress: getRequestClientAddress(request),
|
|
507
618
|
})
|
|
508
619
|
} catch {
|
|
509
620
|
// Touch is non-critical; ignore failures so auth still succeeds.
|
|
510
621
|
}
|
|
511
622
|
}
|
|
512
623
|
|
|
513
|
-
async requirePrincipal(
|
|
514
|
-
request: Request,
|
|
515
|
-
options: AuthSessionResolutionOptions = {}
|
|
516
|
-
): Promise<Principal> {
|
|
517
|
-
const session = await this.getSession(request, options)
|
|
518
|
-
if (!session.authenticated) {
|
|
519
|
-
throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
return session.principal
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
async requireUser(
|
|
526
|
-
request: Request,
|
|
527
|
-
options: AuthSessionResolutionOptions = {}
|
|
528
|
-
): Promise<AuthenticatedAuthSession> {
|
|
529
|
-
const session = await this.getSession(request, { ...options, credentialSource: "session" })
|
|
530
|
-
if (!session.authenticated) {
|
|
531
|
-
throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
return session
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
async requireUserRequest(
|
|
538
|
-
request: Request,
|
|
539
|
-
options: AuthSessionResolutionOptions = {}
|
|
540
|
-
): Promise<AuthenticatedUserRequestSession> {
|
|
541
|
-
const session = await this.getSession(request, { ...options, credentialSource: "any" })
|
|
542
|
-
if (!session.authenticated) {
|
|
543
|
-
throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
if (!isAuthenticatedUserRequestSession(session)) {
|
|
547
|
-
throw new AuthRuntimeError("authorization_denied", "[Sixb] User authentication is required.")
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
return session
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
async createSecurityContext(
|
|
554
|
-
request: Request,
|
|
555
|
-
options: AuthSessionResolutionOptions = {}
|
|
556
|
-
): Promise<SecurityContext> {
|
|
557
|
-
const session = await this.requireUser(request, options)
|
|
558
|
-
return {
|
|
559
|
-
principal: session.principal,
|
|
560
|
-
sessionId: session.session.id,
|
|
561
|
-
projectId: this.projectId,
|
|
562
|
-
correlationId: resolveCorrelationId(request),
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
|
|
566
624
|
/**
|
|
567
|
-
* Resolve
|
|
568
|
-
*
|
|
569
|
-
* Grants resolve eagerly (`groups -> roles -> grants`, subtype-expanded), so the returned
|
|
570
|
-
* context supports synchronous checks when Core binds a request execution SDK.
|
|
571
|
-
*/
|
|
572
|
-
async createAuthorizationContext(
|
|
573
|
-
request: Request,
|
|
574
|
-
options: AuthSessionResolutionOptions = {}
|
|
575
|
-
): Promise<AuthorizationContext> {
|
|
576
|
-
const session = await this.getSession(request, options)
|
|
577
|
-
if (!session.authenticated) {
|
|
578
|
-
throw new AuthRuntimeError("authentication_required", "[Sixb] Authentication is required.")
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
return this.contextFromSession(session)
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
/**
|
|
585
|
-
* Build an authorization context from an already-resolved session, so callers
|
|
586
|
-
* that resolve the session themselves (e.g. the server auth guard) don't read
|
|
587
|
-
* the request twice.
|
|
625
|
+
* Resolve a caller's authorization context. Grants resolve eagerly
|
|
626
|
+
* (`groups -> roles -> grants`, subtype-expanded), so checks against it are synchronous.
|
|
588
627
|
*/
|
|
589
628
|
contextFromSession(session: AuthenticatedRequestAuthSession): AuthorizationContext {
|
|
590
629
|
return resolveAuthorizationContext({
|
|
591
630
|
principal: session.principal,
|
|
592
|
-
sessionId: session
|
|
631
|
+
sessionId: callerSessionId(session),
|
|
593
632
|
groupIds: session.groupIds,
|
|
594
633
|
roles: this.security.listResolvedRoles(),
|
|
595
634
|
})
|
|
596
635
|
}
|
|
597
636
|
|
|
598
637
|
async listPersonalAccessTokens(
|
|
599
|
-
|
|
600
|
-
options: AuthSessionResolutionOptions = {}
|
|
638
|
+
caller: AuthenticatedUserRequestSession
|
|
601
639
|
): Promise<ListPersonalAccessTokensResult> {
|
|
602
|
-
const session = await this.requireUserRequest(request, options)
|
|
603
640
|
const storage = this.requireAuthStorage()
|
|
604
641
|
const result = await storage.accessTokens.list({
|
|
605
642
|
projectId: this.projectId,
|
|
606
643
|
kind: "personal",
|
|
607
|
-
|
|
608
|
-
subjectId: session.user.id,
|
|
644
|
+
subject: { type: "user", id: caller.user.id },
|
|
609
645
|
includeRevoked: true,
|
|
610
646
|
order: "desc",
|
|
611
647
|
limit: 100,
|
|
@@ -615,14 +651,12 @@ export class AuthRuntime {
|
|
|
615
651
|
}
|
|
616
652
|
|
|
617
653
|
async createPersonalAccessToken(
|
|
618
|
-
|
|
619
|
-
input: CreatePersonalAccessTokenInput
|
|
620
|
-
options: AuthSessionResolutionOptions = {}
|
|
654
|
+
caller: AuthenticatedUserRequestSession,
|
|
655
|
+
input: CreatePersonalAccessTokenInput
|
|
621
656
|
): Promise<CreateAccessTokenResult> {
|
|
622
|
-
const session = await this.requireUserRequest(request, options)
|
|
623
657
|
const storage = this.requireAuthStorage()
|
|
624
658
|
// A personal token can only carry groups the caller currently belongs to.
|
|
625
|
-
const groupIds = constrainRequestedGroupIds(input.groupIds,
|
|
659
|
+
const groupIds = constrainRequestedGroupIds(input.groupIds, caller.groupIds, {
|
|
626
660
|
subject: "personal access token",
|
|
627
661
|
})
|
|
628
662
|
const credential = createAccessTokenCredential("personal")
|
|
@@ -631,12 +665,11 @@ export class AuthRuntime {
|
|
|
631
665
|
projectId: this.projectId,
|
|
632
666
|
name: input.name,
|
|
633
667
|
kind: "personal",
|
|
634
|
-
|
|
635
|
-
subjectId: session.user.id,
|
|
668
|
+
subject: { type: "user", id: caller.user.id },
|
|
636
669
|
tokenHash: credential.tokenHash,
|
|
637
670
|
groupIds,
|
|
638
|
-
createdByPrincipal:
|
|
639
|
-
createdBySessionId:
|
|
671
|
+
createdByPrincipal: caller.principal,
|
|
672
|
+
createdBySessionId: callerSessionId(caller),
|
|
640
673
|
createdAt: new Date(),
|
|
641
674
|
expiresAt: input.expiresAt,
|
|
642
675
|
})
|
|
@@ -645,11 +678,9 @@ export class AuthRuntime {
|
|
|
645
678
|
}
|
|
646
679
|
|
|
647
680
|
async revokePersonalAccessToken(
|
|
648
|
-
|
|
649
|
-
input: RevokePersonalAccessTokenInput
|
|
650
|
-
options: AuthSessionResolutionOptions = {}
|
|
681
|
+
caller: AuthenticatedUserRequestSession,
|
|
682
|
+
input: RevokePersonalAccessTokenInput
|
|
651
683
|
): Promise<RevokeAccessTokenResult> {
|
|
652
|
-
const session = await this.requireUserRequest(request, options)
|
|
653
684
|
const storage = this.requireAuthStorage()
|
|
654
685
|
const token = await storage.accessTokens.getById({
|
|
655
686
|
projectId: this.projectId,
|
|
@@ -660,8 +691,8 @@ export class AuthRuntime {
|
|
|
660
691
|
if (
|
|
661
692
|
!token ||
|
|
662
693
|
token.kind !== "personal" ||
|
|
663
|
-
token.
|
|
664
|
-
token.
|
|
694
|
+
token.subject.type !== "user" ||
|
|
695
|
+
token.subject.id !== caller.user.id
|
|
665
696
|
) {
|
|
666
697
|
throw missingAccessTokenError(input.tokenId, this.projectId)
|
|
667
698
|
}
|
|
@@ -676,10 +707,8 @@ export class AuthRuntime {
|
|
|
676
707
|
}
|
|
677
708
|
|
|
678
709
|
async listServiceAccounts(
|
|
679
|
-
|
|
680
|
-
options: AuthSessionResolutionOptions = {}
|
|
710
|
+
caller: AuthenticatedUserRequestSession
|
|
681
711
|
): Promise<ListServiceAccountsResult> {
|
|
682
|
-
const session = await this.requireUserRequest(request, options)
|
|
683
712
|
const storage = this.requireAuthStorage()
|
|
684
713
|
const result = await storage.serviceAccounts.list({
|
|
685
714
|
projectId: this.projectId,
|
|
@@ -697,21 +726,19 @@ export class AuthRuntime {
|
|
|
697
726
|
// listing never leaks the groups of more-privileged accounts.
|
|
698
727
|
return {
|
|
699
728
|
serviceAccounts: withGroups.filter(({ groupIds }) =>
|
|
700
|
-
callerCanManageServiceAccount(
|
|
729
|
+
callerCanManageServiceAccount(caller.groupIds, groupIds)
|
|
701
730
|
),
|
|
702
731
|
}
|
|
703
732
|
}
|
|
704
733
|
|
|
705
734
|
async createServiceAccount(
|
|
706
|
-
|
|
707
|
-
input: CreateServiceAccountInput
|
|
708
|
-
options: AuthSessionResolutionOptions = {}
|
|
735
|
+
caller: AuthenticatedUserRequestSession,
|
|
736
|
+
input: CreateServiceAccountInput
|
|
709
737
|
): Promise<CreateServiceAccountResult> {
|
|
710
|
-
const session = await this.requireUserRequest(request, options)
|
|
711
738
|
const storage = this.requireAuthStorage()
|
|
712
739
|
// A caller can only place a service account in groups it itself belongs to.
|
|
713
740
|
const groupIds =
|
|
714
|
-
constrainRequestedGroupIds(input.groupIds,
|
|
741
|
+
constrainRequestedGroupIds(input.groupIds, caller.groupIds, {
|
|
715
742
|
subject: "service account",
|
|
716
743
|
}) ?? []
|
|
717
744
|
const now = new Date()
|
|
@@ -720,8 +747,8 @@ export class AuthRuntime {
|
|
|
720
747
|
projectId: this.projectId,
|
|
721
748
|
name: input.name,
|
|
722
749
|
description: input.description,
|
|
723
|
-
createdByPrincipal:
|
|
724
|
-
createdBySessionId:
|
|
750
|
+
createdByPrincipal: caller.principal,
|
|
751
|
+
createdBySessionId: callerSessionId(caller),
|
|
725
752
|
createdAt: now,
|
|
726
753
|
updatedAt: now,
|
|
727
754
|
})
|
|
@@ -742,15 +769,13 @@ export class AuthRuntime {
|
|
|
742
769
|
}
|
|
743
770
|
|
|
744
771
|
async disableServiceAccount(
|
|
745
|
-
|
|
746
|
-
input: DisableServiceAccountInput
|
|
747
|
-
options: AuthSessionResolutionOptions = {}
|
|
772
|
+
caller: AuthenticatedUserRequestSession,
|
|
773
|
+
input: DisableServiceAccountInput
|
|
748
774
|
): Promise<DisableServiceAccountResult> {
|
|
749
|
-
const session = await this.requireUserRequest(request, options)
|
|
750
775
|
const storage = this.requireAuthStorage()
|
|
751
776
|
const { serviceAccount, groupIds } = await this.requireManageableServiceAccount(
|
|
752
777
|
storage,
|
|
753
|
-
|
|
778
|
+
caller.groupIds,
|
|
754
779
|
input.serviceAccountId
|
|
755
780
|
)
|
|
756
781
|
const updated = await storage.serviceAccounts.update({
|
|
@@ -764,22 +789,19 @@ export class AuthRuntime {
|
|
|
764
789
|
}
|
|
765
790
|
|
|
766
791
|
async listServiceAccountAccessTokens(
|
|
767
|
-
|
|
768
|
-
input: ListServiceAccountAccessTokensInput
|
|
769
|
-
options: AuthSessionResolutionOptions = {}
|
|
792
|
+
caller: AuthenticatedUserRequestSession,
|
|
793
|
+
input: ListServiceAccountAccessTokensInput
|
|
770
794
|
): Promise<ListServiceAccountAccessTokensResult> {
|
|
771
|
-
const session = await this.requireUserRequest(request, options)
|
|
772
795
|
const storage = this.requireAuthStorage()
|
|
773
796
|
const { serviceAccount } = await this.requireManageableServiceAccount(
|
|
774
797
|
storage,
|
|
775
|
-
|
|
798
|
+
caller.groupIds,
|
|
776
799
|
input.serviceAccountId
|
|
777
800
|
)
|
|
778
801
|
const result = await storage.accessTokens.list({
|
|
779
802
|
projectId: this.projectId,
|
|
780
803
|
kind: "serviceAccount",
|
|
781
|
-
|
|
782
|
-
subjectId: serviceAccount.id,
|
|
804
|
+
subject: { type: "serviceAccount", id: serviceAccount.id },
|
|
783
805
|
includeRevoked: true,
|
|
784
806
|
order: "desc",
|
|
785
807
|
limit: 100,
|
|
@@ -789,14 +811,12 @@ export class AuthRuntime {
|
|
|
789
811
|
}
|
|
790
812
|
|
|
791
813
|
async createServiceAccountAccessToken(
|
|
792
|
-
|
|
793
|
-
input: CreateServiceAccountAccessTokenInput
|
|
794
|
-
options: AuthSessionResolutionOptions = {}
|
|
814
|
+
caller: AuthenticatedUserRequestSession,
|
|
815
|
+
input: CreateServiceAccountAccessTokenInput
|
|
795
816
|
): Promise<CreateServiceAccountAccessTokenResult> {
|
|
796
|
-
const session = await this.requireUserRequest(request, options)
|
|
797
817
|
const storage = this.requireAuthStorage()
|
|
798
818
|
const { serviceAccount, groupIds: serviceAccountGroupIds } =
|
|
799
|
-
await this.requireManageableServiceAccount(storage,
|
|
819
|
+
await this.requireManageableServiceAccount(storage, caller.groupIds, input.serviceAccountId)
|
|
800
820
|
|
|
801
821
|
if (serviceAccount.status === "suspended") {
|
|
802
822
|
throw new AuthStorageError(
|
|
@@ -817,12 +837,11 @@ export class AuthRuntime {
|
|
|
817
837
|
projectId: this.projectId,
|
|
818
838
|
name: input.name,
|
|
819
839
|
kind: "serviceAccount",
|
|
820
|
-
|
|
821
|
-
subjectId: serviceAccount.id,
|
|
840
|
+
subject: { type: "serviceAccount", id: serviceAccount.id },
|
|
822
841
|
tokenHash: credential.tokenHash,
|
|
823
842
|
groupIds,
|
|
824
|
-
createdByPrincipal:
|
|
825
|
-
createdBySessionId:
|
|
843
|
+
createdByPrincipal: caller.principal,
|
|
844
|
+
createdBySessionId: callerSessionId(caller),
|
|
826
845
|
createdAt: new Date(),
|
|
827
846
|
expiresAt: input.expiresAt,
|
|
828
847
|
})
|
|
@@ -831,15 +850,13 @@ export class AuthRuntime {
|
|
|
831
850
|
}
|
|
832
851
|
|
|
833
852
|
async revokeServiceAccountAccessToken(
|
|
834
|
-
|
|
835
|
-
input: RevokeServiceAccountAccessTokenInput
|
|
836
|
-
options: AuthSessionResolutionOptions = {}
|
|
853
|
+
caller: AuthenticatedUserRequestSession,
|
|
854
|
+
input: RevokeServiceAccountAccessTokenInput
|
|
837
855
|
): Promise<RevokeServiceAccountAccessTokenResult> {
|
|
838
|
-
const session = await this.requireUserRequest(request, options)
|
|
839
856
|
const storage = this.requireAuthStorage()
|
|
840
857
|
const { serviceAccount } = await this.requireManageableServiceAccount(
|
|
841
858
|
storage,
|
|
842
|
-
|
|
859
|
+
caller.groupIds,
|
|
843
860
|
input.serviceAccountId
|
|
844
861
|
)
|
|
845
862
|
const token = await storage.accessTokens.getById({
|
|
@@ -850,8 +867,8 @@ export class AuthRuntime {
|
|
|
850
867
|
if (
|
|
851
868
|
!token ||
|
|
852
869
|
token.kind !== "serviceAccount" ||
|
|
853
|
-
token.
|
|
854
|
-
token.
|
|
870
|
+
token.subject.type !== "serviceAccount" ||
|
|
871
|
+
token.subject.id !== serviceAccount.id
|
|
855
872
|
) {
|
|
856
873
|
throw missingAccessTokenError(input.tokenId, this.projectId)
|
|
857
874
|
}
|
|
@@ -913,11 +930,9 @@ export class AuthRuntime {
|
|
|
913
930
|
}
|
|
914
931
|
|
|
915
932
|
async getInvitationOptions(
|
|
916
|
-
|
|
917
|
-
options: AuthSessionResolutionOptions = {}
|
|
933
|
+
caller: AuthenticatedUserRequestSession
|
|
918
934
|
): Promise<GetInvitationOptionsResult> {
|
|
919
|
-
const
|
|
920
|
-
const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
|
|
935
|
+
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
|
|
921
936
|
const inviteScope = scope.operations.invite
|
|
922
937
|
const groups = this.scopedGroupOptions(inviteScope.groupIds)
|
|
923
938
|
const hasInviteMembershipPolicy = inviteScope.policyIds.length > 0
|
|
@@ -950,11 +965,9 @@ export class AuthRuntime {
|
|
|
950
965
|
}
|
|
951
966
|
|
|
952
967
|
async getMembershipOptions(
|
|
953
|
-
|
|
954
|
-
options: AuthSessionResolutionOptions = {}
|
|
968
|
+
caller: AuthenticatedUserRequestSession
|
|
955
969
|
): Promise<GetMembershipOptionsResult> {
|
|
956
|
-
const
|
|
957
|
-
const scope = this.resolveMembershipPolicyScopeForUser(session.groupIds)
|
|
970
|
+
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
|
|
958
971
|
|
|
959
972
|
return {
|
|
960
973
|
// The member-admin edit-groups dialog assigns from the `assignGroups` scope.
|
|
@@ -964,13 +977,11 @@ export class AuthRuntime {
|
|
|
964
977
|
}
|
|
965
978
|
|
|
966
979
|
async listMembers(
|
|
967
|
-
|
|
968
|
-
input: ListMembersInput = {}
|
|
969
|
-
options: AuthSessionResolutionOptions = {}
|
|
980
|
+
caller: AuthenticatedUserRequestSession,
|
|
981
|
+
input: ListMembersInput = {}
|
|
970
982
|
): Promise<ListMembersResult> {
|
|
971
|
-
const session = await this.requireUser(request, options)
|
|
972
983
|
const storage = this.requireAuthStorage()
|
|
973
|
-
const scope = this.resolveMembershipPolicyScopeForUser(
|
|
984
|
+
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
|
|
974
985
|
const { limit, offset } = normalizePagination(input)
|
|
975
986
|
|
|
976
987
|
// First slice loads all users, attaches groups, then filters and paginates in
|
|
@@ -993,7 +1004,7 @@ export class AuthRuntime {
|
|
|
993
1004
|
continue
|
|
994
1005
|
}
|
|
995
1006
|
|
|
996
|
-
const isSelf = user.id ===
|
|
1007
|
+
const isSelf = user.id === caller.user.id
|
|
997
1008
|
members.push({
|
|
998
1009
|
user,
|
|
999
1010
|
groupIds,
|
|
@@ -1012,13 +1023,11 @@ export class AuthRuntime {
|
|
|
1012
1023
|
}
|
|
1013
1024
|
|
|
1014
1025
|
async updateMemberGroups(
|
|
1015
|
-
|
|
1016
|
-
input: UpdateMemberGroupsInput
|
|
1017
|
-
options: AuthSessionResolutionOptions = {}
|
|
1026
|
+
caller: AuthenticatedUserRequestSession,
|
|
1027
|
+
input: UpdateMemberGroupsInput
|
|
1018
1028
|
): Promise<UpdateMemberGroupsResult> {
|
|
1019
|
-
const session = await this.requireUser(request, options)
|
|
1020
1029
|
const storage = this.requireAuthStorage()
|
|
1021
|
-
const scope = this.resolveMembershipPolicyScopeForUser(
|
|
1030
|
+
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
|
|
1022
1031
|
const userId = assertNonEmpty(input.userId, "User id")
|
|
1023
1032
|
|
|
1024
1033
|
// The target must exist and every group it currently holds must be assignable
|
|
@@ -1048,7 +1057,7 @@ export class AuthRuntime {
|
|
|
1048
1057
|
|
|
1049
1058
|
// Self-protection: a caller may add in-scope groups to themselves but may not
|
|
1050
1059
|
// remove any of their own current groups, so they cannot lock themselves out.
|
|
1051
|
-
if (user.id ===
|
|
1060
|
+
if (user.id === caller.user.id && removals.length > 0) {
|
|
1052
1061
|
throw new AuthRuntimeError(
|
|
1053
1062
|
"authorization_denied",
|
|
1054
1063
|
"[Sixb] The current user cannot remove their own groups."
|
|
@@ -1075,7 +1084,7 @@ export class AuthRuntime {
|
|
|
1075
1084
|
|
|
1076
1085
|
// The user's cached session carries its old groups; drop it so the next
|
|
1077
1086
|
// request resolves the updated membership.
|
|
1078
|
-
this.
|
|
1087
|
+
this.sessionCache?.invalidateUser(user.id)
|
|
1079
1088
|
|
|
1080
1089
|
const groupIds = (
|
|
1081
1090
|
await storage.groupMemberships.listForUser({ projectId: this.projectId, userId: user.id })
|
|
@@ -1085,17 +1094,15 @@ export class AuthRuntime {
|
|
|
1085
1094
|
}
|
|
1086
1095
|
|
|
1087
1096
|
async suspendMember(
|
|
1088
|
-
|
|
1089
|
-
input: SuspendMemberInput
|
|
1090
|
-
options: AuthSessionResolutionOptions = {}
|
|
1097
|
+
caller: AuthenticatedUserRequestSession,
|
|
1098
|
+
input: SuspendMemberInput
|
|
1091
1099
|
): Promise<SuspendMemberResult> {
|
|
1092
|
-
const session = await this.requireUser(request, options)
|
|
1093
1100
|
const storage = this.requireAuthStorage()
|
|
1094
|
-
const scope = this.resolveMembershipPolicyScopeForUser(
|
|
1101
|
+
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
|
|
1095
1102
|
const userId = assertNonEmpty(input.userId, "User id")
|
|
1096
1103
|
const { user, groupIds } = await this.requireManageableMember(storage, scope, "suspend", userId)
|
|
1097
1104
|
|
|
1098
|
-
if (user.id ===
|
|
1105
|
+
if (user.id === caller.user.id) {
|
|
1099
1106
|
throw new AuthRuntimeError(
|
|
1100
1107
|
"authorization_denied",
|
|
1101
1108
|
"[Sixb] The current user cannot suspend themselves."
|
|
@@ -1109,19 +1116,17 @@ export class AuthRuntime {
|
|
|
1109
1116
|
})
|
|
1110
1117
|
// Storage revoked the user's sessions; drop cached copies so the suspended
|
|
1111
1118
|
// user stops authenticating immediately.
|
|
1112
|
-
this.
|
|
1119
|
+
this.sessionCache?.invalidateUser(user.id)
|
|
1113
1120
|
|
|
1114
1121
|
return { user: suspended, groupIds }
|
|
1115
1122
|
}
|
|
1116
1123
|
|
|
1117
1124
|
async reactivateMember(
|
|
1118
|
-
|
|
1119
|
-
input: ReactivateMemberInput
|
|
1120
|
-
options: AuthSessionResolutionOptions = {}
|
|
1125
|
+
caller: AuthenticatedUserRequestSession,
|
|
1126
|
+
input: ReactivateMemberInput
|
|
1121
1127
|
): Promise<ReactivateMemberResult> {
|
|
1122
|
-
const session = await this.requireUser(request, options)
|
|
1123
1128
|
const storage = this.requireAuthStorage()
|
|
1124
|
-
const scope = this.resolveMembershipPolicyScopeForUser(
|
|
1129
|
+
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
|
|
1125
1130
|
const userId = assertNonEmpty(input.userId, "User id")
|
|
1126
1131
|
const { user, groupIds } = await this.requireManageableMember(storage, scope, "suspend", userId)
|
|
1127
1132
|
|
|
@@ -1136,9 +1141,49 @@ export class AuthRuntime {
|
|
|
1136
1141
|
return { user: reactivated, groupIds }
|
|
1137
1142
|
}
|
|
1138
1143
|
|
|
1139
|
-
/**
|
|
1140
|
-
|
|
1141
|
-
this.
|
|
1144
|
+
/** The caller's active sessions across every audience, most recently active first. */
|
|
1145
|
+
async listSessions(caller: AuthenticatedUserRequestSession): Promise<readonly SessionRecord[]> {
|
|
1146
|
+
return this.requireAuthStorage().sessions.listActiveByUserId({
|
|
1147
|
+
projectId: this.projectId,
|
|
1148
|
+
userId: caller.user.id,
|
|
1149
|
+
now: new Date(),
|
|
1150
|
+
})
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/**
|
|
1154
|
+
* End one of the caller's own sessions. Returns false for a missing session or one that belongs
|
|
1155
|
+
* to another user, so a caller cannot probe other accounts.
|
|
1156
|
+
*/
|
|
1157
|
+
async revokeSession(
|
|
1158
|
+
caller: AuthenticatedUserRequestSession,
|
|
1159
|
+
sessionId: string
|
|
1160
|
+
): Promise<boolean> {
|
|
1161
|
+
const storage = this.requireAuthStorage()
|
|
1162
|
+
const session = await storage.sessions.getById({ projectId: this.projectId, id: sessionId })
|
|
1163
|
+
if (!session || session.userId !== caller.user.id) {
|
|
1164
|
+
return false
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
await storage.sessions.revoke({
|
|
1168
|
+
projectId: this.projectId,
|
|
1169
|
+
id: sessionId,
|
|
1170
|
+
revokedAt: new Date(),
|
|
1171
|
+
})
|
|
1172
|
+
this.sessionCache?.invalidate(sessionId)
|
|
1173
|
+
return true
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
/** End every active session of the caller, across audiences. Returns how many ended. */
|
|
1177
|
+
async revokeAllSessions(caller: AuthenticatedUserRequestSession): Promise<number> {
|
|
1178
|
+
const revoked = await this.requireAuthStorage().sessions.revokeActiveForUser({
|
|
1179
|
+
projectId: this.projectId,
|
|
1180
|
+
userId: caller.user.id,
|
|
1181
|
+
revokedAt: new Date(),
|
|
1182
|
+
})
|
|
1183
|
+
for (const session of revoked) {
|
|
1184
|
+
this.sessionCache?.invalidate(session.id)
|
|
1185
|
+
}
|
|
1186
|
+
return revoked.length
|
|
1142
1187
|
}
|
|
1143
1188
|
|
|
1144
1189
|
private scopedGroupOptions(groupIds: ReadonlySet<string>): InvitationGroupOption[] {
|
|
@@ -1197,15 +1242,14 @@ export class AuthRuntime {
|
|
|
1197
1242
|
}
|
|
1198
1243
|
|
|
1199
1244
|
async invite(
|
|
1200
|
-
|
|
1245
|
+
caller: AuthenticatedUserRequestSession,
|
|
1201
1246
|
input: InviteUserInput,
|
|
1202
|
-
|
|
1247
|
+
destination: InvitationDestination
|
|
1203
1248
|
): Promise<InviteUserResult> {
|
|
1204
|
-
const session = await this.requireUser(request, options)
|
|
1205
1249
|
const authStorage = this.requireAuthStorage()
|
|
1206
1250
|
const now = new Date()
|
|
1207
1251
|
const groupIds = this.resolveInviteGroupIds(input)
|
|
1208
|
-
this.assertCanManageInvitationGroups(
|
|
1252
|
+
this.assertCanManageInvitationGroups(caller.groupIds, groupIds)
|
|
1209
1253
|
|
|
1210
1254
|
const strategy = this.getStrategy()
|
|
1211
1255
|
if (!isInvitationDeliveryAuthStrategy(strategy)) {
|
|
@@ -1216,18 +1260,15 @@ export class AuthRuntime {
|
|
|
1216
1260
|
}
|
|
1217
1261
|
|
|
1218
1262
|
await this.assertCanInviteRecipient(strategy, authStorage, input.email, now)
|
|
1219
|
-
|
|
1220
|
-
options.delivery?.audience ?? options.audience
|
|
1221
|
-
)
|
|
1222
|
-
this.assertInvitationApplicationAccess(groupIds, deliveryAudience)
|
|
1263
|
+
this.assertInvitationApplicationAccess(groupIds, destination.audience)
|
|
1223
1264
|
|
|
1224
1265
|
const invitation = await authStorage.invitations.createOrUpdateActive({
|
|
1225
1266
|
id: `inv_${randomUUID()}`,
|
|
1226
1267
|
projectId: this.projectId,
|
|
1227
1268
|
email: input.email,
|
|
1228
1269
|
groupIds,
|
|
1229
|
-
createdByPrincipal:
|
|
1230
|
-
createdBySessionId:
|
|
1270
|
+
createdByPrincipal: caller.principal,
|
|
1271
|
+
createdBySessionId: callerSessionId(caller),
|
|
1231
1272
|
createdAt: now,
|
|
1232
1273
|
updatedAt: now,
|
|
1233
1274
|
expiresAt: resolveInvitationExpiresAt(input.expiresAt, now),
|
|
@@ -1239,9 +1280,9 @@ export class AuthRuntime {
|
|
|
1239
1280
|
projectId: this.projectId,
|
|
1240
1281
|
authStorage,
|
|
1241
1282
|
invitation,
|
|
1242
|
-
audience:
|
|
1243
|
-
returnTo:
|
|
1244
|
-
requestOrigin:
|
|
1283
|
+
audience: destination.audience,
|
|
1284
|
+
returnTo: destination.returnTo,
|
|
1285
|
+
requestOrigin: destination.requestOrigin,
|
|
1245
1286
|
revealLink: input.revealLink,
|
|
1246
1287
|
now,
|
|
1247
1288
|
})
|
|
@@ -1270,11 +1311,9 @@ export class AuthRuntime {
|
|
|
1270
1311
|
}
|
|
1271
1312
|
|
|
1272
1313
|
async listInvitations(
|
|
1273
|
-
|
|
1274
|
-
input: ListInvitationsInput = {}
|
|
1275
|
-
options: AuthSessionResolutionOptions = {}
|
|
1314
|
+
caller: AuthenticatedUserRequestSession,
|
|
1315
|
+
input: ListInvitationsInput = {}
|
|
1276
1316
|
): Promise<ListInvitationsResult> {
|
|
1277
|
-
const session = await this.requireUser(request, options)
|
|
1278
1317
|
const authStorage = this.requireAuthStorage()
|
|
1279
1318
|
const { limit, offset } = normalizePagination(input)
|
|
1280
1319
|
const result = await authStorage.invitations.list({
|
|
@@ -1283,7 +1322,7 @@ export class AuthRuntime {
|
|
|
1283
1322
|
statuses: input.statuses,
|
|
1284
1323
|
order: input.order,
|
|
1285
1324
|
})
|
|
1286
|
-
const scope = this.resolveMembershipPolicyScopeForUser(
|
|
1325
|
+
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds)
|
|
1287
1326
|
const manageable = result.invitations.filter((invitation) =>
|
|
1288
1327
|
canPerformMembershipOperation(scope, "invite", invitation.groupIds)
|
|
1289
1328
|
)
|
|
@@ -1297,11 +1336,9 @@ export class AuthRuntime {
|
|
|
1297
1336
|
}
|
|
1298
1337
|
|
|
1299
1338
|
async revokeInvitation(
|
|
1300
|
-
|
|
1301
|
-
input: RevokeInvitationInput
|
|
1302
|
-
options: AuthSessionResolutionOptions = {}
|
|
1339
|
+
caller: AuthenticatedUserRequestSession,
|
|
1340
|
+
input: RevokeInvitationInput
|
|
1303
1341
|
): Promise<RevokeInvitationResult> {
|
|
1304
|
-
const session = await this.requireUser(request, options)
|
|
1305
1342
|
const authStorage = this.requireAuthStorage()
|
|
1306
1343
|
const invitationId = assertNonEmpty(input.invitationId, "Invitation id")
|
|
1307
1344
|
const invitation = await authStorage.invitations.getById({
|
|
@@ -1316,7 +1353,7 @@ export class AuthRuntime {
|
|
|
1316
1353
|
)
|
|
1317
1354
|
}
|
|
1318
1355
|
|
|
1319
|
-
this.assertCanManageInvitationGroups(
|
|
1356
|
+
this.assertCanManageInvitationGroups(caller.groupIds, invitation.groupIds)
|
|
1320
1357
|
|
|
1321
1358
|
if (invitation.status !== "pending") {
|
|
1322
1359
|
throw new AuthRuntimeError(
|
|
@@ -1488,24 +1525,9 @@ export class AuthRuntime {
|
|
|
1488
1525
|
}
|
|
1489
1526
|
}
|
|
1490
1527
|
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
)
|
|
1495
|
-
}
|
|
1496
|
-
|
|
1497
|
-
function isAuthenticatedUserRequestSession(
|
|
1498
|
-
session: AuthenticatedRequestAuthSession
|
|
1499
|
-
): session is AuthenticatedUserRequestSession {
|
|
1500
|
-
return session.principal.type === "user"
|
|
1501
|
-
}
|
|
1502
|
-
|
|
1503
|
-
function resolveRequestIpAddress(request: Request): string | undefined {
|
|
1504
|
-
return (
|
|
1505
|
-
request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ||
|
|
1506
|
-
request.headers.get("x-real-ip")?.trim() ||
|
|
1507
|
-
undefined
|
|
1508
|
-
)
|
|
1528
|
+
/** The interactive session a caller authenticated with, when it used one. */
|
|
1529
|
+
function callerSessionId(caller: AuthenticatedRequestAuthSession): string | undefined {
|
|
1530
|
+
return caller.credentialSource === "session" ? caller.session.id : undefined
|
|
1509
1531
|
}
|
|
1510
1532
|
|
|
1511
1533
|
function constrainTokenGroupIds(
|