@sixb/core 0.1.18 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/dist/actions/commit-edits.d.ts +7 -19
- package/dist/actions/commit-edits.d.ts.map +1 -1
- package/dist/actions/errors.d.ts +0 -3
- package/dist/actions/errors.d.ts.map +1 -1
- package/dist/actions/execution.d.ts +10 -3
- package/dist/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.d.ts +6 -9
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +51 -50
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/request.d.ts +14 -25
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run/context.d.ts +40 -0
- package/dist/actions/run/context.d.ts.map +1 -0
- package/dist/actions/run/edits-commit.d.ts +31 -0
- package/dist/actions/run/edits-commit.d.ts.map +1 -0
- package/dist/actions/run/effects.d.ts +23 -0
- package/dist/actions/run/effects.d.ts.map +1 -0
- package/dist/actions/run/execute.d.ts +30 -0
- package/dist/actions/run/execute.d.ts.map +1 -0
- package/dist/actions/run/executor.d.ts +95 -0
- package/dist/actions/run/executor.d.ts.map +1 -0
- package/dist/actions/run/normalize.d.ts +36 -0
- package/dist/actions/run/normalize.d.ts.map +1 -0
- package/dist/actions/run/phase-types.d.ts +18 -0
- package/dist/actions/run/phase-types.d.ts.map +1 -0
- package/dist/actions/run/phases.d.ts +20 -0
- package/dist/actions/run/phases.d.ts.map +1 -0
- package/dist/actions/run/run-action.d.ts +25 -0
- package/dist/actions/run/run-action.d.ts.map +1 -0
- package/dist/actions/run/signals.d.ts +67 -0
- package/dist/actions/run/signals.d.ts.map +1 -0
- package/dist/actions/run/state.d.ts +47 -0
- package/dist/actions/run/state.d.ts.map +1 -0
- package/dist/actions/run/types.d.ts +54 -0
- package/dist/actions/run/types.d.ts.map +1 -0
- package/dist/actions/run/writeback.d.ts +17 -0
- package/dist/actions/run/writeback.d.ts.map +1 -0
- package/dist/actions/run-authorization.d.ts +1 -1
- package/dist/actions/run-authorization.d.ts.map +1 -1
- package/dist/actions/run-persistence.d.ts +53 -0
- package/dist/actions/run-persistence.d.ts.map +1 -0
- package/dist/actions/types/context.d.ts +10 -0
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/agents/index.js +52 -55
- 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/auth/cookies.d.ts +2 -4
- package/dist/auth/cookies.d.ts.map +1 -1
- package/dist/auth/index.d.ts +0 -2
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +15 -21
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +8 -10
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/session-cache.d.ts +1 -5
- package/dist/auth/session-cache.d.ts.map +1 -1
- package/dist/auth/strategy.js +1 -1
- package/dist/auth/types.d.ts +4 -8
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/validation.d.ts +0 -1
- package/dist/auth/validation.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +0 -4
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/event-visibility.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +6 -8
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +0 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +5 -9
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +1 -1
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/bootstrap/index.js +50 -53
- package/dist/bootstrap/index.js.map +2 -2
- package/dist/{chunk-vz3gc1tm.js → chunk-0rbyz4qy.js} +67 -69
- package/dist/{chunk-vz3gc1tm.js.map → chunk-0rbyz4qy.js.map} +4 -4
- package/dist/{chunk-rz53yb4v.js → chunk-0yh890a4.js} +1 -1
- package/dist/{chunk-vgk3hknm.js → chunk-1k89ecfr.js} +1 -1
- package/dist/{chunk-ny3xyvcn.js → chunk-1zq2p6g0.js} +3 -3
- package/dist/{chunk-dnmadg9k.js → chunk-3t2hgbgd.js} +2 -2
- package/dist/{chunk-k6hrnf35.js → chunk-4vyr1j8f.js} +51 -4
- package/dist/chunk-4vyr1j8f.js.map +11 -0
- package/dist/{chunk-22v5bpz3.js → chunk-5e43w60z.js} +1 -1
- package/dist/{chunk-de4z2bj6.js → chunk-5j58wjct.js} +17 -17
- package/dist/chunk-5j58wjct.js.map +18 -0
- package/dist/{chunk-fe52eczz.js → chunk-6c6sn0bh.js} +6352 -2127
- package/dist/chunk-6c6sn0bh.js.map +106 -0
- package/dist/{chunk-7hpdd6r9.js → chunk-6p49a5cq.js} +4 -4
- package/dist/{chunk-b9affek3.js → chunk-7n440zgt.js} +30 -30
- package/dist/{chunk-b9affek3.js.map → chunk-7n440zgt.js.map} +4 -4
- package/dist/{chunk-kkqwzy6h.js → chunk-7t429e3f.js} +1 -1
- package/dist/{chunk-6fsr7y93.js → chunk-8mx7qw3y.js} +14 -13
- package/dist/{chunk-6fsr7y93.js.map → chunk-8mx7qw3y.js.map} +4 -4
- package/dist/{chunk-kpx7jrmn.js → chunk-91mg3nj9.js} +59 -59
- package/dist/{chunk-kpx7jrmn.js.map → chunk-91mg3nj9.js.map} +5 -5
- package/dist/{chunk-ex496vct.js → chunk-9dmt152s.js} +1 -1
- package/dist/{chunk-48e3cn2d.js → chunk-9gyp8hg1.js} +2 -2
- package/dist/{chunk-ewqa58h9.js → chunk-9k93ah50.js} +4 -4
- package/dist/{chunk-ewqa58h9.js.map → chunk-9k93ah50.js.map} +1 -1
- package/dist/{chunk-zxawp1n2.js → chunk-9w055r5b.js} +1 -1
- package/dist/{chunk-4wn7bxxa.js → chunk-9ybhtmg4.js} +1 -1
- package/dist/{chunk-fc5zfxy1.js → chunk-a40ad1ft.js} +5 -13
- package/dist/chunk-a40ad1ft.js.map +10 -0
- package/dist/{chunk-y2aq6ag9.js → chunk-b38szspf.js} +5 -14
- package/dist/chunk-b38szspf.js.map +11 -0
- package/dist/{chunk-r2y23egw.js → chunk-bkpke1sg.js} +1 -10
- package/dist/chunk-bkpke1sg.js.map +10 -0
- package/dist/{chunk-htr6wjmv.js → chunk-bx9q3cwv.js} +22 -22
- package/dist/{chunk-htr6wjmv.js.map → chunk-bx9q3cwv.js.map} +1 -1
- package/dist/{chunk-vx2yp45y.js → chunk-c85m1hyj.js} +2 -2
- package/dist/{chunk-bs7sqkre.js → chunk-d09tj99x.js} +2 -2
- package/dist/{chunk-qkbx3tf6.js → chunk-d0bqz29d.js} +27 -47
- package/dist/chunk-d0bqz29d.js.map +23 -0
- package/dist/{chunk-zb77kjth.js → chunk-dk8tkk5f.js} +4 -4
- package/dist/{chunk-xt1zt7gv.js → chunk-es1gxsbf.js} +24 -15
- package/dist/chunk-es1gxsbf.js.map +13 -0
- package/dist/{chunk-vjcd8d27.js → chunk-fa02jy15.js} +1 -1
- package/dist/{chunk-za5yd58j.js → chunk-fkgc1wt8.js} +2 -2
- package/dist/{chunk-enpsx8k5.js → chunk-gsjm1wms.js} +16 -20
- package/dist/chunk-gsjm1wms.js.map +10 -0
- package/dist/{chunk-2jntasmh.js → chunk-hcbyfxbe.js} +25 -49
- package/dist/chunk-hcbyfxbe.js.map +12 -0
- package/dist/{chunk-p0dqwj3n.js → chunk-hjzdd750.js} +66 -47
- package/dist/{chunk-p0dqwj3n.js.map → chunk-hjzdd750.js.map} +4 -4
- package/dist/chunk-hkc3jct7.js.map +1 -1
- package/dist/{chunk-y05543x6.js → chunk-hvsb78a1.js} +4 -4
- package/dist/{chunk-y05543x6.js.map → chunk-hvsb78a1.js.map} +1 -1
- package/dist/{chunk-1b1f2d5f.js → chunk-k6q3n2sc.js} +9 -9
- package/dist/{chunk-1b1f2d5f.js.map → chunk-k6q3n2sc.js.map} +1 -1
- package/dist/{chunk-wr8qp979.js → chunk-m427qgq0.js} +9 -5
- package/dist/{chunk-wr8qp979.js.map → chunk-m427qgq0.js.map} +4 -3
- package/dist/{chunk-qq90g05n.js → chunk-n33z5bjw.js} +50 -240
- package/dist/{chunk-qq90g05n.js.map → chunk-n33z5bjw.js.map} +4 -4
- package/dist/{chunk-e1c18xjx.js → chunk-nq6gpjt7.js} +4 -45
- package/dist/{chunk-e1c18xjx.js.map → chunk-nq6gpjt7.js.map} +5 -5
- package/dist/{chunk-1hqwggsn.js → chunk-nzapm6p0.js} +1 -2
- package/dist/chunk-nzapm6p0.js.map +12 -0
- package/dist/{chunk-wt4szfec.js → chunk-pbcbn83d.js} +4 -4
- package/dist/{chunk-wt4szfec.js.map → chunk-pbcbn83d.js.map} +1 -1
- package/dist/{chunk-s4jhg8a3.js → chunk-ren4kg2j.js} +15 -15
- package/dist/{chunk-s4jhg8a3.js.map → chunk-ren4kg2j.js.map} +1 -1
- package/dist/{chunk-d0eb5yy6.js → chunk-rrzt8jdy.js} +5 -5
- package/dist/{chunk-d0eb5yy6.js.map → chunk-rrzt8jdy.js.map} +1 -1
- package/dist/{chunk-y9jmd7e5.js → chunk-s16apyk9.js} +102 -16
- package/dist/chunk-s16apyk9.js.map +16 -0
- package/dist/{chunk-6gmfggss.js → chunk-t7x8dmn0.js} +2 -2
- package/dist/{chunk-f1zxad2t.js → chunk-tg2cw67r.js} +6 -6
- package/dist/{chunk-f1zxad2t.js.map → chunk-tg2cw67r.js.map} +1 -1
- package/dist/{chunk-p844e0rn.js → chunk-tpn40322.js} +2 -2
- package/dist/{chunk-rt9p8m9t.js → chunk-v9xd5wzd.js} +1 -1
- package/dist/{chunk-6h5m9xjx.js → chunk-vpq4shxz.js} +49 -113
- package/dist/chunk-vpq4shxz.js.map +39 -0
- package/dist/{chunk-2vhg6ysa.js → chunk-vyf9kfqf.js} +1 -1
- package/dist/{chunk-bwjcehza.js → chunk-way52z4h.js} +1 -1
- package/dist/{chunk-qkvz64nd.js → chunk-x6m907x7.js} +3 -3
- package/dist/{chunk-yv9czyfr.js → chunk-xfs8x8m9.js} +5 -5
- package/dist/chunk-y0c4e6ex.js +16 -0
- package/dist/chunk-y0c4e6ex.js.map +10 -0
- package/dist/{chunk-v6xpd60t.js → chunk-yevzdx4y.js} +5 -5
- package/dist/{chunk-dfm066qg.js → chunk-yxd3nnqt.js} +2 -29
- package/dist/chunk-yxd3nnqt.js.map +11 -0
- package/dist/{chunk-70jmg2zx.js → chunk-yzwja0mj.js} +4 -19
- package/dist/{chunk-70jmg2zx.js.map → chunk-yzwja0mj.js.map} +3 -3
- package/dist/{chunk-qmnnhde6.js → chunk-z4m0yz8c.js} +1 -1
- package/dist/datasets/write.js +5 -5
- package/dist/deploy/index.d.ts +1 -1
- package/dist/deploy/index.d.ts.map +1 -1
- package/dist/deploy/internal.js +13 -10
- package/dist/deploy/internal.js.map +4 -4
- package/dist/deploy/services.d.ts +1 -2
- package/dist/deploy/services.d.ts.map +1 -1
- package/dist/deploy/types.d.ts +7 -7
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/deploy/validation.d.ts.map +1 -1
- package/dist/edits/index.js +3 -5
- package/dist/edits/index.js.map +1 -1
- package/dist/error-reporting/internal.js +3 -3
- package/dist/error-reporting/types.d.ts +2 -9
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +12 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/internal.js +1 -1
- package/dist/events/definitions.d.ts +0 -5
- package/dist/events/definitions.d.ts.map +1 -1
- package/dist/events/index.d.ts +3 -3
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +6 -8
- package/dist/events/index.js.map +1 -1
- package/dist/events/scope.d.ts +0 -1
- package/dist/events/scope.d.ts.map +1 -1
- package/dist/events/scope.js +1 -1
- package/dist/events/selectors/builder.d.ts +1 -8
- package/dist/events/selectors/builder.d.ts.map +1 -1
- package/dist/events/selectors/index.d.ts +2 -2
- package/dist/events/selectors/index.d.ts.map +1 -1
- package/dist/events/selectors/index.js +2 -2
- package/dist/events/selectors/predicate.d.ts.map +1 -1
- package/dist/events/selectors/types.d.ts +2 -33
- package/dist/events/selectors/types.d.ts.map +1 -1
- package/dist/events/types/index.d.ts +1 -12
- package/dist/events/types/index.d.ts.map +1 -1
- package/dist/execution/agent.js +41 -44
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/primitive.js +60 -91
- package/dist/execution/primitive.js.map +3 -4
- package/dist/execution/request.js +40 -43
- package/dist/execution/request.js.map +2 -2
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +105 -127
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/index.js +5 -5
- package/dist/materialization/index.js +3 -3
- package/dist/materialization/index.js.map +1 -1
- package/dist/materialization/model.d.ts +19 -6
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/index.js +31 -31
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/models/execution/index.js +21 -21
- package/dist/objects/action/errors.d.ts +0 -9
- package/dist/objects/action/errors.d.ts.map +1 -1
- package/dist/objects/action/index.d.ts +3 -3
- package/dist/objects/action/index.d.ts.map +1 -1
- package/dist/objects/action/request.d.ts +2 -8
- package/dist/objects/action/request.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +0 -2
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +44 -29
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/query/index.js +29 -29
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/service/index.d.ts +0 -1
- package/dist/objects/service/index.d.ts.map +1 -1
- package/dist/objects/vectors/handle.d.ts.map +1 -1
- package/dist/objects/vectors/profile.d.ts +5 -0
- package/dist/objects/vectors/profile.d.ts.map +1 -1
- package/dist/ontology/index.js +6 -6
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/internal.js +2 -2
- package/dist/pipelines/index.js +28 -28
- package/dist/projections/internal.js +22 -22
- package/dist/projections/internal.js.map +1 -1
- package/dist/query.js +2 -2
- package/dist/queues/in-memory.d.ts +1 -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 +0 -7
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.js +27 -28
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +16 -36
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/index.js +5 -5
- package/dist/schedules/builders.d.ts.map +1 -1
- package/dist/schedules/index.js +3 -3
- package/dist/schedules/runtime.d.ts.map +1 -1
- package/dist/schedules/validation.d.ts +0 -1
- package/dist/schedules/validation.d.ts.map +1 -1
- package/dist/security/builders.d.ts.map +1 -1
- package/dist/security/every.d.ts +2 -5
- package/dist/security/every.d.ts.map +1 -1
- package/dist/security/grants.d.ts +2 -4
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +1 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/membership-policies.d.ts.map +1 -1
- package/dist/security/public.d.ts +10 -0
- package/dist/security/public.d.ts.map +1 -0
- package/dist/security/public.js +10 -0
- package/dist/security/public.js.map +9 -0
- package/dist/security/registry.d.ts +0 -1
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +13 -18
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +0 -6
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/internal.js +20 -20
- package/dist/storage/action-runs/failure.js +2 -2
- package/dist/storage/action-runs/idempotency.d.ts +3 -4
- package/dist/storage/action-runs/idempotency.d.ts.map +1 -1
- package/dist/storage/action-runs/in-memory.d.ts +2 -9
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/index.d.ts +1 -3
- package/dist/storage/action-runs/index.d.ts.map +1 -1
- package/dist/storage/action-runs/provider.js +1 -1
- package/dist/storage/action-runs/record.d.ts +20 -0
- package/dist/storage/action-runs/record.d.ts.map +1 -0
- package/dist/storage/action-runs/types.d.ts +39 -68
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/agents/types.d.ts +1 -1
- package/dist/storage/ai-limits/enforcement.js +2 -2
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/magic-links.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/oidc-attempts.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/sessions.d.ts +0 -10
- package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/shared.d.ts +1 -2
- package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
- package/dist/storage/auth/types.d.ts +1 -17
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +1 -1
- package/dist/storage/file-upload-sessions/provider.js +10 -10
- package/dist/storage/index.d.ts +2 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +21 -22
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +1 -1
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +9 -12
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/objects/execution-limits.d.ts +1 -1
- package/dist/storage/objects/execution-limits.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +2 -2
- 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-runs/provider.js +10 -10
- package/dist/syncs/index.js +29 -29
- package/dist/testing/action-execution.d.ts +34 -4
- package/dist/testing/action-execution.d.ts.map +1 -1
- package/dist/testing/action-run-storage-contract.d.ts +11 -0
- package/dist/testing/action-run-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3205 -2946
- package/dist/testing/index.js.map +9 -8
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/webhooks/internal.js +26 -26
- package/dist/webhooks/internal.js.map +1 -1
- package/dist/workers/index.js +1 -1
- package/dist/workflows/index.js +48 -51
- package/dist/workflows/index.js.map +1 -1
- package/package.json +8 -8
- package/src/actions/commit-edits.ts +9 -37
- package/src/actions/errors.ts +0 -4
- package/src/actions/execution.ts +10 -10
- package/src/actions/index.ts +5 -24
- package/src/actions/request.ts +157 -295
- package/src/actions/run/context.ts +193 -0
- package/src/actions/run/edits-commit.ts +102 -0
- package/src/actions/run/effects.ts +105 -0
- package/src/actions/run/execute.ts +113 -0
- package/src/actions/run/executor.ts +314 -0
- package/src/actions/run/normalize.ts +142 -0
- package/src/actions/run/phase-types.ts +20 -0
- package/src/actions/run/phases.ts +150 -0
- package/src/actions/run/run-action.ts +170 -0
- package/src/actions/run/signals.ts +118 -0
- package/src/actions/run/state.ts +95 -0
- package/src/actions/run/types.ts +61 -0
- package/src/actions/run/writeback.ts +79 -0
- package/src/actions/run-authorization.ts +1 -1
- package/src/actions/run-persistence.ts +105 -0
- package/src/actions/types/context.ts +10 -0
- package/src/auth/cookies.ts +3 -20
- package/src/auth/index.ts +0 -6
- package/src/auth/runtime.ts +59 -76
- package/src/auth/session-cache.ts +2 -9
- package/src/auth/types.ts +4 -8
- package/src/auth/validation.ts +0 -2
- package/src/authorization/decision.ts +8 -23
- package/src/authorization/event-visibility.ts +0 -12
- package/src/authorization/grant-kinds.ts +20 -27
- package/src/authorization/index.ts +0 -1
- package/src/authorization/resolve.ts +10 -6
- package/src/deploy/index.ts +0 -1
- package/src/deploy/services.ts +2 -12
- package/src/deploy/types.ts +7 -8
- package/src/deploy/validation.ts +15 -7
- package/src/error-reporting/types.ts +2 -10
- package/src/errors/catalog.ts +13 -0
- package/src/events/definitions.ts +0 -17
- package/src/events/index.ts +0 -14
- package/src/events/scope.ts +0 -12
- package/src/events/selectors/builder.ts +0 -51
- package/src/events/selectors/index.ts +0 -6
- package/src/events/selectors/predicate.ts +0 -2
- package/src/events/selectors/types.ts +7 -65
- package/src/events/types/index.ts +0 -11
- package/src/execution/authorization.ts +11 -5
- package/src/index.ts +2 -33
- package/src/materialization/model.ts +26 -9
- package/src/materializer/README.md +6 -1
- package/src/materializer/edits/commit.ts +42 -32
- package/src/materializer/shared/normalize.ts +25 -14
- package/src/models/execution/embedding.ts +6 -6
- package/src/objects/action/errors.ts +0 -12
- package/src/objects/action/index.ts +3 -3
- package/src/objects/action/request.ts +2 -29
- package/src/objects/execution.ts +2 -2
- package/src/objects/sdk/object-handle.ts +3 -29
- package/src/objects/sdk/object-set.ts +5 -30
- package/src/objects/service/index.ts +0 -1
- package/src/objects/vectors/README.md +4 -0
- package/src/objects/vectors/handle.ts +11 -2
- package/src/objects/vectors/indexing-generate.ts +2 -2
- package/src/objects/vectors/profile.ts +5 -0
- package/src/queues/in-memory.ts +0 -6
- package/src/queues/index.ts +0 -2
- package/src/queues/types.ts +0 -11
- package/src/runtime/host.ts +5 -0
- package/src/runtime/resolve-definitions.ts +0 -1
- package/src/runtime/types.ts +16 -45
- package/src/schedules/builders.ts +1 -4
- package/src/schedules/runtime.ts +0 -41
- package/src/schedules/validation.ts +2 -16
- package/src/security/builders.ts +7 -2
- package/src/security/every.ts +1 -5
- package/src/security/grants.ts +5 -25
- package/src/security/index.ts +0 -3
- package/src/security/membership-policies.ts +3 -1
- package/src/security/public.ts +10 -0
- package/src/security/registry.ts +0 -8
- package/src/security/types.ts +19 -25
- package/src/security/validation.ts +19 -17
- package/src/storage/action-runs/idempotency.ts +13 -41
- package/src/storage/action-runs/in-memory.ts +20 -311
- package/src/storage/action-runs/index.ts +1 -16
- package/src/storage/action-runs/record.ts +130 -0
- package/src/storage/action-runs/types.ts +37 -92
- package/src/storage/agents/types.ts +1 -1
- package/src/storage/auth/in-memory/auth-storage.ts +0 -18
- package/src/storage/auth/in-memory/magic-links.ts +0 -3
- package/src/storage/auth/in-memory/oidc-attempts.ts +0 -3
- package/src/storage/auth/in-memory/sessions.ts +1 -25
- package/src/storage/auth/in-memory/shared.ts +1 -10
- package/src/storage/auth/types.ts +2 -18
- package/src/storage/index.ts +1 -9
- package/src/storage/internal.ts +1 -7
- package/src/storage/objects/execution-limits.ts +3 -2
- package/src/storage/types.ts +2 -4
- package/src/testing/action-execution.ts +73 -13
- package/src/testing/action-run-storage-contract.ts +335 -0
- package/src/testing/auth-storage-contract.ts +14 -107
- package/src/testing/execution-storage-contract.ts +0 -2
- package/src/testing/index.ts +8 -1
- package/src/testing/materializer-storage-contract.ts +174 -18
- package/src/testing/queues-contract.ts +0 -18
- package/dist/actions/run-dispatch.d.ts +0 -25
- package/dist/actions/run-dispatch.d.ts.map +0 -1
- package/dist/actions/worker.d.ts +0 -3
- package/dist/actions/worker.d.ts.map +0 -1
- package/dist/actions/worker.js +0 -325
- package/dist/actions/worker.js.map +0 -11
- package/dist/auth/audience.d.ts +0 -8
- package/dist/auth/audience.d.ts.map +0 -1
- package/dist/authorization/application-access.d.ts +0 -18
- package/dist/authorization/application-access.d.ts.map +0 -1
- package/dist/chunk-1hqwggsn.js.map +0 -12
- package/dist/chunk-2jntasmh.js.map +0 -13
- package/dist/chunk-6h5m9xjx.js.map +0 -40
- package/dist/chunk-85cd7e8c.js +0 -51
- package/dist/chunk-85cd7e8c.js.map +0 -10
- package/dist/chunk-de4z2bj6.js.map +0 -18
- package/dist/chunk-dfm066qg.js.map +0 -11
- package/dist/chunk-enpsx8k5.js.map +0 -10
- package/dist/chunk-fc5zfxy1.js.map +0 -11
- package/dist/chunk-fe52eczz.js.map +0 -49
- package/dist/chunk-fx93hd2n.js +0 -1614
- package/dist/chunk-fx93hd2n.js.map +0 -20
- package/dist/chunk-k6hrnf35.js.map +0 -10
- package/dist/chunk-qkbx3tf6.js.map +0 -24
- package/dist/chunk-qxvp5epv.js +0 -1329
- package/dist/chunk-qxvp5epv.js.map +0 -36
- package/dist/chunk-r2y23egw.js.map +0 -10
- package/dist/chunk-tffvfy6s.js +0 -593
- package/dist/chunk-tffvfy6s.js.map +0 -15
- package/dist/chunk-xt1zt7gv.js.map +0 -13
- package/dist/chunk-y2aq6ag9.js.map +0 -11
- package/dist/chunk-y9jmd7e5.js.map +0 -15
- package/dist/chunk-zvx7h87b.js +0 -12
- package/dist/chunk-zvx7h87b.js.map +0 -10
- package/dist/events/types/actions.d.ts +0 -39
- package/dist/events/types/actions.d.ts.map +0 -1
- package/dist/objects/service/action-service.d.ts +0 -13
- package/dist/objects/service/action-service.d.ts.map +0 -1
- package/dist/security/applications.d.ts +0 -15
- package/dist/security/applications.d.ts.map +0 -1
- package/src/actions/run-dispatch.ts +0 -282
- package/src/actions/worker.ts +0 -2
- package/src/auth/audience.ts +0 -28
- package/src/authorization/application-access.ts +0 -34
- package/src/events/types/actions.ts +0 -42
- package/src/objects/service/action-service.ts +0 -43
- package/src/security/applications.ts +0 -11
- /package/dist/{chunk-rz53yb4v.js.map → chunk-0yh890a4.js.map} +0 -0
- /package/dist/{chunk-vgk3hknm.js.map → chunk-1k89ecfr.js.map} +0 -0
- /package/dist/{chunk-ny3xyvcn.js.map → chunk-1zq2p6g0.js.map} +0 -0
- /package/dist/{chunk-dnmadg9k.js.map → chunk-3t2hgbgd.js.map} +0 -0
- /package/dist/{chunk-22v5bpz3.js.map → chunk-5e43w60z.js.map} +0 -0
- /package/dist/{chunk-7hpdd6r9.js.map → chunk-6p49a5cq.js.map} +0 -0
- /package/dist/{chunk-kkqwzy6h.js.map → chunk-7t429e3f.js.map} +0 -0
- /package/dist/{chunk-ex496vct.js.map → chunk-9dmt152s.js.map} +0 -0
- /package/dist/{chunk-48e3cn2d.js.map → chunk-9gyp8hg1.js.map} +0 -0
- /package/dist/{chunk-zxawp1n2.js.map → chunk-9w055r5b.js.map} +0 -0
- /package/dist/{chunk-4wn7bxxa.js.map → chunk-9ybhtmg4.js.map} +0 -0
- /package/dist/{chunk-vx2yp45y.js.map → chunk-c85m1hyj.js.map} +0 -0
- /package/dist/{chunk-bs7sqkre.js.map → chunk-d09tj99x.js.map} +0 -0
- /package/dist/{chunk-zb77kjth.js.map → chunk-dk8tkk5f.js.map} +0 -0
- /package/dist/{chunk-vjcd8d27.js.map → chunk-fa02jy15.js.map} +0 -0
- /package/dist/{chunk-za5yd58j.js.map → chunk-fkgc1wt8.js.map} +0 -0
- /package/dist/{chunk-6gmfggss.js.map → chunk-t7x8dmn0.js.map} +0 -0
- /package/dist/{chunk-p844e0rn.js.map → chunk-tpn40322.js.map} +0 -0
- /package/dist/{chunk-rt9p8m9t.js.map → chunk-v9xd5wzd.js.map} +0 -0
- /package/dist/{chunk-2vhg6ysa.js.map → chunk-vyf9kfqf.js.map} +0 -0
- /package/dist/{chunk-bwjcehza.js.map → chunk-way52z4h.js.map} +0 -0
- /package/dist/{chunk-qkvz64nd.js.map → chunk-x6m907x7.js.map} +0 -0
- /package/dist/{chunk-yv9czyfr.js.map → chunk-xfs8x8m9.js.map} +0 -0
- /package/dist/{chunk-v6xpd60t.js.map → chunk-yevzdx4y.js.map} +0 -0
- /package/dist/{chunk-qmnnhde6.js.map → chunk-z4m0yz8c.js.map} +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/security/errors.ts", "../src/security/membership-policies.ts", "../src/security/validation.ts", "../src/security/builders.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export class SecurityValidationError extends Error {\n readonly name = \"SecurityValidationError\"\n}\n",
|
|
6
|
+
"import type { MembershipOperation, MembershipPolicyDefinition } from \"./types\"\n\nexport interface MembershipOperationScope {\n readonly policyIds: readonly string[]\n readonly groupIds: ReadonlySet<string>\n}\n\nexport interface MembershipPolicyScope {\n readonly policyIds: readonly string[]\n readonly operations: Readonly<Record<MembershipOperation, MembershipOperationScope>>\n}\n\nconst MEMBERSHIP_OPERATIONS = [\"invite\", \"assignGroups\", \"suspend\", \"serviceAccounts\"] as const\n\nexport function resolveMembershipPolicyScope(input: {\n readonly membershipPolicies: readonly MembershipPolicyDefinition[]\n readonly callerGroupIds: readonly string[]\n}): MembershipPolicyScope {\n const callerGroups = new Set(input.callerGroupIds)\n const policyIds: string[] = []\n const operations = createEmptyOperationScopes()\n\n for (const policy of input.membershipPolicies) {\n if (!policy.grantedToGroupIds.some((groupId) => callerGroups.has(groupId))) {\n continue\n }\n\n policyIds.push(policy.id)\n for (const operation of policy.can) {\n operations[operation].policyIds.push(policy.id)\n for (const groupId of policy.scopeGroupIds) {\n operations[operation].groupIds.add(groupId)\n }\n }\n }\n\n return {\n policyIds,\n operations: {\n invite: freezeOperationScope(operations.invite),\n assignGroups: freezeOperationScope(operations.assignGroups),\n suspend: freezeOperationScope(operations.suspend),\n serviceAccounts: freezeOperationScope(operations.serviceAccounts),\n },\n }\n}\n\nexport function canPerformMembershipOperation(\n scope: MembershipPolicyScope,\n operation: MembershipOperation,\n groupIds: readonly string[]\n): boolean {\n const operationScope = scope.operations[operation]\n\n if (operationScope.policyIds.length === 0) {\n return false\n }\n\n if (groupIds.length === 0) {\n return true\n }\n\n return groupIds.every((groupId) => operationScope.groupIds.has(groupId))\n}\n\nexport function missingMembershipGroupIds(\n scope: MembershipPolicyScope,\n operation: MembershipOperation,\n groupIds: readonly string[]\n): readonly string[] {\n if (groupIds.length === 0) {\n return []\n }\n\n const operationScope = scope.operations[operation]\n return groupIds.filter((groupId) => !operationScope.groupIds.has(groupId))\n}\n\nfunction createEmptyOperationScopes(): Record<\n MembershipOperation,\n { policyIds: string[]; groupIds: Set<string> }\n> {\n return {\n invite: { policyIds: [], groupIds: new Set<string>() },\n assignGroups: { policyIds: [], groupIds: new Set<string>() },\n suspend: { policyIds: [], groupIds: new Set<string>() },\n serviceAccounts: { policyIds: [], groupIds: new Set<string>() },\n }\n}\n\nfunction freezeOperationScope(input: {\n readonly policyIds: readonly string[]\n readonly groupIds: ReadonlySet<string>\n}): MembershipOperationScope {\n return {\n policyIds: [...input.policyIds],\n groupIds: new Set(input.groupIds),\n }\n}\n\nexport function isMembershipOperation(value: unknown): value is MembershipOperation {\n return MEMBERSHIP_OPERATIONS.includes(value as MembershipOperation)\n}\n",
|
|
7
|
+
"import {\n GRANT_KINDS,\n type GrantUniverseKey,\n grantKindOf,\n isSingletonGrantKind,\n} from \"../authorization/grant-kinds\"\nimport { SecurityValidationError } from \"./errors\"\nimport { isMembershipOperation } from \"./membership-policies\"\nimport type {\n GrantCapability,\n GrantDefinition,\n GroupDefinition,\n MarkingDefinition,\n MembershipPolicyDefinition,\n RegisteredSecurityDefinitions,\n RoleDefinition,\n Selection,\n} from \"./types\"\n\n/** Registered id universes and singleton capabilities available to role grants. */\ntype RegisteredUniverses = Partial<Record<GrantUniverseKey, ReadonlySet<string>>> & {\n readonly agentAvailable?: boolean\n}\n\n/**\n * Every grant capability, for validating grants that arrive from untyped code.\n *\n * Written as a total `Record<GrantCapability, true>` rather than a bare array so a capability added\n * to `GrantDefinition` is a compile error here — the same discipline `GRANT_KINDS` uses. The\n * hand-written `capability !== \"view\" && …` chain this replaces would have accepted the new\n * capability at startup and then died on `GRANT_KINDS[kind].universeKey`.\n */\nconst GRANT_CAPABILITIES = Object.keys({\n view: true,\n edit: true,\n append: true,\n apply: true,\n share: true,\n run: true,\n observe: true,\n manage: true,\n} satisfies Record<GrantCapability, true>) as readonly GrantCapability[]\n\n/** \"'a', 'b', or 'c'\" — the shape the security errors already use. */\nfunction formatAlternatives(values: readonly string[]): string {\n const quoted = values.map((value) => `'${value}'`)\n const last = quoted.at(-1)\n return quoted.length < 2 ? (last ?? \"\") : `${quoted.slice(0, -1).join(\", \")}, or ${last}`\n}\n\nexport type CreateSecurityError = (message: string) => Error\n\n// Shared, single-source validation primitives. The builders reuse these too, so\n// authoring-time and startup-time checks can never drift apart.\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function assertNonEmptyString(\n value: unknown,\n field: string,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw createError(`[Sixb] ${field} must not be empty.`)\n }\n}\n\nexport function assertOptionalString(\n value: unknown,\n field: string,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is string | undefined {\n if (value === undefined) {\n return\n }\n\n if (typeof value !== \"string\") {\n throw createError(`[Sixb] ${field} must be a string.`)\n }\n}\n\nfunction assertStringArray(\n value: unknown,\n field: string,\n createError: CreateSecurityError\n): asserts value is readonly string[] {\n if (!Array.isArray(value)) {\n throw createError(`[Sixb] ${field} must be an array of group ids.`)\n }\n\n for (const item of value) {\n assertNonEmptyString(item, `${field} item`, createError)\n }\n}\n\nfunction assertMembershipOperationArray(\n value: unknown,\n field: string,\n createError: CreateSecurityError\n): asserts value is MembershipPolicyDefinition[\"can\"] {\n if (!Array.isArray(value)) {\n throw createError(`[Sixb] ${field} must be an array of membership operations.`)\n }\n\n for (const item of value) {\n if (!isMembershipOperation(item)) {\n throw createError(\n `[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend, serviceAccounts.`\n )\n }\n }\n}\n\nfunction assertNoDuplicateIds(ids: readonly string[], field: string): void {\n const seen = new Set<string>()\n for (const id of ids) {\n if (seen.has(id)) {\n throw new SecurityValidationError(`[Sixb] ${field} contains duplicate group id '${id}'.`)\n }\n seen.add(id)\n }\n}\n\nfunction assertNoDuplicateOperations(\n operations: readonly MembershipPolicyDefinition[\"can\"][number][],\n field: string\n): void {\n const seen = new Set<string>()\n for (const operation of operations) {\n if (seen.has(operation)) {\n throw new SecurityValidationError(\n `[Sixb] ${field} contains duplicate operation '${operation}'.`\n )\n }\n seen.add(operation)\n }\n}\n\nexport function assertMarkingDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is MarkingDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Marking definition must be an object.\")\n }\n\n if (value.kind !== \"marking\") {\n throw createError(\"[Sixb] Marking definition kind must be 'marking'.\")\n }\n\n assertNonEmptyString(value.id, \"Marking id\", createError)\n assertOptionalString(value.label, `Marking '${value.id}' label`, createError)\n assertOptionalString(value.description, `Marking '${value.id}' description`, createError)\n}\n\nexport function isMarkingDefinition(value: unknown): value is MarkingDefinition {\n try {\n assertMarkingDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function assertGroupDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is GroupDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Group definition must be an object.\")\n }\n\n if (value.kind !== \"group\") {\n throw createError(\"[Sixb] Group definition kind must be 'group'.\")\n }\n\n assertNonEmptyString(value.id, \"Group id\", createError)\n assertOptionalString(value.label, `Group '${value.id}' label`, createError)\n assertOptionalString(value.description, `Group '${value.id}' description`, createError)\n}\n\nexport function isGroupDefinition(value: unknown): value is GroupDefinition {\n try {\n assertGroupDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function assertMembershipPolicyDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is MembershipPolicyDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Membership policy definition must be an object.\")\n }\n\n if (value.kind !== \"membershipPolicy\") {\n throw createError(\"[Sixb] Membership policy definition kind must be 'membershipPolicy'.\")\n }\n\n assertNonEmptyString(value.id, \"Membership policy id\", createError)\n assertStringArray(\n value.grantedToGroupIds,\n `Membership policy '${value.id}' grantedTo`,\n createError\n )\n assertStringArray(value.scopeGroupIds, `Membership policy '${value.id}' scope`, createError)\n assertMembershipOperationArray(value.can, `Membership policy '${value.id}' can`, createError)\n}\n\nexport function isMembershipPolicyDefinition(value: unknown): value is MembershipPolicyDefinition {\n try {\n assertMembershipPolicyDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function assertGrantDefinition(\n value: unknown,\n field: string,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is GrantDefinition {\n if (!isRecord(value) || value.kind !== \"grant\") {\n throw createError(`[Sixb] ${field} must contain only grant definitions from 'can'.`)\n }\n\n if (!GRANT_CAPABILITIES.includes(value.capability as GrantCapability)) {\n throw createError(\n `[Sixb] ${field} grant capability must be ${formatAlternatives(GRANT_CAPABILITIES)}.`\n )\n }\n\n if (value.capability === \"view\" && value.target !== \"object\" && value.target !== \"dataset\") {\n throw createError(`[Sixb] ${field} view grant target must be 'object' or 'dataset'.`)\n }\n\n if (\n value.capability === \"run\" &&\n value.target !== \"workflow\" &&\n value.target !== \"sync\" &&\n value.target !== \"pipeline\" &&\n value.target !== \"agent\"\n ) {\n throw createError(\n `[Sixb] ${field} run grant target must be 'workflow', 'sync', 'pipeline', or 'agent'.`\n )\n }\n\n if (value.capability === \"observe\" && value.target !== \"logs\" && value.target !== \"aiUsage\") {\n throw createError(`[Sixb] ${field} observe grant target must be 'logs' or 'aiUsage'.`)\n }\n\n if (value.capability === \"manage\" && value.target !== \"connector\" && value.target !== \"aiUsage\") {\n throw createError(`[Sixb] ${field} manage grant target must be 'connector' or 'aiUsage'.`)\n }\n\n // The agent, logs and AI usage are one surface each, so their grants select nothing. The checks\n // above settled the capability and target, so the kind is known.\n if (isSingletonGrantKind(grantKindOf(value as unknown as GrantDefinition))) {\n if (value.selection !== undefined) {\n throw createError(\n `[Sixb] ${field} ${value.capability} grant on '${value.target}' must not declare a selection.`\n )\n }\n return\n }\n\n assertSelection(value.selection, field, createError)\n}\n\nfunction assertSelection(\n value: unknown,\n field: string,\n createError: CreateSecurityError\n): asserts value is Selection {\n if (!isRecord(value) || typeof value.all !== \"boolean\") {\n throw createError(`[Sixb] ${field} grant must carry a selection from 'can' or a scope.`)\n }\n\n const ids = value.all ? value.except : value.ids\n if (!Array.isArray(ids)) {\n throw createError(`[Sixb] ${field} grant selection must list ids.`)\n }\n\n for (const id of ids) {\n assertNonEmptyString(id, `${field} grant selection id`, createError)\n }\n}\n\nexport function assertRoleDefinition(\n value: unknown,\n createError: CreateSecurityError = (message) => new SecurityValidationError(message)\n): asserts value is RoleDefinition {\n if (!isRecord(value)) {\n throw createError(\"[Sixb] Role definition must be an object.\")\n }\n\n if (value.kind !== \"role\") {\n throw createError(\"[Sixb] Role definition kind must be 'role'.\")\n }\n\n assertNonEmptyString(value.id, \"Role id\", createError)\n assertOptionalString(value.label, `Role '${value.id}' label`, createError)\n assertOptionalString(value.description, `Role '${value.id}' description`, createError)\n assertStringArray(value.grantedToGroupIds, `Role '${value.id}' grantedTo`, createError)\n\n if (!Array.isArray(value.grants)) {\n throw createError(`[Sixb] Role '${value.id}' grants must be an array.`)\n }\n\n for (const grant of value.grants) {\n assertGrantDefinition(grant, `Role '${value.id}' grants`, createError)\n }\n\n if (value.clearances !== undefined) {\n assertStringArray(value.clearances, `Role '${value.id}' clearances`, createError)\n }\n}\n\nexport function isRoleDefinition(value: unknown): value is RoleDefinition {\n try {\n assertRoleDefinition(value, (message) => new Error(message))\n return true\n } catch {\n return false\n }\n}\n\nexport function validateSecurityDefinitionsAtStartup(input: {\n readonly markings?: readonly MarkingDefinition[]\n readonly groups: readonly GroupDefinition[]\n readonly membershipPolicies: readonly MembershipPolicyDefinition[]\n readonly roles?: readonly RoleDefinition[]\n /** Registered object type ids — when provided, view grants must reference them. */\n readonly objectTypeIds?: ReadonlySet<string>\n /** Registered dataset ids — when provided, dataset view grants must reference them. */\n readonly datasetIds?: ReadonlySet<string>\n /** Registered action ids — when provided, apply grants must reference them. */\n readonly actionIds?: ReadonlySet<string>\n /** Registered workflow ids — when provided, run grants must reference them. */\n readonly workflowIds?: ReadonlySet<string>\n /** Registered sync ids — when provided, sync run grants must reference them. */\n readonly syncIds?: ReadonlySet<string>\n /** Registered pipeline ids — when provided, pipeline run grants must reference them. */\n readonly pipelineIds?: ReadonlySet<string>\n /** Whether the project's single conversational Agent is configured. */\n readonly agentAvailable?: boolean\n /** Registered connector ids — when provided, manage grants must reference them. */\n readonly connectorIds?: ReadonlySet<string>\n /** Registered Share ids — when provided, share grants must reference them. */\n readonly shareIds?: ReadonlySet<string>\n}): RegisteredSecurityDefinitions {\n const markingsById = new Map<string, MarkingDefinition>()\n const groupsById = new Map<string, GroupDefinition>()\n const rolesById = new Map<string, RoleDefinition>()\n const membershipPoliciesById = new Map<string, MembershipPolicyDefinition>()\n\n for (const marking of input.markings ?? []) {\n assertMarkingDefinition(marking)\n\n if (markingsById.has(marking.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate marking id: ${marking.id}`)\n }\n\n markingsById.set(marking.id, marking)\n }\n\n for (const group of input.groups) {\n assertGroupDefinition(group)\n\n if (groupsById.has(group.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate group id: ${group.id}`)\n }\n\n groupsById.set(group.id, group)\n }\n\n for (const role of input.roles ?? []) {\n assertRoleDefinition(role)\n\n if (rolesById.has(role.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate role id: ${role.id}`)\n }\n\n if (role.grantedToGroupIds.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' must be granted to at least one group.`\n )\n }\n\n const clearances = role.clearances ?? []\n if (role.grants.length === 0 && clearances.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' must declare at least one grant or clearance.`\n )\n }\n\n assertNoDuplicateIds(role.grantedToGroupIds, `Role '${role.id}' grantedTo`)\n assertNoDuplicateIds(clearances, `Role '${role.id}' clearances`)\n\n for (const markingId of clearances) {\n if (!markingsById.has(markingId)) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' clearances reference unknown marking '${markingId}'. Add it to 'security/markings/' or pass it to createSixb({ markings }).`\n )\n }\n }\n\n for (const groupId of role.grantedToGroupIds) {\n if (!groupsById.has(groupId)) {\n throw new SecurityValidationError(\n `[Sixb] Role '${role.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`\n )\n }\n }\n\n for (const grant of role.grants) {\n assertGrantReferences(role.id, grant, input)\n }\n\n rolesById.set(role.id, role)\n }\n\n for (const policy of input.membershipPolicies) {\n assertMembershipPolicyDefinition(policy)\n\n if (membershipPoliciesById.has(policy.id)) {\n throw new SecurityValidationError(`[Sixb] Duplicate membership policy id: ${policy.id}`)\n }\n\n if (policy.grantedToGroupIds.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' must grant membership authority to at least one group.`\n )\n }\n\n if (policy.can.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' must declare at least one operation.`\n )\n }\n\n assertNoDuplicateIds(policy.grantedToGroupIds, `Membership policy '${policy.id}' grantedTo`)\n assertNoDuplicateIds(policy.scopeGroupIds, `Membership policy '${policy.id}' scope`)\n assertNoDuplicateOperations(policy.can, `Membership policy '${policy.id}' can`)\n\n for (const groupId of policy.grantedToGroupIds) {\n if (!groupsById.has(groupId)) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' grantedTo references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`\n )\n }\n }\n\n for (const groupId of policy.scopeGroupIds) {\n if (!groupsById.has(groupId)) {\n throw new SecurityValidationError(\n `[Sixb] Membership policy '${policy.id}' scope references unknown group '${groupId}'. Add it to 'security/groups/' or pass it to createSixb({ groups }).`\n )\n }\n }\n\n membershipPoliciesById.set(policy.id, policy)\n }\n\n return {\n markings: [...markingsById.values()],\n markingsById,\n groups: [...groupsById.values()],\n groupsById,\n roles: [...rolesById.values()],\n rolesById,\n membershipPolicies: [...membershipPoliciesById.values()],\n membershipPoliciesById,\n }\n}\n\nfunction assertGrantReferences(\n roleId: string,\n grant: GrantDefinition,\n registered: RegisteredUniverses\n): void {\n if (grant.capability === \"run\" && grant.target === \"agent\") {\n const spec = GRANT_KINDS[grantKindOf(grant)]\n if (!registered.agentAvailable) {\n throw new SecurityValidationError(\n `[Sixb] Role '${roleId}' grants ${grant.capability} on the project Agent, but it is unavailable. ${spec.fix}`\n )\n }\n return\n }\n // Logs and AI usage are always there; only targeted grants name ids to check.\n if (!(\"selection\" in grant)) return\n const kind = grantKindOf(grant)\n if (isSingletonGrantKind(kind)) return\n const spec = GRANT_KINDS[kind]\n const universe = registered[spec.universeKey]\n\n if (!universe) {\n return\n }\n\n // Explicit selections list ids to include; \"all except\" selections list ids\n // to exclude. Either way every named id must be registered — an unknown id is\n // a typo that would silently widen or no-op the grant.\n const ids = grant.selection.all ? grant.selection.except : grant.selection.ids\n\n for (const id of ids) {\n if (!universe.has(id)) {\n throw new SecurityValidationError(\n `[Sixb] Role '${roleId}' grants ${grant.capability} on unknown ${spec.subject} '${id}'. ${spec.fix}`\n )\n }\n }\n}\n",
|
|
8
|
+
"import { SecurityValidationError } from \"./errors\"\nimport type {\n GrantDefinition,\n GroupDefinition,\n MarkingDefinition,\n MembershipOperation,\n MembershipPolicyDefinition,\n RoleDefinition,\n} from \"./types\"\nimport {\n assertGrantDefinition,\n assertNonEmptyString,\n assertOptionalString,\n isRecord,\n} from \"./validation\"\n\nexport interface DefineGroupOptions {\n readonly label?: string\n readonly description?: string\n}\n\nexport interface DefineMarkingOptions {\n readonly label?: string\n readonly description?: string\n}\n\nexport interface DefineRoleOptions {\n readonly label?: string\n readonly description?: string\n readonly grantedTo: readonly GroupDefinition[]\n readonly grants?: readonly GrantDefinition[]\n /** Markings this role's members may read. */\n readonly clearances?: readonly MarkingDefinition[]\n}\n\nexport interface DefineMembershipPolicyOptions {\n readonly grantedTo: readonly GroupDefinition[]\n readonly scope: readonly GroupDefinition[]\n readonly can: readonly MembershipOperation[]\n}\n\nconst MEMBERSHIP_OPERATIONS = new Set<MembershipOperation>([\n \"invite\",\n \"assignGroups\",\n \"suspend\",\n \"serviceAccounts\",\n])\n\nfunction assertNonEmptyArray<T>(value: readonly T[], field: string): void {\n if (value.length === 0) {\n throw new SecurityValidationError(`[Sixb] ${field} must not be empty.`)\n }\n}\n\nfunction groupIdsFrom(groups: readonly GroupDefinition[], field: string): readonly string[] {\n return groups.map((group) => {\n if (!isRecord(group) || group.kind !== \"group\") {\n throw new SecurityValidationError(`[Sixb] ${field} must contain only group definitions.`)\n }\n\n assertNonEmptyString(group.id, `${field} group id`)\n return group.id\n })\n}\n\nfunction membershipOperationsFrom(\n operations: readonly MembershipOperation[],\n field: string\n): readonly MembershipOperation[] {\n return operations.map((operation) => {\n if (!MEMBERSHIP_OPERATIONS.has(operation)) {\n throw new SecurityValidationError(\n `[Sixb] ${field} must contain only membership operations: invite, assignGroups, suspend, serviceAccounts.`\n )\n }\n\n return operation\n })\n}\n\nexport function defineGroup<const TId extends string>(\n id: TId,\n options: DefineGroupOptions = {}\n): GroupDefinition<TId> {\n assertNonEmptyString(id, \"Group id\")\n assertOptionalString(options.label, `Group '${id}' label`)\n assertOptionalString(options.description, `Group '${id}' description`)\n\n return {\n kind: \"group\",\n id,\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n }\n}\n\n/** Read the ids of marking definitions, rejecting anything else such as a bare id. */\nexport function markingIdsFrom(\n markings: readonly MarkingDefinition[],\n field: string\n): readonly string[] {\n return markings.map((marking) => {\n if (!isRecord(marking) || marking.kind !== \"marking\") {\n throw new SecurityValidationError(`[Sixb] ${field} must contain only marking definitions.`)\n }\n\n assertNonEmptyString(marking.id, `${field} marking id`)\n return marking.id\n })\n}\n\nexport function defineMarking<const TId extends string>(\n id: TId,\n options: DefineMarkingOptions = {}\n): MarkingDefinition<TId> {\n assertNonEmptyString(id, \"Marking id\")\n assertOptionalString(options.label, `Marking '${id}' label`)\n assertOptionalString(options.description, `Marking '${id}' description`)\n\n return {\n kind: \"marking\",\n id,\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n }\n}\n\nexport function defineRole<const TId extends string>(\n id: TId,\n options: DefineRoleOptions\n): RoleDefinition<TId> {\n assertNonEmptyString(id, \"Role id\")\n assertOptionalString(options.label, `Role '${id}' label`)\n assertOptionalString(options.description, `Role '${id}' description`)\n assertNonEmptyArray(options.grantedTo, `Role '${id}' grantedTo`)\n\n const grantedToGroupIds = groupIdsFrom(options.grantedTo, `Role '${id}' grantedTo`)\n const grants = options.grants ?? []\n const clearances = markingIdsFrom(options.clearances ?? [], `Role '${id}' clearances`)\n\n for (const grant of grants) {\n assertGrantDefinition(grant, `Role '${id}' grants`)\n }\n\n if (grants.length === 0 && clearances.length === 0) {\n throw new SecurityValidationError(\n `[Sixb] Role '${id}' must declare at least one grant or clearance.`\n )\n }\n\n return {\n kind: \"role\",\n id,\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.description !== undefined ? { description: options.description } : {}),\n grantedToGroupIds,\n grants,\n ...(clearances.length > 0 ? { clearances } : {}),\n }\n}\n\nexport function defineMembershipPolicy<const TId extends string>(\n id: TId,\n options: DefineMembershipPolicyOptions\n): MembershipPolicyDefinition<TId> {\n assertNonEmptyString(id, \"Membership policy id\")\n assertNonEmptyArray(options.grantedTo, `Membership policy '${id}' grantedTo`)\n assertNonEmptyArray(options.can, `Membership policy '${id}' can`)\n\n return {\n kind: \"membershipPolicy\",\n id,\n grantedToGroupIds: groupIdsFrom(options.grantedTo, `Membership policy '${id}' grantedTo`),\n scopeGroupIds: groupIdsFrom(options.scope, `Membership policy '${id}' scope`),\n can: membershipOperationsFrom(options.can, `Membership policy '${id}' can`),\n }\n}\n"
|
|
9
|
+
],
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "5079B2E8C73E746064756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
isPrimitiveSchema,
|
|
4
4
|
primitiveTraits
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-hvsb78a1.js";
|
|
6
6
|
import {
|
|
7
7
|
ShareDefinitionError2,
|
|
8
8
|
snapshotShareDefinition
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-vpq4shxz.js";
|
|
10
10
|
import {
|
|
11
11
|
snapshotShareAccessPlan
|
|
12
12
|
} from "./chunk-br3k6qbf.js";
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/authorization/grant-kinds.ts
|
|
3
3
|
var GRANT_KINDS = {
|
|
4
|
-
"access:application": {
|
|
5
|
-
universeKey: "applicationIds",
|
|
6
|
-
subject: "application",
|
|
7
|
-
fix: "Use an application exported from '@sixb/core'."
|
|
8
|
-
},
|
|
9
4
|
"view:object": {
|
|
10
5
|
universeKey: "objectTypeIds",
|
|
11
6
|
subject: "object type",
|
|
@@ -58,13 +53,13 @@ var GRANT_KINDS = {
|
|
|
58
53
|
fix: "Configure models.language and use the exported agent reference in can.run(agent)."
|
|
59
54
|
},
|
|
60
55
|
"observe:logs": {
|
|
61
|
-
|
|
62
|
-
subject: "
|
|
56
|
+
singleton: true,
|
|
57
|
+
subject: "logs",
|
|
63
58
|
fix: 'Use can.observe("logs").'
|
|
64
59
|
},
|
|
65
60
|
"observe:aiUsage": {
|
|
66
|
-
|
|
67
|
-
subject: "
|
|
61
|
+
singleton: true,
|
|
62
|
+
subject: "AI usage",
|
|
68
63
|
fix: "Use can.observe(agent.usage)."
|
|
69
64
|
},
|
|
70
65
|
"manage:connector": {
|
|
@@ -73,17 +68,19 @@ var GRANT_KINDS = {
|
|
|
73
68
|
fix: "Add it to 'connectors/' or pass it to createSixb({ connectors })."
|
|
74
69
|
},
|
|
75
70
|
"manage:aiUsage": {
|
|
76
|
-
|
|
77
|
-
subject: "
|
|
71
|
+
singleton: true,
|
|
72
|
+
subject: "AI usage",
|
|
78
73
|
fix: "Use can.manage(agent.usage)."
|
|
79
74
|
}
|
|
80
75
|
};
|
|
81
76
|
var GRANT_KIND_KEYS = Object.keys(GRANT_KINDS);
|
|
82
|
-
var
|
|
77
|
+
var SINGLETON_GRANT_KIND_KEYS = GRANT_KIND_KEYS.filter((kind) => ("singleton" in GRANT_KINDS[kind]));
|
|
78
|
+
var TARGETED_GRANT_KIND_KEYS = GRANT_KIND_KEYS.filter((kind) => !("singleton" in GRANT_KINDS[kind]));
|
|
79
|
+
function isSingletonGrantKind(kind) {
|
|
80
|
+
return "singleton" in GRANT_KINDS[kind];
|
|
81
|
+
}
|
|
83
82
|
function grantKindOf(grant) {
|
|
84
83
|
switch (grant.capability) {
|
|
85
|
-
case "access":
|
|
86
|
-
return "access:application";
|
|
87
84
|
case "view":
|
|
88
85
|
return `view:${grant.target}`;
|
|
89
86
|
case "edit":
|
|
@@ -104,7 +101,6 @@ function grantKindOf(grant) {
|
|
|
104
101
|
}
|
|
105
102
|
function emptyGrantSets() {
|
|
106
103
|
return {
|
|
107
|
-
"access:application": new Set,
|
|
108
104
|
"view:object": new Set,
|
|
109
105
|
"view:dataset": new Set,
|
|
110
106
|
"edit:object": new Set,
|
|
@@ -115,13 +111,13 @@ function emptyGrantSets() {
|
|
|
115
111
|
"run:sync": new Set,
|
|
116
112
|
"run:pipeline": new Set,
|
|
117
113
|
"run:agent": false,
|
|
118
|
-
"observe:logs":
|
|
119
|
-
"observe:aiUsage":
|
|
114
|
+
"observe:logs": false,
|
|
115
|
+
"observe:aiUsage": false,
|
|
120
116
|
"manage:connector": new Set,
|
|
121
|
-
"manage:aiUsage":
|
|
117
|
+
"manage:aiUsage": false
|
|
122
118
|
};
|
|
123
119
|
}
|
|
124
120
|
|
|
125
|
-
export { GRANT_KINDS, TARGETED_GRANT_KIND_KEYS, grantKindOf, emptyGrantSets };
|
|
121
|
+
export { GRANT_KINDS, SINGLETON_GRANT_KIND_KEYS, TARGETED_GRANT_KIND_KEYS, isSingletonGrantKind, grantKindOf, emptyGrantSets };
|
|
126
122
|
|
|
127
|
-
//# debugId=
|
|
123
|
+
//# debugId=1C6F3FFB2BACAB1F64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/authorization/grant-kinds.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Grant kinds: the single source of truth for the (capability, target) space.\n *\n * Every grant collapses to one `GrantKind` discriminant — the same\n * `capability:target` string the decision engine uses as a grant key (e.g.\n * `view:object`, `run:sync`). Resolution, validation, enforcement, and the\n * resolved `GrantIndex` all key off it, so adding a grant family is a single\n * entry in `GRANT_KINDS` plus the compile errors that forces at every consumer.\n */\n\nimport type { GrantDefinition } from \"../security/types\"\n\nexport type GrantKind =\n | \"view:object\"\n | \"view:dataset\"\n | \"edit:object\"\n | \"append:telemetry\"\n | \"apply:action\"\n | \"share:share\"\n | \"run:workflow\"\n | \"run:sync\"\n | \"run:pipeline\"\n | \"run:agent\"\n | \"observe:logs\"\n | \"observe:aiUsage\"\n | \"manage:connector\"\n | \"manage:aiUsage\"\n\n/** Capabilities over one project-wide surface: held or not, with no ids to select. */\nexport type SingletonGrantKind = \"run:agent\" | \"observe:logs\" | \"observe:aiUsage\" | \"manage:aiUsage\"\nexport type TargetedGrantKind = Exclude<GrantKind, SingletonGrantKind>\n\n/** Registered id universes a grant kind ranges over, plus subtype expansion. */\nexport interface GrantUniverse {\n readonly objectTypeIds: ReadonlySet<string>\n readonly datasetIds: ReadonlySet<string>\n readonly actionIds: ReadonlySet<string>\n readonly shareIds: ReadonlySet<string>\n readonly workflowIds: ReadonlySet<string>\n readonly syncIds: ReadonlySet<string>\n readonly pipelineIds: ReadonlySet<string>\n readonly connectorIds: ReadonlySet<string>\n readonly getSubTypes: (objectTypeId: string) => readonly string[]\n}\n\n/** The registered-id sets a grant kind validates against (no subtype hook). */\nexport type GrantUniverseKey = Exclude<keyof GrantUniverse, \"getSubTypes\">\n\ninterface TargetedGrantKindSpec {\n /** Registered universe the grant's ids must belong to. */\n readonly universeKey: GrantUniverseKey\n /** Subject noun used in validation errors (\"unknown <subject> '<id>'\"). */\n readonly subject: string\n /** Actionable hint appended to the \"unknown <subject>\" error. */\n readonly fix: string\n /** Only object-type grants also expand to subtypes. */\n readonly expandsSubtypes?: true\n}\n\ninterface SingletonGrantKindSpec {\n /** Project-wide capability with no resource selection; resolves to a boolean. */\n readonly singleton: true\n readonly subject: string\n readonly fix: string\n}\n\n/**\n * The exhaustive grant-kind table. A new grant family is one entry here; the\n * mapped type makes every omission a compile error.\n */\nexport const GRANT_KINDS: {\n readonly [TKind in GrantKind]: TKind extends SingletonGrantKind\n ? SingletonGrantKindSpec\n : TargetedGrantKindSpec\n} = {\n \"view:object\": {\n universeKey: \"objectTypeIds\",\n subject: \"object type\",\n fix: \"Register it in 'ontology/' or pass it to createSixb({ ontologies }).\",\n expandsSubtypes: true,\n },\n \"view:dataset\": {\n universeKey: \"datasetIds\",\n subject: \"dataset\",\n fix: \"Add it to 'datasets/' or pass it to createSixb({ datasets }).\",\n },\n // Deliberately no `expandsSubtypes`: granting writes on a parent type must not\n // silently extend to types added under it later. `view:object` expands because\n // a read of a subtype reveals nothing the parent's grant did not already cover.\n \"edit:object\": {\n universeKey: \"objectTypeIds\",\n subject: \"object type\",\n fix: \"Register it in 'ontology/' or pass it to createSixb({ ontologies }).\",\n },\n \"append:telemetry\": {\n universeKey: \"objectTypeIds\",\n subject: \"object type\",\n fix: \"Register it in 'ontology/' or pass it to createSixb({ ontologies }).\",\n },\n \"apply:action\": {\n universeKey: \"actionIds\",\n subject: \"action\",\n fix: \"Add it to 'actions/' or pass it to createSixb({ actions }).\",\n },\n \"share:share\": {\n universeKey: \"shareIds\",\n subject: \"share\",\n fix: \"Add it to 'shares/' or pass it to createSixb({ shares }).\",\n },\n \"run:workflow\": {\n universeKey: \"workflowIds\",\n subject: \"workflow\",\n fix: \"Add it to 'workflows/' or pass it to createSixb({ workflows }).\",\n },\n \"run:sync\": {\n universeKey: \"syncIds\",\n subject: \"sync\",\n fix: \"Add it to 'syncs/' or pass it to createSixb({ syncs }).\",\n },\n \"run:pipeline\": {\n universeKey: \"pipelineIds\",\n subject: \"pipeline\",\n fix: \"Add it to 'pipelines/' or pass it to createSixb({ pipelines }).\",\n },\n \"run:agent\": {\n singleton: true,\n subject: \"agent\",\n fix: \"Configure models.language and use the exported agent reference in can.run(agent).\",\n },\n \"observe:logs\": {\n singleton: true,\n subject: \"logs\",\n fix: 'Use can.observe(\"logs\").',\n },\n \"observe:aiUsage\": {\n singleton: true,\n subject: \"AI usage\",\n fix: \"Use can.observe(agent.usage).\",\n },\n \"manage:connector\": {\n universeKey: \"connectorIds\",\n subject: \"connector\",\n fix: \"Add it to 'connectors/' or pass it to createSixb({ connectors }).\",\n },\n \"manage:aiUsage\": {\n singleton: true,\n subject: \"AI usage\",\n fix: \"Use can.manage(agent.usage).\",\n },\n}\n\nexport const GRANT_KIND_KEYS = Object.keys(GRANT_KINDS) as readonly GrantKind[]\nexport const SINGLETON_GRANT_KIND_KEYS = GRANT_KIND_KEYS.filter(\n (kind): kind is SingletonGrantKind => \"singleton\" in GRANT_KINDS[kind]\n)\nexport const TARGETED_GRANT_KIND_KEYS = GRANT_KIND_KEYS.filter(\n (kind): kind is TargetedGrantKind => !(\"singleton\" in GRANT_KINDS[kind])\n)\n\nexport function isSingletonGrantKind(kind: GrantKind): kind is SingletonGrantKind {\n return \"singleton\" in GRANT_KINDS[kind]\n}\n\n/** The grant kind a stored grant resolves to. */\nexport function grantKindOf(grant: GrantDefinition): GrantKind {\n switch (grant.capability) {\n case \"view\":\n return `view:${grant.target}`\n case \"edit\":\n return \"edit:object\"\n case \"append\":\n return \"append:telemetry\"\n case \"apply\":\n return \"apply:action\"\n case \"share\":\n return \"share:share\"\n case \"run\":\n return `run:${grant.target}`\n case \"observe\":\n return `observe:${grant.target}`\n case \"manage\":\n return `manage:${grant.target}`\n }\n}\n\n/** Mutable grant index: booleans for singleton capabilities, id sets for selected resources. */\nexport type MutableGrantIndex = {\n [TKind in GrantKind]: TKind extends SingletonGrantKind ? boolean : Set<string>\n}\n\nexport function emptyGrantSets(): MutableGrantIndex {\n return {\n \"view:object\": new Set(),\n \"view:dataset\": new Set(),\n \"edit:object\": new Set(),\n \"append:telemetry\": new Set(),\n \"apply:action\": new Set(),\n \"share:share\": new Set(),\n \"run:workflow\": new Set(),\n \"run:sync\": new Set(),\n \"run:pipeline\": new Set(),\n \"run:agent\": false,\n \"observe:logs\": false,\n \"observe:aiUsage\": false,\n \"manage:connector\": new Set(),\n \"manage:aiUsage\": false,\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;AAsEO,IAAM,cAIT;AAAA,EACF,eAAe;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,IACL,iBAAiB;AAAA,EACnB;AAAA,EACA,gBAAgB;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EAIA,eAAe;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,oBAAoB;AAAA,IAClB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,eAAe;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,aAAa;AAAA,IACX,WAAW;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,mBAAmB;AAAA,IACjB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,oBAAoB;AAAA,IAClB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,kBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AACF;AAEO,IAAM,kBAAkB,OAAO,KAAK,WAAW;AAC/C,IAAM,4BAA4B,gBAAgB,OACvD,CAAC,UAAqC,eAAe,YAAY,MACnE;AACO,IAAM,2BAA2B,gBAAgB,OACtD,CAAC,SAAoC,EAAE,eAAe,YAAY,MACpE;AAEO,SAAS,oBAAoB,CAAC,MAA6C;AAAA,EAChF,OAAO,eAAe,YAAY;AAAA;AAI7B,SAAS,WAAW,CAAC,OAAmC;AAAA,EAC7D,QAAQ,MAAM;AAAA,SACP;AAAA,MACH,OAAO,QAAQ,MAAM;AAAA,SAClB;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO,OAAO,MAAM;AAAA,SACjB;AAAA,MACH,OAAO,WAAW,MAAM;AAAA,SACrB;AAAA,MACH,OAAO,UAAU,MAAM;AAAA;AAAA;AAStB,SAAS,cAAc,GAAsB;AAAA,EAClD,OAAO;AAAA,IACL,eAAe,IAAI;AAAA,IACnB,gBAAgB,IAAI;AAAA,IACpB,eAAe,IAAI;AAAA,IACnB,oBAAoB,IAAI;AAAA,IACxB,gBAAgB,IAAI;AAAA,IACpB,eAAe,IAAI;AAAA,IACnB,gBAAgB,IAAI;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,gBAAgB,IAAI;AAAA,IACpB,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,oBAAoB,IAAI;AAAA,IACxB,kBAAkB;AAAA,EACpB;AAAA;",
|
|
8
|
+
"debugId": "1C6F3FFB2BACAB1F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -1,41 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
// src/auth/errors.ts
|
|
3
|
-
class AuthRuntimeError2 extends Error {
|
|
4
|
-
code;
|
|
5
|
-
name = "AuthRuntimeError";
|
|
6
|
-
constructor(code, message) {
|
|
7
|
-
super(message);
|
|
8
|
-
this.code = code;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
class SignInRefusedError2 extends Error {
|
|
13
|
-
reason;
|
|
14
|
-
email;
|
|
15
|
-
name = "SignInRefusedError";
|
|
16
|
-
constructor(reason, message, email) {
|
|
17
|
-
super(message);
|
|
18
|
-
this.reason = reason;
|
|
19
|
-
this.email = email;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// src/auth/audience.ts
|
|
24
|
-
var DEFAULT_AUTH_SESSION_AUDIENCE2 = "atlas";
|
|
25
|
-
function isValidAuthSessionAudience2(value) {
|
|
26
|
-
return value === "atlas" || value === "app";
|
|
27
|
-
}
|
|
28
|
-
function resolveAuthSessionAudience2(value) {
|
|
29
|
-
const audience = value ?? DEFAULT_AUTH_SESSION_AUDIENCE2;
|
|
30
|
-
if (!isValidAuthSessionAudience2(audience)) {
|
|
31
|
-
throw new AuthRuntimeError2("invalid_auth_config", `[Sixb] Auth session audience '${audience}' is invalid. Expected 'atlas' or 'app'.`);
|
|
32
|
-
}
|
|
33
|
-
return audience;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
2
|
// src/auth/cookies.ts
|
|
37
|
-
var DEFAULT_SESSION_COOKIE_NAME2 = "
|
|
38
|
-
var DEFAULT_CSRF_COOKIE_NAME2 = "
|
|
3
|
+
var DEFAULT_SESSION_COOKIE_NAME2 = "sixb_session_app";
|
|
4
|
+
var DEFAULT_CSRF_COOKIE_NAME2 = "sixb_csrf_app";
|
|
39
5
|
function resolveAuthCookieOptions2(options) {
|
|
40
6
|
const resolved = {
|
|
41
7
|
sessionCookieName: options?.sessionCookieName ?? DEFAULT_SESSION_COOKIE_NAME2,
|
|
@@ -48,17 +14,6 @@ function resolveAuthCookieOptions2(options) {
|
|
|
48
14
|
assertValidCookieOptions(resolved);
|
|
49
15
|
return resolved;
|
|
50
16
|
}
|
|
51
|
-
function resolveAuthCookieOptionsForAudience(options, audience) {
|
|
52
|
-
const resolvedAudience = resolveAuthSessionAudience2(audience);
|
|
53
|
-
if (resolvedAudience === DEFAULT_AUTH_SESSION_AUDIENCE2) {
|
|
54
|
-
return options;
|
|
55
|
-
}
|
|
56
|
-
return {
|
|
57
|
-
...options,
|
|
58
|
-
sessionCookieName: `${options.sessionCookieName}_${resolvedAudience}`,
|
|
59
|
-
csrfCookieName: `${options.csrfCookieName}_${resolvedAudience}`
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
17
|
function parseCookieHeader2(header) {
|
|
63
18
|
const cookies = new Map;
|
|
64
19
|
if (!header) {
|
|
@@ -200,6 +155,27 @@ function requiresSecureCookieName(name) {
|
|
|
200
155
|
return isHostPrefixedCookieName(name) || name.startsWith("__Secure-");
|
|
201
156
|
}
|
|
202
157
|
|
|
158
|
+
// src/auth/errors.ts
|
|
159
|
+
class AuthRuntimeError2 extends Error {
|
|
160
|
+
code;
|
|
161
|
+
name = "AuthRuntimeError";
|
|
162
|
+
constructor(code, message) {
|
|
163
|
+
super(message);
|
|
164
|
+
this.code = code;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
class SignInRefusedError2 extends Error {
|
|
169
|
+
reason;
|
|
170
|
+
email;
|
|
171
|
+
name = "SignInRefusedError";
|
|
172
|
+
constructor(reason, message, email) {
|
|
173
|
+
super(message);
|
|
174
|
+
this.reason = reason;
|
|
175
|
+
this.email = email;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
203
179
|
// src/auth/validation.ts
|
|
204
180
|
var DAY = 24 * 60 * 60 * 1000;
|
|
205
181
|
var DEFAULT_AUTH_SESSION_IDLE_TIMEOUT_MS2 = 30 * DAY;
|
|
@@ -316,6 +292,6 @@ function assertValidStrategy(strategy) {
|
|
|
316
292
|
}
|
|
317
293
|
}
|
|
318
294
|
|
|
319
|
-
export {
|
|
295
|
+
export { DEFAULT_SESSION_COOKIE_NAME2, DEFAULT_CSRF_COOKIE_NAME2, resolveAuthCookieOptions2, parseCookieHeader2, getCookie2, serializeCookie2, shouldUseSecureCookies2, createSessionCookieHeader2, createCsrfCookieHeader2, clearSessionCookieHeader2, clearCsrfCookieHeader2, AuthRuntimeError2, SignInRefusedError2, DEFAULT_AUTH_SESSION_IDLE_TIMEOUT_MS2, DEFAULT_AUTH_SESSION_RENEWAL_WINDOW_MS2, DEFAULT_AUTH_INVITATION_TTL_MS2, MAX_AUTH_INVITATION_TTL_MS2, DEFAULT_AUTH_SESSION_CACHE_TTL_MS2, resolveAuthConfig2, resolveInvitationExpiresAt, assertNonEmpty3, normalizePagination, isMagicLinkAuthStrategy2, isInvitationDeliveryAuthStrategy2, isOidcAuthStrategy2 };
|
|
320
296
|
|
|
321
|
-
//# debugId=
|
|
297
|
+
//# debugId=D416279B4950C46864756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/auth/cookies.ts", "../src/auth/errors.ts", "../src/auth/validation.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { AuthCookieOptions } from \"./types\"\n\n// The names the app's cookies had beside Atlas's, so its sessions survived Atlas leaving.\nexport const DEFAULT_SESSION_COOKIE_NAME = \"sixb_session_app\"\nexport const DEFAULT_CSRF_COOKIE_NAME = \"sixb_csrf_app\"\n\nexport interface ResolvedAuthCookieOptions {\n readonly sessionCookieName: string\n readonly csrfCookieName: string\n readonly domain?: string\n readonly secure: boolean | \"auto\"\n readonly sameSite: \"strict\"\n readonly csrfHttpOnly: boolean\n}\n\ninterface CookieSerializationOptions {\n readonly name: string\n readonly value: string\n readonly httpOnly?: boolean\n readonly maxAge?: number\n readonly expires?: Date\n readonly domain?: string\n readonly secure?: boolean\n readonly sameSite: \"strict\"\n}\n\nexport function resolveAuthCookieOptions(\n options: AuthCookieOptions | undefined\n): ResolvedAuthCookieOptions {\n const resolved = {\n sessionCookieName: options?.sessionCookieName ?? DEFAULT_SESSION_COOKIE_NAME,\n csrfCookieName: options?.csrfCookieName ?? DEFAULT_CSRF_COOKIE_NAME,\n domain: options?.cookieDomain,\n secure: options?.secure ?? \"auto\",\n sameSite: options?.sameSite ?? \"strict\",\n csrfHttpOnly: options?.csrfHttpOnly ?? false,\n }\n\n assertValidCookieOptions(resolved)\n return resolved\n}\n\nexport function parseCookieHeader(header: string | null): ReadonlyMap<string, string> {\n const cookies = new Map<string, string>()\n if (!header) {\n return cookies\n }\n\n for (const part of header.split(\";\")) {\n const separator = part.indexOf(\"=\")\n if (separator <= 0) {\n continue\n }\n\n const name = part.slice(0, separator).trim()\n if (!name || cookies.has(name)) {\n continue\n }\n\n const value = part.slice(separator + 1).trim()\n cookies.set(name, value)\n }\n\n return cookies\n}\n\nexport function getCookie(request: Request, name: string): string | undefined {\n return parseCookieHeader(request.headers.get(\"cookie\")).get(name)\n}\n\nexport function serializeCookie(options: CookieSerializationOptions): string {\n const parts = [`${options.name}=${options.value}`]\n\n parts.push(\"Path=/\")\n parts.push(\"SameSite=Strict\")\n\n if (options.domain) {\n parts.push(`Domain=${options.domain}`)\n }\n\n if (options.httpOnly) {\n parts.push(\"HttpOnly\")\n }\n\n if (options.secure) {\n parts.push(\"Secure\")\n }\n\n if (options.maxAge !== undefined) {\n parts.push(`Max-Age=${Math.trunc(options.maxAge)}`)\n }\n\n if (options.expires) {\n parts.push(`Expires=${options.expires.toUTCString()}`)\n }\n\n return parts.join(\"; \")\n}\n\nexport function shouldUseSecureCookies(\n request: Request,\n options: ResolvedAuthCookieOptions\n): boolean {\n if (\n requiresSecureCookieName(options.sessionCookieName) ||\n requiresSecureCookieName(options.csrfCookieName)\n ) {\n return true\n }\n\n if (typeof options.secure === \"boolean\") {\n return options.secure\n }\n\n const url = new URL(request.url)\n if (isLocalhost(url.hostname)) {\n return false\n }\n\n return url.protocol === \"https:\" || process.env.NODE_ENV === \"production\"\n}\n\nexport function createSessionCookieHeader(params: {\n readonly request: Request\n readonly value: string\n readonly expiresAt: Date\n readonly options: ResolvedAuthCookieOptions\n}): string {\n const lifetime = resolveCookieLifetime(params.expiresAt)\n return serializeCookie({\n name: params.options.sessionCookieName,\n value: params.value,\n httpOnly: true,\n ...lifetime,\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nexport function createCsrfCookieHeader(params: {\n readonly request: Request\n readonly value: string\n readonly expiresAt: Date\n readonly options: ResolvedAuthCookieOptions\n}): string {\n const lifetime = resolveCookieLifetime(params.expiresAt)\n return serializeCookie({\n name: params.options.csrfCookieName,\n value: params.value,\n httpOnly: params.options.csrfHttpOnly,\n ...lifetime,\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nfunction resolveCookieLifetime(expiresAt: Date): {\n readonly maxAge: number\n readonly expires: Date\n} {\n const expiresAtMs = expiresAt.getTime()\n if (!Number.isFinite(expiresAtMs)) {\n throw new Error(\"[Sixb] Auth cookie expiresAt must be a valid date.\")\n }\n\n return {\n maxAge: Math.max(0, Math.floor((expiresAtMs - Date.now()) / 1000)),\n expires: new Date(expiresAtMs),\n }\n}\n\nexport function clearSessionCookieHeader(params: {\n readonly request: Request\n readonly options: ResolvedAuthCookieOptions\n}): string {\n return serializeCookie({\n name: params.options.sessionCookieName,\n value: \"\",\n httpOnly: true,\n maxAge: 0,\n expires: new Date(0),\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nexport function clearCsrfCookieHeader(params: {\n readonly request: Request\n readonly options: ResolvedAuthCookieOptions\n}): string {\n return serializeCookie({\n name: params.options.csrfCookieName,\n value: \"\",\n maxAge: 0,\n expires: new Date(0),\n domain: params.options.domain,\n secure: shouldUseSecureCookies(params.request, params.options),\n sameSite: params.options.sameSite,\n })\n}\n\nfunction isLocalhost(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n}\n\nfunction assertValidCookieOptions(options: ResolvedAuthCookieOptions): void {\n assertValidCookieName(options.sessionCookieName, \"sessionCookieName\")\n assertValidCookieName(options.csrfCookieName, \"csrfCookieName\")\n\n if (options.sameSite !== \"strict\") {\n throw new Error(\"[Sixb] Auth cookie sameSite must be 'strict'.\")\n }\n\n if (\n options.domain &&\n (isHostPrefixedCookieName(options.sessionCookieName) ||\n isHostPrefixedCookieName(options.csrfCookieName))\n ) {\n throw new Error(\"[Sixb] __Host- auth cookies cannot be configured with cookieDomain.\")\n }\n\n if (\n options.secure === false &&\n (requiresSecureCookieName(options.sessionCookieName) ||\n requiresSecureCookieName(options.csrfCookieName))\n ) {\n throw new Error(\"[Sixb] __Host- auth cookies require secure cookies.\")\n }\n}\n\nfunction assertValidCookieName(name: string, label: string): void {\n if (!/^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/.test(name)) {\n throw new Error(`[Sixb] Auth cookie ${label} '${name}' is not a valid cookie name.`)\n }\n}\n\nfunction isHostPrefixedCookieName(name: string): boolean {\n return name.startsWith(\"__Host-\")\n}\n\nfunction requiresSecureCookieName(name: string): boolean {\n return isHostPrefixedCookieName(name) || name.startsWith(\"__Secure-\")\n}\n",
|
|
6
|
+
"export type AuthRuntimeErrorCode =\n | \"authentication_required\"\n | \"auth_storage_missing\"\n | \"authorization_denied\"\n | \"invalid_auth_input\"\n | \"invalid_auth_config\"\n | \"rate_limited\"\n | \"production_auth_required\"\n\nexport class AuthRuntimeError extends Error {\n readonly name = \"AuthRuntimeError\"\n\n constructor(\n readonly code: AuthRuntimeErrorCode,\n message: string\n ) {\n super(message)\n }\n}\n\n/** Why a strategy refused someone who authenticated. Each is something a person can act on. */\nexport type SignInRefusalReason =\n | \"not_invited\"\n | \"suspended\"\n | \"domain_not_allowed\"\n | \"no_trusted_address\"\n\n/**\n * Thrown by a strategy that refuses a sign-in for a known reason. The sign-in page tells the\n * person which reason, naming `email` when there is one; `message` is for the server log.\n */\nexport class SignInRefusedError extends Error {\n readonly name = \"SignInRefusedError\"\n\n constructor(\n readonly reason: SignInRefusalReason,\n message: string,\n readonly email?: string\n ) {\n super(message)\n }\n}\n",
|
|
7
|
+
"import { resolveAuthCookieOptions } from \"./cookies\"\nimport { AuthRuntimeError } from \"./errors\"\nimport type {\n AuthSessionOptions,\n AuthStrategy,\n InvitationDeliveryAuthStrategy,\n MagicLinkAuthStrategy,\n OidcAuthStrategy,\n ResolvedAuthConfig,\n SixbAuthConfig,\n} from \"./types\"\n\nconst DAY = 24 * 60 * 60 * 1000\n\nexport const DEFAULT_AUTH_SESSION_IDLE_TIMEOUT_MS = 30 * DAY\nexport const DEFAULT_AUTH_SESSION_RENEWAL_WINDOW_MS = 7 * DAY\nexport const DEFAULT_AUTH_INVITATION_TTL_MS = 7 * DAY\nexport const MAX_AUTH_INVITATION_TTL_MS = 30 * DAY\n/**\n * Default in-process session cache window. Short enough that a revoked session lingers\n * only briefly, long enough to collapse a burst of requests to a single auth resolution.\n */\nexport const DEFAULT_AUTH_SESSION_CACHE_TTL_MS = 5_000\n\nexport function resolveAuthConfig(config: SixbAuthConfig | undefined): ResolvedAuthConfig {\n if (!config) {\n return {\n strategy: null,\n session: resolveAuthSessionOptions(undefined),\n cookies: resolveAuthCookieOptions(undefined),\n }\n }\n\n const strategy = \"strategy\" in config ? config.strategy : config\n assertValidStrategy(strategy)\n\n return {\n strategy,\n session: resolveAuthSessionOptions(\"strategy\" in config ? config.session : undefined),\n cookies: resolveAuthCookieOptions(\"strategy\" in config ? config.cookies : undefined),\n }\n}\n\nexport function resolveInvitationExpiresAt(value: Date | undefined, now: Date): Date {\n const expiresAt = value\n ? new Date(value)\n : new Date(now.getTime() + DEFAULT_AUTH_INVITATION_TTL_MS)\n const expiresAtTime = expiresAt.getTime()\n\n if (!Number.isFinite(expiresAtTime)) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation expiresAt must be a valid date.\"\n )\n }\n\n if (expiresAtTime <= now.getTime()) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation expiresAt must be in the future.\"\n )\n }\n\n if (expiresAtTime > now.getTime() + MAX_AUTH_INVITATION_TTL_MS) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation expiresAt must be no more than 30 days in the future.\"\n )\n }\n\n return expiresAt\n}\n\nexport function sanitizeReturnTo(value: string | undefined): string {\n if (!value || !value.startsWith(\"/\") || value.startsWith(\"//\")) {\n return \"/\"\n }\n\n try {\n const parsed = new URL(value, \"http://sixb.local\")\n if (parsed.origin !== \"http://sixb.local\") {\n return \"/\"\n }\n\n return `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n return \"/\"\n }\n}\n\nexport function assertNonEmpty(value: string, label: string): string {\n const normalized = value.trim()\n if (!normalized) {\n throw new AuthRuntimeError(\"invalid_auth_input\", `[Sixb] ${label} must be a non-empty string.`)\n }\n return normalized\n}\n\nexport function normalizePagination(input: { readonly limit?: number; readonly offset?: number }): {\n readonly limit?: number\n readonly offset: number\n} {\n if (input.limit !== undefined && (!Number.isInteger(input.limit) || input.limit < 0)) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation list limit must be a non-negative integer.\"\n )\n }\n\n if (input.offset !== undefined && (!Number.isInteger(input.offset) || input.offset < 0)) {\n throw new AuthRuntimeError(\n \"invalid_auth_input\",\n \"[Sixb] Invitation list offset must be a non-negative integer.\"\n )\n }\n\n return {\n limit: input.limit,\n offset: input.offset ?? 0,\n }\n}\n\nfunction resolveAuthSessionOptions(\n options: AuthSessionOptions | undefined\n): ResolvedAuthConfig[\"session\"] {\n const idleTimeoutMs = options?.idleTimeoutMs ?? DEFAULT_AUTH_SESSION_IDLE_TIMEOUT_MS\n if (!Number.isFinite(idleTimeoutMs) || idleTimeoutMs <= 0) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session idleTimeoutMs must be a positive finite number.\"\n )\n }\n\n const renewalWindowMs = options?.renewalWindowMs ?? DEFAULT_AUTH_SESSION_RENEWAL_WINDOW_MS\n if (!Number.isFinite(renewalWindowMs) || renewalWindowMs <= 0) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session renewalWindowMs must be a positive finite number.\"\n )\n }\n if (renewalWindowMs >= idleTimeoutMs) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session renewalWindowMs must be less than idleTimeoutMs.\"\n )\n }\n\n const absoluteTimeoutMs = options?.absoluteTimeoutMs\n if (\n absoluteTimeoutMs !== undefined &&\n (!Number.isFinite(absoluteTimeoutMs) || absoluteTimeoutMs <= 0)\n ) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session absoluteTimeoutMs must be a positive finite number when configured.\"\n )\n }\n if (absoluteTimeoutMs !== undefined && absoluteTimeoutMs < idleTimeoutMs) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session absoluteTimeoutMs must be greater than or equal to idleTimeoutMs.\"\n )\n }\n\n const cacheTtlMs = options?.cacheTtlMs ?? DEFAULT_AUTH_SESSION_CACHE_TTL_MS\n if (!Number.isFinite(cacheTtlMs) || cacheTtlMs < 0) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session cacheTtlMs must be a non-negative finite number.\"\n )\n }\n if (cacheTtlMs >= renewalWindowMs) {\n throw new AuthRuntimeError(\n \"invalid_auth_config\",\n \"[Sixb] Auth session cacheTtlMs must be less than renewalWindowMs.\"\n )\n }\n\n return {\n idleTimeoutMs,\n renewalWindowMs,\n ...(absoluteTimeoutMs === undefined ? {} : { absoluteTimeoutMs }),\n cacheTtlMs,\n }\n}\n\nexport function isMagicLinkAuthStrategy(\n strategy: AuthStrategy | null\n): strategy is MagicLinkAuthStrategy {\n if (!strategy || strategy.kind !== \"magicLink\") {\n return false\n }\n\n const candidate = strategy as {\n readonly requestMagicLink?: unknown\n readonly completeMagicLinkSignIn?: unknown\n }\n\n return (\n typeof candidate.requestMagicLink === \"function\" &&\n typeof candidate.completeMagicLinkSignIn === \"function\"\n )\n}\n\nexport function isInvitationDeliveryAuthStrategy(\n strategy: AuthStrategy | null\n): strategy is InvitationDeliveryAuthStrategy {\n if (!strategy) {\n return false\n }\n\n const candidate = strategy as {\n readonly deliverInvitation?: unknown\n }\n\n return typeof candidate.deliverInvitation === \"function\"\n}\n\nexport function isOidcAuthStrategy(strategy: AuthStrategy | null): strategy is OidcAuthStrategy {\n if (!strategy || strategy.kind !== \"oidc\") {\n return false\n }\n\n const candidate = strategy as {\n readonly startOidcSignIn?: unknown\n readonly completeOidcSignIn?: unknown\n }\n\n return (\n typeof candidate.startOidcSignIn === \"function\" &&\n typeof candidate.completeOidcSignIn === \"function\"\n )\n}\n\nfunction assertValidStrategy(strategy: AuthStrategy): void {\n if (!strategy.id.trim()) {\n throw new AuthRuntimeError(\"invalid_auth_config\", \"[Sixb] Auth strategy id is required.\")\n }\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "D416279B4950C46864756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
|
+
materializationEventKindOrdinal2,
|
|
4
|
+
sha256Canonical2,
|
|
5
|
+
createRequestHash2,
|
|
6
|
+
createCommitId2,
|
|
3
7
|
normalizeObjectRef2,
|
|
4
8
|
normalizeLinkRef2,
|
|
5
9
|
objectRefKey2,
|
|
@@ -15,12 +19,8 @@ import {
|
|
|
15
19
|
linkScopeSortKey2,
|
|
16
20
|
telemetryPointSortKey2,
|
|
17
21
|
compareObjectRefs2,
|
|
18
|
-
compareLinkRefs2
|
|
19
|
-
|
|
20
|
-
sha256Canonical2,
|
|
21
|
-
createRequestHash2,
|
|
22
|
-
createCommitId2
|
|
23
|
-
} from "./chunk-b9affek3.js";
|
|
22
|
+
compareLinkRefs2
|
|
23
|
+
} from "./chunk-7n440zgt.js";
|
|
24
24
|
import {
|
|
25
25
|
withFailureMessage
|
|
26
26
|
} from "./chunk-z3y5kg1x.js";
|
|
@@ -35,32 +35,32 @@ import {
|
|
|
35
35
|
normalizeLinkProperties2,
|
|
36
36
|
validateLinkProperties2,
|
|
37
37
|
validateTelemetryUnit2
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-hvsb78a1.js";
|
|
39
39
|
import {
|
|
40
|
+
resolveExecutionScopeAuthorization,
|
|
40
41
|
ProjectionValidationError2,
|
|
41
42
|
validateProjectionsAtStartup,
|
|
42
|
-
isProjectionDefinition2
|
|
43
|
-
|
|
44
|
-
} from "./chunk-qkbx3tf6.js";
|
|
43
|
+
isProjectionDefinition2
|
|
44
|
+
} from "./chunk-d0bqz29d.js";
|
|
45
45
|
import {
|
|
46
|
-
objectBatchKey2,
|
|
47
46
|
vectorConfiguration,
|
|
48
47
|
vectorSources,
|
|
49
|
-
normalizeVector2
|
|
50
|
-
|
|
48
|
+
normalizeVector2,
|
|
49
|
+
objectBatchKey2
|
|
50
|
+
} from "./chunk-n33z5bjw.js";
|
|
51
51
|
import {
|
|
52
52
|
materializationApplyPhase2
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-pbcbn83d.js";
|
|
54
54
|
import {
|
|
55
55
|
parseDatasetTimestamp2
|
|
56
56
|
} from "./chunk-z667z3sg.js";
|
|
57
57
|
import {
|
|
58
58
|
executionRecordInputFromRuntime,
|
|
59
59
|
ensureExecutionRecord2
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-9dmt152s.js";
|
|
61
61
|
import {
|
|
62
62
|
isStorageSerializationFailure2
|
|
63
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-s16apyk9.js";
|
|
64
64
|
import {
|
|
65
65
|
assertPinnedDatasetWatermark2
|
|
66
66
|
} from "./chunk-6aawea28.js";
|
|
@@ -1046,14 +1046,6 @@ function normalizeOntologyEditCommit2(input) {
|
|
|
1046
1046
|
...input.operationGroups !== undefined ? { operationGroups: normalizeOperationGroups(input.operationGroups, operationIds) } : {}
|
|
1047
1047
|
});
|
|
1048
1048
|
}
|
|
1049
|
-
const source = input.source.kind === "action" ? Object.freeze({
|
|
1050
|
-
kind: "action",
|
|
1051
|
-
actionId: normalizeNonblank(input.source.actionId, "Action id"),
|
|
1052
|
-
runId: normalizeNonblank(input.source.runId, "Action run id")
|
|
1053
|
-
}) : Object.freeze({
|
|
1054
|
-
kind: "runtime",
|
|
1055
|
-
requestId: normalizeNonblank(input.source.requestId, "Runtime request id")
|
|
1056
|
-
});
|
|
1057
1049
|
if (input.vectorWrites?.length && (operations.length || input.source.kind !== "runtime")) {
|
|
1058
1050
|
throw new MaterializationValidationError2("Vector writes require a dedicated atomic runtime commit.");
|
|
1059
1051
|
}
|
|
@@ -1062,14 +1054,34 @@ function normalizeOntologyEditCommit2(input) {
|
|
|
1062
1054
|
const expectedObjects = input.expectedObjects.map(normalizeExpectedObject);
|
|
1063
1055
|
const expectedLinks = input.expectedLinks.map(normalizeExpectedLink);
|
|
1064
1056
|
const expectedLinkScopes = input.expectedLinkScopes.map(normalizeExpectedLinkScope);
|
|
1065
|
-
|
|
1057
|
+
const atomic = {
|
|
1066
1058
|
mode: "atomic",
|
|
1067
1059
|
...input.vectorWrites === undefined ? {} : { vectorWrites: structuredClone(input.vectorWrites) },
|
|
1068
|
-
source,
|
|
1069
1060
|
operations: Object.freeze(operations),
|
|
1070
1061
|
expectedObjects: deduplicateExpectations(expectedObjects, (value) => objectRefKey2(value.ref), "Expected objects"),
|
|
1071
1062
|
expectedLinks: deduplicateExpectations(expectedLinks, (value) => linkRefKey2(value.ref), "Expected links"),
|
|
1072
1063
|
expectedLinkScopes: deduplicateExpectations(expectedLinkScopes, (value) => linkScopeKey(value.source, value.linkId), "Expected link scopes")
|
|
1064
|
+
};
|
|
1065
|
+
if (input.source.kind === "action") {
|
|
1066
|
+
if (!("run" in input) || input.run === undefined) {
|
|
1067
|
+
throw new MaterializationValidationError2("An Action commit must carry its run's record.");
|
|
1068
|
+
}
|
|
1069
|
+
return Object.freeze({
|
|
1070
|
+
...atomic,
|
|
1071
|
+
source: Object.freeze({
|
|
1072
|
+
kind: "action",
|
|
1073
|
+
actionId: normalizeNonblank(input.source.actionId, "Action id"),
|
|
1074
|
+
runId: normalizeNonblank(input.source.runId, "Action run id")
|
|
1075
|
+
}),
|
|
1076
|
+
run: structuredClone(input.run)
|
|
1077
|
+
});
|
|
1078
|
+
}
|
|
1079
|
+
return Object.freeze({
|
|
1080
|
+
...atomic,
|
|
1081
|
+
source: Object.freeze({
|
|
1082
|
+
kind: "runtime",
|
|
1083
|
+
requestId: normalizeNonblank(input.source.requestId, "Runtime request id")
|
|
1084
|
+
})
|
|
1073
1085
|
});
|
|
1074
1086
|
}
|
|
1075
1087
|
function normalizeProjectionSourceRef(source) {
|
|
@@ -2817,7 +2829,7 @@ async function prepareEditCommit(context, raw) {
|
|
|
2817
2829
|
const identity = createTimedCommitIdentity2({
|
|
2818
2830
|
projectId: context.projectId,
|
|
2819
2831
|
idempotencyKey,
|
|
2820
|
-
normalizedCallerIntent: input,
|
|
2832
|
+
normalizedCallerIntent: editIntent(input),
|
|
2821
2833
|
now: context.clock()
|
|
2822
2834
|
});
|
|
2823
2835
|
return {
|
|
@@ -2834,18 +2846,11 @@ function editIdempotencyKey(input) {
|
|
|
2834
2846
|
}
|
|
2835
2847
|
return createRuntimeIdempotencyKey2(input.source.requestId);
|
|
2836
2848
|
}
|
|
2837
|
-
|
|
2838
|
-
if (
|
|
2839
|
-
return;
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
}
|
|
2843
|
-
const run = await storage.actionRuns.lockForMaterialization({
|
|
2844
|
-
projectId,
|
|
2845
|
-
actionId: input.source.actionId,
|
|
2846
|
-
runId: input.source.runId
|
|
2847
|
-
});
|
|
2848
|
-
assertMaterializerRunExecution(execution, run.executionId, `Action run '${run.id}'`);
|
|
2849
|
+
function editIntent(input) {
|
|
2850
|
+
if (!("run" in input))
|
|
2851
|
+
return input;
|
|
2852
|
+
const { run: _run, ...intent } = input;
|
|
2853
|
+
return intent;
|
|
2849
2854
|
}
|
|
2850
2855
|
async function validateMutationExecution(storage, projectId, input, execution) {
|
|
2851
2856
|
if (await authorizeVectorIndexingCommit(storage, projectId, input, execution))
|
|
@@ -2859,18 +2864,32 @@ async function validateMutationExecution(storage, projectId, input, execution) {
|
|
|
2859
2864
|
id: input.source.actionId,
|
|
2860
2865
|
runId: input.source.runId
|
|
2861
2866
|
});
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
const run = await storage.actionRuns.getById({ projectId, id: input.source.runId });
|
|
2866
|
-
if (!run) {
|
|
2867
|
-
throw new MaterializationValidationError2(`Action run '${input.source.runId}' was not found.`);
|
|
2867
|
+
const run = requireActionRun(input);
|
|
2868
|
+
if (run.projectId !== projectId || run.id !== input.source.runId) {
|
|
2869
|
+
throw new MaterializationValidationError2(`The record carried by Action run '${input.source.runId}' belongs to another run.`);
|
|
2868
2870
|
}
|
|
2869
2871
|
if (run.actionId !== input.source.actionId) {
|
|
2870
2872
|
throw new MaterializationConflictError2("run-correlation", `Action run '${run.id}' does not belong to action '${input.source.actionId}'.`);
|
|
2871
2873
|
}
|
|
2874
|
+
if (run.status !== "succeeded" || run.phase !== "commit") {
|
|
2875
|
+
throw new MaterializationValidationError2(`Action run '${run.id}' commits its edits only as a succeeded run in its commit phase.`);
|
|
2876
|
+
}
|
|
2872
2877
|
assertMaterializerRunExecution(execution, run.executionId, `Action run '${run.id}'`);
|
|
2873
2878
|
}
|
|
2879
|
+
async function recordActionRun(storage, input) {
|
|
2880
|
+
if (input.source.kind !== "action")
|
|
2881
|
+
return;
|
|
2882
|
+
if (!storage.actionRuns) {
|
|
2883
|
+
throw new MaterializationValidationError2("Storage does not provide Action run capabilities required by this commit.");
|
|
2884
|
+
}
|
|
2885
|
+
await storage.actionRuns.record(requireActionRun(input));
|
|
2886
|
+
}
|
|
2887
|
+
function requireActionRun(input) {
|
|
2888
|
+
if (!("run" in input)) {
|
|
2889
|
+
throw new MaterializationValidationError2("An Action commit must carry its run's record.");
|
|
2890
|
+
}
|
|
2891
|
+
return input.run;
|
|
2892
|
+
}
|
|
2874
2893
|
async function executeEditCommit(context, command) {
|
|
2875
2894
|
return withSerializationRetry(context, () => context.storage.transaction((storage) => executeEditTransaction(context, storage, command), {
|
|
2876
2895
|
isolation: "serializable"
|
|
@@ -2882,7 +2901,7 @@ async function executeEditTransaction(context, storage, command) {
|
|
|
2882
2901
|
const replay = await replayCommit(context, command.identity, command.execution.executionId, storage);
|
|
2883
2902
|
if (replay)
|
|
2884
2903
|
return replay;
|
|
2885
|
-
await
|
|
2904
|
+
await recordActionRun(storage, command.input);
|
|
2886
2905
|
const session = await beginEditMaterialization(context, storage, command);
|
|
2887
2906
|
const workingState = await loadEditWorkingState(context, storage.ontology.materializations, session, command.input.operations);
|
|
2888
2907
|
const outcomes = applyEditOperations(context, workingState, command);
|
|
@@ -4374,4 +4393,4 @@ function createOntologyMaterializer2(input) {
|
|
|
4374
4393
|
}
|
|
4375
4394
|
export { computeOntologyRevision2, computeProjectionRevision2, computeProjectionOwnershipHash2, ProjectionRegistry2, createActionIdempotencyKey2, createRuntimeIdempotencyKey2, createProjectionIdempotencyKey2, createRuntimeTelemetryIdempotencyKey2, createProjectionTelemetryIdempotencyKey2, createCommitIdentity2, timestampCommitIdentity2, createTimedCommitIdentity2, createProjectionMaterializationId2, createLinkScopeFingerprint2, normalizeJsonProperties2, normalizeOntologyEditCommit2, normalizeProjectionExecution2, normalizeProjectionSourceEntry2, normalizeTelemetryAppend2, OntologyMaterializer2, createOntologyMaterializer2 };
|
|
4376
4395
|
|
|
4377
|
-
//# debugId=
|
|
4396
|
+
//# debugId=F60EADEFB2F6DBB664756E2164756E21
|