@sixb/core 0.1.20 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/commit-edits.d.ts +3 -1
- package/dist/actions/commit-edits.d.ts.map +1 -1
- package/dist/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.js +71 -60
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/read-facade.d.ts +9 -1
- package/dist/actions/read-facade.d.ts.map +1 -1
- package/dist/actions/request.d.ts +15 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run/context.d.ts +1 -0
- package/dist/actions/run/context.d.ts.map +1 -1
- package/dist/actions/run/execute.d.ts +2 -3
- package/dist/actions/run/execute.d.ts.map +1 -1
- package/dist/actions/run/executor.d.ts +3 -0
- package/dist/actions/run/executor.d.ts.map +1 -1
- package/dist/actions/run/normalize.d.ts +2 -1
- package/dist/actions/run/normalize.d.ts.map +1 -1
- package/dist/actions/run/signals.d.ts +1 -3
- package/dist/actions/run/signals.d.ts.map +1 -1
- package/dist/actions/run/types.d.ts +16 -1
- package/dist/actions/run/types.d.ts.map +1 -1
- package/dist/actions/run-authorization.d.ts +23 -0
- package/dist/actions/run-authorization.d.ts.map +1 -1
- package/dist/actions/types/context.d.ts +17 -1
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validators.d.ts.map +1 -1
- package/dist/activity/connection.d.ts +62 -0
- package/dist/activity/connection.d.ts.map +1 -0
- package/dist/activity/device.d.ts +8 -0
- package/dist/activity/device.d.ts.map +1 -0
- package/dist/activity/execution.d.ts +48 -0
- package/dist/activity/execution.d.ts.map +1 -0
- package/dist/activity/service.d.ts +79 -0
- package/dist/activity/service.d.ts.map +1 -0
- package/dist/activity/shares.d.ts +24 -0
- package/dist/activity/shares.d.ts.map +1 -0
- package/dist/activity/timeline.d.ts +103 -0
- package/dist/activity/timeline.d.ts.map +1 -0
- package/dist/agents/accounting.d.ts +15 -0
- package/dist/agents/accounting.d.ts.map +1 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/agent-mail.d.ts +9 -0
- package/dist/agents/agent-mail.d.ts.map +1 -0
- package/dist/agents/api-gateway.d.ts +5 -0
- package/dist/agents/api-gateway.d.ts.map +1 -1
- package/dist/agents/approval-continuation.d.ts +23 -0
- package/dist/agents/approval-continuation.d.ts.map +1 -0
- package/dist/agents/approval-executor.d.ts +56 -0
- package/dist/agents/approval-executor.d.ts.map +1 -0
- package/dist/agents/approval-outcome.d.ts +8 -0
- package/dist/agents/approval-outcome.d.ts.map +1 -0
- package/dist/agents/approvals.d.ts +210 -0
- package/dist/agents/approvals.d.ts.map +1 -0
- package/dist/agents/authority.d.ts +10 -0
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/builders.d.ts.map +1 -1
- package/dist/agents/cancel.d.ts +23 -0
- package/dist/agents/cancel.d.ts.map +1 -0
- package/dist/agents/child-question.d.ts +18 -0
- package/dist/agents/child-question.d.ts.map +1 -0
- package/dist/agents/children.d.ts +99 -0
- package/dist/agents/children.d.ts.map +1 -0
- package/dist/agents/context/index.js +1 -1
- package/dist/agents/context-compaction.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +13 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +180 -14
- package/dist/agents/execution.d.ts.map +1 -1
- package/dist/agents/fork.d.ts +16 -0
- package/dist/agents/fork.d.ts.map +1 -0
- package/dist/agents/ids.d.ts +7 -0
- package/dist/agents/ids.d.ts.map +1 -1
- package/dist/agents/index.d.ts +20 -8
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +170 -84
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/memory-execution.d.ts +57 -0
- package/dist/agents/memory-execution.d.ts.map +1 -0
- package/dist/agents/memory.d.ts +49 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/message.d.ts +50 -1
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +19 -0
- package/dist/agents/model-loop.d.ts.map +1 -1
- package/dist/agents/model-routing.d.ts +19 -0
- package/dist/agents/model-routing.d.ts.map +1 -0
- package/dist/agents/participants.d.ts +18 -0
- package/dist/agents/participants.d.ts.map +1 -0
- package/dist/agents/reference.d.ts.map +1 -1
- package/dist/agents/request.d.ts +36 -2
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/run-scope.d.ts +51 -0
- package/dist/agents/run-scope.d.ts.map +1 -0
- package/dist/agents/skills.d.ts.map +1 -1
- package/dist/agents/streams/index.d.ts +3 -2
- package/dist/agents/streams/index.d.ts.map +1 -1
- package/dist/agents/streams/index.js +8 -4
- package/dist/agents/streams/index.js.map +1 -1
- package/dist/agents/streams/internal.d.ts +1 -1
- package/dist/agents/streams/internal.d.ts.map +1 -1
- package/dist/agents/streams/internal.js +6 -4
- package/dist/agents/streams/internal.js.map +1 -1
- package/dist/agents/streams/protocol.d.ts +122 -3
- package/dist/agents/streams/protocol.d.ts.map +1 -1
- package/dist/agents/subagent-runs.d.ts +12 -0
- package/dist/agents/subagent-runs.d.ts.map +1 -0
- package/dist/agents/thread-access.d.ts +53 -0
- package/dist/agents/thread-access.d.ts.map +1 -0
- package/dist/agents/tool-definition.d.ts +5 -4
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/types.d.ts +31 -12
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +1 -1
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/artifacts/access.d.ts +52 -0
- package/dist/artifacts/access.d.ts.map +1 -0
- package/dist/artifacts/address.d.ts +48 -0
- package/dist/artifacts/address.d.ts.map +1 -0
- package/dist/artifacts/canvas.d.ts +92 -0
- package/dist/artifacts/canvas.d.ts.map +1 -0
- package/dist/artifacts/csv.d.ts +27 -0
- package/dist/artifacts/csv.d.ts.map +1 -0
- package/dist/artifacts/errors.d.ts +16 -0
- package/dist/artifacts/errors.d.ts.map +1 -0
- package/dist/artifacts/execution.d.ts +138 -0
- package/dist/artifacts/execution.d.ts.map +1 -0
- package/dist/artifacts/formula/check.d.ts +24 -0
- package/dist/artifacts/formula/check.d.ts.map +1 -0
- package/dist/artifacts/formula/evaluate.d.ts +32 -0
- package/dist/artifacts/formula/evaluate.d.ts.map +1 -0
- package/dist/artifacts/formula/index.d.ts +38 -0
- package/dist/artifacts/formula/index.d.ts.map +1 -0
- package/dist/artifacts/formula/parser.d.ts +67 -0
- package/dist/artifacts/formula/parser.d.ts.map +1 -0
- package/dist/artifacts/frames/assets.d.ts +30 -0
- package/dist/artifacts/frames/assets.d.ts.map +1 -0
- package/dist/artifacts/frames/entries.d.ts +19 -0
- package/dist/artifacts/frames/entries.d.ts.map +1 -0
- package/dist/artifacts/frames/grants.d.ts +37 -0
- package/dist/artifacts/frames/grants.d.ts.map +1 -0
- package/dist/artifacts/frames/index.d.ts +12 -0
- package/dist/artifacts/frames/index.d.ts.map +1 -0
- package/dist/artifacts/frames/index.js +1285 -0
- package/dist/artifacts/frames/index.js.map +16 -0
- package/dist/artifacts/frames/kit.d.ts +71 -0
- package/dist/artifacts/frames/kit.d.ts.map +1 -0
- package/dist/artifacts/frames/probe.d.ts +45 -0
- package/dist/artifacts/frames/probe.d.ts.map +1 -0
- package/dist/artifacts/frames/protocol.d.ts +167 -0
- package/dist/artifacts/frames/protocol.d.ts.map +1 -0
- package/dist/artifacts/frames/runtime.d.ts +31 -0
- package/dist/artifacts/frames/runtime.d.ts.map +1 -0
- package/dist/artifacts/html.d.ts +6 -0
- package/dist/artifacts/html.d.ts.map +1 -0
- package/dist/artifacts/ids.d.ts +5 -0
- package/dist/artifacts/ids.d.ts.map +1 -0
- package/dist/artifacts/index.d.ts +22 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +247 -0
- package/dist/artifacts/index.js.map +10 -0
- package/dist/artifacts/kinds.d.ts +5 -0
- package/dist/artifacts/kinds.d.ts.map +1 -0
- package/dist/artifacts/limits.d.ts +58 -0
- package/dist/artifacts/limits.d.ts.map +1 -0
- package/dist/artifacts/live-sheet.d.ts +65 -0
- package/dist/artifacts/live-sheet.d.ts.map +1 -0
- package/dist/artifacts/outline.d.ts +70 -0
- package/dist/artifacts/outline.d.ts.map +1 -0
- package/dist/artifacts/publish/files.d.ts +15 -0
- package/dist/artifacts/publish/files.d.ts.map +1 -0
- package/dist/artifacts/publish/index.d.ts +7 -0
- package/dist/artifacts/publish/index.d.ts.map +1 -0
- package/dist/artifacts/publish/index.js +76 -0
- package/dist/{chunk-7n30ybym.js.map → artifacts/publish/index.js.map} +1 -1
- package/dist/artifacts/publish/publish.d.ts +84 -0
- package/dist/artifacts/publish/publish.d.ts.map +1 -0
- package/dist/artifacts/publish/queries.d.ts +33 -0
- package/dist/artifacts/publish/queries.d.ts.map +1 -0
- package/dist/artifacts/publish/references.d.ts +30 -0
- package/dist/artifacts/publish/references.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/canvas.d.ts +18 -0
- package/dist/artifacts/publish/validate/canvas.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/document.d.ts +17 -0
- package/dist/artifacts/publish/validate/document.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/file.d.ts +8 -0
- package/dist/artifacts/publish/validate/file.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/html.d.ts +20 -0
- package/dist/artifacts/publish/validate/html.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/page.d.ts +15 -0
- package/dist/artifacts/publish/validate/page.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/sheet.d.ts +23 -0
- package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/slides.d.ts +15 -0
- package/dist/artifacts/publish/validate/slides.d.ts.map +1 -0
- package/dist/artifacts/queries.d.ts +95 -0
- package/dist/artifacts/queries.d.ts.map +1 -0
- package/dist/artifacts/references.d.ts +12 -0
- package/dist/artifacts/references.d.ts.map +1 -0
- package/dist/artifacts/resolve.d.ts +47 -0
- package/dist/artifacts/resolve.d.ts.map +1 -0
- package/dist/artifacts/run-query.d.ts +26 -0
- package/dist/artifacts/run-query.d.ts.map +1 -0
- package/dist/artifacts/serialize-query.d.ts +12 -0
- package/dist/artifacts/serialize-query.d.ts.map +1 -0
- package/dist/artifacts/sheet-rules.d.ts +26 -0
- package/dist/artifacts/sheet-rules.d.ts.map +1 -0
- package/dist/artifacts/theme.d.ts +19 -0
- package/dist/artifacts/theme.d.ts.map +1 -0
- package/dist/artifacts/tones.d.ts +8 -0
- package/dist/artifacts/tones.d.ts.map +1 -0
- package/dist/artifacts/warnings.d.ts +11 -0
- package/dist/artifacts/warnings.d.ts.map +1 -0
- package/dist/artifacts/workbook.d.ts +135 -0
- package/dist/artifacts/workbook.d.ts.map +1 -0
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +16 -13
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/member-events.d.ts +13 -0
- package/dist/auth/member-events.d.ts.map +1 -0
- package/dist/auth/profile.d.ts +11 -0
- package/dist/auth/profile.d.ts.map +1 -0
- package/dist/auth/runtime.d.ts +31 -3
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/strategy.d.ts +3 -1
- package/dist/auth/strategy.d.ts.map +1 -1
- package/dist/auth/strategy.js +7 -3
- package/dist/auth/strategy.js.map +1 -1
- package/dist/auth/types.d.ts +30 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +17 -0
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/event-visibility.d.ts +5 -1
- package/dist/authorization/event-visibility.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +2 -2
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +2 -2
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +14 -9
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +19 -1
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/authorization/run-visibility.d.ts +8 -1
- package/dist/authorization/run-visibility.d.ts.map +1 -1
- package/dist/authorization/types.d.ts +14 -0
- package/dist/authorization/types.d.ts.map +1 -1
- package/dist/blob-storage/browser.js +1 -1
- package/dist/blob-storage/index.js +2 -2
- package/dist/blob-storage/internal.d.ts +1 -1
- package/dist/blob-storage/internal.d.ts.map +1 -1
- package/dist/blob-storage/internal.js +11 -5
- package/dist/blob-storage/internal.js.map +1 -1
- package/dist/blob-storage/media-type.d.ts +12 -0
- package/dist/blob-storage/media-type.d.ts.map +1 -1
- package/dist/bootstrap/index.js +76 -66
- package/dist/bootstrap/index.js.map +2 -2
- package/dist/{chunk-tg2cw67r.js → chunk-02bzjgnt.js} +6 -6
- package/dist/{chunk-tg2cw67r.js.map → chunk-02bzjgnt.js.map} +1 -1
- package/dist/{chunk-mfs23znk.js → chunk-07kkp2e1.js} +1 -1
- package/dist/{chunk-6p49a5cq.js → chunk-098anw4f.js} +21 -19
- package/dist/chunk-098anw4f.js.map +12 -0
- package/dist/{chunk-fkgc1wt8.js → chunk-0phpbbvm.js} +3 -3
- package/dist/{chunk-ere85b8y.js → chunk-0xmt5p5y.js} +116 -27
- package/dist/chunk-0xmt5p5y.js.map +14 -0
- package/dist/{chunk-t6f3tdnr.js → chunk-16a9dmfy.js} +33 -2
- package/dist/{chunk-t6f3tdnr.js.map → chunk-16a9dmfy.js.map} +5 -4
- package/dist/{chunk-hkc3jct7.js → chunk-18sk89cg.js} +18 -10
- package/dist/chunk-18sk89cg.js.map +10 -0
- package/dist/{chunk-way52z4h.js → chunk-1t6k1avb.js} +6 -12
- package/dist/{chunk-way52z4h.js.map → chunk-1t6k1avb.js.map} +3 -4
- package/dist/chunk-2626mh4m.js +693 -0
- package/dist/chunk-2626mh4m.js.map +19 -0
- package/dist/{chunk-qczk96d9.js → chunk-2adz0h75.js} +13 -4
- package/dist/chunk-2adz0h75.js.map +11 -0
- package/dist/{chunk-3t2hgbgd.js → chunk-2fn60nvs.js} +40 -8
- package/dist/chunk-2fn60nvs.js.map +15 -0
- package/dist/{chunk-99nd4rc1.js → chunk-2gjj5dx3.js} +5 -4
- package/dist/{chunk-99nd4rc1.js.map → chunk-2gjj5dx3.js.map} +3 -3
- package/dist/chunk-3fqxbn31.js +107 -0
- package/dist/chunk-3fqxbn31.js.map +11 -0
- package/dist/{chunk-y0c4e6ex.js → chunk-3gbefjg5.js} +1 -1
- package/dist/{chunk-yzwja0mj.js → chunk-45ngkxkp.js} +52 -31
- package/dist/chunk-45ngkxkp.js.map +13 -0
- package/dist/{chunk-fa02jy15.js → chunk-48jezz3j.js} +1 -1
- package/dist/{chunk-ren4kg2j.js → chunk-4b26qwbg.js} +13 -13
- package/dist/{chunk-ren4kg2j.js.map → chunk-4b26qwbg.js.map} +1 -1
- package/dist/{chunk-9k93ah50.js → chunk-4f3ydv7t.js} +33 -69
- package/dist/chunk-4f3ydv7t.js.map +10 -0
- package/dist/chunk-4y26vs3v.js +97 -0
- package/dist/chunk-4y26vs3v.js.map +10 -0
- package/dist/{chunk-4as3wt1c.js → chunk-4ymrcdbm.js} +7 -3
- package/dist/chunk-4ymrcdbm.js.map +12 -0
- package/dist/{chunk-hcbyfxbe.js → chunk-5grk14e5.js} +76 -2
- package/dist/{chunk-hcbyfxbe.js.map → chunk-5grk14e5.js.map} +4 -3
- package/dist/chunk-5tfev0fv.js +676 -0
- package/dist/chunk-5tfev0fv.js.map +15 -0
- package/dist/chunk-65abf64x.js +13 -0
- package/dist/chunk-65abf64x.js.map +10 -0
- package/dist/{chunk-hvsb78a1.js → chunk-65pyhyas.js} +114 -107
- package/dist/chunk-65pyhyas.js.map +20 -0
- package/dist/{chunk-1sr8ryzk.js → chunk-661ezhks.js} +303 -6
- package/dist/chunk-661ezhks.js.map +11 -0
- package/dist/{chunk-z3y5kg1x.js → chunk-6eqsgvxk.js} +3 -3
- package/dist/{chunk-z3y5kg1x.js.map → chunk-6eqsgvxk.js.map} +2 -2
- package/dist/{chunk-c85m1hyj.js → chunk-6n69k945.js} +2 -2
- package/dist/{chunk-xfs8x8m9.js → chunk-6p0pastb.js} +5 -5
- package/dist/{chunk-rrzt8jdy.js → chunk-6rrtzea3.js} +116 -110
- package/dist/chunk-6rrtzea3.js.map +14 -0
- package/dist/{chunk-t7x8dmn0.js → chunk-6y0mkhex.js} +3 -3
- package/dist/{chunk-es1gxsbf.js → chunk-73v685wb.js} +14 -16
- package/dist/chunk-73v685wb.js.map +12 -0
- package/dist/{chunk-6c6sn0bh.js → chunk-7gr4j2eq.js} +7930 -5973
- package/dist/chunk-7gr4j2eq.js.map +120 -0
- package/dist/{chunk-hjzdd750.js → chunk-7mc2wkre.js} +391 -91
- package/dist/chunk-7mc2wkre.js.map +50 -0
- package/dist/chunk-7z5p905k.js +1660 -0
- package/dist/chunk-7z5p905k.js.map +22 -0
- package/dist/{chunk-3zxk45er.js → chunk-8ncg20rd.js} +3 -68
- package/dist/{chunk-3zxk45er.js.map → chunk-8ncg20rd.js.map} +4 -5
- package/dist/{chunk-yxd3nnqt.js → chunk-9mab3dvg.js} +26 -2
- package/dist/chunk-9mab3dvg.js.map +11 -0
- package/dist/chunk-9wr3yajk.js +42 -0
- package/dist/chunk-9wr3yajk.js.map +10 -0
- package/dist/chunk-a3faa34j.js +74 -0
- package/dist/chunk-a3faa34j.js.map +10 -0
- package/dist/chunk-az47zep4.js +41 -0
- package/dist/chunk-az47zep4.js.map +10 -0
- package/dist/{chunk-v9xd5wzd.js → chunk-bab05bhg.js} +1 -1
- package/dist/{chunk-5j58wjct.js → chunk-bktev1ds.js} +14 -11
- package/dist/{chunk-5j58wjct.js.map → chunk-bktev1ds.js.map} +3 -3
- package/dist/{chunk-b38szspf.js → chunk-c0vk1djt.js} +5 -3
- package/dist/chunk-c0vk1djt.js.map +11 -0
- package/dist/chunk-c69nj7se.js +3 -0
- package/dist/chunk-c69nj7se.js.map +9 -0
- package/dist/{chunk-0yh890a4.js → chunk-c844dkwd.js} +35 -7
- package/dist/{chunk-0yh890a4.js.map → chunk-c844dkwd.js.map} +3 -3
- package/dist/{chunk-d09tj99x.js → chunk-cdk3egjj.js} +24 -5
- package/dist/chunk-cdk3egjj.js.map +12 -0
- package/dist/chunk-cswhawa2.js +113 -0
- package/dist/chunk-cswhawa2.js.map +10 -0
- package/dist/{chunk-gc4ntf7d.js → chunk-cwdzcv37.js} +1 -1
- package/dist/chunk-d2m879s4.js +288 -0
- package/dist/chunk-d2m879s4.js.map +12 -0
- package/dist/chunk-d7vyc7k6.js +10 -0
- package/dist/chunk-d7vyc7k6.js.map +10 -0
- package/dist/{chunk-vyf9kfqf.js → chunk-dp0cdtj2.js} +2 -2
- package/dist/{chunk-6x0pqh32.js → chunk-e5wf5vz0.js} +3 -1
- package/dist/chunk-e5wf5vz0.js.map +10 -0
- package/dist/{chunk-bx9q3cwv.js → chunk-efmm01gj.js} +108 -1045
- package/dist/chunk-efmm01gj.js.map +18 -0
- package/dist/{chunk-tw03bsmb.js → chunk-eptrvnby.js} +224 -3
- package/dist/chunk-eptrvnby.js.map +12 -0
- package/dist/{chunk-n33z5bjw.js → chunk-ezne9wc9.js} +1762 -502
- package/dist/chunk-ezne9wc9.js.map +71 -0
- package/dist/chunk-fe8zwt8b.js +688 -0
- package/dist/chunk-fe8zwt8b.js.map +19 -0
- package/dist/chunk-ff5xkv0p.js +211 -0
- package/dist/chunk-ff5xkv0p.js.map +10 -0
- package/dist/{chunk-br3k6qbf.js → chunk-fm62y49k.js} +1 -1
- package/dist/{chunk-nq6gpjt7.js → chunk-fntqb7qy.js} +30 -4
- package/dist/{chunk-nq6gpjt7.js.map → chunk-fntqb7qy.js.map} +5 -5
- package/dist/{chunk-1zq2p6g0.js → chunk-fp2kq35z.js} +26 -10
- package/dist/{chunk-1zq2p6g0.js.map → chunk-fp2kq35z.js.map} +5 -5
- package/dist/chunk-g5bvzyyr.js +32 -0
- package/dist/chunk-g5bvzyyr.js.map +10 -0
- package/dist/{chunk-9ybhtmg4.js → chunk-g663fahq.js} +2 -2
- package/dist/{chunk-k6q3n2sc.js → chunk-gvj5cd3b.js} +29 -13
- package/dist/chunk-gvj5cd3b.js.map +12 -0
- package/dist/{chunk-yevzdx4y.js → chunk-h33shhq6.js} +10 -12
- package/dist/{chunk-yevzdx4y.js.map → chunk-h33shhq6.js.map} +3 -4
- package/dist/{chunk-vpq4shxz.js → chunk-h3pbv7n8.js} +1771 -36
- package/dist/chunk-h3pbv7n8.js.map +48 -0
- package/dist/chunk-hke9aeen.js +9 -0
- package/dist/chunk-hke9aeen.js.map +10 -0
- package/dist/chunk-hn2r7z41.js.map +1 -1
- package/dist/{chunk-pbcbn83d.js → chunk-hqsp2sx4.js} +54 -8
- package/dist/chunk-hqsp2sx4.js.map +14 -0
- package/dist/{chunk-9w055r5b.js → chunk-hwarjrgf.js} +1 -1
- package/dist/{chunk-9dmt152s.js → chunk-hyesv9dv.js} +2 -2
- package/dist/chunk-hz5d43gn.js +45 -0
- package/dist/chunk-hz5d43gn.js.map +10 -0
- package/dist/{chunk-91mg3nj9.js → chunk-j936th07.js} +86 -41
- package/dist/chunk-j936th07.js.map +12 -0
- package/dist/chunk-jcfw4h7m.js +9 -0
- package/dist/chunk-jcfw4h7m.js.map +10 -0
- package/dist/chunk-kcqpk9w1.js +75 -0
- package/dist/chunk-kcqpk9w1.js.map +10 -0
- package/dist/{chunk-x6m907x7.js → chunk-m2nevja0.js} +6 -7
- package/dist/{chunk-x6m907x7.js.map → chunk-m2nevja0.js.map} +3 -3
- package/dist/{chunk-x9v4cx1d.js → chunk-m36fw8ft.js} +1 -1
- package/dist/{chunk-a40ad1ft.js → chunk-mbsbxarb.js} +1 -1
- package/dist/chunk-mzx71snp.js +129 -0
- package/dist/chunk-mzx71snp.js.map +10 -0
- package/dist/{chunk-6aawea28.js → chunk-n8q5j6y5.js} +1 -1
- package/dist/{chunk-dk8tkk5f.js → chunk-n9zpx9c6.js} +4 -4
- package/dist/{chunk-7t429e3f.js → chunk-npcr0228.js} +1 -1
- package/dist/chunk-nydf3dbe.js +663 -0
- package/dist/chunk-nydf3dbe.js.map +13 -0
- package/dist/chunk-pdt5cw8z.js +233 -0
- package/dist/chunk-pdt5cw8z.js.map +11 -0
- package/dist/{chunk-rj69qcrd.js → chunk-pgrf64hp.js} +55 -7
- package/dist/chunk-pgrf64hp.js.map +12 -0
- package/dist/{chunk-z4m0yz8c.js → chunk-q4pmvkg0.js} +1 -1
- package/dist/chunk-qhqgp4jf.js +1418 -0
- package/dist/chunk-qhqgp4jf.js.map +22 -0
- package/dist/chunk-qx00vjrj.js +144 -0
- package/dist/chunk-qx00vjrj.js.map +13 -0
- package/dist/{chunk-5e43w60z.js → chunk-r6szek0x.js} +184 -7
- package/dist/chunk-r6szek0x.js.map +10 -0
- package/dist/{chunk-v4jbb3rs.js → chunk-rap5w0x0.js} +156 -2
- package/dist/chunk-rap5w0x0.js.map +10 -0
- package/dist/{chunk-pfp1txq2.js → chunk-sgx82nnt.js} +5 -31
- package/dist/{chunk-pfp1txq2.js.map → chunk-sgx82nnt.js.map} +3 -4
- package/dist/{chunk-bkpke1sg.js → chunk-t5608tkq.js} +3 -1
- package/dist/{chunk-bkpke1sg.js.map → chunk-t5608tkq.js.map} +3 -3
- package/dist/{chunk-29yx306f.js → chunk-tdxfsg1c.js} +507 -265
- package/dist/chunk-tdxfsg1c.js.map +23 -0
- package/dist/chunk-vabga7fk.js +176 -0
- package/dist/chunk-vabga7fk.js.map +12 -0
- package/dist/{chunk-gsjm1wms.js → chunk-vhbw5sqm.js} +33 -3
- package/dist/chunk-vhbw5sqm.js.map +10 -0
- package/dist/{chunk-tpn40322.js → chunk-vpgwq5nf.js} +104 -17
- package/dist/chunk-vpgwq5nf.js.map +21 -0
- package/dist/{chunk-0rbyz4qy.js → chunk-vyt322b6.js} +586 -171
- package/dist/{chunk-0rbyz4qy.js.map → chunk-vyt322b6.js.map} +12 -9
- package/dist/chunk-waqk73p1.js +2380 -0
- package/dist/chunk-waqk73p1.js.map +23 -0
- package/dist/{chunk-jhm3zsa7.js → chunk-wkv3h3q7.js} +64 -2
- package/dist/{chunk-jhm3zsa7.js.map → chunk-wkv3h3q7.js.map} +3 -3
- package/dist/chunk-wsc1brye.js +27 -0
- package/dist/chunk-wsc1brye.js.map +10 -0
- package/dist/chunk-x0v3jd47.js +124 -0
- package/dist/chunk-x0v3jd47.js.map +10 -0
- package/dist/{chunk-96yw3pwd.js → chunk-y7dbmaqh.js} +28 -2
- package/dist/chunk-y7dbmaqh.js.map +10 -0
- package/dist/{chunk-d0bqz29d.js → chunk-yc9ners4.js} +124 -19
- package/dist/{chunk-d0bqz29d.js.map → chunk-yc9ners4.js.map} +8 -8
- package/dist/{chunk-8mx7qw3y.js → chunk-zbc929zg.js} +29 -5
- package/dist/chunk-zbc929zg.js.map +13 -0
- package/dist/chunk-zrvhsq7f.js +37 -0
- package/dist/chunk-zrvhsq7f.js.map +10 -0
- package/dist/datasets/builders.d.ts +15 -2
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/column-index.d.ts +7 -0
- package/dist/datasets/column-index.d.ts.map +1 -0
- package/dist/datasets/execution.d.ts +3 -2
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/write.js +8 -8
- package/dist/error-reporting/internal.js +4 -4
- package/dist/errors/catalog.d.ts +26 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/internal.d.ts +1 -0
- package/dist/errors/internal.d.ts.map +1 -1
- package/dist/errors/internal.js +7 -4
- package/dist/errors/internal.js.map +1 -1
- package/dist/events/definitions.d.ts +7 -0
- package/dist/events/definitions.d.ts.map +1 -1
- package/dist/events/execution.d.ts +12 -2
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.d.ts +2 -3
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +9 -11
- package/dist/events/index.js.map +1 -1
- package/dist/events/scope.d.ts.map +1 -1
- package/dist/events/scope.js +1 -1
- package/dist/events/selectors/builder.d.ts +12 -1
- 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/types.d.ts +19 -3
- package/dist/events/selectors/types.d.ts.map +1 -1
- package/dist/events/service.d.ts +17 -2
- package/dist/events/service.d.ts.map +1 -1
- package/dist/events/types/index.d.ts +3 -1
- package/dist/events/types/index.d.ts.map +1 -1
- package/dist/events/types/users.d.ts +63 -0
- package/dist/events/types/users.d.ts.map +1 -0
- package/dist/events/view-conditions.d.ts +34 -0
- package/dist/events/view-conditions.d.ts.map +1 -0
- package/dist/execution/agent.d.ts +15 -0
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +72 -59
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +102 -12
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/lineage.d.ts +7 -0
- package/dist/execution/lineage.d.ts.map +1 -0
- package/dist/execution/object-reader-clearance.d.ts +41 -0
- package/dist/execution/object-reader-clearance.d.ts.map +1 -0
- package/dist/execution/object-reader-ontology.d.ts +12 -0
- package/dist/execution/object-reader-ontology.d.ts.map +1 -0
- package/dist/execution/object-reader-security.d.ts +66 -0
- package/dist/execution/object-reader-security.d.ts.map +1 -0
- package/dist/execution/object-reader-users.d.ts +20 -0
- package/dist/execution/object-reader-users.d.ts.map +1 -0
- package/dist/execution/preparation.d.ts +23 -0
- package/dist/execution/preparation.d.ts.map +1 -0
- package/dist/execution/primitive.js +70 -59
- package/dist/execution/primitive.js.map +1 -1
- package/dist/execution/request.d.ts +2 -1
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +72 -57
- package/dist/execution/request.js.map +3 -3
- package/dist/execution/unique-lookup.d.ts +14 -0
- package/dist/execution/unique-lookup.d.ts.map +1 -0
- package/dist/execution/visible-objects.d.ts +12 -0
- package/dist/execution/visible-objects.d.ts.map +1 -0
- package/dist/http/api-routes.d.ts +17 -0
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +49 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +168 -142
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +1 -0
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +6 -3
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +21 -13
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/lineage.d.ts +94 -0
- package/dist/lake-storage/lineage.d.ts.map +1 -0
- package/dist/lake-storage/sql-transforms.d.ts +45 -0
- package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
- package/dist/lake-storage/types.d.ts +55 -1
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/lake-storage/version-inputs.d.ts +14 -3
- package/dist/lake-storage/version-inputs.d.ts.map +1 -1
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
- package/dist/materialization/errors.d.ts +25 -0
- package/dist/materialization/errors.d.ts.map +1 -1
- package/dist/materialization/event-envelopes.d.ts +5 -0
- package/dist/materialization/event-envelopes.d.ts.map +1 -1
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +14 -8
- package/dist/materialization/index.js.map +1 -1
- package/dist/materialization/model.d.ts +20 -2
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/edits/commit.d.ts.map +1 -1
- package/dist/materializer/edits/load-state.d.ts +5 -1
- package/dist/materializer/edits/load-state.d.ts.map +1 -1
- package/dist/materializer/edits/plan.d.ts.map +1 -1
- package/dist/materializer/edits/unique-values.d.ts +47 -0
- package/dist/materializer/edits/unique-values.d.ts.map +1 -0
- package/dist/materializer/edits/working-state.d.ts +6 -1
- package/dist/materializer/edits/working-state.d.ts.map +1 -1
- package/dist/materializer/execution/work-records.d.ts +7 -1
- package/dist/materializer/execution/work-records.d.ts.map +1 -1
- package/dist/materializer/index.js +51 -46
- package/dist/materializer/index.js.map +1 -1
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
- package/dist/materializer/projections/source-materialization.d.ts +1 -0
- package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/materializer/shared/projection-run.d.ts +0 -1
- package/dist/materializer/shared/projection-run.d.ts.map +1 -1
- package/dist/materializer/telemetry/plan.d.ts.map +1 -1
- package/dist/models/audio/catalog.d.ts +13 -1
- package/dist/models/audio/catalog.d.ts.map +1 -1
- package/dist/models/audio/errors.d.ts +6 -1
- package/dist/models/audio/errors.d.ts.map +1 -1
- package/dist/models/audio/runtime.d.ts.map +1 -1
- package/dist/models/audio/speech.d.ts +8 -0
- package/dist/models/audio/speech.d.ts.map +1 -0
- package/dist/models/audio/types.d.ts +93 -0
- package/dist/models/audio/types.d.ts.map +1 -1
- package/dist/models/calls.d.ts +27 -0
- package/dist/models/calls.d.ts.map +1 -0
- package/dist/models/catalog-index.d.ts +7 -4
- package/dist/models/catalog-index.d.ts.map +1 -1
- package/dist/models/catalog.d.ts +55 -3
- package/dist/models/catalog.d.ts.map +1 -1
- package/dist/models/decision/runtime.d.ts +6 -1
- package/dist/models/decision/runtime.d.ts.map +1 -1
- package/dist/models/decision/validation.d.ts +4 -1
- package/dist/models/decision/validation.d.ts.map +1 -1
- package/dist/models/definitions.d.ts +23 -1
- package/dist/models/definitions.d.ts.map +1 -1
- package/dist/models/events.d.ts +12 -1
- package/dist/models/events.d.ts.map +1 -1
- package/dist/models/execution/binding.d.ts +3 -1
- package/dist/models/execution/binding.d.ts.map +1 -1
- package/dist/models/execution/index.d.ts +1 -0
- package/dist/models/execution/index.d.ts.map +1 -1
- package/dist/models/execution/index.js +50 -39
- package/dist/models/execution/index.js.map +1 -1
- package/dist/models/execution/model-call-accounting.d.ts.map +1 -1
- package/dist/models/execution/model-call-recorder.d.ts +3 -0
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
- package/dist/models/execution/usage.d.ts.map +1 -1
- package/dist/models/execution.d.ts +4 -2
- package/dist/models/execution.d.ts.map +1 -1
- package/dist/models/generation-types.d.ts +8 -1
- package/dist/models/generation-types.d.ts.map +1 -1
- package/dist/models/image/catalog.d.ts +13 -0
- package/dist/models/image/catalog.d.ts.map +1 -0
- package/dist/models/image/errors.d.ts +8 -0
- package/dist/models/image/errors.d.ts.map +1 -0
- package/dist/models/image/runtime.d.ts +8 -0
- package/dist/models/image/runtime.d.ts.map +1 -0
- package/dist/models/image/types.d.ts +103 -0
- package/dist/models/image/types.d.ts.map +1 -0
- package/dist/models/index.d.ts +12 -8
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +17 -7
- package/dist/models/index.js.map +1 -1
- package/dist/models/input-file.d.ts +9 -0
- package/dist/models/input-file.d.ts.map +1 -0
- package/dist/models/language-model.d.ts +13 -0
- package/dist/models/language-model.d.ts.map +1 -1
- package/dist/models/pricing.d.ts +25 -10
- package/dist/models/pricing.d.ts.map +1 -1
- package/dist/models/rate-card.d.ts +44 -6
- package/dist/models/rate-card.d.ts.map +1 -1
- package/dist/objects/clearance-redaction.d.ts +27 -0
- package/dist/objects/clearance-redaction.d.ts.map +1 -0
- package/dist/objects/conditional-writes.d.ts +37 -0
- package/dist/objects/conditional-writes.d.ts.map +1 -0
- package/dist/objects/execution.d.ts +2 -0
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.d.ts +1 -0
- package/dist/objects/index.d.ts.map +1 -1
- package/dist/objects/index.js +77 -60
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +11 -5
- package/dist/objects/link/authorization.d.ts.map +1 -1
- package/dist/objects/link/endpoints.d.ts +21 -2
- package/dist/objects/link/endpoints.d.ts.map +1 -1
- package/dist/objects/link/remove.d.ts.map +1 -1
- package/dist/objects/link/upsert-batch.d.ts.map +1 -1
- package/dist/objects/link/upsert.d.ts.map +1 -1
- package/dist/objects/materializer-adapter.d.ts +13 -4
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/object/delete.d.ts +3 -0
- package/dist/objects/object/delete.d.ts.map +1 -1
- package/dist/objects/object/upsert-batch.d.ts.map +1 -1
- package/dist/objects/object/upsert.d.ts.map +1 -1
- package/dist/objects/property-clearance.d.ts +47 -24
- package/dist/objects/property-clearance.d.ts.map +1 -1
- package/dist/objects/query/clearance-admission.d.ts +10 -0
- package/dist/objects/query/clearance-admission.d.ts.map +1 -0
- package/dist/objects/query/current-user.d.ts +17 -0
- package/dist/objects/query/current-user.d.ts.map +1 -0
- package/dist/objects/query/executor.d.ts +14 -0
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.d.ts +2 -2
- package/dist/objects/query/index.d.ts.map +1 -1
- package/dist/objects/query/index.js +55 -49
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/ir.d.ts +19 -1
- package/dist/objects/query/ir.d.ts.map +1 -1
- package/dist/objects/query/link-query-clearance.d.ts +21 -0
- package/dist/objects/query/link-query-clearance.d.ts.map +1 -0
- package/dist/objects/query/matches-predicate.d.ts +9 -0
- package/dist/objects/query/matches-predicate.d.ts.map +1 -0
- package/dist/objects/query/normalize.d.ts.map +1 -1
- package/dist/objects/query/user-expansions.d.ts +27 -0
- package/dist/objects/query/user-expansions.d.ts.map +1 -0
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/runtime-batch.d.ts +3 -1
- package/dist/objects/runtime-batch.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/query-executor.d.ts +6 -0
- package/dist/objects/sdk/query-executor.d.ts.map +1 -1
- package/dist/objects/serialize.d.ts +39 -0
- package/dist/objects/serialize.d.ts.map +1 -0
- package/dist/objects/unique-violation.d.ts +22 -0
- package/dist/objects/unique-violation.d.ts.map +1 -0
- package/dist/ontology/builders.d.ts +3 -1
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/docs-markdown.d.ts +1 -1
- package/dist/ontology/docs-markdown.d.ts.map +1 -1
- package/dist/ontology/index.d.ts +2 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +13 -9
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/internal.js +9 -7
- package/dist/ontology/internal.js.map +3 -3
- package/dist/ontology/json-schema.d.ts.map +1 -1
- package/dist/ontology/primitives.d.ts +3 -0
- package/dist/ontology/primitives.d.ts.map +1 -1
- package/dist/ontology/registry.d.ts +6 -0
- package/dist/ontology/registry.d.ts.map +1 -1
- package/dist/ontology/types.d.ts +9 -0
- package/dist/ontology/types.d.ts.map +1 -1
- package/dist/ontology/unique-values.d.ts +26 -0
- package/dist/ontology/unique-values.d.ts.map +1 -0
- package/dist/ontology/user-ref.d.ts +23 -0
- package/dist/ontology/user-ref.d.ts.map +1 -1
- package/dist/ontology/validation/properties.d.ts.map +1 -1
- package/dist/ontology/validation/schema.d.ts.map +1 -1
- package/dist/pipelines/index.d.ts +2 -0
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +61 -46
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/lineage.d.ts +17 -0
- package/dist/pipelines/lineage.d.ts.map +1 -0
- package/dist/projections/internal.d.ts +2 -2
- package/dist/projections/internal.js +42 -38
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/registry.d.ts +4 -0
- package/dist/projections/registry.d.ts.map +1 -1
- package/dist/projections/revision.d.ts +15 -0
- package/dist/projections/revision.d.ts.map +1 -1
- package/dist/projections/run-dispatch.d.ts.map +1 -1
- package/dist/projections/types.d.ts +2 -0
- package/dist/projections/types.d.ts.map +1 -1
- package/dist/query.d.ts +4 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +2 -2
- package/dist/rules/execution.d.ts.map +1 -1
- package/dist/runtime/ai-cost.d.ts +2 -0
- package/dist/runtime/ai-cost.d.ts.map +1 -1
- package/dist/runtime/ai-usage.d.ts +7 -0
- package/dist/runtime/ai-usage.d.ts.map +1 -1
- package/dist/runtime/create.d.ts +3 -0
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +6 -0
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +2 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +58 -50
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/ontology-mutations.d.ts +2 -0
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +10 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +66 -8
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/auth.d.ts +16 -0
- package/dist/sandboxes/auth.d.ts.map +1 -1
- package/dist/sandboxes/config.d.ts.map +1 -1
- package/dist/sandboxes/configuration.d.ts +26 -0
- package/dist/sandboxes/configuration.d.ts.map +1 -1
- package/dist/sandboxes/index.d.ts +1 -1
- package/dist/sandboxes/index.d.ts.map +1 -1
- package/dist/sandboxes/index.js +15 -13
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/sandboxes/sandbox.d.ts +28 -5
- package/dist/sandboxes/sandbox.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/security/applied-markings-contribution.d.ts +58 -0
- package/dist/security/applied-markings-contribution.d.ts.map +1 -0
- package/dist/security/applied-markings-host.d.ts +10 -0
- package/dist/security/applied-markings-host.d.ts.map +1 -0
- package/dist/security/applied-markings-snapshot.d.ts +67 -0
- package/dist/security/applied-markings-snapshot.d.ts.map +1 -0
- package/dist/security/applied-markings.d.ts +73 -0
- package/dist/security/applied-markings.d.ts.map +1 -0
- package/dist/security/dataset-version-markings.d.ts +47 -0
- package/dist/security/dataset-version-markings.d.ts.map +1 -0
- package/dist/security/grants.d.ts +13 -4
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +2 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/internal.d.ts +15 -0
- package/dist/security/internal.d.ts.map +1 -0
- package/dist/security/internal.js +135 -0
- package/dist/security/internal.js.map +10 -0
- package/dist/security/marking-propagation.d.ts +62 -0
- package/dist/security/marking-propagation.d.ts.map +1 -0
- package/dist/security/marking-sets.d.ts +14 -0
- package/dist/security/marking-sets.d.ts.map +1 -0
- package/dist/security/markings.d.ts +6 -3
- package/dist/security/markings.d.ts.map +1 -1
- package/dist/security/pipeline-markings.d.ts +20 -0
- package/dist/security/pipeline-markings.d.ts.map +1 -0
- package/dist/security/project.d.ts +7 -0
- package/dist/security/project.d.ts.map +1 -0
- package/dist/security/projection-markings.d.ts +71 -0
- package/dist/security/projection-markings.d.ts.map +1 -0
- package/dist/security/public.js +2 -2
- package/dist/security/redactions.d.ts +4 -1
- package/dist/security/redactions.d.ts.map +1 -1
- package/dist/security/registry.d.ts +6 -0
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +64 -6
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/security/view-conditions.d.ts +37 -0
- package/dist/security/view-conditions.d.ts.map +1 -0
- package/dist/shares/execution.d.ts.map +1 -1
- package/dist/shares/internal.js +40 -36
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +3 -3
- package/dist/storage/action-runs/in-memory.d.ts +4 -0
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/provider.js +1 -1
- package/dist/storage/action-runs/types.d.ts +9 -1
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/activity/in-memory.d.ts +55 -0
- package/dist/storage/activity/in-memory.d.ts.map +1 -0
- package/dist/storage/activity/index.d.ts +3 -0
- package/dist/storage/activity/index.d.ts.map +1 -0
- package/dist/storage/activity/policy.d.ts +96 -0
- package/dist/storage/activity/policy.d.ts.map +1 -0
- package/dist/storage/activity/types.d.ts +191 -0
- package/dist/storage/activity/types.d.ts.map +1 -0
- package/dist/storage/agents/errors.d.ts +3 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +124 -3
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +2 -2
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +154 -4
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +60 -8
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +573 -20
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +10 -1
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
- package/dist/storage/ai-cost/groups.d.ts +9 -0
- package/dist/storage/ai-cost/groups.d.ts.map +1 -1
- package/dist/storage/ai-cost/index.d.ts +1 -1
- package/dist/storage/ai-cost/index.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.d.ts +2 -1
- package/dist/storage/ai-cost/provider.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +11 -5
- package/dist/storage/ai-cost/provider.js.map +1 -1
- package/dist/storage/ai-cost/types.d.ts +14 -2
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/validation.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +6 -5
- package/dist/storage/ai-limits/enforcement.js.map +1 -1
- package/dist/storage/ai-limits/provider.d.ts +1 -1
- package/dist/storage/ai-limits/provider.d.ts.map +1 -1
- package/dist/storage/ai-limits/provider.js +3 -2
- package/dist/storage/ai-limits/provider.js.map +1 -1
- package/dist/storage/ai-usage/in-memory.d.ts +5 -1
- package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
- package/dist/storage/ai-usage/index.d.ts +2 -2
- package/dist/storage/ai-usage/index.d.ts.map +1 -1
- package/dist/storage/ai-usage/record.d.ts +5 -1
- package/dist/storage/ai-usage/record.d.ts.map +1 -1
- package/dist/storage/ai-usage/types.d.ts +33 -0
- package/dist/storage/ai-usage/types.d.ts.map +1 -1
- package/dist/storage/ai-usage/usage.d.ts +2 -0
- package/dist/storage/ai-usage/usage.d.ts.map +1 -1
- package/dist/storage/artifacts/errors.d.ts +18 -0
- package/dist/storage/artifacts/errors.d.ts.map +1 -0
- package/dist/storage/artifacts/in-memory.d.ts +55 -0
- package/dist/storage/artifacts/in-memory.d.ts.map +1 -0
- package/dist/storage/artifacts/index.d.ts +5 -0
- package/dist/storage/artifacts/index.d.ts.map +1 -0
- package/dist/storage/artifacts/record.d.ts +34 -0
- package/dist/storage/artifacts/record.d.ts.map +1 -0
- package/dist/storage/artifacts/types.d.ts +263 -0
- package/dist/storage/artifacts/types.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/auth-storage.d.ts +3 -2
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/sessions.d.ts +2 -1
- package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/users.d.ts +7 -3
- package/dist/storage/auth/in-memory/users.d.ts.map +1 -1
- package/dist/storage/auth/index.d.ts +1 -1
- package/dist/storage/auth/index.d.ts.map +1 -1
- package/dist/storage/auth/types.d.ts +59 -9
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +2 -2
- package/dist/storage/executions/in-memory.d.ts +3 -1
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/index.d.ts +1 -1
- package/dist/storage/executions/index.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +2 -0
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +9 -223
- package/dist/storage/executions/provider.js.map +3 -4
- package/dist/storage/executions/types.d.ts +46 -0
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.js +17 -14
- package/dist/storage/file-upload-sessions/provider.js.map +1 -1
- package/dist/storage/in-memory/index.d.ts +8 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +15 -11
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +78 -66
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +4 -1
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +80 -19
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/migrations/migrate-storage.d.ts +4 -1
- package/dist/storage/migrations/migrate-storage.d.ts.map +1 -1
- package/dist/storage/migrations/prepare-unique-properties.d.ts +18 -0
- package/dist/storage/migrations/prepare-unique-properties.d.ts.map +1 -0
- package/dist/storage/objects/guard.d.ts +1 -1
- package/dist/storage/objects/guard.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/conditional-reader.d.ts +5 -0
- package/dist/storage/objects/in-memory/conditional-reader.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/read-scope.d.ts +3 -9
- package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/read-source.d.ts +10 -1
- package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/scoped-reader.d.ts +14 -0
- package/dist/storage/objects/in-memory/scoped-reader.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
- package/dist/storage/objects/in-memory/storage.d.ts +36 -1
- package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
- package/dist/storage/objects/index.d.ts +2 -2
- package/dist/storage/objects/index.d.ts.map +1 -1
- package/dist/storage/objects/read-scope.d.ts +9 -1
- package/dist/storage/objects/read-scope.d.ts.map +1 -1
- package/dist/storage/objects/types.d.ts +64 -1
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/index.d.ts +2 -0
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +1 -0
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/replacement-plans.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/sources.d.ts +2 -1
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/unique-values.d.ts +32 -0
- package/dist/storage/ontology/in-memory/unique-values.d.ts.map +1 -0
- package/dist/storage/ontology/index.d.ts +5 -2
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/materializations.d.ts +34 -1
- package/dist/storage/ontology/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/provider-work.d.ts +15 -2
- package/dist/storage/ontology/provider-work.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +1 -1
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +9 -4
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/ontology/sources.d.ts +15 -0
- package/dist/storage/ontology/sources.d.ts.map +1 -1
- package/dist/storage/ontology/unique-values.d.ts +54 -0
- package/dist/storage/ontology/unique-values.d.ts.map +1 -0
- package/dist/storage/operation-scope.d.ts +1 -1
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +1 -1
- package/dist/storage/projection-runs/in-memory.d.ts +0 -6
- package/dist/storage/projection-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.js +3 -3
- package/dist/storage/share-grants/in-memory.d.ts +2 -1
- package/dist/storage/share-grants/in-memory.d.ts.map +1 -1
- package/dist/storage/share-grants/index.d.ts +1 -1
- package/dist/storage/share-grants/index.d.ts.map +1 -1
- package/dist/storage/share-grants/provider.js +4 -3
- package/dist/storage/share-grants/provider.js.map +1 -1
- package/dist/storage/share-grants/types.d.ts +6 -0
- package/dist/storage/share-grants/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +6 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts +4 -0
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +18 -14
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/types.d.ts +5 -0
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +49 -45
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/action-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/activity-storage-contract.d.ts +14 -0
- package/dist/testing/activity-storage-contract.d.ts.map +1 -0
- package/dist/testing/agent-approval-storage-contract.d.ts +17 -0
- package/dist/testing/agent-approval-storage-contract.d.ts.map +1 -0
- package/dist/testing/agent-memory-storage-contract.d.ts +12 -0
- package/dist/testing/agent-memory-storage-contract.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-limit-storage-contract.d.ts +0 -1
- package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -1
- package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
- package/dist/testing/artifact-storage-contract.d.ts +13 -0
- package/dist/testing/artifact-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts +13 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts +5 -0
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/effective-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/file-upload-session-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +11 -5
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +9340 -3794
- package/dist/testing/index.js.map +32 -26
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
- package/dist/testing/lake-storage-contract.d.ts +2 -0
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/object-conditional-read-scope-contract.d.ts +11 -0
- package/dist/testing/object-conditional-read-scope-contract.d.ts.map +1 -0
- package/dist/testing/object-query-contract.d.ts +0 -2
- package/dist/testing/object-query-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/queues-contract.d.ts +5 -0
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/testing/sandboxes-contract.d.ts.map +1 -1
- package/dist/testing/share-grant-storage-contract.d.ts.map +1 -1
- package/dist/testing/share-session-storage-contract.d.ts.map +1 -1
- package/dist/testing/unique-values-contract.d.ts +21 -0
- package/dist/testing/unique-values-contract.d.ts.map +1 -0
- package/dist/testing/webhook-execution.d.ts +0 -8
- package/dist/testing/webhook-execution.d.ts.map +1 -1
- package/dist/testing/webhook-run-storage-contract.d.ts.map +1 -1
- package/dist/users/execution.d.ts +40 -0
- package/dist/users/execution.d.ts.map +1 -0
- package/dist/users/index.d.ts +3 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/webhooks/internal.js +42 -38
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +5 -7
- package/dist/workers/index.js.map +4 -4
- package/dist/workers/queue-worker.d.ts +0 -2
- package/dist/workers/queue-worker.d.ts.map +1 -1
- package/dist/workers/worker.d.ts +0 -2
- package/dist/workers/worker.d.ts.map +1 -1
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +76 -66
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts +12 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +15 -2
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +7 -0
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +25 -1
- package/src/actions/commit-edits.ts +6 -1
- package/src/actions/execution.ts +55 -23
- package/src/actions/read-facade.ts +33 -0
- package/src/actions/request.ts +234 -66
- package/src/actions/run/context.ts +47 -1
- package/src/actions/run/execute.ts +13 -6
- package/src/actions/run/executor.ts +11 -2
- package/src/actions/run/normalize.ts +12 -2
- package/src/actions/run/phases.ts +2 -0
- package/src/actions/run/run-action.ts +12 -3
- package/src/actions/run/signals.ts +3 -9
- package/src/actions/run/types.ts +17 -1
- package/src/actions/run-authorization.ts +95 -0
- package/src/actions/types/context.ts +20 -3
- package/src/actions/validators.ts +19 -8
- package/src/activity/README.md +158 -0
- package/src/activity/connection.ts +217 -0
- package/src/activity/device.ts +41 -0
- package/src/activity/execution.ts +210 -0
- package/src/activity/service.ts +274 -0
- package/src/activity/shares.ts +62 -0
- package/src/activity/timeline.ts +385 -0
- package/src/agents/accounting.ts +59 -0
- package/src/agents/adapters.ts +10 -0
- package/src/agents/agent-mail.ts +29 -0
- package/src/agents/api-gateway.ts +14 -3
- package/src/agents/approval-continuation.ts +48 -0
- package/src/agents/approval-executor.ts +318 -0
- package/src/agents/approval-outcome.ts +59 -0
- package/src/agents/approvals.ts +566 -0
- package/src/agents/authority.ts +24 -1
- package/src/agents/builders.ts +5 -3
- package/src/agents/cancel.ts +103 -0
- package/src/agents/child-question.ts +46 -0
- package/src/agents/children.ts +404 -0
- package/src/agents/context-compaction.ts +12 -0
- package/src/agents/errors.ts +31 -0
- package/src/agents/execution.ts +788 -90
- package/src/agents/fork.ts +158 -0
- package/src/agents/ids.ts +18 -6
- package/src/agents/index.ts +63 -3
- package/src/agents/memory-execution.ts +186 -0
- package/src/agents/memory.ts +178 -0
- package/src/agents/message.ts +57 -0
- package/src/agents/model-loop.ts +93 -6
- package/src/agents/model-routing.ts +193 -0
- package/src/agents/participants.ts +213 -0
- package/src/agents/reference.ts +2 -0
- package/src/agents/request.ts +398 -64
- package/src/agents/run-scope.ts +134 -0
- package/src/agents/skills.ts +6 -0
- package/src/agents/streams/index.ts +5 -0
- package/src/agents/streams/internal.ts +1 -0
- package/src/agents/streams/protocol.ts +385 -7
- package/src/agents/subagent-runs.ts +41 -0
- package/src/agents/thread-access.ts +137 -0
- package/src/agents/tool-definition.ts +5 -3
- package/src/agents/types.ts +43 -18
- package/src/agents/validation.ts +4 -0
- package/src/artifacts/access.ts +125 -0
- package/src/artifacts/address.ts +132 -0
- package/src/artifacts/canvas.ts +369 -0
- package/src/artifacts/csv.ts +118 -0
- package/src/artifacts/errors.ts +32 -0
- package/src/artifacts/execution.ts +553 -0
- package/src/artifacts/formula/check.ts +171 -0
- package/src/artifacts/formula/evaluate.ts +288 -0
- package/src/artifacts/formula/index.ts +199 -0
- package/src/artifacts/formula/parser.ts +357 -0
- package/src/artifacts/frames/assets.ts +104 -0
- package/src/artifacts/frames/entries.ts +35 -0
- package/src/artifacts/frames/grants.ts +125 -0
- package/src/artifacts/frames/index.ts +21 -0
- package/src/artifacts/frames/kit.ts +569 -0
- package/src/artifacts/frames/probe.ts +357 -0
- package/src/artifacts/frames/protocol.ts +328 -0
- package/src/artifacts/frames/runtime.ts +458 -0
- package/src/artifacts/html.ts +25 -0
- package/src/artifacts/ids.ts +18 -0
- package/src/artifacts/index.ts +125 -0
- package/src/artifacts/kinds.ts +8 -0
- package/src/artifacts/limits.ts +58 -0
- package/src/artifacts/live-sheet.ts +345 -0
- package/src/artifacts/outline.ts +95 -0
- package/src/artifacts/publish/files.ts +87 -0
- package/src/artifacts/publish/index.ts +14 -0
- package/src/artifacts/publish/publish.ts +336 -0
- package/src/artifacts/publish/queries.ts +336 -0
- package/src/artifacts/publish/references.ts +135 -0
- package/src/artifacts/publish/validate/canvas.ts +118 -0
- package/src/artifacts/publish/validate/document.ts +114 -0
- package/src/artifacts/publish/validate/file.ts +19 -0
- package/src/artifacts/publish/validate/html.ts +78 -0
- package/src/artifacts/publish/validate/page.ts +65 -0
- package/src/artifacts/publish/validate/sheet.ts +297 -0
- package/src/artifacts/publish/validate/slides.ts +82 -0
- package/src/artifacts/queries.ts +512 -0
- package/src/artifacts/references.ts +11 -0
- package/src/artifacts/resolve.ts +112 -0
- package/src/artifacts/run-query.ts +212 -0
- package/src/artifacts/serialize-query.ts +25 -0
- package/src/artifacts/sheet-rules.ts +180 -0
- package/src/artifacts/theme.ts +116 -0
- package/src/artifacts/tones.ts +20 -0
- package/src/artifacts/warnings.ts +10 -0
- package/src/artifacts/workbook.ts +674 -0
- package/src/auth/index.ts +4 -0
- package/src/auth/member-events.ts +114 -0
- package/src/auth/profile.ts +118 -0
- package/src/auth/runtime.ts +190 -9
- package/src/auth/strategy.ts +3 -0
- package/src/auth/types.ts +32 -0
- package/src/authorization/decision.ts +52 -0
- package/src/authorization/event-visibility.ts +17 -16
- package/src/authorization/grant-kinds.ts +46 -2
- package/src/authorization/index.ts +6 -1
- package/src/authorization/resolve.ts +58 -1
- package/src/authorization/run-visibility.ts +8 -1
- package/src/authorization/types.ts +14 -0
- package/src/blob-storage/internal.ts +1 -1
- package/src/blob-storage/media-type.ts +69 -0
- package/src/datasets/builders.ts +66 -2
- package/src/datasets/column-index.ts +19 -0
- package/src/datasets/execution.ts +23 -9
- package/src/errors/catalog.ts +26 -1
- package/src/errors/internal.ts +18 -8
- package/src/events/definitions.ts +26 -0
- package/src/events/execution.ts +171 -21
- package/src/events/index.ts +10 -1
- package/src/events/scope.ts +2 -0
- package/src/events/selectors/builder.ts +50 -0
- package/src/events/selectors/index.ts +4 -0
- package/src/events/selectors/types.ts +32 -1
- package/src/events/service.ts +55 -2
- package/src/events/types/index.ts +10 -0
- package/src/events/types/users.ts +73 -0
- package/src/events/view-conditions.ts +241 -0
- package/src/execution/agent.ts +25 -0
- package/src/execution/authorization.ts +70 -0
- package/src/execution/authorized-object-reader.ts +486 -266
- package/src/execution/lineage.ts +14 -0
- package/src/execution/object-reader-clearance.ts +91 -0
- package/src/execution/object-reader-ontology.ts +60 -0
- package/src/execution/object-reader-security.ts +270 -0
- package/src/execution/object-reader-users.ts +122 -0
- package/src/execution/preparation.ts +78 -0
- package/src/execution/request.ts +2 -0
- package/src/execution/unique-lookup.ts +55 -0
- package/src/execution/visible-objects.ts +26 -0
- package/src/http/api-routes.ts +331 -7
- package/src/index.ts +169 -4
- package/src/lake-storage/in-memory.ts +26 -3
- package/src/lake-storage/index.ts +13 -1
- package/src/lake-storage/lineage.ts +385 -0
- package/src/lake-storage/sql-transforms.ts +45 -0
- package/src/lake-storage/types.ts +59 -1
- package/src/lake-storage/version-inputs.ts +35 -6
- package/src/maintenance/ontology-maintenance.ts +15 -0
- package/src/materialization/errors.ts +37 -0
- package/src/materialization/event-envelopes.ts +11 -3
- package/src/materialization/index.ts +1 -0
- package/src/materialization/model.ts +24 -4
- package/src/materializer/README.md +7 -1
- package/src/materializer/edits/commit.ts +56 -12
- package/src/materializer/edits/load-state.ts +15 -7
- package/src/materializer/edits/operations.ts +12 -0
- package/src/materializer/edits/plan.ts +2 -0
- package/src/materializer/edits/unique-values.ts +255 -0
- package/src/materializer/edits/working-state.ts +8 -1
- package/src/materializer/execution/work-records.ts +47 -0
- package/src/materializer/projections/finish-run.ts +0 -1
- package/src/materializer/projections/replace.ts +1 -1
- package/src/materializer/projections/replacement-plan.ts +4 -1
- package/src/materializer/projections/source-materialization.ts +2 -1
- package/src/materializer/shared/normalize.ts +37 -6
- package/src/materializer/shared/projection-run.ts +1 -2
- package/src/materializer/telemetry/append.ts +14 -17
- package/src/materializer/telemetry/plan.ts +2 -0
- package/src/models/audio/catalog.ts +89 -10
- package/src/models/audio/errors.ts +18 -1
- package/src/models/audio/runtime.ts +10 -13
- package/src/models/audio/speech.ts +261 -0
- package/src/models/audio/types.ts +97 -0
- package/src/models/calls.ts +100 -0
- package/src/models/catalog-index.ts +21 -2
- package/src/models/catalog.ts +211 -35
- package/src/models/decision/runtime.ts +21 -22
- package/src/models/decision/validation.ts +4 -1
- package/src/models/definitions.ts +57 -8
- package/src/models/events.ts +72 -1
- package/src/models/execution/README.md +34 -5
- package/src/models/execution/binding.ts +3 -1
- package/src/models/execution/embedding.ts +1 -0
- package/src/models/execution/index.ts +5 -0
- package/src/models/execution/model-call-accounting.ts +3 -1
- package/src/models/execution/model-call-recorder.ts +29 -1
- package/src/models/execution/usage.ts +8 -0
- package/src/models/execution.ts +20 -22
- package/src/models/generation-types.ts +8 -1
- package/src/models/image/catalog.ts +89 -0
- package/src/models/image/errors.ts +19 -0
- package/src/models/image/runtime.ts +335 -0
- package/src/models/image/types.ts +111 -0
- package/src/models/index.ts +38 -4
- package/src/models/{audio/file.ts → input-file.ts} +22 -13
- package/src/models/language-model.ts +13 -0
- package/src/models/pricing.ts +263 -42
- package/src/models/rate-card.ts +161 -12
- package/src/objects/authorized-ontology-view.ts +1 -0
- package/src/objects/clearance-redaction.ts +138 -0
- package/src/objects/conditional-writes.ts +109 -0
- package/src/objects/execution.ts +4 -0
- package/src/objects/index.ts +8 -0
- package/src/objects/link/authorization.ts +37 -8
- package/src/objects/link/endpoints.ts +42 -11
- package/src/objects/link/remove.ts +27 -12
- package/src/objects/link/upsert-batch.ts +9 -5
- package/src/objects/link/upsert.ts +20 -14
- package/src/objects/materializer-adapter.ts +55 -18
- package/src/objects/object/delete.ts +26 -7
- package/src/objects/object/upsert-batch.ts +46 -18
- package/src/objects/object/upsert.ts +25 -8
- package/src/objects/property-clearance.ts +171 -152
- package/src/objects/query/clearance-admission.ts +112 -0
- package/src/objects/query/current-user.ts +76 -0
- package/src/objects/query/executor.ts +39 -103
- package/src/objects/query/explain.ts +20 -7
- package/src/objects/query/index.ts +2 -0
- package/src/objects/query/ir.ts +20 -0
- package/src/objects/query/link-query-clearance.ts +73 -0
- package/src/objects/query/links.ts +8 -0
- package/src/objects/query/matches-predicate.ts +108 -0
- package/src/objects/query/normalize.ts +50 -19
- package/src/objects/query/scalar-values.ts +19 -3
- package/src/objects/query/user-expansions.ts +65 -0
- package/src/objects/query/validate.ts +248 -10
- package/src/objects/runtime-batch.ts +8 -2
- package/src/objects/sdk/object-set.ts +12 -1
- package/src/objects/sdk/query-builder.ts +39 -8
- package/src/objects/sdk/query-executor.ts +6 -0
- package/src/objects/serialize.ts +79 -0
- package/src/objects/unique-violation.ts +59 -0
- package/src/objects/vectors/handle.ts +3 -3
- package/src/ontology/builders.ts +15 -1
- package/src/ontology/docs-markdown.ts +2 -1
- package/src/ontology/index.ts +2 -2
- package/src/ontology/json-schema.ts +4 -0
- package/src/ontology/primitives.ts +21 -8
- package/src/ontology/registry.ts +16 -0
- package/src/ontology/types.ts +9 -0
- package/src/ontology/unique-values.ts +84 -0
- package/src/ontology/user-ref.ts +39 -0
- package/src/ontology/validation/properties.ts +43 -0
- package/src/ontology/validation/schema.ts +9 -1
- package/src/pipelines/index.ts +2 -0
- package/src/pipelines/lineage.ts +45 -0
- package/src/projections/internal.ts +2 -2
- package/src/projections/registry.ts +16 -10
- package/src/projections/revision.ts +112 -45
- package/src/projections/run-dispatch.ts +38 -25
- package/src/projections/types.ts +2 -0
- package/src/query.ts +5 -0
- package/src/rules/execution.ts +43 -11
- package/src/runtime/ai-cost.ts +30 -0
- package/src/runtime/ai-usage.ts +32 -1
- package/src/runtime/create.ts +4 -0
- package/src/runtime/host.ts +73 -1
- package/src/runtime/index.ts +2 -0
- package/src/runtime/internal.ts +2 -0
- package/src/runtime/ontology-mutations.ts +19 -4
- package/src/runtime/resolve-definitions.ts +69 -3
- package/src/runtime/sixb.ts +53 -9
- package/src/runtime/types.ts +99 -9
- package/src/sandboxes/README.md +29 -7
- package/src/sandboxes/auth.ts +16 -0
- package/src/sandboxes/config.ts +2 -7
- package/src/sandboxes/configuration.ts +61 -7
- package/src/sandboxes/index.ts +1 -0
- package/src/sandboxes/sandbox.ts +27 -5
- package/src/schedules/builders.ts +3 -1
- package/src/schedules/runtime.ts +6 -0
- package/src/schedules/validation.ts +23 -1
- package/src/security/README.md +62 -0
- package/src/security/applied-markings-contribution.ts +277 -0
- package/src/security/applied-markings-host.ts +41 -0
- package/src/security/applied-markings-snapshot.ts +235 -0
- package/src/security/applied-markings.ts +405 -0
- package/src/security/dataset-version-markings.ts +163 -0
- package/src/security/grants.ts +191 -11
- package/src/security/index.ts +5 -0
- package/src/security/internal.ts +18 -0
- package/src/security/marking-propagation.ts +255 -0
- package/src/security/marking-sets.ts +42 -0
- package/src/security/markings.ts +29 -178
- package/src/security/pipeline-markings.ts +175 -0
- package/src/security/project.ts +13 -0
- package/src/security/projection-markings.ts +421 -0
- package/src/security/redactions.ts +7 -2
- package/src/security/registry.ts +32 -7
- package/src/security/types.ts +68 -5
- package/src/security/validation.ts +34 -11
- package/src/security/view-conditions.ts +215 -0
- package/src/shares/execution.ts +43 -10
- package/src/storage/action-runs/in-memory.ts +18 -0
- package/src/storage/action-runs/types.ts +10 -0
- package/src/storage/activity/in-memory.ts +374 -0
- package/src/storage/activity/index.ts +27 -0
- package/src/storage/activity/policy.ts +430 -0
- package/src/storage/activity/types.ts +211 -0
- package/src/storage/agents/errors.ts +3 -0
- package/src/storage/agents/in-memory.ts +789 -32
- package/src/storage/agents/index.ts +42 -0
- package/src/storage/agents/provider.ts +730 -16
- package/src/storage/agents/types.ts +628 -27
- package/src/storage/ai-cost/analytics.ts +60 -7
- package/src/storage/ai-cost/codec.ts +6 -1
- package/src/storage/ai-cost/groups.ts +44 -1
- package/src/storage/ai-cost/index.ts +1 -0
- package/src/storage/ai-cost/provider.ts +2 -0
- package/src/storage/ai-cost/types.ts +18 -1
- package/src/storage/ai-cost/validation.ts +39 -12
- package/src/storage/ai-limits/provider.ts +4 -7
- package/src/storage/ai-usage/in-memory.ts +28 -1
- package/src/storage/ai-usage/index.ts +9 -1
- package/src/storage/ai-usage/record.ts +44 -7
- package/src/storage/ai-usage/types.ts +38 -0
- package/src/storage/ai-usage/usage.ts +15 -1
- package/src/storage/artifacts/errors.ts +28 -0
- package/src/storage/artifacts/in-memory.ts +388 -0
- package/src/storage/artifacts/index.ts +35 -0
- package/src/storage/artifacts/record.ts +260 -0
- package/src/storage/artifacts/types.ts +293 -0
- package/src/storage/auth/in-memory/auth-storage.ts +27 -2
- package/src/storage/auth/in-memory/sessions.ts +21 -0
- package/src/storage/auth/in-memory/users.ts +40 -6
- package/src/storage/auth/index.ts +3 -0
- package/src/storage/auth/types.ts +61 -7
- package/src/storage/executions/in-memory.ts +93 -1
- package/src/storage/executions/index.ts +5 -0
- package/src/storage/executions/provider.ts +12 -0
- package/src/storage/executions/types.ts +47 -0
- package/src/storage/in-memory/index.ts +16 -0
- package/src/storage/index.ts +132 -1
- package/src/storage/internal.ts +39 -1
- package/src/storage/migrations/migrate-storage.ts +8 -1
- package/src/storage/migrations/prepare-unique-properties.ts +161 -0
- package/src/storage/objects/guard.ts +7 -3
- package/src/storage/objects/in-memory/conditional-reader.ts +72 -0
- package/src/storage/objects/in-memory/query.ts +4 -105
- package/src/storage/objects/in-memory/read-scope.ts +15 -14
- package/src/storage/objects/in-memory/read-source.ts +11 -1
- package/src/storage/objects/in-memory/scoped-reader.ts +243 -0
- package/src/storage/objects/in-memory/selected-reader.ts +6 -231
- package/src/storage/objects/in-memory/storage.ts +183 -1
- package/src/storage/objects/index.ts +9 -1
- package/src/storage/objects/read-scope.ts +191 -0
- package/src/storage/objects/types.ts +68 -1
- package/src/storage/ontology/in-memory/index.ts +3 -0
- package/src/storage/ontology/in-memory/materializations.ts +35 -0
- package/src/storage/ontology/in-memory/replacement-plans.ts +4 -0
- package/src/storage/ontology/in-memory/sources.ts +23 -0
- package/src/storage/ontology/in-memory/unique-values.ts +62 -0
- package/src/storage/ontology/index.ts +12 -0
- package/src/storage/ontology/materializations.ts +35 -1
- package/src/storage/ontology/provider-work.ts +76 -0
- package/src/storage/ontology/provider.ts +3 -0
- package/src/storage/ontology/sources.ts +17 -0
- package/src/storage/ontology/unique-values.ts +56 -0
- package/src/storage/operation-scope.ts +9 -1
- package/src/storage/projection-runs/in-memory.ts +3 -35
- package/src/storage/share-grants/in-memory.ts +8 -0
- package/src/storage/share-grants/index.ts +1 -0
- package/src/storage/share-grants/types.ts +8 -0
- package/src/storage/types.ts +6 -0
- package/src/storage/workflow-runs/in-memory.ts +16 -0
- package/src/storage/workflow-runs/types.ts +5 -0
- package/src/testing/action-run-storage-contract.ts +25 -0
- package/src/testing/activity-storage-contract.ts +840 -0
- package/src/testing/agent-approval-storage-contract.ts +1117 -0
- package/src/testing/agent-memory-storage-contract.ts +400 -0
- package/src/testing/agent-storage-contract.ts +1206 -50
- package/src/testing/ai-cost-storage-contract.ts +31 -1
- package/src/testing/ai-limit-storage-contract.ts +9 -7
- package/src/testing/ai-model-call-groups-contract.ts +76 -0
- package/src/testing/ai-usage-storage-contract.ts +120 -13
- package/src/testing/artifact-storage-contract.ts +851 -0
- package/src/testing/auth-storage-contract.ts +597 -73
- package/src/testing/broker-contract.ts +28 -23
- package/src/testing/effective-storage-contract.ts +3 -8
- package/src/testing/execution-storage-contract.ts +200 -1
- package/src/testing/file-upload-session-storage-contract.ts +12 -24
- package/src/testing/index.ts +26 -4
- package/src/testing/lake-merge-storage-contract.ts +38 -0
- package/src/testing/lake-storage-contract.ts +269 -30
- package/src/testing/materializer-storage-contract.ts +37 -9
- package/src/testing/object-conditional-read-scope-contract.ts +634 -0
- package/src/testing/object-query-contract.ts +386 -186
- package/src/testing/ontology-storage-contract.ts +286 -22
- package/src/testing/projection-run-storage-contract.ts +8 -18
- package/src/testing/queues-contract.ts +39 -70
- package/src/testing/sandboxes-contract.ts +3 -14
- package/src/testing/share-grant-storage-contract.ts +28 -16
- package/src/testing/share-session-storage-contract.ts +4 -14
- package/src/testing/unique-values-contract.ts +907 -0
- package/src/testing/webhook-execution.ts +1 -1
- package/src/testing/webhook-run-storage-contract.ts +6 -9
- package/src/users/execution.ts +131 -0
- package/src/users/index.ts +2 -0
- package/src/workers/queue-worker.ts +1 -3
- package/src/workers/worker.ts +1 -3
- package/src/workflows/builders.ts +20 -0
- package/src/workflows/request.ts +46 -8
- package/src/workflows/types.ts +15 -2
- package/src/workflows/validation.ts +95 -9
- package/dist/chunk-1k89ecfr.js +0 -85
- package/dist/chunk-1k89ecfr.js.map +0 -10
- package/dist/chunk-1sr8ryzk.js.map +0 -11
- package/dist/chunk-29yx306f.js.map +0 -22
- package/dist/chunk-3t2hgbgd.js.map +0 -15
- package/dist/chunk-4as3wt1c.js.map +0 -12
- package/dist/chunk-4vyr1j8f.js +0 -128
- package/dist/chunk-4vyr1j8f.js.map +0 -11
- package/dist/chunk-5e43w60z.js.map +0 -10
- package/dist/chunk-6c6sn0bh.js.map +0 -106
- package/dist/chunk-6p49a5cq.js.map +0 -12
- package/dist/chunk-6x0pqh32.js.map +0 -10
- package/dist/chunk-7n30ybym.js +0 -3
- package/dist/chunk-7n440zgt.js +0 -261
- package/dist/chunk-7n440zgt.js.map +0 -12
- package/dist/chunk-8mx7qw3y.js.map +0 -13
- package/dist/chunk-91mg3nj9.js.map +0 -12
- package/dist/chunk-96yw3pwd.js.map +0 -10
- package/dist/chunk-9gyp8hg1.js +0 -363
- package/dist/chunk-9gyp8hg1.js.map +0 -14
- package/dist/chunk-9k93ah50.js.map +0 -11
- package/dist/chunk-b38szspf.js.map +0 -11
- package/dist/chunk-bx9q3cwv.js.map +0 -19
- package/dist/chunk-d09tj99x.js.map +0 -12
- package/dist/chunk-ere85b8y.js.map +0 -15
- package/dist/chunk-es1gxsbf.js.map +0 -13
- package/dist/chunk-gsjm1wms.js.map +0 -10
- package/dist/chunk-hjzdd750.js.map +0 -49
- package/dist/chunk-hkc3jct7.js.map +0 -10
- package/dist/chunk-hvsb78a1.js.map +0 -20
- package/dist/chunk-k6q3n2sc.js.map +0 -12
- package/dist/chunk-n33z5bjw.js.map +0 -66
- package/dist/chunk-pbcbn83d.js.map +0 -14
- package/dist/chunk-pqajwytd.js +0 -68
- package/dist/chunk-pqajwytd.js.map +0 -11
- package/dist/chunk-qczk96d9.js.map +0 -11
- package/dist/chunk-rdghfsss.js +0 -39
- package/dist/chunk-rdghfsss.js.map +0 -10
- package/dist/chunk-rj69qcrd.js.map +0 -11
- package/dist/chunk-rrzt8jdy.js.map +0 -14
- package/dist/chunk-s16apyk9.js +0 -256
- package/dist/chunk-s16apyk9.js.map +0 -16
- package/dist/chunk-s54c868q.js +0 -307
- package/dist/chunk-s54c868q.js.map +0 -12
- package/dist/chunk-tpn40322.js.map +0 -19
- package/dist/chunk-tw03bsmb.js.map +0 -11
- package/dist/chunk-v4jbb3rs.js.map +0 -10
- package/dist/chunk-vpq4shxz.js.map +0 -39
- package/dist/chunk-yxd3nnqt.js.map +0 -11
- package/dist/chunk-yzwja0mj.js.map +0 -14
- package/dist/events/toStoredEvent.d.ts +0 -9
- package/dist/events/toStoredEvent.d.ts.map +0 -1
- package/dist/models/audio/file.d.ts +0 -9
- package/dist/models/audio/file.d.ts.map +0 -1
- package/src/events/toStoredEvent.ts +0 -33
- /package/dist/{chunk-mfs23znk.js.map → chunk-07kkp2e1.js.map} +0 -0
- /package/dist/{chunk-fkgc1wt8.js.map → chunk-0phpbbvm.js.map} +0 -0
- /package/dist/{chunk-y0c4e6ex.js.map → chunk-3gbefjg5.js.map} +0 -0
- /package/dist/{chunk-fa02jy15.js.map → chunk-48jezz3j.js.map} +0 -0
- /package/dist/{chunk-c85m1hyj.js.map → chunk-6n69k945.js.map} +0 -0
- /package/dist/{chunk-xfs8x8m9.js.map → chunk-6p0pastb.js.map} +0 -0
- /package/dist/{chunk-t7x8dmn0.js.map → chunk-6y0mkhex.js.map} +0 -0
- /package/dist/{chunk-v9xd5wzd.js.map → chunk-bab05bhg.js.map} +0 -0
- /package/dist/{chunk-gc4ntf7d.js.map → chunk-cwdzcv37.js.map} +0 -0
- /package/dist/{chunk-vyf9kfqf.js.map → chunk-dp0cdtj2.js.map} +0 -0
- /package/dist/{chunk-br3k6qbf.js.map → chunk-fm62y49k.js.map} +0 -0
- /package/dist/{chunk-9ybhtmg4.js.map → chunk-g663fahq.js.map} +0 -0
- /package/dist/{chunk-9w055r5b.js.map → chunk-hwarjrgf.js.map} +0 -0
- /package/dist/{chunk-9dmt152s.js.map → chunk-hyesv9dv.js.map} +0 -0
- /package/dist/{chunk-x9v4cx1d.js.map → chunk-m36fw8ft.js.map} +0 -0
- /package/dist/{chunk-a40ad1ft.js.map → chunk-mbsbxarb.js.map} +0 -0
- /package/dist/{chunk-6aawea28.js.map → chunk-n8q5j6y5.js.map} +0 -0
- /package/dist/{chunk-dk8tkk5f.js.map → chunk-n9zpx9c6.js.map} +0 -0
- /package/dist/{chunk-7t429e3f.js.map → chunk-npcr0228.js.map} +0 -0
- /package/dist/{chunk-z4m0yz8c.js.map → chunk-q4pmvkg0.js.map} +0 -0
|
@@ -1,37 +1,76 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
|
+
assertAuthorized2,
|
|
3
4
|
resolveRoleGrants2,
|
|
5
|
+
resolveRoleViewConditions2,
|
|
4
6
|
resolveAuthorizationContext2
|
|
5
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-yc9ners4.js";
|
|
6
8
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
isUserRef,
|
|
10
|
+
isUserRefPropertySchema,
|
|
11
|
+
isCurrentUser
|
|
12
|
+
} from "./chunk-4y26vs3v.js";
|
|
13
|
+
import {
|
|
14
|
+
compileConditionalObjectReadScope2
|
|
15
|
+
} from "./chunk-rap5w0x0.js";
|
|
16
|
+
import {
|
|
17
|
+
validateSchemaValue2,
|
|
18
|
+
assertValidFileRefs2,
|
|
19
|
+
normalizeSchemaValue2,
|
|
20
|
+
validatePropertyValue2,
|
|
21
|
+
isExactSchema,
|
|
22
|
+
isSortableSchema,
|
|
23
|
+
isTextSchema,
|
|
24
|
+
isContainsSchema,
|
|
25
|
+
queryScalarKindForSchema
|
|
26
|
+
} from "./chunk-65pyhyas.js";
|
|
9
27
|
import {
|
|
10
|
-
SecurityValidationError2,
|
|
11
28
|
resolveMembershipPolicyScope,
|
|
12
29
|
canPerformMembershipOperation,
|
|
13
30
|
missingMembershipGroupIds,
|
|
14
31
|
validateSecurityDefinitionsAtStartup
|
|
15
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-73v685wb.js";
|
|
33
|
+
import {
|
|
34
|
+
sha256Canonical2
|
|
35
|
+
} from "./chunk-zrvhsq7f.js";
|
|
16
36
|
import {
|
|
17
37
|
getCookie2,
|
|
18
38
|
AuthRuntimeError2,
|
|
39
|
+
normalizeProfileChanges,
|
|
40
|
+
signInDisplayName2,
|
|
19
41
|
resolveAuthConfig2,
|
|
20
42
|
resolveInvitationExpiresAt,
|
|
21
43
|
assertNonEmpty3,
|
|
22
44
|
normalizePagination,
|
|
23
|
-
|
|
24
|
-
|
|
45
|
+
isMagicLinkAuthStrategy2,
|
|
46
|
+
isInvitationDeliveryAuthStrategy2,
|
|
47
|
+
isOidcAuthStrategy2
|
|
48
|
+
} from "./chunk-5grk14e5.js";
|
|
25
49
|
import {
|
|
26
50
|
normalizeParams,
|
|
27
51
|
coerceParamsToTyped
|
|
28
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-6n69k945.js";
|
|
29
53
|
import {
|
|
30
54
|
snapshotLinkPathSelection
|
|
31
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-16a9dmfy.js";
|
|
56
|
+
import {
|
|
57
|
+
resolveWhere,
|
|
58
|
+
ObjectQueryValidationError2,
|
|
59
|
+
normalizeObjectQuery2
|
|
60
|
+
} from "./chunk-j936th07.js";
|
|
32
61
|
import {
|
|
33
|
-
|
|
62
|
+
MaterializationValidationError2
|
|
63
|
+
} from "./chunk-y7dbmaqh.js";
|
|
64
|
+
import {
|
|
65
|
+
SecurityValidationError2
|
|
66
|
+
} from "./chunk-jcfw4h7m.js";
|
|
67
|
+
import {
|
|
68
|
+
OntologyValidationError2,
|
|
69
|
+
formatUnknownObjectTypeMessage
|
|
34
70
|
} from "./chunk-cqr3acm1.js";
|
|
71
|
+
import {
|
|
72
|
+
normalizeDecimalValue2
|
|
73
|
+
} from "./chunk-3bh94gbw.js";
|
|
35
74
|
|
|
36
75
|
// src/auth/access-tokens.ts
|
|
37
76
|
import { createHash, randomBytes, randomUUID } from "crypto";
|
|
@@ -553,6 +592,15 @@ function invalid(message) {
|
|
|
553
592
|
return new ShareDefinitionError2(`[Sixb] ${message}`);
|
|
554
593
|
}
|
|
555
594
|
|
|
595
|
+
// src/security/project.ts
|
|
596
|
+
var project2 = Object.freeze({
|
|
597
|
+
kind: "project",
|
|
598
|
+
logs: Object.freeze({ kind: "logs" }),
|
|
599
|
+
activity: Object.freeze({ kind: "activity" }),
|
|
600
|
+
users: Object.freeze({ kind: "users" }),
|
|
601
|
+
models: Object.freeze({ kind: "models" })
|
|
602
|
+
});
|
|
603
|
+
|
|
556
604
|
// src/security/grants.ts
|
|
557
605
|
var VIEW_TARGETS = ["object", "dataset"];
|
|
558
606
|
var RUN_TARGETS = ["workflow", "sync", "pipeline"];
|
|
@@ -608,11 +656,59 @@ function resolveGrant(input, label, allowedTargets) {
|
|
|
608
656
|
const ids = [...new Set(items.map((item) => definitionIdOf(item, label)))];
|
|
609
657
|
return { target, selection: { all: false, ids } };
|
|
610
658
|
}
|
|
659
|
+
var UNVIEWABLE_PROJECT_REFERENCES = new Set([
|
|
660
|
+
project2,
|
|
661
|
+
project2.logs,
|
|
662
|
+
project2.activity
|
|
663
|
+
]);
|
|
611
664
|
function view(input) {
|
|
612
665
|
if (isShareTarget(input))
|
|
613
666
|
return createShareViewGrant(input);
|
|
667
|
+
if (isUsersReference(input)) {
|
|
668
|
+
return { kind: "grant", capability: "view", target: "users" };
|
|
669
|
+
}
|
|
670
|
+
if (UNVIEWABLE_PROJECT_REFERENCES.has(input)) {
|
|
671
|
+
throw new SecurityValidationError2("[Sixb] can.view accepts object types, datasets, shares, or project.users.");
|
|
672
|
+
}
|
|
614
673
|
const { target, selection } = resolveGrant(input, "can.view", VIEW_TARGETS);
|
|
615
|
-
|
|
674
|
+
const grant = { kind: "grant", capability: "view", target, selection };
|
|
675
|
+
const one = target !== "object" || Array.isArray(input) || isBreadthSelector(input) ? undefined : input;
|
|
676
|
+
if (one) {
|
|
677
|
+
Object.defineProperty(grant, "where", {
|
|
678
|
+
configurable: false,
|
|
679
|
+
enumerable: false,
|
|
680
|
+
writable: false,
|
|
681
|
+
value: (callback) => conditionalViewGrant(grant, one, callback)
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
return grant;
|
|
685
|
+
}
|
|
686
|
+
function conditionalViewGrant(grant, objectType, callback) {
|
|
687
|
+
const subject = `can.view(${objectType.id}).where(...)`;
|
|
688
|
+
if (typeof callback !== "function") {
|
|
689
|
+
throw new SecurityValidationError2(`[Sixb] ${subject} expects a function, such as (object) => object.p.status.eq("open").`);
|
|
690
|
+
}
|
|
691
|
+
const condition = resolveWhere(callback);
|
|
692
|
+
if (condition === undefined) {
|
|
693
|
+
throw new SecurityValidationError2(`[Sixb] ${subject} returned no condition. Return a predicate, or drop .where() to grant every object.`);
|
|
694
|
+
}
|
|
695
|
+
return deepFreeze({
|
|
696
|
+
kind: "grant",
|
|
697
|
+
capability: "view",
|
|
698
|
+
target: "object",
|
|
699
|
+
selection: structuredClone(grant.selection),
|
|
700
|
+
condition: structuredClone(condition)
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
function deepFreeze(value) {
|
|
704
|
+
if (typeof value !== "object" || value === null || Object.isFrozen(value))
|
|
705
|
+
return value;
|
|
706
|
+
for (const child of Object.values(value))
|
|
707
|
+
deepFreeze(child);
|
|
708
|
+
return Object.freeze(value);
|
|
709
|
+
}
|
|
710
|
+
function isUsersReference(input) {
|
|
711
|
+
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "users";
|
|
616
712
|
}
|
|
617
713
|
function edit(input) {
|
|
618
714
|
return {
|
|
@@ -656,25 +752,51 @@ function run(input) {
|
|
|
656
752
|
if (isAgentReference(input)) {
|
|
657
753
|
return { kind: "grant", capability: "run", target: "agent" };
|
|
658
754
|
}
|
|
755
|
+
if (isModelsReference(input)) {
|
|
756
|
+
return { kind: "grant", capability: "run", target: "models" };
|
|
757
|
+
}
|
|
659
758
|
const { target, selection } = resolveGrant(input, "can.run", RUN_TARGETS);
|
|
660
759
|
return { kind: "grant", capability: "run", target, selection };
|
|
661
760
|
}
|
|
662
761
|
function isAgentReference(input) {
|
|
663
762
|
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "agent";
|
|
664
763
|
}
|
|
764
|
+
function isModelsReference(input) {
|
|
765
|
+
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "models";
|
|
766
|
+
}
|
|
665
767
|
function isAgentUsageReference(input) {
|
|
666
768
|
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "aiUsage";
|
|
667
769
|
}
|
|
770
|
+
var OBSERVABLE_REFERENCES = {
|
|
771
|
+
logs: "project.logs",
|
|
772
|
+
activity: "project.activity",
|
|
773
|
+
aiUsage: "agent.usage",
|
|
774
|
+
agentThreads: "agent.threads"
|
|
775
|
+
};
|
|
776
|
+
function isObservableReference(input) {
|
|
777
|
+
return typeof input === "object" && input !== null && "kind" in input && typeof input.kind === "string" && Object.hasOwn(OBSERVABLE_REFERENCES, input.kind);
|
|
778
|
+
}
|
|
668
779
|
function observe(input) {
|
|
669
|
-
|
|
670
|
-
|
|
780
|
+
const value = input;
|
|
781
|
+
if (value === "logs") {
|
|
782
|
+
throw new SecurityValidationError2('[Sixb] can.observe("logs") is now can.observe(project.logs), imported from "@sixb/core".');
|
|
783
|
+
}
|
|
784
|
+
if (!isObservableReference(value)) {
|
|
785
|
+
const accepted = Object.values(OBSERVABLE_REFERENCES).join(" or ");
|
|
786
|
+
throw new SecurityValidationError2(`[Sixb] can.observe accepts ${accepted}.`);
|
|
671
787
|
}
|
|
672
|
-
return { kind: "grant", capability: "observe", target:
|
|
788
|
+
return { kind: "grant", capability: "observe", target: value.kind };
|
|
789
|
+
}
|
|
790
|
+
function isAgentMemoryReference(input) {
|
|
791
|
+
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "agentMemory";
|
|
673
792
|
}
|
|
674
793
|
function manage(input) {
|
|
675
794
|
if (isAgentUsageReference(input)) {
|
|
676
795
|
return { kind: "grant", capability: "manage", target: "aiUsage" };
|
|
677
796
|
}
|
|
797
|
+
if (isAgentMemoryReference(input)) {
|
|
798
|
+
return { kind: "grant", capability: "manage", target: "agentMemory" };
|
|
799
|
+
}
|
|
678
800
|
return {
|
|
679
801
|
kind: "grant",
|
|
680
802
|
capability: "manage",
|
|
@@ -692,6 +814,1312 @@ var can2 = {
|
|
|
692
814
|
observe,
|
|
693
815
|
manage
|
|
694
816
|
};
|
|
817
|
+
// src/objects/query/current-user.ts
|
|
818
|
+
function bindCurrentUser(query, user) {
|
|
819
|
+
switch (query.kind) {
|
|
820
|
+
case "start":
|
|
821
|
+
case "refs":
|
|
822
|
+
return query;
|
|
823
|
+
case "filter":
|
|
824
|
+
return {
|
|
825
|
+
...query,
|
|
826
|
+
input: bindCurrentUser(query.input, user),
|
|
827
|
+
predicate: bindCurrentUserPredicate(query.predicate, user)
|
|
828
|
+
};
|
|
829
|
+
case "set":
|
|
830
|
+
return { ...query, inputs: query.inputs.map((input) => bindCurrentUser(input, user)) };
|
|
831
|
+
default:
|
|
832
|
+
return { ...query, input: bindCurrentUser(query.input, user) };
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
function bindCurrentUserPredicate(predicate, user) {
|
|
836
|
+
switch (predicate.op) {
|
|
837
|
+
case "and":
|
|
838
|
+
case "or":
|
|
839
|
+
return {
|
|
840
|
+
...predicate,
|
|
841
|
+
items: predicate.items.map((item) => bindCurrentUserPredicate(item, user))
|
|
842
|
+
};
|
|
843
|
+
case "not":
|
|
844
|
+
return { ...predicate, item: bindCurrentUserPredicate(predicate.item, user) };
|
|
845
|
+
case "exists":
|
|
846
|
+
case "constant":
|
|
847
|
+
return predicate;
|
|
848
|
+
case "in": {
|
|
849
|
+
if (!predicate.values.some(isCurrentUser))
|
|
850
|
+
return predicate;
|
|
851
|
+
const values = predicate.values.flatMap((value) => isCurrentUser(value) ? user ? [user] : [] : [value]);
|
|
852
|
+
return values.length > 0 ? { ...predicate, values } : NO_ROW;
|
|
853
|
+
}
|
|
854
|
+
case "contains": {
|
|
855
|
+
if (!isCurrentUser(predicate.value))
|
|
856
|
+
return predicate;
|
|
857
|
+
if (user)
|
|
858
|
+
return { ...predicate, value: user };
|
|
859
|
+
return NO_ROW;
|
|
860
|
+
}
|
|
861
|
+
default: {
|
|
862
|
+
if (!isCurrentUser(predicate.value))
|
|
863
|
+
return predicate;
|
|
864
|
+
if (user)
|
|
865
|
+
return { ...predicate, value: user };
|
|
866
|
+
return predicate.op === "neq" ? EVERY_ROW : NO_ROW;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
var NO_ROW = Object.freeze({ op: "constant", value: false });
|
|
871
|
+
var EVERY_ROW = Object.freeze({ op: "constant", value: true });
|
|
872
|
+
|
|
873
|
+
// src/objects/vectors/profile.ts
|
|
874
|
+
var MAX_VECTOR_K = 1000;
|
|
875
|
+
var VECTOR_INPUT_VERSION = 1;
|
|
876
|
+
var INDEXING_EMBEDDING_TIMEOUT_MS = 5 * 60000;
|
|
877
|
+
function vectorConfiguration(profile) {
|
|
878
|
+
return sha256Canonical2({
|
|
879
|
+
format: VECTOR_INPUT_VERSION,
|
|
880
|
+
sources: [...profile.source],
|
|
881
|
+
provider: profile.model.providerId,
|
|
882
|
+
model: profile.model.modelId,
|
|
883
|
+
representation: profile.model.definition.representation ?? { name: profile.model.modelId },
|
|
884
|
+
dimensions: profile.model.definition.dimensions,
|
|
885
|
+
...profile.model.definition.inputMode === "asymmetric" ? { inputMode: "asymmetric" } : {},
|
|
886
|
+
metric: "cosine",
|
|
887
|
+
precision: "float32",
|
|
888
|
+
normalization: "l2-v1"
|
|
889
|
+
});
|
|
890
|
+
}
|
|
891
|
+
function vectorSources(source, properties) {
|
|
892
|
+
const values = Object.create(null);
|
|
893
|
+
for (const key of source) {
|
|
894
|
+
const value = properties[key];
|
|
895
|
+
if (value !== undefined && value !== null && typeof value !== "string") {
|
|
896
|
+
throw new MaterializationValidationError2(`Vector source must be text: ${key}`);
|
|
897
|
+
}
|
|
898
|
+
values[key] = typeof value === "string" ? value : null;
|
|
899
|
+
}
|
|
900
|
+
const text = JSON.stringify(source.map((key) => [key, values[key]]));
|
|
901
|
+
return { text, sourceFingerprint: sha256Canonical2(text) };
|
|
902
|
+
}
|
|
903
|
+
function normalizeVector2(values, dimensions) {
|
|
904
|
+
if (!Array.isArray(values) || values.length !== dimensions) {
|
|
905
|
+
throw new MaterializationValidationError2(`Vector dimension mismatch; expected ${dimensions}`);
|
|
906
|
+
}
|
|
907
|
+
const normalized = Array.from(values, (value) => {
|
|
908
|
+
if (typeof value !== "number" || !Number.isFinite(value) || !Number.isFinite(Math.fround(value))) {
|
|
909
|
+
throw new MaterializationValidationError2("Vector values must be finite float32 numbers.");
|
|
910
|
+
}
|
|
911
|
+
return Math.fround(value);
|
|
912
|
+
});
|
|
913
|
+
if (!normalized.some((value) => value !== 0)) {
|
|
914
|
+
throw new MaterializationValidationError2("Cosine search requires a nonzero vector.");
|
|
915
|
+
}
|
|
916
|
+
const norm = Math.hypot(...normalized);
|
|
917
|
+
return Object.freeze(normalized.map((value) => Math.fround(value / norm)));
|
|
918
|
+
}
|
|
919
|
+
function vectorSearchCandidateLimit2(dimensions) {
|
|
920
|
+
return Math.min(1e4, Math.floor(16000000 / dimensions));
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
// src/objects/vectors/query.ts
|
|
924
|
+
function hasVectorProfile2(query) {
|
|
925
|
+
if (query.kind === "vector")
|
|
926
|
+
return true;
|
|
927
|
+
if (query.kind === "set")
|
|
928
|
+
return query.inputs.some(hasVectorProfile2);
|
|
929
|
+
return "input" in query && hasVectorProfile2(query.input);
|
|
930
|
+
}
|
|
931
|
+
function isVectorProfileQuery2(query) {
|
|
932
|
+
if (query.kind === "limit" || query.kind === "project")
|
|
933
|
+
return isVectorProfileQuery2(query.input);
|
|
934
|
+
if (query.kind === "rerank") {
|
|
935
|
+
return query.input.kind === "vector" && isVectorProfileQuery2(query.input);
|
|
936
|
+
}
|
|
937
|
+
if (query.kind !== "vector" || !query.profile)
|
|
938
|
+
return false;
|
|
939
|
+
return isVectorCandidateQuery(query.input);
|
|
940
|
+
}
|
|
941
|
+
function isVectorCandidateQuery(query) {
|
|
942
|
+
switch (query.kind) {
|
|
943
|
+
case "start":
|
|
944
|
+
return !query.includeSubtypes;
|
|
945
|
+
case "refs":
|
|
946
|
+
return true;
|
|
947
|
+
case "filter":
|
|
948
|
+
case "traverse":
|
|
949
|
+
return isVectorCandidateQuery(query.input);
|
|
950
|
+
case "set":
|
|
951
|
+
return query.inputs.every(isVectorCandidateQuery);
|
|
952
|
+
default:
|
|
953
|
+
return false;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
// src/objects/query/reranking-limits.ts
|
|
958
|
+
var MAX_RERANK_CANDIDATES = 100;
|
|
959
|
+
var MAX_RERANK_INPUT_BYTES = 1048576;
|
|
960
|
+
|
|
961
|
+
// src/objects/query/validate.ts
|
|
962
|
+
var DEFAULT_MAX_LIMIT = 1000;
|
|
963
|
+
var DEFAULT_MAX_PAGE_SIZE = 1000;
|
|
964
|
+
var DEFAULT_MAX_REFS = 1000;
|
|
965
|
+
var NOOP_ADMISSION_STATE = Object.freeze({});
|
|
966
|
+
var NOOP_QUERY_ADMISSION = Object.freeze({
|
|
967
|
+
empty: () => NOOP_ADMISSION_STATE,
|
|
968
|
+
source: () => ({ state: NOOP_ADMISSION_STATE }),
|
|
969
|
+
property: () => {
|
|
970
|
+
return;
|
|
971
|
+
},
|
|
972
|
+
edge: (input) => ({
|
|
973
|
+
state: input.state
|
|
974
|
+
}),
|
|
975
|
+
set: (input) => input.states[0] ?? NOOP_ADMISSION_STATE
|
|
976
|
+
});
|
|
977
|
+
function composeObjectQueryAdmissions(first, second) {
|
|
978
|
+
const parts = new WeakMap;
|
|
979
|
+
const join = (left, right) => {
|
|
980
|
+
const state = Object.freeze({});
|
|
981
|
+
parts.set(state, [left, right]);
|
|
982
|
+
return state;
|
|
983
|
+
};
|
|
984
|
+
const split = (state) => {
|
|
985
|
+
const pair = parts.get(state);
|
|
986
|
+
if (!pair)
|
|
987
|
+
throw new Error("[Sixb] Composed query admission received a foreign state.");
|
|
988
|
+
return pair;
|
|
989
|
+
};
|
|
990
|
+
const transition = (left, right) => {
|
|
991
|
+
const denial = left.denial ?? right.denial;
|
|
992
|
+
return { state: join(left.state, right.state), ...denial ? { denial } : {} };
|
|
993
|
+
};
|
|
994
|
+
const admission = {
|
|
995
|
+
empty: () => join(first.empty(), second.empty()),
|
|
996
|
+
source: (input) => transition(first.source(input), second.source(input)),
|
|
997
|
+
edge: (input) => {
|
|
998
|
+
const [left, right] = split(input.state);
|
|
999
|
+
return transition(first.edge({ ...input, state: left }), second.edge({ ...input, state: right }));
|
|
1000
|
+
},
|
|
1001
|
+
property: (input) => {
|
|
1002
|
+
const [left, right] = split(input.state);
|
|
1003
|
+
return first.property({ ...input, state: left }) ?? second.property({ ...input, state: right });
|
|
1004
|
+
},
|
|
1005
|
+
set: (input) => {
|
|
1006
|
+
const pairs = input.states.map(split);
|
|
1007
|
+
return join(first.set({ ...input, states: pairs.map(([left]) => left) }), second.set({ ...input, states: pairs.map(([, right]) => right) }));
|
|
1008
|
+
}
|
|
1009
|
+
};
|
|
1010
|
+
return Object.freeze(admission);
|
|
1011
|
+
}
|
|
1012
|
+
function validateObjectQuery2(query, options) {
|
|
1013
|
+
const admitted = validateObjectQueryWithAdmission(query, options, NOOP_QUERY_ADMISSION);
|
|
1014
|
+
return {
|
|
1015
|
+
query: admitted.query,
|
|
1016
|
+
result: admitted.result,
|
|
1017
|
+
touchedObjectTypeIds: admitted.touchedObjectTypeIds
|
|
1018
|
+
};
|
|
1019
|
+
}
|
|
1020
|
+
function validateObjectQueryWithAdmission(query, options, admission) {
|
|
1021
|
+
const normalized = options.normalize === false ? query : normalizeObjectQuery2(query);
|
|
1022
|
+
const ctx = createValidationContext(options, admission);
|
|
1023
|
+
validateVectorComposition(query, ctx);
|
|
1024
|
+
const validation = validateQueryNode(normalized, "$", ctx);
|
|
1025
|
+
if (ctx.issues.length > 0) {
|
|
1026
|
+
throw new ObjectQueryValidationError2(ctx.issues);
|
|
1027
|
+
}
|
|
1028
|
+
const denial = ctx.admissionDenials[0];
|
|
1029
|
+
if (denial)
|
|
1030
|
+
throw denial;
|
|
1031
|
+
return {
|
|
1032
|
+
query: validation.query,
|
|
1033
|
+
result: validation.result,
|
|
1034
|
+
touchedObjectTypeIds: [...ctx.touchedObjectTypeIds],
|
|
1035
|
+
admissionState: validation.admissionState
|
|
1036
|
+
};
|
|
1037
|
+
}
|
|
1038
|
+
function collectObjectQueryValidationIssues2(query, options) {
|
|
1039
|
+
const normalized = options.normalize === false ? query : normalizeObjectQuery2(query);
|
|
1040
|
+
const ctx = createValidationContext(options, NOOP_QUERY_ADMISSION);
|
|
1041
|
+
validateVectorComposition(query, ctx);
|
|
1042
|
+
validateQueryNode(normalized, "$", ctx);
|
|
1043
|
+
return ctx.issues;
|
|
1044
|
+
}
|
|
1045
|
+
function resolveObjectQueryResultShape2(query, options) {
|
|
1046
|
+
return validateObjectQuery2(query, options).result;
|
|
1047
|
+
}
|
|
1048
|
+
function validateVectorComposition(query, ctx) {
|
|
1049
|
+
if (hasVectorProfile2(query) && !isVectorProfileQuery2(query))
|
|
1050
|
+
ctx.issues.push({
|
|
1051
|
+
path: "$",
|
|
1052
|
+
code: "vector.composition",
|
|
1053
|
+
message: "Vector profiles support one top-k over one concrete type, with filters, traversals or sets before ranking, optional reranking, then limit/project."
|
|
1054
|
+
});
|
|
1055
|
+
}
|
|
1056
|
+
function createValidationContext(options, admission) {
|
|
1057
|
+
return {
|
|
1058
|
+
ontology: options.ontology,
|
|
1059
|
+
valueTypesById: options.ontology.getValueTypesById(),
|
|
1060
|
+
maxLimit: options.maxLimit ?? DEFAULT_MAX_LIMIT,
|
|
1061
|
+
maxPageSize: options.maxPageSize ?? DEFAULT_MAX_PAGE_SIZE,
|
|
1062
|
+
maxRefs: options.maxRefs ?? DEFAULT_MAX_REFS,
|
|
1063
|
+
issues: [],
|
|
1064
|
+
touchedObjectTypeIds: new Set,
|
|
1065
|
+
admission,
|
|
1066
|
+
admissionDenials: []
|
|
1067
|
+
};
|
|
1068
|
+
}
|
|
1069
|
+
function validateQueryNode(query, path, ctx) {
|
|
1070
|
+
const validation = dispatchQueryNode(query, path, ctx);
|
|
1071
|
+
for (const objectTypeId of validation.result.objectTypeIds) {
|
|
1072
|
+
ctx.touchedObjectTypeIds.add(objectTypeId);
|
|
1073
|
+
}
|
|
1074
|
+
return validation;
|
|
1075
|
+
}
|
|
1076
|
+
function dispatchQueryNode(query, path, ctx) {
|
|
1077
|
+
switch (query.kind) {
|
|
1078
|
+
case "start": {
|
|
1079
|
+
const validation = validateStart(query.objectTypeId, query.includeSubtypes, path, ctx);
|
|
1080
|
+
return {
|
|
1081
|
+
...validation,
|
|
1082
|
+
admissionState: admitTransition(ctx, ctx.admission.source({
|
|
1083
|
+
kind: "start",
|
|
1084
|
+
result: validation.result,
|
|
1085
|
+
objectTypeId: query.objectTypeId,
|
|
1086
|
+
path
|
|
1087
|
+
}))
|
|
1088
|
+
};
|
|
1089
|
+
}
|
|
1090
|
+
case "refs": {
|
|
1091
|
+
const validation = validateRefs(query.refs, path, ctx);
|
|
1092
|
+
return {
|
|
1093
|
+
...validation,
|
|
1094
|
+
admissionState: admitTransition(ctx, ctx.admission.source({
|
|
1095
|
+
kind: "refs",
|
|
1096
|
+
result: validation.result,
|
|
1097
|
+
refs: validation.query.kind === "refs" ? validation.query.refs : query.refs,
|
|
1098
|
+
path
|
|
1099
|
+
}))
|
|
1100
|
+
};
|
|
1101
|
+
}
|
|
1102
|
+
case "filter": {
|
|
1103
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1104
|
+
const predicate = validatePredicate(query.predicate, input.result, input.admissionState, `${path}.predicate`, ctx);
|
|
1105
|
+
return {
|
|
1106
|
+
result: input.result,
|
|
1107
|
+
query: { ...query, input: input.query, predicate },
|
|
1108
|
+
admissionState: input.admissionState
|
|
1109
|
+
};
|
|
1110
|
+
}
|
|
1111
|
+
case "text": {
|
|
1112
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1113
|
+
const textFields = validateTextQuery(query.query, query.fields, input.result, input.admissionState, path, ctx);
|
|
1114
|
+
return {
|
|
1115
|
+
result: input.result,
|
|
1116
|
+
query: {
|
|
1117
|
+
...query,
|
|
1118
|
+
input: input.query,
|
|
1119
|
+
fields: query.fields,
|
|
1120
|
+
fieldsByObjectType: query.fields ? undefined : textFields.fieldsByObjectType
|
|
1121
|
+
},
|
|
1122
|
+
admissionState: input.admissionState
|
|
1123
|
+
};
|
|
1124
|
+
}
|
|
1125
|
+
case "vector": {
|
|
1126
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1127
|
+
return {
|
|
1128
|
+
result: input.result,
|
|
1129
|
+
query: validateVectorProfileQuery({ ...query, input: input.query }, input.result, input.admissionState, path, ctx),
|
|
1130
|
+
admissionState: input.admissionState
|
|
1131
|
+
};
|
|
1132
|
+
}
|
|
1133
|
+
case "traverse": {
|
|
1134
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1135
|
+
const result = validateTraverse(query.linkId, query.direction, query.sourceObjectTypeId, input.result, path, ctx);
|
|
1136
|
+
return {
|
|
1137
|
+
result,
|
|
1138
|
+
query: { ...query, input: input.query },
|
|
1139
|
+
admissionState: admitTransition(ctx, ctx.admission.edge({
|
|
1140
|
+
state: input.admissionState,
|
|
1141
|
+
result,
|
|
1142
|
+
linkId: query.linkId,
|
|
1143
|
+
direction: query.direction,
|
|
1144
|
+
sourceObjectTypeId: query.sourceObjectTypeId,
|
|
1145
|
+
use: "traverse",
|
|
1146
|
+
path
|
|
1147
|
+
}))
|
|
1148
|
+
};
|
|
1149
|
+
}
|
|
1150
|
+
case "rerank": {
|
|
1151
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1152
|
+
if (input.query.kind !== "vector" || typeof input.query.vector !== "string" || input.query.k > MAX_RERANK_CANDIDATES) {
|
|
1153
|
+
addIssue(ctx, path, "invalid_rerank_input", `Reranking requires a text vector query with k at most ${MAX_RERANK_CANDIDATES}, before limit or project.`);
|
|
1154
|
+
}
|
|
1155
|
+
if (typeof query.model?.provider !== "string" || !query.model.provider.trim() || query.model.provider.trim() !== query.model.provider || typeof query.model.modelId !== "string" || !query.model.modelId.trim() || query.model.modelId.trim() !== query.model.modelId) {
|
|
1156
|
+
addIssue(ctx, path, "invalid_rerank_model", "Reranking requires an explicit provider and model ID.");
|
|
1157
|
+
}
|
|
1158
|
+
return { ...input, query: { ...query, model: { ...query.model }, input: input.query } };
|
|
1159
|
+
}
|
|
1160
|
+
case "set":
|
|
1161
|
+
return validateSet(query.inputs, query.op, path, ctx);
|
|
1162
|
+
case "sort": {
|
|
1163
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1164
|
+
const fields = validateSortFields(query.fields, input.result, input.admissionState, "sort", path, ctx);
|
|
1165
|
+
return {
|
|
1166
|
+
result: input.result,
|
|
1167
|
+
query: { ...query, input: input.query, fields },
|
|
1168
|
+
admissionState: input.admissionState
|
|
1169
|
+
};
|
|
1170
|
+
}
|
|
1171
|
+
case "limit": {
|
|
1172
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1173
|
+
validateLimit(query.limit, path, ctx);
|
|
1174
|
+
return {
|
|
1175
|
+
result: input.result,
|
|
1176
|
+
query: { ...query, input: input.query },
|
|
1177
|
+
admissionState: input.admissionState
|
|
1178
|
+
};
|
|
1179
|
+
}
|
|
1180
|
+
case "page": {
|
|
1181
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1182
|
+
validatePage(query.pageSize, query.pageToken, path, ctx);
|
|
1183
|
+
return {
|
|
1184
|
+
result: input.result,
|
|
1185
|
+
query: { ...query, input: input.query },
|
|
1186
|
+
admissionState: input.admissionState
|
|
1187
|
+
};
|
|
1188
|
+
}
|
|
1189
|
+
case "project": {
|
|
1190
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1191
|
+
validateProjection(query.properties, input.result, input.admissionState, path, ctx);
|
|
1192
|
+
return {
|
|
1193
|
+
result: input.result,
|
|
1194
|
+
query: { ...query, input: input.query },
|
|
1195
|
+
admissionState: input.admissionState
|
|
1196
|
+
};
|
|
1197
|
+
}
|
|
1198
|
+
case "expand": {
|
|
1199
|
+
const input = validateQueryNode(query.input, `${path}.input`, ctx);
|
|
1200
|
+
const usersAllowed = path === "$";
|
|
1201
|
+
const expansions = validateExpansions(query.expansions, input.result, input.admissionState, `${path}.expansions`, ctx, usersAllowed);
|
|
1202
|
+
validateUserExpansions(query.users, input.result, `${path}.users`, ctx, usersAllowed);
|
|
1203
|
+
validateUserExpansionsProjected(query.users, input.query, `${path}.users`, ctx);
|
|
1204
|
+
return {
|
|
1205
|
+
result: input.result,
|
|
1206
|
+
query: { ...query, input: input.query, expansions },
|
|
1207
|
+
admissionState: input.admissionState
|
|
1208
|
+
};
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
function validateRefs(refs, path, ctx) {
|
|
1213
|
+
if (refs.length === 0) {
|
|
1214
|
+
addIssue(ctx, `${path}.refs`, "empty_refs", "refs must include at least one object reference");
|
|
1215
|
+
}
|
|
1216
|
+
if (refs.length > ctx.maxRefs) {
|
|
1217
|
+
addIssue(ctx, `${path}.refs`, "too_many_refs", `refs must include at most ${ctx.maxRefs} object references`);
|
|
1218
|
+
}
|
|
1219
|
+
const objectTypeIds = new Set;
|
|
1220
|
+
refs.forEach((ref, index) => {
|
|
1221
|
+
const refPath = `${path}.refs[${index}]`;
|
|
1222
|
+
if (!ref.objectTypeId) {
|
|
1223
|
+
addIssue(ctx, `${refPath}.objectTypeId`, "missing_object_type", "objectTypeId is required");
|
|
1224
|
+
} else if (!ctx.ontology.getObjectTypeById(ref.objectTypeId)) {
|
|
1225
|
+
addIssue(ctx, `${refPath}.objectTypeId`, "unknown_object_type", formatUnknownObjectTypeMessage(ref.objectTypeId));
|
|
1226
|
+
} else {
|
|
1227
|
+
objectTypeIds.add(ref.objectTypeId);
|
|
1228
|
+
}
|
|
1229
|
+
if (!ref.primaryId) {
|
|
1230
|
+
addIssue(ctx, `${refPath}.primaryId`, "missing_primary_id", "primaryId is required");
|
|
1231
|
+
}
|
|
1232
|
+
});
|
|
1233
|
+
return {
|
|
1234
|
+
result: { objectTypeIds: [...objectTypeIds] },
|
|
1235
|
+
query: { kind: "refs", refs: refs.map((ref) => ({ ...ref })) }
|
|
1236
|
+
};
|
|
1237
|
+
}
|
|
1238
|
+
function validateStart(objectTypeId, includeSubtypes, path, ctx) {
|
|
1239
|
+
if (!objectTypeId) {
|
|
1240
|
+
addIssue(ctx, path, "missing_object_type", "start.objectTypeId is required");
|
|
1241
|
+
return { result: { objectTypeIds: [] }, query: { kind: "start", objectTypeId } };
|
|
1242
|
+
}
|
|
1243
|
+
if (!ctx.ontology.getObjectTypeById(objectTypeId)) {
|
|
1244
|
+
addIssue(ctx, path, "unknown_object_type", formatUnknownObjectTypeMessage(objectTypeId));
|
|
1245
|
+
return { result: { objectTypeIds: [] }, query: { kind: "start", objectTypeId } };
|
|
1246
|
+
}
|
|
1247
|
+
const objectTypeIds = includeSubtypes ? withSubtypes([objectTypeId], ctx) : [objectTypeId];
|
|
1248
|
+
return { result: { objectTypeIds }, query: { kind: "start", objectTypeId, includeSubtypes } };
|
|
1249
|
+
}
|
|
1250
|
+
function validatePredicate(predicate, shape, admissionState, path, ctx) {
|
|
1251
|
+
switch (predicate.op) {
|
|
1252
|
+
case "and":
|
|
1253
|
+
case "or":
|
|
1254
|
+
if (predicate.items.length === 0) {
|
|
1255
|
+
addIssue(ctx, path, "empty_predicate_group", `Predicate '${predicate.op}' must not be empty`);
|
|
1256
|
+
}
|
|
1257
|
+
return {
|
|
1258
|
+
...predicate,
|
|
1259
|
+
items: predicate.items.map((item, index) => validatePredicate(item, shape, admissionState, `${path}.items[${index}]`, ctx))
|
|
1260
|
+
};
|
|
1261
|
+
case "not":
|
|
1262
|
+
return {
|
|
1263
|
+
...predicate,
|
|
1264
|
+
item: validatePredicate(predicate.item, shape, admissionState, `${path}.item`, ctx)
|
|
1265
|
+
};
|
|
1266
|
+
case "eq":
|
|
1267
|
+
case "neq":
|
|
1268
|
+
case "lt":
|
|
1269
|
+
case "lte":
|
|
1270
|
+
case "gt":
|
|
1271
|
+
case "gte": {
|
|
1272
|
+
const { scalarKind: _authoredScalarKind, ...authoredPredicate } = predicate;
|
|
1273
|
+
const scalarKind = resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx);
|
|
1274
|
+
validatePredicateValue(predicate.propertyId, predicate.op, predicate.value, shape, path, ctx);
|
|
1275
|
+
admitProperty(ctx, {
|
|
1276
|
+
state: admissionState,
|
|
1277
|
+
propertyId: predicate.propertyId,
|
|
1278
|
+
use: "filter",
|
|
1279
|
+
path
|
|
1280
|
+
});
|
|
1281
|
+
return {
|
|
1282
|
+
...authoredPredicate,
|
|
1283
|
+
value: normalizeObjectQueryValue(predicate.value, scalarKind),
|
|
1284
|
+
...scalarKind ? { scalarKind } : {}
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
case "in": {
|
|
1288
|
+
const { scalarKind: _authoredScalarKind, ...authoredPredicate } = predicate;
|
|
1289
|
+
const scalarKind = resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx);
|
|
1290
|
+
if (predicate.values.length === 0) {
|
|
1291
|
+
addIssue(ctx, path, "empty_in_values", "Predicate 'in' must include at least one value");
|
|
1292
|
+
}
|
|
1293
|
+
predicate.values.forEach((value, index) => {
|
|
1294
|
+
validatePredicateValue(predicate.propertyId, predicate.op, value, shape, `${path}.values[${index}]`, ctx);
|
|
1295
|
+
});
|
|
1296
|
+
admitProperty(ctx, {
|
|
1297
|
+
state: admissionState,
|
|
1298
|
+
propertyId: predicate.propertyId,
|
|
1299
|
+
use: "filter",
|
|
1300
|
+
path
|
|
1301
|
+
});
|
|
1302
|
+
return {
|
|
1303
|
+
...authoredPredicate,
|
|
1304
|
+
values: predicate.values.map((value) => normalizeObjectQueryValue(value, scalarKind)),
|
|
1305
|
+
...scalarKind ? { scalarKind } : {}
|
|
1306
|
+
};
|
|
1307
|
+
}
|
|
1308
|
+
case "exists":
|
|
1309
|
+
resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx);
|
|
1310
|
+
admitProperty(ctx, {
|
|
1311
|
+
state: admissionState,
|
|
1312
|
+
propertyId: predicate.propertyId,
|
|
1313
|
+
use: "filter",
|
|
1314
|
+
path
|
|
1315
|
+
});
|
|
1316
|
+
if (typeof predicate.value !== "boolean") {
|
|
1317
|
+
addIssue(ctx, path, "invalid_exists_value", "Predicate 'exists' value must be boolean");
|
|
1318
|
+
}
|
|
1319
|
+
return predicate;
|
|
1320
|
+
case "constant":
|
|
1321
|
+
if (typeof predicate.value !== "boolean") {
|
|
1322
|
+
addIssue(ctx, path, "invalid_constant_value", "Predicate 'constant' value must be boolean");
|
|
1323
|
+
}
|
|
1324
|
+
return predicate;
|
|
1325
|
+
case "contains": {
|
|
1326
|
+
const { scalarKind: _authoredScalarKind, ...authoredPredicate } = predicate;
|
|
1327
|
+
const scalarKind = resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx);
|
|
1328
|
+
validateContainsValue(predicate.propertyId, predicate.value, shape, path, ctx);
|
|
1329
|
+
admitProperty(ctx, {
|
|
1330
|
+
state: admissionState,
|
|
1331
|
+
propertyId: predicate.propertyId,
|
|
1332
|
+
use: "filter",
|
|
1333
|
+
path
|
|
1334
|
+
});
|
|
1335
|
+
return {
|
|
1336
|
+
...authoredPredicate,
|
|
1337
|
+
value: normalizeObjectQueryValue(predicate.value, scalarKind),
|
|
1338
|
+
...scalarKind ? { scalarKind } : {}
|
|
1339
|
+
};
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
function resolveAndValidatePredicateProperty(propertyId, op, shape, path, ctx) {
|
|
1344
|
+
const properties = getPropertiesForResult(propertyId, shape, path, ctx);
|
|
1345
|
+
if (properties.length === 0)
|
|
1346
|
+
return;
|
|
1347
|
+
const schemas = [];
|
|
1348
|
+
for (const { objectType, property } of properties) {
|
|
1349
|
+
const schema = resolveSchemaForProperty(property, objectType.id, ctx, path);
|
|
1350
|
+
if (schema)
|
|
1351
|
+
schemas.push(schema);
|
|
1352
|
+
if (isPrimaryExactPredicate(property, op)) {
|
|
1353
|
+
continue;
|
|
1354
|
+
}
|
|
1355
|
+
if (property.query?.searchable !== true || property.query.filterable !== true) {
|
|
1356
|
+
addIssue(ctx, path, "property_not_filterable", `Property '${propertyId}' on '${objectType.id}' must set query.searchable: true and query.filterable: true before it can be used in predicates`);
|
|
1357
|
+
continue;
|
|
1358
|
+
}
|
|
1359
|
+
if (!schema)
|
|
1360
|
+
continue;
|
|
1361
|
+
if ((op === "lt" || op === "lte" || op === "gt" || op === "gte") && !isSortableSchema(schema)) {
|
|
1362
|
+
addIssue(ctx, path, "operator_not_supported_for_schema", `Predicate '${op}' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema is not orderable`);
|
|
1363
|
+
}
|
|
1364
|
+
if ((op === "eq" || op === "neq" || op === "in" || op === "exists") && !isExactSchema(schema)) {
|
|
1365
|
+
addIssue(ctx, path, "operator_not_supported_for_schema", `Predicate '${op}' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema cannot be exact-matched`);
|
|
1366
|
+
}
|
|
1367
|
+
if (op === "contains" && !isContainsSchema(schema)) {
|
|
1368
|
+
addIssue(ctx, path, "operator_not_supported_for_schema", `Predicate 'contains' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema is not string, array, or map`);
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
if (op === "exists")
|
|
1372
|
+
return;
|
|
1373
|
+
if (op === "contains")
|
|
1374
|
+
return resolveArrayItemScalarKind(schemas, ctx);
|
|
1375
|
+
return resolveCommonQueryScalarKind(schemas, propertyId, path, ctx);
|
|
1376
|
+
}
|
|
1377
|
+
function resolveArrayItemScalarKind(schemas, ctx) {
|
|
1378
|
+
const kinds = new Set;
|
|
1379
|
+
for (const schema of schemas) {
|
|
1380
|
+
if (typeof schema === "string" || schema.type !== "array")
|
|
1381
|
+
return;
|
|
1382
|
+
const items = resolveValueTypeRefs(schema.items, ctx.valueTypesById);
|
|
1383
|
+
kinds.add(items ? queryScalarKindForSchema(items) : undefined);
|
|
1384
|
+
}
|
|
1385
|
+
return kinds.size === 1 ? [...kinds][0] : undefined;
|
|
1386
|
+
}
|
|
1387
|
+
function resolveValueTypeRefs(schema, valueTypesById, seen = new Set) {
|
|
1388
|
+
if (typeof schema === "string" || schema.type !== "valueTypeRef")
|
|
1389
|
+
return schema;
|
|
1390
|
+
if (seen.has(schema.valueTypeId))
|
|
1391
|
+
return;
|
|
1392
|
+
seen.add(schema.valueTypeId);
|
|
1393
|
+
const resolved = schema._resolved ?? valueTypesById.get(schema.valueTypeId)?.schema;
|
|
1394
|
+
return resolved ? resolveValueTypeRefs(resolved, valueTypesById, seen) : undefined;
|
|
1395
|
+
}
|
|
1396
|
+
function normalizeObjectQueryValue(value, scalarKind) {
|
|
1397
|
+
try {
|
|
1398
|
+
if (scalarKind === "decimal" && typeof value === "string")
|
|
1399
|
+
return normalizeDecimalValue2(value);
|
|
1400
|
+
if ((scalarKind === "date" || scalarKind === "timestamp") && isTemporalValue(value)) {
|
|
1401
|
+
return normalizeSchemaValue2(scalarKind, value, "predicate value", NO_VALUE_TYPES);
|
|
1402
|
+
}
|
|
1403
|
+
} catch {
|
|
1404
|
+
return value;
|
|
1405
|
+
}
|
|
1406
|
+
return value;
|
|
1407
|
+
}
|
|
1408
|
+
var NO_VALUE_TYPES = new Map;
|
|
1409
|
+
function isTemporalValue(value) {
|
|
1410
|
+
return typeof value === "string" || value instanceof Date;
|
|
1411
|
+
}
|
|
1412
|
+
function resolveCommonQueryScalarKind(schemas, propertyId, path, ctx) {
|
|
1413
|
+
const scalarKinds = schemas.map(queryScalarKindForSchema);
|
|
1414
|
+
if (scalarKinds.length === 0 || scalarKinds.some((kind) => kind === undefined)) {
|
|
1415
|
+
return;
|
|
1416
|
+
}
|
|
1417
|
+
const resolvedKinds = new Set(scalarKinds);
|
|
1418
|
+
if (resolvedKinds.size === 1)
|
|
1419
|
+
return scalarKinds[0];
|
|
1420
|
+
addIssue(ctx, path, "incompatible_property_scalar_kinds", `Property '${propertyId}' resolves to incompatible scalar schemas: ${[...resolvedKinds].join(", ")}`);
|
|
1421
|
+
return;
|
|
1422
|
+
}
|
|
1423
|
+
function validatePredicateValue(propertyId, op, value, shape, path, ctx) {
|
|
1424
|
+
if (isCurrentUser(value)) {
|
|
1425
|
+
validateCurrentUserPredicate(propertyId, op, shape, path, ctx);
|
|
1426
|
+
return;
|
|
1427
|
+
}
|
|
1428
|
+
for (const { objectType, property } of getPropertiesForResult(propertyId, shape, path, ctx, {
|
|
1429
|
+
reportMissing: false
|
|
1430
|
+
})) {
|
|
1431
|
+
try {
|
|
1432
|
+
validatePropertyValue2(property, value, `${objectType.id}.${property.id}`, ctx.valueTypesById);
|
|
1433
|
+
} catch (error) {
|
|
1434
|
+
addIssue(ctx, path, "invalid_predicate_value", error instanceof Error ? error.message : `Invalid value for property '${property.id}' on '${objectType.id}'`);
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
function validateContainsValue(propertyId, value, shape, path, ctx) {
|
|
1439
|
+
if (isCurrentUser(value)) {
|
|
1440
|
+
validateCurrentUserPredicate(propertyId, "contains", shape, path, ctx);
|
|
1441
|
+
return;
|
|
1442
|
+
}
|
|
1443
|
+
for (const { objectType, property } of getPropertiesForResult(propertyId, shape, path, ctx, {
|
|
1444
|
+
reportMissing: false
|
|
1445
|
+
})) {
|
|
1446
|
+
const schema = resolveSchemaForProperty(property, objectType.id, ctx, path);
|
|
1447
|
+
if (!schema)
|
|
1448
|
+
continue;
|
|
1449
|
+
if (typeof schema === "string") {
|
|
1450
|
+
if (isContainsSchema(schema)) {
|
|
1451
|
+
if (typeof value !== "string") {
|
|
1452
|
+
addIssue(ctx, path, "invalid_contains_value", `Predicate 'contains' value for '${objectType.id}.${property.id}' must be a string`);
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
continue;
|
|
1456
|
+
}
|
|
1457
|
+
if (schema.type === "array") {
|
|
1458
|
+
try {
|
|
1459
|
+
validateSchemaValue2(schema.items, value, `${objectType.id}.${property.id}[]`, ctx.valueTypesById);
|
|
1460
|
+
} catch (error) {
|
|
1461
|
+
addIssue(ctx, path, "invalid_contains_value", error instanceof Error ? error.message : `Invalid contains value for '${objectType.id}.${property.id}'`);
|
|
1462
|
+
}
|
|
1463
|
+
continue;
|
|
1464
|
+
}
|
|
1465
|
+
if (schema.type === "map" && typeof value !== "string") {
|
|
1466
|
+
addIssue(ctx, path, "invalid_contains_value", `Predicate 'contains' value for '${objectType.id}.${property.id}' must be a map key string`);
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1470
|
+
function validateCurrentUserPredicate(propertyId, op, shape, path, ctx) {
|
|
1471
|
+
if (op !== "eq" && op !== "neq" && op !== "in" && op !== "contains") {
|
|
1472
|
+
addIssue(ctx, path, "current_user_operator_not_supported", `Predicate '${op}' cannot compare currentUser(); use eq, neq, in, or contains.`);
|
|
1473
|
+
return;
|
|
1474
|
+
}
|
|
1475
|
+
for (const { objectType, property } of getPropertiesForResult(propertyId, shape, path, ctx, {
|
|
1476
|
+
reportMissing: false
|
|
1477
|
+
})) {
|
|
1478
|
+
if (holdsUserReferences(property.schema, op === "contains", ctx))
|
|
1479
|
+
continue;
|
|
1480
|
+
addIssue(ctx, path, "current_user_requires_user_reference", op === "contains" ? `currentUser() can only be found in a list of ref.user() values; '${objectType.id}.${property.id}' is not one.` : `currentUser() can only be compared with a ref.user() property; '${objectType.id}.${property.id}' is not one.`);
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
function holdsUserReferences(schema, list, ctx) {
|
|
1484
|
+
const resolved = resolveValueTypeRefs(schema, ctx.valueTypesById);
|
|
1485
|
+
if (!list)
|
|
1486
|
+
return resolved === "userRef";
|
|
1487
|
+
if (typeof resolved !== "object" || resolved.type !== "array")
|
|
1488
|
+
return false;
|
|
1489
|
+
return resolveValueTypeRefs(resolved.items, ctx.valueTypesById) === "userRef";
|
|
1490
|
+
}
|
|
1491
|
+
function validateTextQuery(query, fields, shape, admissionState, path, ctx) {
|
|
1492
|
+
if (query.trim().length === 0) {
|
|
1493
|
+
addIssue(ctx, path, "empty_text_query", "Text query must not be empty");
|
|
1494
|
+
}
|
|
1495
|
+
const fieldsByObjectType = fields ? undefined : {};
|
|
1496
|
+
for (const objectType of getObjectTypesForResult(shape, ctx)) {
|
|
1497
|
+
const fieldIds = fields ?? objectType.search?.defaultText;
|
|
1498
|
+
if (!fieldIds || fieldIds.length === 0) {
|
|
1499
|
+
addIssue(ctx, path, "missing_text_fields", `Object type '${objectType.id}' must define search.defaultText or the text query must specify fields`);
|
|
1500
|
+
continue;
|
|
1501
|
+
}
|
|
1502
|
+
const admitted = admitTextFields(fieldIds, fields === undefined, {
|
|
1503
|
+
state: admissionState,
|
|
1504
|
+
objectTypeId: objectType.id,
|
|
1505
|
+
path: `${path}.fields`,
|
|
1506
|
+
ctx
|
|
1507
|
+
});
|
|
1508
|
+
if (fieldsByObjectType)
|
|
1509
|
+
fieldsByObjectType[objectType.id] = uniqueStrings(admitted);
|
|
1510
|
+
for (const fieldId of fieldIds) {
|
|
1511
|
+
const property = getProperty(objectType, fieldId);
|
|
1512
|
+
if (!property) {
|
|
1513
|
+
addIssue(ctx, path, "unknown_text_field", `Text query references unknown property '${fieldId}' on '${objectType.id}'`);
|
|
1514
|
+
continue;
|
|
1515
|
+
}
|
|
1516
|
+
assertStaticSearchProperty(objectType.id, property, "text query", path, ctx);
|
|
1517
|
+
assertQueryFlag(objectType.id, property, "text", "text query", path, ctx);
|
|
1518
|
+
const schema = resolveSchemaForProperty(property, objectType.id, ctx, path);
|
|
1519
|
+
if (schema && !isTextSchema(schema)) {
|
|
1520
|
+
addIssue(ctx, path, "text_field_not_string_like", `Text query field '${fieldId}' on '${objectType.id}' must be string-like`);
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
return fieldsByObjectType ? { fieldsByObjectType } : {};
|
|
1525
|
+
}
|
|
1526
|
+
function admitTextFields(fieldIds, defaults, input) {
|
|
1527
|
+
const admitted = [];
|
|
1528
|
+
let firstDenial;
|
|
1529
|
+
for (const fieldId of fieldIds) {
|
|
1530
|
+
const denial = input.ctx.admission.property({
|
|
1531
|
+
state: input.state,
|
|
1532
|
+
propertyId: fieldId,
|
|
1533
|
+
objectTypeId: input.objectTypeId,
|
|
1534
|
+
use: "text",
|
|
1535
|
+
path: input.path
|
|
1536
|
+
});
|
|
1537
|
+
if (!denial) {
|
|
1538
|
+
admitted.push(fieldId);
|
|
1539
|
+
} else if (!defaults) {
|
|
1540
|
+
recordAdmissionDenial(input.ctx, denial);
|
|
1541
|
+
} else {
|
|
1542
|
+
firstDenial ??= denial;
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
if (admitted.length === 0 && firstDenial)
|
|
1546
|
+
recordAdmissionDenial(input.ctx, firstDenial);
|
|
1547
|
+
return admitted;
|
|
1548
|
+
}
|
|
1549
|
+
function validateVectorProfileQuery(query, shape, state, path, ctx) {
|
|
1550
|
+
const types = getObjectTypesForResult(shape, ctx);
|
|
1551
|
+
if (types.length !== 1 || !Number.isSafeInteger(query.k) || query.k < 1 || query.k > MAX_VECTOR_K) {
|
|
1552
|
+
addIssue(ctx, path, "invalid_vector_profile_query", `Vector search requires one type, one profile and k between 1 and ${MAX_VECTOR_K}`);
|
|
1553
|
+
return query;
|
|
1554
|
+
}
|
|
1555
|
+
const objectType = types[0];
|
|
1556
|
+
const profile = query.profile === undefined ? undefined : objectType.search?.vectors?.[query.profile];
|
|
1557
|
+
if (!profile) {
|
|
1558
|
+
addIssue(ctx, path, "unknown_vector_profile", `Unknown vector profile: ${query.profile}`);
|
|
1559
|
+
return query;
|
|
1560
|
+
}
|
|
1561
|
+
for (const propertyId of profile.source)
|
|
1562
|
+
admitProperty(ctx, { state, propertyId, objectTypeId: objectType.id, use: "vector", path });
|
|
1563
|
+
let values = query.vector;
|
|
1564
|
+
try {
|
|
1565
|
+
if (typeof values === "string") {
|
|
1566
|
+
if (!values.trim() || values.length > 8000) {
|
|
1567
|
+
throw new Error("Vector search text must be nonempty and at most 8000 characters.");
|
|
1568
|
+
}
|
|
1569
|
+
} else {
|
|
1570
|
+
values = normalizeVector2(values, profile.model.definition.dimensions);
|
|
1571
|
+
}
|
|
1572
|
+
} catch (error) {
|
|
1573
|
+
addIssue(ctx, path, "invalid_vector", error instanceof Error ? error.message : "Invalid vector");
|
|
1574
|
+
}
|
|
1575
|
+
return {
|
|
1576
|
+
...query,
|
|
1577
|
+
vector: values,
|
|
1578
|
+
source: [...profile.source],
|
|
1579
|
+
configuration: vectorConfiguration(profile)
|
|
1580
|
+
};
|
|
1581
|
+
}
|
|
1582
|
+
function validateTraverse(linkId, direction, sourceObjectTypeId, shape, path, ctx) {
|
|
1583
|
+
if (!linkId) {
|
|
1584
|
+
addIssue(ctx, path, "missing_link_id", "traverse.linkId is required");
|
|
1585
|
+
return { objectTypeIds: [] };
|
|
1586
|
+
}
|
|
1587
|
+
if (direction === "outgoing") {
|
|
1588
|
+
if (sourceObjectTypeId !== undefined) {
|
|
1589
|
+
addIssue(ctx, path, "traverse_source_not_applicable", "traverse.sourceObjectTypeId only applies to incoming traversal");
|
|
1590
|
+
}
|
|
1591
|
+
return validateOutgoingTraverse(linkId, shape, path, ctx);
|
|
1592
|
+
}
|
|
1593
|
+
return validateIncomingTraverse(linkId, sourceObjectTypeId, shape, path, ctx);
|
|
1594
|
+
}
|
|
1595
|
+
function validateOutgoingTraverse(linkId, shape, path, ctx) {
|
|
1596
|
+
const targetTypeIds = [];
|
|
1597
|
+
for (const objectType of getObjectTypesForResult(shape, ctx)) {
|
|
1598
|
+
const link = objectType.links.find((candidate) => candidate.id === linkId);
|
|
1599
|
+
if (!link) {
|
|
1600
|
+
addIssue(ctx, path, "unknown_link", `Outgoing traversal references unknown link '${linkId}' on '${objectType.id}'`);
|
|
1601
|
+
continue;
|
|
1602
|
+
}
|
|
1603
|
+
if (link.targetObjectTypeId === "*") {
|
|
1604
|
+
addIssue(ctx, path, "wildcard_traverse_target", `Outgoing traversal over wildcard link '${objectType.id}.${linkId}' cannot infer a target object type`);
|
|
1605
|
+
continue;
|
|
1606
|
+
}
|
|
1607
|
+
const declaredTargets = Array.isArray(link.targetObjectTypeId) ? link.targetObjectTypeId : [link.targetObjectTypeId];
|
|
1608
|
+
for (const targetId of declaredTargets) {
|
|
1609
|
+
if (!ctx.ontology.getObjectTypeById(targetId)) {
|
|
1610
|
+
addIssue(ctx, path, "unknown_link_target", `Outgoing traversal over '${objectType.id}.${linkId}' targets unknown object type '${targetId}'`);
|
|
1611
|
+
} else {
|
|
1612
|
+
targetTypeIds.push(targetId);
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
const objectTypeIds = uniqueStrings(targetTypeIds);
|
|
1617
|
+
touchLinkTargets(objectTypeIds, ctx);
|
|
1618
|
+
return { objectTypeIds };
|
|
1619
|
+
}
|
|
1620
|
+
function validateIncomingTraverse(linkId, sourceObjectTypeId, shape, path, ctx) {
|
|
1621
|
+
let candidateTypes = ctx.ontology.listObjectTypes();
|
|
1622
|
+
if (sourceObjectTypeId !== undefined) {
|
|
1623
|
+
const sourceType = ctx.ontology.getObjectTypeById(sourceObjectTypeId);
|
|
1624
|
+
if (!sourceType) {
|
|
1625
|
+
addIssue(ctx, path, "unknown_traverse_source", `Incoming traversal references unknown source object type '${sourceObjectTypeId}'`);
|
|
1626
|
+
return { objectTypeIds: [] };
|
|
1627
|
+
}
|
|
1628
|
+
candidateTypes = [sourceType];
|
|
1629
|
+
}
|
|
1630
|
+
const sourceTypeIds = [];
|
|
1631
|
+
for (const sourceType of candidateTypes) {
|
|
1632
|
+
const link = sourceType.links.find((candidate) => candidate.id === linkId);
|
|
1633
|
+
if (!link)
|
|
1634
|
+
continue;
|
|
1635
|
+
if (link.targetObjectTypeId === "*") {
|
|
1636
|
+
sourceTypeIds.push(sourceType.id);
|
|
1637
|
+
continue;
|
|
1638
|
+
}
|
|
1639
|
+
const matches = shape.objectTypeIds.some((targetTypeId) => ctx.ontology.isValidLinkTarget(link.targetObjectTypeId, targetTypeId));
|
|
1640
|
+
if (matches)
|
|
1641
|
+
sourceTypeIds.push(sourceType.id);
|
|
1642
|
+
}
|
|
1643
|
+
if (sourceTypeIds.length === 0) {
|
|
1644
|
+
addIssue(ctx, path, "incoming_link_not_found", `Incoming traversal found no source object types with link '${linkId}' targeting ${shape.objectTypeIds.join(" | ")}`);
|
|
1645
|
+
}
|
|
1646
|
+
return { objectTypeIds: uniqueStrings(sourceTypeIds) };
|
|
1647
|
+
}
|
|
1648
|
+
function validateExpansions(expansions, shape, admissionState, path, ctx, usersAllowed) {
|
|
1649
|
+
return expansions.map((expansion, index) => validateExpansion(expansion, shape, admissionState, `${path}[${index}]`, ctx, usersAllowed));
|
|
1650
|
+
}
|
|
1651
|
+
function validateExpansion(expansion, shape, admissionState, path, ctx, usersAllowed) {
|
|
1652
|
+
if (!expansion.linkId) {
|
|
1653
|
+
addIssue(ctx, path, "missing_expand_link", "expand.linkId is required");
|
|
1654
|
+
return expansion;
|
|
1655
|
+
}
|
|
1656
|
+
const targetShape = expansion.direction === "incoming" ? resolveIncomingExpansionTargets(expansion.linkId, expansion.sourceObjectTypeId, shape, path, ctx) : resolveOutgoingExpansionTargets(expansion.linkId, expansion.sourceObjectTypeId, shape, path, ctx);
|
|
1657
|
+
const targetAdmissionState = admitTransition(ctx, ctx.admission.edge({
|
|
1658
|
+
state: admissionState,
|
|
1659
|
+
result: targetShape,
|
|
1660
|
+
linkId: expansion.linkId,
|
|
1661
|
+
direction: expansion.direction,
|
|
1662
|
+
sourceObjectTypeId: expansion.sourceObjectTypeId,
|
|
1663
|
+
use: "expand",
|
|
1664
|
+
path
|
|
1665
|
+
}));
|
|
1666
|
+
for (const targetTypeId of targetShape.objectTypeIds) {
|
|
1667
|
+
ctx.touchedObjectTypeIds.add(targetTypeId);
|
|
1668
|
+
}
|
|
1669
|
+
validateExpansionLimit(expansion.limit, path, ctx);
|
|
1670
|
+
const orderBy = expansion.orderBy ? validateSortFields(expansion.orderBy, targetShape, targetAdmissionState, "expand.orderBy", `${path}.orderBy`, ctx) : undefined;
|
|
1671
|
+
const expand = expansion.expand ? validateExpansions(expansion.expand, targetShape, targetAdmissionState, `${path}.expand`, ctx, usersAllowed) : undefined;
|
|
1672
|
+
validateUserExpansions(expansion.users, targetShape, `${path}.users`, ctx, usersAllowed);
|
|
1673
|
+
return { ...expansion, orderBy, expand };
|
|
1674
|
+
}
|
|
1675
|
+
function validateUserExpansions(users, shape, path, ctx, usersAllowed) {
|
|
1676
|
+
if (users === undefined)
|
|
1677
|
+
return;
|
|
1678
|
+
if (!Array.isArray(users)) {
|
|
1679
|
+
addIssue(ctx, path, "invalid_user_expansion", "expand.users must be an array of property ids");
|
|
1680
|
+
return;
|
|
1681
|
+
}
|
|
1682
|
+
if (!usersAllowed && users.length > 0) {
|
|
1683
|
+
addIssue(ctx, path, "invalid_user_expansion", "Only the outermost expand can expand user properties; a set operand cannot.");
|
|
1684
|
+
return;
|
|
1685
|
+
}
|
|
1686
|
+
users.forEach((propertyId, index) => {
|
|
1687
|
+
const propertyPath = `${path}[${index}]`;
|
|
1688
|
+
if (typeof propertyId !== "string" || propertyId.length === 0) {
|
|
1689
|
+
addIssue(ctx, propertyPath, "invalid_user_expansion", "expand.users ids must not be empty");
|
|
1690
|
+
return;
|
|
1691
|
+
}
|
|
1692
|
+
const declared = getPropertiesForResult(propertyId, shape, propertyPath, ctx, {
|
|
1693
|
+
reportMissing: false
|
|
1694
|
+
});
|
|
1695
|
+
if (declared.length === 0) {
|
|
1696
|
+
addIssue(ctx, propertyPath, "unknown_property", `Expansion references property '${propertyId}' not present on result type ${shape.objectTypeIds.join(" | ")} (an expand abandoned by a later traverse?)`);
|
|
1697
|
+
return;
|
|
1698
|
+
}
|
|
1699
|
+
for (const { objectType, property } of declared) {
|
|
1700
|
+
if (isUserRefPropertySchema(property.schema))
|
|
1701
|
+
continue;
|
|
1702
|
+
addIssue(ctx, propertyPath, "invalid_user_expansion", `Property '${propertyId}' on '${objectType.id}' is not a ref.user() property; expand() takes a link or a user property.`);
|
|
1703
|
+
}
|
|
1704
|
+
});
|
|
1705
|
+
}
|
|
1706
|
+
function validateUserExpansionsProjected(users, input, path, ctx) {
|
|
1707
|
+
if (!Array.isArray(users))
|
|
1708
|
+
return;
|
|
1709
|
+
const projected = projectedProperties(input);
|
|
1710
|
+
if (projected === undefined)
|
|
1711
|
+
return;
|
|
1712
|
+
users.forEach((propertyId, index) => {
|
|
1713
|
+
if (projected.includes(propertyId))
|
|
1714
|
+
return;
|
|
1715
|
+
addIssue(ctx, `${path}[${index}]`, "invalid_user_expansion", `Expanded user property '${propertyId}' must be projected too.`);
|
|
1716
|
+
});
|
|
1717
|
+
}
|
|
1718
|
+
function projectedProperties(query) {
|
|
1719
|
+
switch (query.kind) {
|
|
1720
|
+
case "project":
|
|
1721
|
+
return query.properties;
|
|
1722
|
+
case "set":
|
|
1723
|
+
return keptByEveryOperand(query.inputs.map(projectedProperties));
|
|
1724
|
+
case "filter":
|
|
1725
|
+
case "text":
|
|
1726
|
+
case "vector":
|
|
1727
|
+
case "rerank":
|
|
1728
|
+
case "sort":
|
|
1729
|
+
case "limit":
|
|
1730
|
+
case "page":
|
|
1731
|
+
return projectedProperties(query.input);
|
|
1732
|
+
default:
|
|
1733
|
+
return;
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
function keptByEveryOperand(projections) {
|
|
1737
|
+
const projected = projections.filter((properties) => properties !== undefined);
|
|
1738
|
+
if (projected.length === 0)
|
|
1739
|
+
return;
|
|
1740
|
+
return projected.reduce((kept, properties) => kept.filter((propertyId) => properties.includes(propertyId)));
|
|
1741
|
+
}
|
|
1742
|
+
function resolveOutgoingExpansionTargets(linkId, sourceObjectTypeId, shape, path, ctx) {
|
|
1743
|
+
if (sourceObjectTypeId !== undefined) {
|
|
1744
|
+
addIssue(ctx, path, "expand_source_not_applicable", "expand.sourceObjectTypeId only applies to incoming expansion");
|
|
1745
|
+
}
|
|
1746
|
+
const targetTypeIds = [];
|
|
1747
|
+
let foundOnAnyType = false;
|
|
1748
|
+
for (const objectType of getObjectTypesForResult(shape, ctx)) {
|
|
1749
|
+
const link = objectType.links.find((candidate) => candidate.id === linkId);
|
|
1750
|
+
if (!link)
|
|
1751
|
+
continue;
|
|
1752
|
+
foundOnAnyType = true;
|
|
1753
|
+
if (link.targetObjectTypeId === "*") {
|
|
1754
|
+
addIssue(ctx, path, "wildcard_expand_target", `Expansion over wildcard link '${objectType.id}.${linkId}' cannot infer a target object type`);
|
|
1755
|
+
continue;
|
|
1756
|
+
}
|
|
1757
|
+
const declaredTargets = Array.isArray(link.targetObjectTypeId) ? link.targetObjectTypeId : [link.targetObjectTypeId];
|
|
1758
|
+
for (const targetId of declaredTargets) {
|
|
1759
|
+
if (!ctx.ontology.getObjectTypeById(targetId)) {
|
|
1760
|
+
addIssue(ctx, path, "unknown_expand_target", `Expansion over '${objectType.id}.${linkId}' targets unknown object type '${targetId}'`);
|
|
1761
|
+
} else {
|
|
1762
|
+
targetTypeIds.push(targetId);
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
}
|
|
1766
|
+
if (!foundOnAnyType) {
|
|
1767
|
+
addIssue(ctx, path, "unknown_expand_link", `Expansion references link '${linkId}' not present on result type ${shape.objectTypeIds.join(" | ")} (an expand abandoned by a later traverse?)`);
|
|
1768
|
+
}
|
|
1769
|
+
const objectTypeIds = uniqueStrings(targetTypeIds);
|
|
1770
|
+
touchLinkTargets(objectTypeIds, ctx);
|
|
1771
|
+
return { objectTypeIds };
|
|
1772
|
+
}
|
|
1773
|
+
function touchLinkTargets(objectTypeIds, ctx) {
|
|
1774
|
+
for (const objectTypeId of withSubtypes(objectTypeIds, ctx)) {
|
|
1775
|
+
ctx.touchedObjectTypeIds.add(objectTypeId);
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
function resolveIncomingExpansionTargets(linkId, sourceObjectTypeId, shape, path, ctx) {
|
|
1779
|
+
let candidateTypes = ctx.ontology.listObjectTypes();
|
|
1780
|
+
if (sourceObjectTypeId !== undefined) {
|
|
1781
|
+
const sourceType = ctx.ontology.getObjectTypeById(sourceObjectTypeId);
|
|
1782
|
+
if (!sourceType) {
|
|
1783
|
+
addIssue(ctx, path, "unknown_expand_source", `Incoming expansion references unknown source object type '${sourceObjectTypeId}'`);
|
|
1784
|
+
return { objectTypeIds: [] };
|
|
1785
|
+
}
|
|
1786
|
+
candidateTypes = [sourceType];
|
|
1787
|
+
}
|
|
1788
|
+
const sourceTypeIds = [];
|
|
1789
|
+
for (const sourceType of candidateTypes) {
|
|
1790
|
+
const link = sourceType.links.find((candidate) => candidate.id === linkId);
|
|
1791
|
+
if (!link)
|
|
1792
|
+
continue;
|
|
1793
|
+
if (link.targetObjectTypeId === "*") {
|
|
1794
|
+
sourceTypeIds.push(sourceType.id);
|
|
1795
|
+
continue;
|
|
1796
|
+
}
|
|
1797
|
+
const matches = shape.objectTypeIds.some((targetTypeId) => ctx.ontology.isValidLinkTarget(link.targetObjectTypeId, targetTypeId));
|
|
1798
|
+
if (matches)
|
|
1799
|
+
sourceTypeIds.push(sourceType.id);
|
|
1800
|
+
}
|
|
1801
|
+
if (sourceTypeIds.length === 0) {
|
|
1802
|
+
addIssue(ctx, path, "incoming_expand_link_not_found", `Incoming expansion found no source object types with link '${linkId}' targeting ${shape.objectTypeIds.join(" | ")}`);
|
|
1803
|
+
}
|
|
1804
|
+
return { objectTypeIds: uniqueStrings(sourceTypeIds) };
|
|
1805
|
+
}
|
|
1806
|
+
function validateExpansionLimit(limit, path, ctx) {
|
|
1807
|
+
if (limit === undefined)
|
|
1808
|
+
return;
|
|
1809
|
+
if (!Number.isInteger(limit) || limit < 0) {
|
|
1810
|
+
addIssue(ctx, `${path}.limit`, "invalid_expand_limit", "expand.limit must be a non-negative integer");
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1813
|
+
function validateSet(inputs, op, path, ctx) {
|
|
1814
|
+
if (inputs.length === 0) {
|
|
1815
|
+
addIssue(ctx, path, "empty_set", `Set operation '${op}' must include at least one input`);
|
|
1816
|
+
return {
|
|
1817
|
+
result: { objectTypeIds: [] },
|
|
1818
|
+
query: { kind: "set", op, inputs },
|
|
1819
|
+
admissionState: ctx.admission.empty()
|
|
1820
|
+
};
|
|
1821
|
+
}
|
|
1822
|
+
const results = inputs.map((input, index) => validateQueryNode(input, `${path}.inputs[${index}]`, ctx));
|
|
1823
|
+
const first = results[0]?.result ?? { objectTypeIds: [] };
|
|
1824
|
+
const expected = keyForTypeIds(first.objectTypeIds);
|
|
1825
|
+
results.forEach((result, index) => {
|
|
1826
|
+
if (keyForTypeIds(result.result.objectTypeIds) !== expected) {
|
|
1827
|
+
addIssue(ctx, `${path}.inputs[${index}]`, "incompatible_set_input", `Set operation '${op}' inputs must produce the same object type set`);
|
|
1828
|
+
}
|
|
1829
|
+
});
|
|
1830
|
+
return {
|
|
1831
|
+
result: first,
|
|
1832
|
+
query: { kind: "set", op, inputs: results.map((result) => result.query) },
|
|
1833
|
+
admissionState: ctx.admission.set({
|
|
1834
|
+
op,
|
|
1835
|
+
states: results.map((result) => result.admissionState),
|
|
1836
|
+
path
|
|
1837
|
+
})
|
|
1838
|
+
};
|
|
1839
|
+
}
|
|
1840
|
+
function validateSortFields(fields, shape, admissionState, use, path, ctx) {
|
|
1841
|
+
if (fields.length === 0) {
|
|
1842
|
+
addIssue(ctx, path, "empty_sort", "Sort must include at least one field");
|
|
1843
|
+
return [];
|
|
1844
|
+
}
|
|
1845
|
+
const seen = new Set;
|
|
1846
|
+
return fields.map((field, index) => {
|
|
1847
|
+
if (field.direction && field.direction !== "asc" && field.direction !== "desc") {
|
|
1848
|
+
addIssue(ctx, `${path}.fields[${index}]`, "invalid_sort_direction", "Sort direction must be asc or desc");
|
|
1849
|
+
}
|
|
1850
|
+
const key = field.kind === "property" ? `property:${field.propertyId}` : "relevance";
|
|
1851
|
+
if (seen.has(key)) {
|
|
1852
|
+
addIssue(ctx, `${path}.fields[${index}]`, "duplicate_sort_field", `Duplicate sort field '${key}'`);
|
|
1853
|
+
}
|
|
1854
|
+
seen.add(key);
|
|
1855
|
+
if (field.kind === "relevance")
|
|
1856
|
+
return field;
|
|
1857
|
+
admitProperty(ctx, {
|
|
1858
|
+
state: admissionState,
|
|
1859
|
+
propertyId: field.propertyId,
|
|
1860
|
+
use,
|
|
1861
|
+
path: `${path}.fields[${index}]`
|
|
1862
|
+
});
|
|
1863
|
+
const { scalarKind: _authoredScalarKind, ...authoredField } = field;
|
|
1864
|
+
const schemas = [];
|
|
1865
|
+
for (const { objectType, property } of getPropertiesForResult(field.propertyId, shape, `${path}.fields[${index}]`, ctx)) {
|
|
1866
|
+
if (property.query?.searchable !== true || property.query.sortable !== true) {
|
|
1867
|
+
addIssue(ctx, `${path}.fields[${index}]`, "property_not_sortable", `Property '${property.id}' on '${objectType.id}' must set query.searchable: true and query.sortable: true before it can be sorted`);
|
|
1868
|
+
continue;
|
|
1869
|
+
}
|
|
1870
|
+
const schema = resolveSchemaForProperty(property, objectType.id, ctx, `${path}.fields[${index}]`);
|
|
1871
|
+
if (schema)
|
|
1872
|
+
schemas.push(schema);
|
|
1873
|
+
if (schema && !isSortableSchema(schema)) {
|
|
1874
|
+
addIssue(ctx, `${path}.fields[${index}]`, "sort_field_not_orderable", `Sort field '${property.id}' on '${objectType.id}' is not orderable`);
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
const scalarKind = resolveCommonQueryScalarKind(schemas, field.propertyId, `${path}.fields[${index}]`, ctx);
|
|
1878
|
+
return { ...authoredField, ...scalarKind ? { scalarKind } : {} };
|
|
1879
|
+
});
|
|
1880
|
+
}
|
|
1881
|
+
function validateLimit(limit, path, ctx) {
|
|
1882
|
+
if (!Number.isInteger(limit) || limit < 0) {
|
|
1883
|
+
addIssue(ctx, path, "invalid_limit", "limit must be a non-negative integer");
|
|
1884
|
+
} else if (limit > ctx.maxLimit) {
|
|
1885
|
+
addIssue(ctx, path, "limit_too_large", `limit must be <= ${ctx.maxLimit}`);
|
|
1886
|
+
}
|
|
1887
|
+
}
|
|
1888
|
+
function validatePage(pageSize, pageToken, path, ctx) {
|
|
1889
|
+
if (!Number.isInteger(pageSize) || pageSize <= 0) {
|
|
1890
|
+
addIssue(ctx, path, "invalid_page_size", "pageSize must be a positive integer");
|
|
1891
|
+
} else if (pageSize > ctx.maxPageSize) {
|
|
1892
|
+
addIssue(ctx, path, "page_size_too_large", `pageSize must be <= ${ctx.maxPageSize}`);
|
|
1893
|
+
}
|
|
1894
|
+
if (pageToken !== undefined && pageToken.length === 0) {
|
|
1895
|
+
addIssue(ctx, path, "empty_page_token", "pageToken must not be empty when provided");
|
|
1896
|
+
}
|
|
1897
|
+
}
|
|
1898
|
+
function validateProjection(properties, shape, admissionState, path, ctx) {
|
|
1899
|
+
if (!properties)
|
|
1900
|
+
return;
|
|
1901
|
+
if (properties.length === 0) {
|
|
1902
|
+
addIssue(ctx, path, "empty_projection", "project.properties must not be empty when provided");
|
|
1903
|
+
}
|
|
1904
|
+
const seen = new Set;
|
|
1905
|
+
properties.forEach((propertyId, index) => {
|
|
1906
|
+
admitProperty(ctx, {
|
|
1907
|
+
state: admissionState,
|
|
1908
|
+
propertyId,
|
|
1909
|
+
use: "project",
|
|
1910
|
+
path: `${path}.properties[${index}]`
|
|
1911
|
+
});
|
|
1912
|
+
if (seen.has(propertyId)) {
|
|
1913
|
+
addIssue(ctx, `${path}.properties[${index}]`, "duplicate_projection_property", `Duplicate projected property '${propertyId}'`);
|
|
1914
|
+
}
|
|
1915
|
+
seen.add(propertyId);
|
|
1916
|
+
getPropertiesForResult(propertyId, shape, `${path}.properties[${index}]`, ctx);
|
|
1917
|
+
});
|
|
1918
|
+
}
|
|
1919
|
+
function getObjectTypesForResult(shape, ctx) {
|
|
1920
|
+
const objectTypes = [];
|
|
1921
|
+
for (const objectTypeId of shape.objectTypeIds) {
|
|
1922
|
+
const objectType = ctx.ontology.getObjectTypeById(objectTypeId);
|
|
1923
|
+
if (objectType)
|
|
1924
|
+
objectTypes.push(objectType);
|
|
1925
|
+
}
|
|
1926
|
+
return objectTypes;
|
|
1927
|
+
}
|
|
1928
|
+
function getPropertiesForResult(propertyId, shape, path, ctx, options = {}) {
|
|
1929
|
+
const results = [];
|
|
1930
|
+
for (const objectType of getObjectTypesForResult(shape, ctx)) {
|
|
1931
|
+
const property = getProperty(objectType, propertyId);
|
|
1932
|
+
if (!property) {
|
|
1933
|
+
if (options.reportMissing === false) {
|
|
1934
|
+
continue;
|
|
1935
|
+
}
|
|
1936
|
+
addIssue(ctx, path, "unknown_property", `Property '${propertyId}' does not exist on object type '${objectType.id}'`);
|
|
1937
|
+
continue;
|
|
1938
|
+
}
|
|
1939
|
+
results.push({ objectType, property });
|
|
1940
|
+
}
|
|
1941
|
+
return results;
|
|
1942
|
+
}
|
|
1943
|
+
function getProperty(objectType, propertyId) {
|
|
1944
|
+
return objectType.properties.find((property) => property.id === propertyId);
|
|
1945
|
+
}
|
|
1946
|
+
function assertStaticSearchProperty(objectTypeId, property, context, path, ctx) {
|
|
1947
|
+
if (property.mode === "telemetry") {
|
|
1948
|
+
addIssue(ctx, path, "telemetry_search_property", `${context} references telemetry property '${property.id}' on '${objectTypeId}'. Search can only reference static properties because telemetry latest values are not object-query indexed.`);
|
|
1949
|
+
}
|
|
1950
|
+
}
|
|
1951
|
+
function assertQueryFlag(objectTypeId, property, flag, context, path, ctx) {
|
|
1952
|
+
if (property.query?.searchable === true && property.query[flag] === true)
|
|
1953
|
+
return;
|
|
1954
|
+
addIssue(ctx, path, "query_field_not_enabled", `${context} field '${property.id}' on '${objectTypeId}' must set query.searchable: true and query.${flag}: true`);
|
|
1955
|
+
}
|
|
1956
|
+
function resolveSchemaForProperty(property, objectTypeId, ctx, path) {
|
|
1957
|
+
try {
|
|
1958
|
+
return resolveSchema(property.schema, ctx.valueTypesById);
|
|
1959
|
+
} catch (error) {
|
|
1960
|
+
addIssue(ctx, path, "unresolved_property_schema", error instanceof Error ? error.message : `Could not resolve schema for '${objectTypeId}.${property.id}'`);
|
|
1961
|
+
return null;
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
function resolveSchema(schema, valueTypesById, seenValueTypeIds = new Set) {
|
|
1965
|
+
if (typeof schema === "string")
|
|
1966
|
+
return schema;
|
|
1967
|
+
if (schema.type !== "valueTypeRef")
|
|
1968
|
+
return schema;
|
|
1969
|
+
if (seenValueTypeIds.has(schema.valueTypeId)) {
|
|
1970
|
+
throw new Error(`Circular valueTypeRef '${schema.valueTypeId}'`);
|
|
1971
|
+
}
|
|
1972
|
+
const resolved = schema._resolved ?? valueTypesById.get(schema.valueTypeId)?.schema;
|
|
1973
|
+
if (!resolved) {
|
|
1974
|
+
throw new Error(`Unknown valueTypeRef '${schema.valueTypeId}'`);
|
|
1975
|
+
}
|
|
1976
|
+
seenValueTypeIds.add(schema.valueTypeId);
|
|
1977
|
+
return resolveSchema(resolved, valueTypesById, seenValueTypeIds);
|
|
1978
|
+
}
|
|
1979
|
+
function isPrimaryExactPredicate(property, op) {
|
|
1980
|
+
return property.primary === true && (op === "eq" || op === "in");
|
|
1981
|
+
}
|
|
1982
|
+
function keyForTypeIds(typeIds) {
|
|
1983
|
+
return uniqueStrings(typeIds).sort().join("\x00");
|
|
1984
|
+
}
|
|
1985
|
+
function uniqueStrings(values) {
|
|
1986
|
+
return [...new Set(values)];
|
|
1987
|
+
}
|
|
1988
|
+
function withSubtypes(objectTypeIds, ctx) {
|
|
1989
|
+
return uniqueStrings(objectTypeIds.flatMap((id) => [id, ...ctx.ontology.listSubTypes(id)]));
|
|
1990
|
+
}
|
|
1991
|
+
function admitTransition(ctx, transition) {
|
|
1992
|
+
if (transition.denial)
|
|
1993
|
+
recordAdmissionDenial(ctx, transition.denial);
|
|
1994
|
+
return transition.state;
|
|
1995
|
+
}
|
|
1996
|
+
function admitProperty(ctx, input) {
|
|
1997
|
+
const denial = ctx.admission.property(input);
|
|
1998
|
+
if (denial)
|
|
1999
|
+
recordAdmissionDenial(ctx, denial);
|
|
2000
|
+
}
|
|
2001
|
+
function recordAdmissionDenial(ctx, denial) {
|
|
2002
|
+
if (ctx.admissionDenials.length === 0)
|
|
2003
|
+
ctx.admissionDenials.push(denial);
|
|
2004
|
+
}
|
|
2005
|
+
function addIssue(ctx, path, code, message) {
|
|
2006
|
+
ctx.issues.push({ path, code, message });
|
|
2007
|
+
}
|
|
2008
|
+
|
|
2009
|
+
// src/security/view-conditions.ts
|
|
2010
|
+
function resolveViewCondition(roleId, grant, ontology) {
|
|
2011
|
+
if (!("condition" in grant) || grant.condition === undefined)
|
|
2012
|
+
return;
|
|
2013
|
+
const objectTypeId = grant.capability === "view" && grant.target === "object" ? onlyId(grant.selection) : undefined;
|
|
2014
|
+
if (objectTypeId === undefined) {
|
|
2015
|
+
throw new SecurityValidationError2(`[Sixb] Role '${roleId}' declares a condition on a grant that is not a view grant on one object type. Write can.view(Type).where(...).`);
|
|
2016
|
+
}
|
|
2017
|
+
const subject = viewConditionSubject({ roleId, objectTypeId });
|
|
2018
|
+
if (!ontology) {
|
|
2019
|
+
throw new SecurityValidationError2(`[Sixb] ${subject} needs the ontology to be validated.`);
|
|
2020
|
+
}
|
|
2021
|
+
const objectTypeIds = [objectTypeId, ...ontology.listSubTypes(objectTypeId)];
|
|
2022
|
+
try {
|
|
2023
|
+
const validated = validateObjectQueryWithAdmission({
|
|
2024
|
+
kind: "filter",
|
|
2025
|
+
input: { kind: "start", objectTypeId, includeSubtypes: true },
|
|
2026
|
+
predicate: grant.condition
|
|
2027
|
+
}, { ontology }, unmarkedPropertiesOnly(subject, objectTypeIds, ontology));
|
|
2028
|
+
if (validated.query.kind !== "filter") {
|
|
2029
|
+
throw new Error(`[Sixb] ${subject} did not validate as a filter.`);
|
|
2030
|
+
}
|
|
2031
|
+
const ordered = orderedTextComparison(validated.query.predicate);
|
|
2032
|
+
if (ordered) {
|
|
2033
|
+
throw new SecurityValidationError2(`[Sixb] ${subject} compares '${objectTypeId}.${ordered.propertyId}' with ${ordered.op}(). Storage providers order text differently, so a condition cannot order text: compare with eq, neq, in or contains instead.`);
|
|
2034
|
+
}
|
|
2035
|
+
return {
|
|
2036
|
+
roleId,
|
|
2037
|
+
objectTypeId,
|
|
2038
|
+
predicate: deepFreeze2(structuredClone(validated.query.predicate))
|
|
2039
|
+
};
|
|
2040
|
+
} catch (error) {
|
|
2041
|
+
if (!(error instanceof ObjectQueryValidationError2))
|
|
2042
|
+
throw error;
|
|
2043
|
+
const reasons = error.issues.map((issue) => issue.message).join("; ");
|
|
2044
|
+
throw new SecurityValidationError2(`[Sixb] ${subject}: ${reasons}`);
|
|
2045
|
+
}
|
|
2046
|
+
}
|
|
2047
|
+
function assertViewConditionsReadable(input) {
|
|
2048
|
+
for (const condition of input.conditions) {
|
|
2049
|
+
const predicate = bindCurrentUserPredicate(condition.predicate, STARTUP_CHECK_USER);
|
|
2050
|
+
const objectTypeIds = [condition.objectTypeId, ...input.getSubTypes(condition.objectTypeId)];
|
|
2051
|
+
try {
|
|
2052
|
+
input.objectStorage.createConditionalReadScope({
|
|
2053
|
+
projectId: input.projectId,
|
|
2054
|
+
scope: compileConditionalObjectReadScope2({
|
|
2055
|
+
kind: "conditional",
|
|
2056
|
+
conditions: objectTypeIds.map((objectTypeId) => ({ objectTypeId, predicate }))
|
|
2057
|
+
})
|
|
2058
|
+
});
|
|
2059
|
+
} catch (error) {
|
|
2060
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
2061
|
+
throw new SecurityValidationError2(`[Sixb] ${viewConditionSubject(condition)} cannot be read by the configured object storage: ${reason}`, { cause: error });
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
2065
|
+
var STARTUP_CHECK_USER = Object.freeze({ type: "user", id: "usr_sixb_startup_check" });
|
|
2066
|
+
function viewConditionSubject(condition) {
|
|
2067
|
+
return `Role '${condition.roleId}': can.view(${condition.objectTypeId}).where(...)`;
|
|
2068
|
+
}
|
|
2069
|
+
function orderedTextComparison(predicate) {
|
|
2070
|
+
switch (predicate.op) {
|
|
2071
|
+
case "and":
|
|
2072
|
+
case "or":
|
|
2073
|
+
for (const item of predicate.items) {
|
|
2074
|
+
const ordered = orderedTextComparison(item);
|
|
2075
|
+
if (ordered)
|
|
2076
|
+
return ordered;
|
|
2077
|
+
}
|
|
2078
|
+
return null;
|
|
2079
|
+
case "not":
|
|
2080
|
+
return orderedTextComparison(predicate.item);
|
|
2081
|
+
case "lt":
|
|
2082
|
+
case "lte":
|
|
2083
|
+
case "gt":
|
|
2084
|
+
case "gte":
|
|
2085
|
+
return predicate.scalarKind === "string" || predicate.scalarKind === "uuid" ? { propertyId: predicate.propertyId, op: predicate.op } : null;
|
|
2086
|
+
default:
|
|
2087
|
+
return null;
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
function onlyId(selection) {
|
|
2091
|
+
if (selection.all || selection.ids.length !== 1)
|
|
2092
|
+
return;
|
|
2093
|
+
return selection.ids[0];
|
|
2094
|
+
}
|
|
2095
|
+
function unmarkedPropertiesOnly(subject, objectTypeIds, ontology) {
|
|
2096
|
+
const state = Object.freeze({});
|
|
2097
|
+
const admission = {
|
|
2098
|
+
empty: () => state,
|
|
2099
|
+
source: () => ({ state }),
|
|
2100
|
+
edge: () => ({ state }),
|
|
2101
|
+
set: () => state,
|
|
2102
|
+
property: ({ propertyId }) => {
|
|
2103
|
+
for (const objectTypeId of objectTypeIds) {
|
|
2104
|
+
const property = ontology.getObjectTypeById(objectTypeId)?.properties.find((candidate) => candidate.id === propertyId);
|
|
2105
|
+
const markings = property?.markings ?? [];
|
|
2106
|
+
if (markings.length === 0)
|
|
2107
|
+
continue;
|
|
2108
|
+
return new SecurityValidationError2(`[Sixb] ${subject} reads '${objectTypeId}.${propertyId}', which carries [${markings.join(", ")}]. A condition can only read unmarked properties.`);
|
|
2109
|
+
}
|
|
2110
|
+
return;
|
|
2111
|
+
}
|
|
2112
|
+
};
|
|
2113
|
+
return Object.freeze(admission);
|
|
2114
|
+
}
|
|
2115
|
+
function deepFreeze2(value) {
|
|
2116
|
+
if (typeof value !== "object" || value === null)
|
|
2117
|
+
return value;
|
|
2118
|
+
for (const child of Object.values(value))
|
|
2119
|
+
deepFreeze2(child);
|
|
2120
|
+
return Object.freeze(value);
|
|
2121
|
+
}
|
|
2122
|
+
|
|
695
2123
|
// src/security/registry.ts
|
|
696
2124
|
class SecurityRegistry {
|
|
697
2125
|
markingsById;
|
|
@@ -699,6 +2127,7 @@ class SecurityRegistry {
|
|
|
699
2127
|
rolesById;
|
|
700
2128
|
membershipPoliciesById;
|
|
701
2129
|
resolvedRoles;
|
|
2130
|
+
viewConditions;
|
|
702
2131
|
constructor(input) {
|
|
703
2132
|
const definitions = validateSecurityDefinitionsAtStartup({
|
|
704
2133
|
markings: input.markings ?? [],
|
|
@@ -715,6 +2144,7 @@ class SecurityRegistry {
|
|
|
715
2144
|
connectorIds: input.connectorIds,
|
|
716
2145
|
shareIds: input.shareIds
|
|
717
2146
|
});
|
|
2147
|
+
this.viewConditions = definitions.roles.flatMap((role) => role.grants.flatMap((grant) => resolveViewCondition(role.id, grant, input.ontology) ?? []));
|
|
718
2148
|
const universe = {
|
|
719
2149
|
objectTypeIds: input.objectTypeIds ?? new Set,
|
|
720
2150
|
datasetIds: input.datasetIds ?? new Set,
|
|
@@ -730,12 +2160,17 @@ class SecurityRegistry {
|
|
|
730
2160
|
this.groupsById = definitions.groupsById;
|
|
731
2161
|
this.rolesById = definitions.rolesById;
|
|
732
2162
|
this.membershipPoliciesById = definitions.membershipPoliciesById;
|
|
733
|
-
this.resolvedRoles = definitions.roles.map((role) =>
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
2163
|
+
this.resolvedRoles = definitions.roles.map((role) => {
|
|
2164
|
+
const grants = resolveRoleGrants2(role, universe);
|
|
2165
|
+
const viewConditions = resolveRoleViewConditions2(this.viewConditions.filter((condition) => condition.roleId === role.id), grants, universe);
|
|
2166
|
+
return {
|
|
2167
|
+
id: role.id,
|
|
2168
|
+
grantedToGroupIds: role.grantedToGroupIds,
|
|
2169
|
+
grants,
|
|
2170
|
+
...viewConditions.size > 0 ? { viewConditions } : {},
|
|
2171
|
+
clearances: new Set(role.clearances ?? [])
|
|
2172
|
+
};
|
|
2173
|
+
});
|
|
739
2174
|
}
|
|
740
2175
|
listMarkings() {
|
|
741
2176
|
return [...this.markingsById.values()];
|
|
@@ -758,6 +2193,9 @@ class SecurityRegistry {
|
|
|
758
2193
|
listResolvedRoles() {
|
|
759
2194
|
return this.resolvedRoles;
|
|
760
2195
|
}
|
|
2196
|
+
listViewConditions() {
|
|
2197
|
+
return this.viewConditions;
|
|
2198
|
+
}
|
|
761
2199
|
listMembershipPolicies() {
|
|
762
2200
|
return [...this.membershipPoliciesById.values()];
|
|
763
2201
|
}
|
|
@@ -1660,6 +3098,20 @@ class InMemoryAuthSessionStore {
|
|
|
1660
3098
|
return created !== 0 ? created : b.id.localeCompare(a.id);
|
|
1661
3099
|
}).map(cloneRecord);
|
|
1662
3100
|
}
|
|
3101
|
+
async listByUserId(params) {
|
|
3102
|
+
const before = params.before;
|
|
3103
|
+
const offset = before?.skip ?? 0;
|
|
3104
|
+
const sessions = [...this.state.sessions.values()].filter((session) => session.projectId === params.projectId).filter((session) => session.userId === params.userId).filter((session) => !before || session.createdAt <= before.createdAt).sort((a, b) => {
|
|
3105
|
+
const created = b.createdAt.getTime() - a.createdAt.getTime();
|
|
3106
|
+
if (created !== 0)
|
|
3107
|
+
return created;
|
|
3108
|
+
return a.id < b.id ? 1 : a.id > b.id ? -1 : 0;
|
|
3109
|
+
});
|
|
3110
|
+
return {
|
|
3111
|
+
sessions: sessions.slice(offset, offset + params.limit).map(cloneRecord),
|
|
3112
|
+
hasMore: sessions.length > offset + params.limit
|
|
3113
|
+
};
|
|
3114
|
+
}
|
|
1663
3115
|
async findValidByTokenHash(params) {
|
|
1664
3116
|
const session = this.state.sessions.get(sessionKey(params.projectId, params.id));
|
|
1665
3117
|
if (!session || session.bearer || session.tokenHash !== params.tokenHash || !isActiveSession(session, params.now)) {
|
|
@@ -1787,6 +3239,12 @@ class InMemoryAuthUserStore {
|
|
|
1787
3239
|
const record = this.state.users.get(userKey(params.projectId, params.id)) ?? null;
|
|
1788
3240
|
return cloneOptionalRecord(record);
|
|
1789
3241
|
}
|
|
3242
|
+
async getByIds(params) {
|
|
3243
|
+
return [...new Set(params.ids)].flatMap((id) => {
|
|
3244
|
+
const record = this.state.users.get(userKey(params.projectId, id));
|
|
3245
|
+
return record ? [cloneRecord(record)] : [];
|
|
3246
|
+
});
|
|
3247
|
+
}
|
|
1790
3248
|
async getByEmail(params) {
|
|
1791
3249
|
return cloneOptionalRecord(getUserByEmail(this.state, params.projectId, params.email));
|
|
1792
3250
|
}
|
|
@@ -1796,14 +3254,19 @@ class InMemoryAuthUserStore {
|
|
|
1796
3254
|
if (!existing) {
|
|
1797
3255
|
throw new AuthStorageError2("missing_user", `[Sixb] User '${input.id}' not found for project '${input.projectId}'.`);
|
|
1798
3256
|
}
|
|
3257
|
+
const displayName = profileValue(input.displayName, existing.displayName);
|
|
3258
|
+
const avatarUrl = profileValue(input.avatarUrl, existing.avatarUrl);
|
|
3259
|
+
if (displayName === existing.displayName && avatarUrl === existing.avatarUrl) {
|
|
3260
|
+
return { user: cloneRecord(existing), previousUser: cloneRecord(existing) };
|
|
3261
|
+
}
|
|
1799
3262
|
const next = {
|
|
1800
3263
|
...existing,
|
|
1801
|
-
displayName
|
|
1802
|
-
avatarUrl
|
|
3264
|
+
displayName,
|
|
3265
|
+
avatarUrl,
|
|
1803
3266
|
updatedAt: dateOrNow(input.updatedAt)
|
|
1804
3267
|
};
|
|
1805
3268
|
this.state.users.set(key, cloneRecord(next));
|
|
1806
|
-
return cloneRecord(next);
|
|
3269
|
+
return { user: cloneRecord(next), previousUser: cloneRecord(existing) };
|
|
1807
3270
|
}
|
|
1808
3271
|
async updateStatus(input) {
|
|
1809
3272
|
const key = userKey(input.projectId, input.id);
|
|
@@ -1817,15 +3280,16 @@ class InMemoryAuthUserStore {
|
|
|
1817
3280
|
updatedAt: dateOrNow(input.updatedAt)
|
|
1818
3281
|
};
|
|
1819
3282
|
this.state.users.set(key, cloneRecord(next));
|
|
1820
|
-
return cloneRecord(next);
|
|
3283
|
+
return { user: cloneRecord(next), previousUser: cloneRecord(existing) };
|
|
1821
3284
|
}
|
|
1822
3285
|
async list(input) {
|
|
1823
3286
|
if (input.statuses?.length === 0) {
|
|
1824
3287
|
return { users: [], hasMore: false, total: 0 };
|
|
1825
3288
|
}
|
|
1826
3289
|
const statuses = input.statuses ? new Set(input.statuses) : null;
|
|
3290
|
+
const search = input.search?.toLowerCase();
|
|
1827
3291
|
const order = input.order ?? "desc";
|
|
1828
|
-
const rows = [...this.state.users.values()].filter((user) => user.projectId === input.projectId).filter((user) => statuses ? statuses.has(user.status) : true).sort((a, b) => compareByCreatedAt(a, b, order));
|
|
3292
|
+
const rows = [...this.state.users.values()].filter((user) => user.projectId === input.projectId).filter((user) => statuses ? statuses.has(user.status) : true).filter((user) => search === undefined ? true : userMatches(user, search)).sort((a, b) => compareByCreatedAt(a, b, order));
|
|
1829
3293
|
const page = paginate(rows, input);
|
|
1830
3294
|
return {
|
|
1831
3295
|
users: page.page.map(cloneRecord),
|
|
@@ -1834,6 +3298,12 @@ class InMemoryAuthUserStore {
|
|
|
1834
3298
|
};
|
|
1835
3299
|
}
|
|
1836
3300
|
}
|
|
3301
|
+
function profileValue(value, current) {
|
|
3302
|
+
return value === undefined ? current : value ?? undefined;
|
|
3303
|
+
}
|
|
3304
|
+
function userMatches(user, search) {
|
|
3305
|
+
return (user.displayName?.toLowerCase().includes(search) ?? false) || user.email.toLowerCase().includes(search);
|
|
3306
|
+
}
|
|
1837
3307
|
|
|
1838
3308
|
// src/storage/auth/in-memory/auth-storage.ts
|
|
1839
3309
|
class InMemoryAuthStorage2 {
|
|
@@ -1956,6 +3426,7 @@ class InMemoryAuthStorage2 {
|
|
|
1956
3426
|
tokenHash: input.tokenHash,
|
|
1957
3427
|
consumedAt: completedAt
|
|
1958
3428
|
});
|
|
3429
|
+
const previousUser = existingUser ? cloneRecord(existingUser) : null;
|
|
1959
3430
|
let user = existingUser;
|
|
1960
3431
|
if (!user) {
|
|
1961
3432
|
user = {
|
|
@@ -1994,7 +3465,8 @@ class InMemoryAuthStorage2 {
|
|
|
1994
3465
|
user: cloneRecord(user),
|
|
1995
3466
|
session: cloneRecord(session),
|
|
1996
3467
|
invitation: invitation.invitation ? cloneRecord(invitation.invitation) : undefined,
|
|
1997
|
-
groupMemberships: memberships.map(cloneRecord)
|
|
3468
|
+
groupMemberships: memberships.map(cloneRecord),
|
|
3469
|
+
previousUser
|
|
1998
3470
|
};
|
|
1999
3471
|
}
|
|
2000
3472
|
async completeOidcSignIn(input) {
|
|
@@ -2039,6 +3511,7 @@ class InMemoryAuthStorage2 {
|
|
|
2039
3511
|
}
|
|
2040
3512
|
}
|
|
2041
3513
|
this.consumeOidcAttempt(input, completedAt, projectId);
|
|
3514
|
+
const previousUser = user ? cloneRecord(user) : null;
|
|
2042
3515
|
if (!user) {
|
|
2043
3516
|
user = {
|
|
2044
3517
|
id: newUserId ?? assertNonEmpty4(input.newUserId, "User id"),
|
|
@@ -2051,6 +3524,8 @@ class InMemoryAuthStorage2 {
|
|
|
2051
3524
|
updatedAt: completedAt
|
|
2052
3525
|
};
|
|
2053
3526
|
this.state.users.set(userKey(projectId, user.id), cloneRecord(user));
|
|
3527
|
+
} else {
|
|
3528
|
+
user = this.refreshProviderProfile(user, input, completedAt);
|
|
2054
3529
|
}
|
|
2055
3530
|
const invitation = this.acceptInvitationAndApplyGroups({
|
|
2056
3531
|
activeInvitation,
|
|
@@ -2093,7 +3568,8 @@ class InMemoryAuthStorage2 {
|
|
|
2093
3568
|
session: cloneRecord(session),
|
|
2094
3569
|
identity: cloneRecord(nextIdentity),
|
|
2095
3570
|
invitation: invitation.invitation ? cloneRecord(invitation.invitation) : undefined,
|
|
2096
|
-
groupMemberships: memberships.map(cloneRecord)
|
|
3571
|
+
groupMemberships: memberships.map(cloneRecord),
|
|
3572
|
+
previousUser
|
|
2097
3573
|
};
|
|
2098
3574
|
}
|
|
2099
3575
|
async suspendUserAndRevokeSessions(input) {
|
|
@@ -2109,7 +3585,17 @@ class InMemoryAuthStorage2 {
|
|
|
2109
3585
|
};
|
|
2110
3586
|
this.state.users.set(key, cloneRecord(next));
|
|
2111
3587
|
revokeActiveSessionsForUser(this.state, input.projectId, input.userId, input.suspendedAt);
|
|
2112
|
-
return cloneRecord(next);
|
|
3588
|
+
return { user: cloneRecord(next), previousUser: cloneRecord(existing) };
|
|
3589
|
+
}
|
|
3590
|
+
refreshProviderProfile(user, input, updatedAt) {
|
|
3591
|
+
const displayName = input.displayName ?? user.displayName;
|
|
3592
|
+
const avatarUrl = input.avatarUrl ?? user.avatarUrl;
|
|
3593
|
+
if (displayName === user.displayName && avatarUrl === user.avatarUrl) {
|
|
3594
|
+
return user;
|
|
3595
|
+
}
|
|
3596
|
+
const next = { ...user, displayName, avatarUrl, updatedAt: cloneDate(updatedAt) };
|
|
3597
|
+
this.state.users.set(userKey(user.projectId, user.id), cloneRecord(next));
|
|
3598
|
+
return next;
|
|
2113
3599
|
}
|
|
2114
3600
|
acceptInvitationAndApplyGroups(input) {
|
|
2115
3601
|
if (!input.activeInvitation) {
|
|
@@ -2184,6 +3670,166 @@ function restoreMap(target, snapshot) {
|
|
|
2184
3670
|
target.set(key, value);
|
|
2185
3671
|
}
|
|
2186
3672
|
}
|
|
3673
|
+
// src/users/execution.ts
|
|
3674
|
+
var DEFAULT_LIMIT = 50;
|
|
3675
|
+
var MAX_LIMIT = 200;
|
|
3676
|
+
var MAX_SEARCH_LENGTH = 200;
|
|
3677
|
+
function createUsersRuntime(runtime) {
|
|
3678
|
+
const assertReadable = () => assertAuthorized2(runtime, { kind: "users.view" });
|
|
3679
|
+
return {
|
|
3680
|
+
get: async (user) => {
|
|
3681
|
+
assertReadable();
|
|
3682
|
+
if (!isUserRef(user)) {
|
|
3683
|
+
throw new Error("[Sixb] users.get expects a user reference, such as userRef(id).");
|
|
3684
|
+
}
|
|
3685
|
+
const users = runtime.storage.auth?.users;
|
|
3686
|
+
if (!users)
|
|
3687
|
+
return null;
|
|
3688
|
+
const record = await users.getById({ projectId: runtime.projectId, id: user.id });
|
|
3689
|
+
return record ? toUserProfile(record) : null;
|
|
3690
|
+
},
|
|
3691
|
+
list: async (input = {}) => {
|
|
3692
|
+
assertReadable();
|
|
3693
|
+
const limit = listLimit(input.limit);
|
|
3694
|
+
const offset = listOffset(input.offset);
|
|
3695
|
+
const search = listSearch(input.search);
|
|
3696
|
+
const users = runtime.storage.auth?.users;
|
|
3697
|
+
if (!users)
|
|
3698
|
+
return { users: [], hasMore: false, total: 0 };
|
|
3699
|
+
const page = await users.list({
|
|
3700
|
+
projectId: runtime.projectId,
|
|
3701
|
+
...statusFilter(input.status),
|
|
3702
|
+
...search === undefined ? {} : { search },
|
|
3703
|
+
limit,
|
|
3704
|
+
offset,
|
|
3705
|
+
order: "asc"
|
|
3706
|
+
});
|
|
3707
|
+
return {
|
|
3708
|
+
users: page.users.map(toUserProfile),
|
|
3709
|
+
hasMore: page.hasMore,
|
|
3710
|
+
total: page.total
|
|
3711
|
+
};
|
|
3712
|
+
}
|
|
3713
|
+
};
|
|
3714
|
+
}
|
|
3715
|
+
function toUserProfile(record) {
|
|
3716
|
+
return {
|
|
3717
|
+
id: record.id,
|
|
3718
|
+
email: record.email,
|
|
3719
|
+
...record.displayName === undefined ? {} : { displayName: record.displayName },
|
|
3720
|
+
...record.avatarUrl === undefined ? {} : { avatarUrl: record.avatarUrl },
|
|
3721
|
+
status: record.status
|
|
3722
|
+
};
|
|
3723
|
+
}
|
|
3724
|
+
function statusFilter(status = "active") {
|
|
3725
|
+
if (status === "all")
|
|
3726
|
+
return {};
|
|
3727
|
+
if (status === "active" || status === "suspended")
|
|
3728
|
+
return { statuses: [status] };
|
|
3729
|
+
throw new Error(`[Sixb] users.list status must be "active", "suspended", or "all".`);
|
|
3730
|
+
}
|
|
3731
|
+
function listSearch(search) {
|
|
3732
|
+
const trimmed = search?.trim();
|
|
3733
|
+
if (!trimmed)
|
|
3734
|
+
return;
|
|
3735
|
+
if (trimmed.length <= MAX_SEARCH_LENGTH)
|
|
3736
|
+
return trimmed;
|
|
3737
|
+
throw new Error(`[Sixb] users.list search must be at most ${MAX_SEARCH_LENGTH} characters.`);
|
|
3738
|
+
}
|
|
3739
|
+
function listLimit(limit) {
|
|
3740
|
+
if (limit === undefined)
|
|
3741
|
+
return DEFAULT_LIMIT;
|
|
3742
|
+
if (Number.isInteger(limit) && limit >= 1 && limit <= MAX_LIMIT)
|
|
3743
|
+
return limit;
|
|
3744
|
+
throw new Error(`[Sixb] users.list limit must be an integer from 1 to ${MAX_LIMIT}.`);
|
|
3745
|
+
}
|
|
3746
|
+
function listOffset(offset) {
|
|
3747
|
+
if (offset === undefined)
|
|
3748
|
+
return 0;
|
|
3749
|
+
if (Number.isInteger(offset) && offset >= 0)
|
|
3750
|
+
return offset;
|
|
3751
|
+
throw new Error("[Sixb] users.list offset must be a non-negative integer.");
|
|
3752
|
+
}
|
|
3753
|
+
|
|
3754
|
+
// src/auth/member-events.ts
|
|
3755
|
+
function signInEvents(result) {
|
|
3756
|
+
const user = toUserProfile(result.user);
|
|
3757
|
+
if (result.previousUser === null) {
|
|
3758
|
+
return [
|
|
3759
|
+
{
|
|
3760
|
+
type: "user.joined",
|
|
3761
|
+
payload: {
|
|
3762
|
+
user,
|
|
3763
|
+
...result.invitation ? { invitationId: result.invitation.id } : {}
|
|
3764
|
+
},
|
|
3765
|
+
idempotencyKey: `user.joined:${user.id}`
|
|
3766
|
+
}
|
|
3767
|
+
];
|
|
3768
|
+
}
|
|
3769
|
+
const changes = profileChanges(result.previousUser, result.user);
|
|
3770
|
+
if (!hasChanges(changes))
|
|
3771
|
+
return [];
|
|
3772
|
+
return [{ type: "user.profile.updated", payload: { user, changes } }];
|
|
3773
|
+
}
|
|
3774
|
+
function profileUpdatedEvents(caller, previousUser, user) {
|
|
3775
|
+
const changes = profileChanges(previousUser, user);
|
|
3776
|
+
if (!hasChanges(changes))
|
|
3777
|
+
return [];
|
|
3778
|
+
return [
|
|
3779
|
+
{
|
|
3780
|
+
type: "user.profile.updated",
|
|
3781
|
+
payload: { user: toUserProfile(user), changes, requestedBy: requester(caller) }
|
|
3782
|
+
}
|
|
3783
|
+
];
|
|
3784
|
+
}
|
|
3785
|
+
function statusChangedEvents(caller, previousUser, user) {
|
|
3786
|
+
if (previousUser.status === user.status)
|
|
3787
|
+
return [];
|
|
3788
|
+
return [
|
|
3789
|
+
{
|
|
3790
|
+
type: user.status === "suspended" ? "user.suspended" : "user.reactivated",
|
|
3791
|
+
payload: { user: toUserProfile(user), requestedBy: requester(caller) }
|
|
3792
|
+
}
|
|
3793
|
+
];
|
|
3794
|
+
}
|
|
3795
|
+
function invitedEvents(caller, invitation) {
|
|
3796
|
+
return [
|
|
3797
|
+
{
|
|
3798
|
+
type: "user.invited",
|
|
3799
|
+
payload: {
|
|
3800
|
+
invitationId: invitation.id,
|
|
3801
|
+
email: invitation.email,
|
|
3802
|
+
expiresAt: invitation.expiresAt.toISOString(),
|
|
3803
|
+
requestedBy: requester(caller)
|
|
3804
|
+
}
|
|
3805
|
+
}
|
|
3806
|
+
];
|
|
3807
|
+
}
|
|
3808
|
+
function profileChanges(before, after) {
|
|
3809
|
+
const displayName = fieldChange(before.displayName, after.displayName);
|
|
3810
|
+
const avatarUrl = fieldChange(before.avatarUrl, after.avatarUrl);
|
|
3811
|
+
return {
|
|
3812
|
+
...displayName ? { displayName } : {},
|
|
3813
|
+
...avatarUrl ? { avatarUrl } : {}
|
|
3814
|
+
};
|
|
3815
|
+
}
|
|
3816
|
+
function fieldChange(before, after) {
|
|
3817
|
+
if (after === undefined) {
|
|
3818
|
+
return before === undefined ? undefined : { operation: "cleared", before, after: null };
|
|
3819
|
+
}
|
|
3820
|
+
if (before === undefined)
|
|
3821
|
+
return { operation: "created", after };
|
|
3822
|
+
if (before === after)
|
|
3823
|
+
return;
|
|
3824
|
+
return { operation: "updated", before, after };
|
|
3825
|
+
}
|
|
3826
|
+
function hasChanges(changes) {
|
|
3827
|
+
return changes.displayName !== undefined || changes.avatarUrl !== undefined;
|
|
3828
|
+
}
|
|
3829
|
+
function requester(caller) {
|
|
3830
|
+
return { type: caller.principal.type, id: caller.principal.id };
|
|
3831
|
+
}
|
|
3832
|
+
|
|
2187
3833
|
// src/auth/session-cache.ts
|
|
2188
3834
|
class SessionCache {
|
|
2189
3835
|
ttlMs;
|
|
@@ -2296,6 +3942,7 @@ var SESSION_TOUCH_INTERVAL_MS = 60000;
|
|
|
2296
3942
|
var ACCESS_TOKEN_TOUCH_INTERVAL_MS = 60000;
|
|
2297
3943
|
var BEARER_ACCESS_TOKEN_TTL_MS = 15 * 60000;
|
|
2298
3944
|
var REFRESH_REUSE_GRACE_MS = 60000;
|
|
3945
|
+
var PROFILE_FIELDS = ["displayName", "avatarUrl"];
|
|
2299
3946
|
|
|
2300
3947
|
class AuthRuntime2 {
|
|
2301
3948
|
projectId;
|
|
@@ -2303,10 +3950,12 @@ class AuthRuntime2 {
|
|
|
2303
3950
|
security;
|
|
2304
3951
|
config;
|
|
2305
3952
|
sessionCache;
|
|
3953
|
+
events;
|
|
2306
3954
|
constructor(options) {
|
|
2307
3955
|
this.projectId = options.projectId;
|
|
2308
3956
|
this.storage = options.storage;
|
|
2309
3957
|
this.security = options.security;
|
|
3958
|
+
this.events = options.events;
|
|
2310
3959
|
this.config = resolveAuthConfig2(options.config);
|
|
2311
3960
|
this.sessionCache = this.config.session.cacheTtlMs > 0 ? new SessionCache(this.config.session.cacheTtlMs) : null;
|
|
2312
3961
|
if (this.isEnabled() && !this.storage.auth) {
|
|
@@ -2623,6 +4272,38 @@ class AuthRuntime2 {
|
|
|
2623
4272
|
});
|
|
2624
4273
|
} catch {}
|
|
2625
4274
|
}
|
|
4275
|
+
async completeMagicLinkSignIn(input) {
|
|
4276
|
+
const strategy = this.getStrategy();
|
|
4277
|
+
if (!isMagicLinkAuthStrategy2(strategy)) {
|
|
4278
|
+
throw new AuthRuntimeError2("invalid_auth_config", "[Sixb] The active auth strategy does not support magic-link sign-in.");
|
|
4279
|
+
}
|
|
4280
|
+
const result = await strategy.completeMagicLinkSignIn({
|
|
4281
|
+
projectId: this.projectId,
|
|
4282
|
+
authStorage: this.requireAuthStorage(),
|
|
4283
|
+
magicLinkId: input.magicLinkId,
|
|
4284
|
+
token: input.token,
|
|
4285
|
+
session: input.session,
|
|
4286
|
+
displayName: signInDisplayName2(input.displayName)
|
|
4287
|
+
});
|
|
4288
|
+
await this.emitMemberEvents(signInEvents(result));
|
|
4289
|
+
return result;
|
|
4290
|
+
}
|
|
4291
|
+
async completeOidcSignIn(input) {
|
|
4292
|
+
const strategy = this.getStrategy();
|
|
4293
|
+
if (!isOidcAuthStrategy2(strategy)) {
|
|
4294
|
+
throw new AuthRuntimeError2("invalid_auth_config", "[Sixb] The active auth strategy does not support OIDC sign-in.");
|
|
4295
|
+
}
|
|
4296
|
+
const result = await strategy.completeOidcSignIn({
|
|
4297
|
+
projectId: this.projectId,
|
|
4298
|
+
authStorage: this.requireAuthStorage(),
|
|
4299
|
+
requestUrl: input.requestUrl,
|
|
4300
|
+
requestOrigin: input.requestOrigin,
|
|
4301
|
+
session: input.session
|
|
4302
|
+
});
|
|
4303
|
+
this.sessionCache?.invalidateUser(result.user.id);
|
|
4304
|
+
await this.emitMemberEvents(signInEvents(result));
|
|
4305
|
+
return result;
|
|
4306
|
+
}
|
|
2626
4307
|
contextFromSession(session) {
|
|
2627
4308
|
return resolveAuthorizationContext2({
|
|
2628
4309
|
principal: session.principal,
|
|
@@ -2924,12 +4605,13 @@ class AuthRuntime2 {
|
|
|
2924
4605
|
if (user.id === caller.user.id) {
|
|
2925
4606
|
throw new AuthRuntimeError2("authorization_denied", "[Sixb] The current user cannot suspend themselves.");
|
|
2926
4607
|
}
|
|
2927
|
-
const suspended = await storage.suspendUserAndRevokeSessions({
|
|
4608
|
+
const { user: suspended, previousUser } = await storage.suspendUserAndRevokeSessions({
|
|
2928
4609
|
projectId: this.projectId,
|
|
2929
4610
|
userId: user.id,
|
|
2930
4611
|
suspendedAt: new Date
|
|
2931
4612
|
});
|
|
2932
4613
|
this.sessionCache?.invalidateUser(user.id);
|
|
4614
|
+
await this.emitMemberEvents(statusChangedEvents(caller, previousUser, suspended));
|
|
2933
4615
|
return { user: suspended, groupIds, managedGroupIds };
|
|
2934
4616
|
}
|
|
2935
4617
|
async reactivateMember(caller, input) {
|
|
@@ -2937,14 +4619,64 @@ class AuthRuntime2 {
|
|
|
2937
4619
|
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds);
|
|
2938
4620
|
const userId = assertNonEmpty3(input.userId, "User id");
|
|
2939
4621
|
const { user, groupIds, managedGroupIds } = await this.requireManageableMember(storage, scope, "suspend", userId);
|
|
2940
|
-
const reactivated = await storage.users.updateStatus({
|
|
4622
|
+
const { user: reactivated, previousUser } = await storage.users.updateStatus({
|
|
2941
4623
|
projectId: this.projectId,
|
|
2942
4624
|
id: user.id,
|
|
2943
4625
|
status: "active",
|
|
2944
4626
|
updatedAt: new Date
|
|
2945
4627
|
});
|
|
4628
|
+
await this.emitMemberEvents(statusChangedEvents(caller, previousUser, reactivated));
|
|
2946
4629
|
return { user: reactivated, groupIds, managedGroupIds };
|
|
2947
4630
|
}
|
|
4631
|
+
async getProfile(caller) {
|
|
4632
|
+
const storage = this.requireAuthStorage();
|
|
4633
|
+
const user = await storage.users.getById({ projectId: this.projectId, id: caller.user.id });
|
|
4634
|
+
if (!user) {
|
|
4635
|
+
throw new AuthStorageError2("missing_user", `[Sixb] User '${caller.user.id}' not found for project '${this.projectId}'.`);
|
|
4636
|
+
}
|
|
4637
|
+
return {
|
|
4638
|
+
profile: toUserProfile(user),
|
|
4639
|
+
managedFields: await this.managedProfileFields(storage, user.id)
|
|
4640
|
+
};
|
|
4641
|
+
}
|
|
4642
|
+
async updateProfile(caller, input) {
|
|
4643
|
+
const changes = normalizeProfileChanges(input);
|
|
4644
|
+
const storage = this.requireAuthStorage();
|
|
4645
|
+
const managedFields = await this.managedProfileFields(storage, caller.user.id);
|
|
4646
|
+
const managedChanges = managedFields.filter((field) => changes[field] !== undefined);
|
|
4647
|
+
if (managedChanges.length > 0) {
|
|
4648
|
+
throw new AuthRuntimeError2("authorization_denied", `[Sixb] Your identity provider manages ${managedChanges.join(" and ")}. ` + `Change ${managedChanges.length > 1 ? "them" : "it"} there.`);
|
|
4649
|
+
}
|
|
4650
|
+
const { user, previousUser } = await storage.users.updateProfile({
|
|
4651
|
+
projectId: this.projectId,
|
|
4652
|
+
id: caller.user.id,
|
|
4653
|
+
...changes,
|
|
4654
|
+
updatedAt: new Date
|
|
4655
|
+
});
|
|
4656
|
+
const changed = user.displayName !== previousUser.displayName || user.avatarUrl !== previousUser.avatarUrl;
|
|
4657
|
+
if (changed) {
|
|
4658
|
+
this.sessionCache?.invalidateUser(user.id);
|
|
4659
|
+
}
|
|
4660
|
+
await this.emitMemberEvents(profileUpdatedEvents(caller, previousUser, user));
|
|
4661
|
+
return { profile: toUserProfile(user), managedFields };
|
|
4662
|
+
}
|
|
4663
|
+
async managedProfileFields(storage, userId) {
|
|
4664
|
+
const strategy = this.getStrategy();
|
|
4665
|
+
if (!strategy?.providerProfileFields) {
|
|
4666
|
+
return [];
|
|
4667
|
+
}
|
|
4668
|
+
const identities = await storage.identities.listForUser({ projectId: this.projectId, userId });
|
|
4669
|
+
const managed = new Set;
|
|
4670
|
+
for (const identity of identities) {
|
|
4671
|
+
if (identity.strategyId !== strategy.id) {
|
|
4672
|
+
continue;
|
|
4673
|
+
}
|
|
4674
|
+
for (const field of strategy.providerProfileFields(identity)) {
|
|
4675
|
+
managed.add(field);
|
|
4676
|
+
}
|
|
4677
|
+
}
|
|
4678
|
+
return PROFILE_FIELDS.filter((field) => managed.has(field));
|
|
4679
|
+
}
|
|
2948
4680
|
async listSessions(caller) {
|
|
2949
4681
|
return this.requireAuthStorage().sessions.listActiveByUserId({
|
|
2950
4682
|
projectId: this.projectId,
|
|
@@ -3041,13 +4773,11 @@ class AuthRuntime2 {
|
|
|
3041
4773
|
status: delivery.status,
|
|
3042
4774
|
...input.revealLink && delivery.link ? { link: delivery.link } : {}
|
|
3043
4775
|
};
|
|
3044
|
-
if (delivery.status
|
|
3045
|
-
return { invitation, delivery };
|
|
3046
|
-
}
|
|
3047
|
-
if (delivery.status !== "sent") {
|
|
4776
|
+
if (delivery.status !== "sent" && delivery.status !== "not_supported") {
|
|
3048
4777
|
await this.revokeInvitationAfterDeliveryFailure(authStorage, invitation, now);
|
|
3049
4778
|
throw this.createInvitationDeliveryError(delivery.status);
|
|
3050
4779
|
}
|
|
4780
|
+
await this.emitMemberEvents(invitedEvents(caller, invitation));
|
|
3051
4781
|
return { invitation, delivery };
|
|
3052
4782
|
}
|
|
3053
4783
|
async listInvitations(caller, input = {}) {
|
|
@@ -3090,6 +4820,11 @@ class AuthRuntime2 {
|
|
|
3090
4820
|
})
|
|
3091
4821
|
};
|
|
3092
4822
|
}
|
|
4823
|
+
async emitMemberEvents(events) {
|
|
4824
|
+
if (events.length === 0)
|
|
4825
|
+
return;
|
|
4826
|
+
await this.events.emit({ events }, { source: "Sixb" });
|
|
4827
|
+
}
|
|
3093
4828
|
requireAuthStorage() {
|
|
3094
4829
|
if (!this.storage.auth) {
|
|
3095
4830
|
throw new AuthRuntimeError2("auth_storage_missing", "[Sixb] Auth is enabled but storage.auth is not configured.");
|
|
@@ -3263,6 +4998,6 @@ var SYSTEM_PRINCIPAL2 = { type: "system", id: "system" };
|
|
|
3263
4998
|
function principalsEqual2(left, right) {
|
|
3264
4999
|
return left.type === right.type && left.id === right.id;
|
|
3265
5000
|
}
|
|
3266
|
-
export { ActionDefinitionError2, missingActionMutationMessage, effectsWithoutEditsMessage, assertNonEmpty2, isActionDefinition2, isGlobalActionDefinition2, isObjectActionDefinition2, normalizeActionParams, coerceActionParamsToTyped, validateActionSubject, resolveObjectActionSubject, PERSONAL_ACCESS_TOKEN_PREFIX2, SERVICE_ACCOUNT_ACCESS_TOKEN_PREFIX2, generateAccessTokenSecret2, hashAccessTokenSecret2, formatAccessTokenValue2, parseAccessTokenValue2, getBearerAccessTokenValue2, createAccessTokenCredential2, setRequestClientAddress2, getRequestClientAddress2, CSRF_HEADER_NAME2, generateCsrfToken2, isCsrfExemptMethod2, verifyDoubleSubmitCsrf2, verifyCsrfToken2, every2, ShareDefinitionError2, defineShare2, isShareDefinition, snapshotShareDefinition, can2, SecurityRegistry, AuthStorageError2, MAX_PENDING_DEVICE_AUTHORIZATIONS2, paginate, InMemoryAuthStorage2, generateSessionSecret2, hashSessionSecret2, formatSessionCookieValue2, parseSessionCookieValue2, createSessionCredential2, AuthRuntime2, SYSTEM_PRINCIPAL2, principalsEqual2 };
|
|
5001
|
+
export { ActionDefinitionError2, missingActionMutationMessage, effectsWithoutEditsMessage, assertNonEmpty2, isActionDefinition2, isGlobalActionDefinition2, isObjectActionDefinition2, normalizeActionParams, coerceActionParamsToTyped, validateActionSubject, resolveObjectActionSubject, PERSONAL_ACCESS_TOKEN_PREFIX2, SERVICE_ACCOUNT_ACCESS_TOKEN_PREFIX2, generateAccessTokenSecret2, hashAccessTokenSecret2, formatAccessTokenValue2, parseAccessTokenValue2, getBearerAccessTokenValue2, createAccessTokenCredential2, setRequestClientAddress2, getRequestClientAddress2, CSRF_HEADER_NAME2, generateCsrfToken2, isCsrfExemptMethod2, verifyDoubleSubmitCsrf2, verifyCsrfToken2, every2, ShareDefinitionError2, defineShare2, isShareDefinition, snapshotShareDefinition, project2, can2, bindCurrentUser, bindCurrentUserPredicate, INDEXING_EMBEDDING_TIMEOUT_MS, vectorConfiguration, vectorSources, normalizeVector2, vectorSearchCandidateLimit2, hasVectorProfile2, isVectorProfileQuery2, MAX_RERANK_INPUT_BYTES, composeObjectQueryAdmissions, validateObjectQuery2, validateObjectQueryWithAdmission, collectObjectQueryValidationIssues2, resolveObjectQueryResultShape2, assertViewConditionsReadable, SecurityRegistry, AuthStorageError2, MAX_PENDING_DEVICE_AUTHORIZATIONS2, paginate, InMemoryAuthStorage2, createUsersRuntime, toUserProfile, generateSessionSecret2, hashSessionSecret2, formatSessionCookieValue2, parseSessionCookieValue2, createSessionCredential2, AuthRuntime2, SYSTEM_PRINCIPAL2, principalsEqual2 };
|
|
3267
5002
|
|
|
3268
|
-
//# debugId=
|
|
5003
|
+
//# debugId=86A4C82302343CA464756E2164756E21
|