@sixb/core 0.1.21 → 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 +63 -59
- 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 +14 -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/timeline.d.ts +8 -1
- package/dist/activity/timeline.d.ts.map +1 -1
- 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 +19 -8
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +159 -86
- 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/streams/index.d.ts +3 -2
- package/dist/agents/streams/index.d.ts.map +1 -1
- package/dist/agents/streams/index.js +7 -3
- 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 +5 -3
- 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 +23 -4
- 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/canvas.d.ts +92 -0
- package/dist/artifacts/canvas.d.ts.map +1 -0
- package/dist/artifacts/csv.d.ts +5 -0
- package/dist/artifacts/csv.d.ts.map +1 -1
- package/dist/artifacts/errors.d.ts +7 -2
- package/dist/artifacts/errors.d.ts.map +1 -1
- package/dist/artifacts/execution.d.ts +102 -7
- package/dist/artifacts/execution.d.ts.map +1 -1
- 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 +11 -9
- package/dist/artifacts/frames/assets.d.ts.map +1 -1
- 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 +6 -6
- package/dist/artifacts/frames/grants.d.ts.map +1 -1
- package/dist/artifacts/frames/index.d.ts +4 -2
- package/dist/artifacts/frames/index.d.ts.map +1 -1
- package/dist/artifacts/frames/index.js +444 -51
- package/dist/artifacts/frames/index.js.map +10 -8
- package/dist/artifacts/frames/kit.d.ts +10 -5
- package/dist/artifacts/frames/kit.d.ts.map +1 -1
- package/dist/artifacts/frames/probe.d.ts +16 -12
- package/dist/artifacts/frames/probe.d.ts.map +1 -1
- package/dist/artifacts/frames/protocol.d.ts +79 -10
- package/dist/artifacts/frames/protocol.d.ts.map +1 -1
- package/dist/artifacts/frames/runtime.d.ts +27 -9
- package/dist/artifacts/frames/runtime.d.ts.map +1 -1
- package/dist/artifacts/index.d.ts +11 -5
- package/dist/artifacts/index.d.ts.map +1 -1
- package/dist/artifacts/index.js +128 -6
- package/dist/artifacts/index.js.map +3 -3
- package/dist/artifacts/kinds.d.ts +1 -1
- package/dist/artifacts/kinds.d.ts.map +1 -1
- package/dist/artifacts/limits.d.ts +30 -0
- package/dist/artifacts/limits.d.ts.map +1 -1
- 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 +27 -1
- package/dist/artifacts/outline.d.ts.map +1 -1
- package/dist/artifacts/publish/index.d.ts +2 -0
- package/dist/artifacts/publish/index.d.ts.map +1 -1
- package/dist/artifacts/publish/index.js +59 -19
- package/dist/artifacts/publish/index.js.map +1 -1
- package/dist/artifacts/publish/publish.d.ts +43 -11
- package/dist/artifacts/publish/publish.d.ts.map +1 -1
- 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 +6 -3
- package/dist/artifacts/publish/references.d.ts.map +1 -1
- 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/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 +11 -3
- package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -1
- package/dist/artifacts/publish/validate/slides.d.ts +1 -7
- package/dist/artifacts/publish/validate/slides.d.ts.map +1 -1
- package/dist/artifacts/queries.d.ts +95 -0
- package/dist/artifacts/queries.d.ts.map +1 -0
- package/dist/artifacts/resolve.d.ts +6 -0
- package/dist/artifacts/resolve.d.ts.map +1 -1
- 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/tones.d.ts +8 -0
- package/dist/artifacts/tones.d.ts.map +1 -0
- package/dist/artifacts/workbook.d.ts +76 -5
- package/dist/artifacts/workbook.d.ts.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +14 -11
- 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 +15 -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 +12 -7
- 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/bootstrap/index.js +69 -65
- package/dist/bootstrap/index.js.map +2 -2
- package/dist/{chunk-ky3j490c.js → chunk-02bzjgnt.js} +6 -6
- package/dist/{chunk-ky3j490c.js.map → chunk-02bzjgnt.js.map} +1 -1
- package/dist/{chunk-mfs23znk.js → chunk-07kkp2e1.js} +1 -1
- package/dist/{chunk-c1rxbz5y.js → chunk-098anw4f.js} +21 -19
- package/dist/chunk-098anw4f.js.map +12 -0
- package/dist/{chunk-z58tm0hm.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-18sk89cg.js +47 -0
- package/dist/chunk-18sk89cg.js.map +10 -0
- package/dist/{chunk-e17zdm62.js → chunk-1t6k1avb.js} +1 -1
- 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-kge7k6ey.js → chunk-2fn60nvs.js} +2 -2
- 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-mjddfa7k.js → chunk-3fqxbn31.js} +2 -24
- package/dist/{chunk-mjddfa7k.js.map → chunk-3fqxbn31.js.map} +3 -4
- package/dist/{chunk-y0c4e6ex.js → chunk-3gbefjg5.js} +1 -1
- package/dist/{chunk-5hx48dnn.js → chunk-45ngkxkp.js} +52 -31
- package/dist/chunk-45ngkxkp.js.map +13 -0
- package/dist/{chunk-cy4mbddw.js → chunk-48jezz3j.js} +1 -1
- package/dist/{chunk-561r0yc9.js → chunk-4b26qwbg.js} +13 -13
- package/dist/{chunk-561r0yc9.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-8frc8a4j.js → chunk-65pyhyas.js} +90 -83
- package/dist/chunk-65pyhyas.js.map +20 -0
- package/dist/{chunk-hwksyjks.js → chunk-661ezhks.js} +182 -6
- package/dist/chunk-661ezhks.js.map +11 -0
- package/dist/{chunk-447a5c0p.js → chunk-6n69k945.js} +2 -2
- package/dist/{chunk-0bphap9y.js → chunk-6p0pastb.js} +5 -5
- package/dist/{chunk-9j4jw7as.js → chunk-6rrtzea3.js} +18 -5
- package/dist/chunk-6rrtzea3.js.map +14 -0
- package/dist/{chunk-431pyp2c.js → chunk-6y0mkhex.js} +2 -2
- package/dist/{chunk-f4pamkt9.js → chunk-73v685wb.js} +10 -10
- package/dist/{chunk-f4pamkt9.js.map → chunk-73v685wb.js.map} +3 -3
- package/dist/{chunk-akzryx9h.js → chunk-7gr4j2eq.js} +7836 -5047
- package/dist/chunk-7gr4j2eq.js.map +120 -0
- package/dist/{chunk-bk9svbcq.js → chunk-7mc2wkre.js} +386 -86
- package/dist/chunk-7mc2wkre.js.map +50 -0
- package/dist/{chunk-6rqgmkde.js → chunk-7z5p905k.js} +335 -703
- package/dist/chunk-7z5p905k.js.map +22 -0
- 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-az47zep4.js +41 -0
- package/dist/chunk-az47zep4.js.map +10 -0
- package/dist/{chunk-s7jg7pmn.js → chunk-bab05bhg.js} +1 -1
- package/dist/{chunk-858emn8m.js → chunk-bktev1ds.js} +14 -11
- package/dist/{chunk-858emn8m.js.map → chunk-bktev1ds.js.map} +3 -3
- package/dist/{chunk-dhcv7yxc.js → chunk-c0vk1djt.js} +5 -3
- package/dist/chunk-c0vk1djt.js.map +11 -0
- package/dist/chunk-c69nj7se.js +3 -0
- package/dist/{chunk-7n30ybym.js.map → chunk-c69nj7se.js.map} +1 -1
- package/dist/{chunk-q5e5tv4b.js → chunk-c844dkwd.js} +1 -1
- package/dist/{chunk-g257jwnc.js → chunk-cdk3egjj.js} +17 -4
- 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-cfj9dfbb.js → chunk-d2m879s4.js} +2 -2
- package/dist/{chunk-arns890k.js → chunk-d7vyc7k6.js} +2 -2
- package/dist/chunk-d7vyc7k6.js.map +10 -0
- package/dist/{chunk-q7gn29y3.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-cn0fwwhy.js → chunk-efmm01gj.js} +108 -1045
- package/dist/chunk-efmm01gj.js.map +18 -0
- package/dist/{chunk-918wwnaa.js → chunk-ezne9wc9.js} +1224 -430
- package/dist/chunk-ezne9wc9.js.map +71 -0
- package/dist/{chunk-tbc1ngpd.js → chunk-fe8zwt8b.js} +58 -12
- package/dist/{chunk-tbc1ngpd.js.map → chunk-fe8zwt8b.js.map} +5 -4
- 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-1cc1xaf3.js → chunk-fp2kq35z.js} +26 -10
- package/dist/{chunk-1cc1xaf3.js.map → chunk-fp2kq35z.js.map} +5 -5
- package/dist/{chunk-vvxtn22d.js → chunk-g663fahq.js} +2 -2
- package/dist/{chunk-k43ct2ke.js → chunk-gvj5cd3b.js} +16 -9
- package/dist/chunk-gvj5cd3b.js.map +12 -0
- package/dist/{chunk-rmakanzx.js → chunk-h33shhq6.js} +5 -5
- package/dist/{chunk-nn5xnx3s.js → chunk-h3pbv7n8.js} +1738 -38
- package/dist/chunk-h3pbv7n8.js.map +48 -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-d09e3rax.js → chunk-hwarjrgf.js} +1 -1
- package/dist/{chunk-vf57cr4t.js → chunk-hyesv9dv.js} +1 -1
- 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-kcqpk9w1.js +75 -0
- package/dist/chunk-kcqpk9w1.js.map +10 -0
- package/dist/{chunk-5vems3nx.js → chunk-m2nevja0.js} +2 -2
- 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-d7dnxdep.js → chunk-n9zpx9c6.js} +4 -4
- package/dist/{chunk-xvsc5m8n.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-y5tah2kf.js → chunk-q4pmvkg0.js} +1 -1
- package/dist/chunk-qhqgp4jf.js +1418 -0
- package/dist/chunk-qhqgp4jf.js.map +22 -0
- package/dist/{chunk-48qjhh6v.js → chunk-qx00vjrj.js} +19 -60
- package/dist/chunk-qx00vjrj.js.map +13 -0
- package/dist/{chunk-5948n82c.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-d5rjr8c0.js → chunk-vabga7fk.js} +1 -1
- package/dist/{chunk-dhdha526.js → chunk-vhbw5sqm.js} +26 -2
- package/dist/chunk-vhbw5sqm.js.map +10 -0
- package/dist/{chunk-e6k4thh5.js → chunk-vpgwq5nf.js} +98 -12
- package/dist/chunk-vpgwq5nf.js.map +21 -0
- package/dist/{chunk-61y5xs4p.js → chunk-vyt322b6.js} +69 -50
- package/dist/{chunk-61y5xs4p.js.map → chunk-vyt322b6.js.map} +4 -4
- package/dist/chunk-waqk73p1.js +2380 -0
- package/dist/chunk-waqk73p1.js.map +23 -0
- package/dist/chunk-wsc1brye.js +27 -0
- package/dist/chunk-wsc1brye.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-6vb4st8k.js → chunk-yc9ners4.js} +120 -19
- package/dist/{chunk-6vb4st8k.js.map → chunk-yc9ners4.js.map} +8 -8
- package/dist/{chunk-dvd2fp9q.js → chunk-zbc929zg.js} +28 -4
- 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/write.js +5 -5
- package/dist/error-reporting/internal.js +3 -3
- package/dist/errors/catalog.d.ts +26 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/internal.d.ts.map +1 -1
- package/dist/errors/internal.js +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.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 +8 -10
- 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 +63 -57
- 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 +51 -2
- 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-ontology.d.ts +2 -2
- package/dist/execution/object-reader-ontology.d.ts.map +1 -1
- package/dist/execution/object-reader-security.d.ts +24 -3
- package/dist/execution/object-reader-security.d.ts.map +1 -1
- 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 +61 -57
- 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 +64 -56
- 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 +32 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +137 -126
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/index.js +5 -5
- 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 +45 -41
- 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 +44 -34
- 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/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 +68 -58
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +3 -0
- 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/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 +49 -44
- 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/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/index.d.ts +2 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +11 -7
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/internal.js +7 -5
- 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.js +43 -40
- package/dist/pipelines/index.js.map +1 -1
- package/dist/projections/internal.js +36 -33
- 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/host.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.js +42 -38
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +2 -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/index.js +7 -6
- package/dist/sandboxes/index.js.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/grants.d.ts +12 -4
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/internal.js +1 -1
- package/dist/security/project.d.ts +4 -1
- package/dist/security/project.d.ts.map +1 -1
- package/dist/security/public.js +2 -2
- package/dist/security/registry.d.ts +6 -0
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +47 -9
- 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 +34 -31
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +2 -2
- package/dist/storage/action-runs/provider.js +1 -1
- package/dist/storage/action-runs/types.d.ts +1 -1
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/agents/errors.d.ts +3 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +120 -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 -5
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +565 -13
- 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 +5 -4
- 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 +12 -2
- package/dist/storage/artifacts/errors.d.ts.map +1 -1
- package/dist/storage/artifacts/in-memory.d.ts +23 -2
- package/dist/storage/artifacts/in-memory.d.ts.map +1 -1
- package/dist/storage/artifacts/index.d.ts +2 -2
- package/dist/storage/artifacts/index.d.ts.map +1 -1
- package/dist/storage/artifacts/record.d.ts +19 -2
- package/dist/storage/artifacts/record.d.ts.map +1 -1
- package/dist/storage/artifacts/types.d.ts +87 -8
- package/dist/storage/artifacts/types.d.ts.map +1 -1
- 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/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 +40 -9
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +1 -1
- package/dist/storage/executions/in-memory.d.ts +2 -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/types.d.ts +15 -0
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.js +15 -12
- package/dist/storage/file-upload-sessions/provider.js.map +1 -1
- package/dist/storage/index.d.ts +13 -11
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +50 -39
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +2 -2
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +19 -8
- 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/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 +4 -1
- 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/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 +2 -2
- package/dist/storage/share-grants/provider.js +4 -3
- package/dist/storage/share-grants/provider.js.map +1 -1
- package/dist/storage/types.d.ts +2 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +15 -12
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/syncs/index.js +42 -39
- package/dist/syncs/index.js.map +1 -1
- 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.map +1 -1
- 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 +9 -5
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +7938 -3743
- package/dist/testing/index.js.map +29 -25
- 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 +34 -31
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +4 -6
- 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 +67 -63
- 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 +6 -2
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/actions/commit-edits.ts +6 -1
- package/src/actions/execution.ts +42 -15
- package/src/actions/read-facade.ts +33 -0
- package/src/actions/request.ts +224 -71
- 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 +72 -0
- package/src/actions/types/context.ts +20 -3
- package/src/actions/validators.ts +19 -8
- package/src/activity/README.md +5 -2
- package/src/activity/timeline.ts +39 -78
- 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 +55 -0
- 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 -69
- package/src/agents/run-scope.ts +134 -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 +35 -10
- package/src/agents/validation.ts +2 -0
- package/src/artifacts/access.ts +125 -0
- package/src/artifacts/canvas.ts +369 -0
- package/src/artifacts/csv.ts +10 -0
- package/src/artifacts/errors.ts +12 -1
- package/src/artifacts/execution.ts +436 -36
- 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 +35 -19
- package/src/artifacts/frames/entries.ts +35 -0
- package/src/artifacts/frames/grants.ts +10 -9
- package/src/artifacts/frames/index.ts +8 -2
- package/src/artifacts/frames/kit.ts +191 -14
- package/src/artifacts/frames/probe.ts +66 -18
- package/src/artifacts/frames/protocol.ts +164 -10
- package/src/artifacts/frames/runtime.ts +273 -28
- package/src/artifacts/index.ts +66 -2
- package/src/artifacts/kinds.ts +1 -1
- package/src/artifacts/limits.ts +31 -0
- package/src/artifacts/live-sheet.ts +345 -0
- package/src/artifacts/outline.ts +34 -1
- package/src/artifacts/publish/index.ts +2 -0
- package/src/artifacts/publish/publish.ts +120 -34
- package/src/artifacts/publish/queries.ts +336 -0
- package/src/artifacts/publish/references.ts +18 -13
- package/src/artifacts/publish/validate/canvas.ts +118 -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 +115 -69
- package/src/artifacts/publish/validate/slides.ts +11 -63
- package/src/artifacts/queries.ts +512 -0
- package/src/artifacts/resolve.ts +20 -5
- 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/tones.ts +20 -0
- package/src/artifacts/workbook.ts +374 -15
- 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 +47 -0
- package/src/authorization/event-visibility.ts +17 -16
- package/src/authorization/grant-kinds.ts +32 -0
- 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/errors/catalog.ts +26 -1
- package/src/errors/internal.ts +17 -8
- package/src/events/definitions.ts +26 -0
- package/src/events/execution.ts +43 -6
- 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 +238 -32
- package/src/execution/lineage.ts +14 -0
- package/src/execution/object-reader-ontology.ts +11 -14
- package/src/execution/object-reader-security.ts +134 -10
- 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 +206 -7
- package/src/index.ts +99 -2
- 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/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 +12 -3
- package/src/objects/link/endpoints.ts +42 -11
- package/src/objects/link/remove.ts +25 -10
- package/src/objects/link/upsert-batch.ts +2 -0
- package/src/objects/link/upsert.ts +18 -12
- package/src/objects/materializer-adapter.ts +55 -18
- package/src/objects/object/delete.ts +24 -7
- package/src/objects/object/upsert-batch.ts +44 -14
- package/src/objects/object/upsert.ts +23 -5
- 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/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 +3 -0
- package/src/ontology/docs-markdown.ts +1 -0
- 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/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/host.ts +18 -1
- package/src/runtime/index.ts +2 -0
- package/src/runtime/resolve-definitions.ts +3 -0
- package/src/runtime/sixb.ts +35 -8
- package/src/runtime/types.ts +99 -9
- 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/grants.ts +155 -10
- package/src/security/index.ts +3 -1
- package/src/security/project.ts +6 -1
- package/src/security/registry.ts +32 -7
- package/src/security/types.ts +54 -9
- package/src/security/validation.ts +27 -11
- package/src/security/view-conditions.ts +215 -0
- package/src/shares/execution.ts +43 -10
- package/src/storage/action-runs/types.ts +2 -0
- package/src/storage/agents/errors.ts +3 -0
- package/src/storage/agents/in-memory.ts +779 -32
- package/src/storage/agents/index.ts +42 -0
- package/src/storage/agents/provider.ts +733 -8
- package/src/storage/agents/types.ts +620 -12
- 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 +13 -1
- package/src/storage/artifacts/in-memory.ts +156 -8
- package/src/storage/artifacts/index.ts +6 -1
- package/src/storage/artifacts/record.ts +61 -1
- package/src/storage/artifacts/types.ts +92 -8
- package/src/storage/auth/in-memory/auth-storage.ts +27 -2
- package/src/storage/auth/in-memory/users.ts +40 -6
- package/src/storage/auth/index.ts +1 -0
- package/src/storage/auth/types.ts +43 -7
- package/src/storage/executions/in-memory.ts +32 -0
- package/src/storage/executions/index.ts +2 -0
- package/src/storage/executions/types.ts +17 -0
- package/src/storage/index.ts +69 -1
- package/src/storage/internal.ts +9 -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/unique-values.ts +62 -0
- package/src/storage/ontology/index.ts +10 -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/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/types.ts +2 -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 +1188 -33
- 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 +338 -4
- package/src/testing/auth-storage-contract.ts +550 -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 +53 -0
- package/src/testing/file-upload-session-storage-contract.ts +12 -24
- package/src/testing/index.ts +17 -4
- package/src/testing/lake-storage-contract.ts +22 -28
- package/src/testing/materializer-storage-contract.ts +36 -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 +230 -21
- 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 +13 -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 +6 -0
- package/src/workflows/request.ts +46 -8
- package/src/workflows/types.ts +6 -2
- package/src/workflows/validation.ts +23 -9
- package/dist/chunk-29yx306f.js.map +0 -22
- package/dist/chunk-3jms7je7.js +0 -14
- package/dist/chunk-3jms7je7.js.map +0 -10
- package/dist/chunk-3qct2mdc.js +0 -297
- package/dist/chunk-3qct2mdc.js.map +0 -12
- package/dist/chunk-48qjhh6v.js.map +0 -13
- package/dist/chunk-4as3wt1c.js.map +0 -12
- package/dist/chunk-5948n82c.js.map +0 -10
- package/dist/chunk-5hx48dnn.js.map +0 -14
- package/dist/chunk-6rqgmkde.js.map +0 -29
- 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-7q8t23v4.js +0 -467
- package/dist/chunk-7q8t23v4.js.map +0 -14
- package/dist/chunk-8frc8a4j.js.map +0 -20
- package/dist/chunk-918wwnaa.js.map +0 -68
- package/dist/chunk-91mg3nj9.js.map +0 -12
- package/dist/chunk-96yw3pwd.js.map +0 -10
- package/dist/chunk-9j4jw7as.js.map +0 -14
- package/dist/chunk-9k93ah50.js.map +0 -11
- package/dist/chunk-9kgkfg6v.js +0 -502
- package/dist/chunk-9kgkfg6v.js.map +0 -14
- package/dist/chunk-akzryx9h.js.map +0 -100
- package/dist/chunk-arns890k.js.map +0 -10
- package/dist/chunk-bk9svbcq.js.map +0 -49
- package/dist/chunk-c06hmxyy.js +0 -31
- package/dist/chunk-c06hmxyy.js.map +0 -10
- package/dist/chunk-c1rxbz5y.js.map +0 -12
- package/dist/chunk-cn0fwwhy.js.map +0 -19
- package/dist/chunk-dhcv7yxc.js.map +0 -11
- package/dist/chunk-dhdha526.js.map +0 -10
- package/dist/chunk-dvd2fp9q.js.map +0 -13
- package/dist/chunk-e6k4thh5.js.map +0 -19
- package/dist/chunk-ere85b8y.js.map +0 -15
- package/dist/chunk-g257jwnc.js.map +0 -12
- package/dist/chunk-hwksyjks.js.map +0 -11
- package/dist/chunk-k43ct2ke.js.map +0 -12
- package/dist/chunk-nn5xnx3s.js.map +0 -40
- 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-v4jbb3rs.js.map +0 -10
- package/dist/chunk-yxd3nnqt.js.map +0 -11
- 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-z58tm0hm.js.map → chunk-0phpbbvm.js.map} +0 -0
- /package/dist/{chunk-e17zdm62.js.map → chunk-1t6k1avb.js.map} +0 -0
- /package/dist/{chunk-kge7k6ey.js.map → chunk-2fn60nvs.js.map} +0 -0
- /package/dist/{chunk-y0c4e6ex.js.map → chunk-3gbefjg5.js.map} +0 -0
- /package/dist/{chunk-cy4mbddw.js.map → chunk-48jezz3j.js.map} +0 -0
- /package/dist/{chunk-twe4dx8p.js → chunk-5tfev0fv.js} +0 -0
- /package/dist/{chunk-twe4dx8p.js.map → chunk-5tfev0fv.js.map} +0 -0
- /package/dist/{chunk-447a5c0p.js.map → chunk-6n69k945.js.map} +0 -0
- /package/dist/{chunk-0bphap9y.js.map → chunk-6p0pastb.js.map} +0 -0
- /package/dist/{chunk-431pyp2c.js.map → chunk-6y0mkhex.js.map} +0 -0
- /package/dist/{chunk-s7jg7pmn.js.map → chunk-bab05bhg.js.map} +0 -0
- /package/dist/{chunk-q5e5tv4b.js.map → chunk-c844dkwd.js.map} +0 -0
- /package/dist/{chunk-cfj9dfbb.js.map → chunk-d2m879s4.js.map} +0 -0
- /package/dist/{chunk-q7gn29y3.js.map → chunk-dp0cdtj2.js.map} +0 -0
- /package/dist/{chunk-br3k6qbf.js.map → chunk-fm62y49k.js.map} +0 -0
- /package/dist/{chunk-vvxtn22d.js.map → chunk-g663fahq.js.map} +0 -0
- /package/dist/{chunk-rmakanzx.js.map → chunk-h33shhq6.js.map} +0 -0
- /package/dist/{chunk-d09e3rax.js.map → chunk-hwarjrgf.js.map} +0 -0
- /package/dist/{chunk-vf57cr4t.js.map → chunk-hyesv9dv.js.map} +0 -0
- /package/dist/{chunk-5vems3nx.js.map → chunk-m2nevja0.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-d7dnxdep.js.map → chunk-n9zpx9c6.js.map} +0 -0
- /package/dist/{chunk-xvsc5m8n.js.map → chunk-npcr0228.js.map} +0 -0
- /package/dist/{chunk-y5tah2kf.js.map → chunk-q4pmvkg0.js.map} +0 -0
- /package/dist/{chunk-d5rjr8c0.js.map → chunk-vabga7fk.js.map} +0 -0
|
@@ -1,39 +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
28
|
resolveMembershipPolicyScope,
|
|
11
29
|
canPerformMembershipOperation,
|
|
12
30
|
missingMembershipGroupIds,
|
|
13
31
|
validateSecurityDefinitionsAtStartup
|
|
14
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-73v685wb.js";
|
|
33
|
+
import {
|
|
34
|
+
sha256Canonical2
|
|
35
|
+
} from "./chunk-zrvhsq7f.js";
|
|
15
36
|
import {
|
|
16
37
|
getCookie2,
|
|
17
38
|
AuthRuntimeError2,
|
|
39
|
+
normalizeProfileChanges,
|
|
40
|
+
signInDisplayName2,
|
|
18
41
|
resolveAuthConfig2,
|
|
19
42
|
resolveInvitationExpiresAt,
|
|
20
43
|
assertNonEmpty3,
|
|
21
44
|
normalizePagination,
|
|
22
|
-
|
|
23
|
-
|
|
45
|
+
isMagicLinkAuthStrategy2,
|
|
46
|
+
isInvitationDeliveryAuthStrategy2,
|
|
47
|
+
isOidcAuthStrategy2
|
|
48
|
+
} from "./chunk-5grk14e5.js";
|
|
24
49
|
import {
|
|
25
50
|
normalizeParams,
|
|
26
51
|
coerceParamsToTyped
|
|
27
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-6n69k945.js";
|
|
28
53
|
import {
|
|
29
54
|
snapshotLinkPathSelection
|
|
30
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-16a9dmfy.js";
|
|
56
|
+
import {
|
|
57
|
+
resolveWhere,
|
|
58
|
+
ObjectQueryValidationError2,
|
|
59
|
+
normalizeObjectQuery2
|
|
60
|
+
} from "./chunk-j936th07.js";
|
|
61
|
+
import {
|
|
62
|
+
MaterializationValidationError2
|
|
63
|
+
} from "./chunk-y7dbmaqh.js";
|
|
31
64
|
import {
|
|
32
65
|
SecurityValidationError2
|
|
33
66
|
} from "./chunk-jcfw4h7m.js";
|
|
34
67
|
import {
|
|
35
|
-
OntologyValidationError2
|
|
68
|
+
OntologyValidationError2,
|
|
69
|
+
formatUnknownObjectTypeMessage
|
|
36
70
|
} from "./chunk-cqr3acm1.js";
|
|
71
|
+
import {
|
|
72
|
+
normalizeDecimalValue2
|
|
73
|
+
} from "./chunk-3bh94gbw.js";
|
|
37
74
|
|
|
38
75
|
// src/auth/access-tokens.ts
|
|
39
76
|
import { createHash, randomBytes, randomUUID } from "crypto";
|
|
@@ -555,6 +592,15 @@ function invalid(message) {
|
|
|
555
592
|
return new ShareDefinitionError2(`[Sixb] ${message}`);
|
|
556
593
|
}
|
|
557
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
|
+
|
|
558
604
|
// src/security/grants.ts
|
|
559
605
|
var VIEW_TARGETS = ["object", "dataset"];
|
|
560
606
|
var RUN_TARGETS = ["workflow", "sync", "pipeline"];
|
|
@@ -610,11 +656,59 @@ function resolveGrant(input, label, allowedTargets) {
|
|
|
610
656
|
const ids = [...new Set(items.map((item) => definitionIdOf(item, label)))];
|
|
611
657
|
return { target, selection: { all: false, ids } };
|
|
612
658
|
}
|
|
659
|
+
var UNVIEWABLE_PROJECT_REFERENCES = new Set([
|
|
660
|
+
project2,
|
|
661
|
+
project2.logs,
|
|
662
|
+
project2.activity
|
|
663
|
+
]);
|
|
613
664
|
function view(input) {
|
|
614
665
|
if (isShareTarget(input))
|
|
615
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
|
+
}
|
|
616
673
|
const { target, selection } = resolveGrant(input, "can.view", VIEW_TARGETS);
|
|
617
|
-
|
|
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";
|
|
618
712
|
}
|
|
619
713
|
function edit(input) {
|
|
620
714
|
return {
|
|
@@ -658,19 +752,26 @@ function run(input) {
|
|
|
658
752
|
if (isAgentReference(input)) {
|
|
659
753
|
return { kind: "grant", capability: "run", target: "agent" };
|
|
660
754
|
}
|
|
755
|
+
if (isModelsReference(input)) {
|
|
756
|
+
return { kind: "grant", capability: "run", target: "models" };
|
|
757
|
+
}
|
|
661
758
|
const { target, selection } = resolveGrant(input, "can.run", RUN_TARGETS);
|
|
662
759
|
return { kind: "grant", capability: "run", target, selection };
|
|
663
760
|
}
|
|
664
761
|
function isAgentReference(input) {
|
|
665
762
|
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "agent";
|
|
666
763
|
}
|
|
764
|
+
function isModelsReference(input) {
|
|
765
|
+
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "models";
|
|
766
|
+
}
|
|
667
767
|
function isAgentUsageReference(input) {
|
|
668
768
|
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "aiUsage";
|
|
669
769
|
}
|
|
670
770
|
var OBSERVABLE_REFERENCES = {
|
|
671
771
|
logs: "project.logs",
|
|
672
772
|
activity: "project.activity",
|
|
673
|
-
aiUsage: "agent.usage"
|
|
773
|
+
aiUsage: "agent.usage",
|
|
774
|
+
agentThreads: "agent.threads"
|
|
674
775
|
};
|
|
675
776
|
function isObservableReference(input) {
|
|
676
777
|
return typeof input === "object" && input !== null && "kind" in input && typeof input.kind === "string" && Object.hasOwn(OBSERVABLE_REFERENCES, input.kind);
|
|
@@ -686,10 +787,16 @@ function observe(input) {
|
|
|
686
787
|
}
|
|
687
788
|
return { kind: "grant", capability: "observe", target: value.kind };
|
|
688
789
|
}
|
|
790
|
+
function isAgentMemoryReference(input) {
|
|
791
|
+
return typeof input === "object" && input !== null && !Array.isArray(input) && !isBreadthSelector(input) && "kind" in input && input.kind === "agentMemory";
|
|
792
|
+
}
|
|
689
793
|
function manage(input) {
|
|
690
794
|
if (isAgentUsageReference(input)) {
|
|
691
795
|
return { kind: "grant", capability: "manage", target: "aiUsage" };
|
|
692
796
|
}
|
|
797
|
+
if (isAgentMemoryReference(input)) {
|
|
798
|
+
return { kind: "grant", capability: "manage", target: "agentMemory" };
|
|
799
|
+
}
|
|
693
800
|
return {
|
|
694
801
|
kind: "grant",
|
|
695
802
|
capability: "manage",
|
|
@@ -707,12 +814,1312 @@ var can2 = {
|
|
|
707
814
|
observe,
|
|
708
815
|
manage
|
|
709
816
|
};
|
|
710
|
-
// src/
|
|
711
|
-
|
|
712
|
-
kind
|
|
713
|
-
|
|
714
|
-
|
|
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
|
|
715
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
|
+
|
|
716
2123
|
// src/security/registry.ts
|
|
717
2124
|
class SecurityRegistry {
|
|
718
2125
|
markingsById;
|
|
@@ -720,6 +2127,7 @@ class SecurityRegistry {
|
|
|
720
2127
|
rolesById;
|
|
721
2128
|
membershipPoliciesById;
|
|
722
2129
|
resolvedRoles;
|
|
2130
|
+
viewConditions;
|
|
723
2131
|
constructor(input) {
|
|
724
2132
|
const definitions = validateSecurityDefinitionsAtStartup({
|
|
725
2133
|
markings: input.markings ?? [],
|
|
@@ -736,6 +2144,7 @@ class SecurityRegistry {
|
|
|
736
2144
|
connectorIds: input.connectorIds,
|
|
737
2145
|
shareIds: input.shareIds
|
|
738
2146
|
});
|
|
2147
|
+
this.viewConditions = definitions.roles.flatMap((role) => role.grants.flatMap((grant) => resolveViewCondition(role.id, grant, input.ontology) ?? []));
|
|
739
2148
|
const universe = {
|
|
740
2149
|
objectTypeIds: input.objectTypeIds ?? new Set,
|
|
741
2150
|
datasetIds: input.datasetIds ?? new Set,
|
|
@@ -751,12 +2160,17 @@ class SecurityRegistry {
|
|
|
751
2160
|
this.groupsById = definitions.groupsById;
|
|
752
2161
|
this.rolesById = definitions.rolesById;
|
|
753
2162
|
this.membershipPoliciesById = definitions.membershipPoliciesById;
|
|
754
|
-
this.resolvedRoles = definitions.roles.map((role) =>
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
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
|
+
});
|
|
760
2174
|
}
|
|
761
2175
|
listMarkings() {
|
|
762
2176
|
return [...this.markingsById.values()];
|
|
@@ -779,6 +2193,9 @@ class SecurityRegistry {
|
|
|
779
2193
|
listResolvedRoles() {
|
|
780
2194
|
return this.resolvedRoles;
|
|
781
2195
|
}
|
|
2196
|
+
listViewConditions() {
|
|
2197
|
+
return this.viewConditions;
|
|
2198
|
+
}
|
|
782
2199
|
listMembershipPolicies() {
|
|
783
2200
|
return [...this.membershipPoliciesById.values()];
|
|
784
2201
|
}
|
|
@@ -1822,6 +3239,12 @@ class InMemoryAuthUserStore {
|
|
|
1822
3239
|
const record = this.state.users.get(userKey(params.projectId, params.id)) ?? null;
|
|
1823
3240
|
return cloneOptionalRecord(record);
|
|
1824
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
|
+
}
|
|
1825
3248
|
async getByEmail(params) {
|
|
1826
3249
|
return cloneOptionalRecord(getUserByEmail(this.state, params.projectId, params.email));
|
|
1827
3250
|
}
|
|
@@ -1831,14 +3254,19 @@ class InMemoryAuthUserStore {
|
|
|
1831
3254
|
if (!existing) {
|
|
1832
3255
|
throw new AuthStorageError2("missing_user", `[Sixb] User '${input.id}' not found for project '${input.projectId}'.`);
|
|
1833
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
|
+
}
|
|
1834
3262
|
const next = {
|
|
1835
3263
|
...existing,
|
|
1836
|
-
displayName
|
|
1837
|
-
avatarUrl
|
|
3264
|
+
displayName,
|
|
3265
|
+
avatarUrl,
|
|
1838
3266
|
updatedAt: dateOrNow(input.updatedAt)
|
|
1839
3267
|
};
|
|
1840
3268
|
this.state.users.set(key, cloneRecord(next));
|
|
1841
|
-
return cloneRecord(next);
|
|
3269
|
+
return { user: cloneRecord(next), previousUser: cloneRecord(existing) };
|
|
1842
3270
|
}
|
|
1843
3271
|
async updateStatus(input) {
|
|
1844
3272
|
const key = userKey(input.projectId, input.id);
|
|
@@ -1852,15 +3280,16 @@ class InMemoryAuthUserStore {
|
|
|
1852
3280
|
updatedAt: dateOrNow(input.updatedAt)
|
|
1853
3281
|
};
|
|
1854
3282
|
this.state.users.set(key, cloneRecord(next));
|
|
1855
|
-
return cloneRecord(next);
|
|
3283
|
+
return { user: cloneRecord(next), previousUser: cloneRecord(existing) };
|
|
1856
3284
|
}
|
|
1857
3285
|
async list(input) {
|
|
1858
3286
|
if (input.statuses?.length === 0) {
|
|
1859
3287
|
return { users: [], hasMore: false, total: 0 };
|
|
1860
3288
|
}
|
|
1861
3289
|
const statuses = input.statuses ? new Set(input.statuses) : null;
|
|
3290
|
+
const search = input.search?.toLowerCase();
|
|
1862
3291
|
const order = input.order ?? "desc";
|
|
1863
|
-
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));
|
|
1864
3293
|
const page = paginate(rows, input);
|
|
1865
3294
|
return {
|
|
1866
3295
|
users: page.page.map(cloneRecord),
|
|
@@ -1869,6 +3298,12 @@ class InMemoryAuthUserStore {
|
|
|
1869
3298
|
};
|
|
1870
3299
|
}
|
|
1871
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
|
+
}
|
|
1872
3307
|
|
|
1873
3308
|
// src/storage/auth/in-memory/auth-storage.ts
|
|
1874
3309
|
class InMemoryAuthStorage2 {
|
|
@@ -1991,6 +3426,7 @@ class InMemoryAuthStorage2 {
|
|
|
1991
3426
|
tokenHash: input.tokenHash,
|
|
1992
3427
|
consumedAt: completedAt
|
|
1993
3428
|
});
|
|
3429
|
+
const previousUser = existingUser ? cloneRecord(existingUser) : null;
|
|
1994
3430
|
let user = existingUser;
|
|
1995
3431
|
if (!user) {
|
|
1996
3432
|
user = {
|
|
@@ -2029,7 +3465,8 @@ class InMemoryAuthStorage2 {
|
|
|
2029
3465
|
user: cloneRecord(user),
|
|
2030
3466
|
session: cloneRecord(session),
|
|
2031
3467
|
invitation: invitation.invitation ? cloneRecord(invitation.invitation) : undefined,
|
|
2032
|
-
groupMemberships: memberships.map(cloneRecord)
|
|
3468
|
+
groupMemberships: memberships.map(cloneRecord),
|
|
3469
|
+
previousUser
|
|
2033
3470
|
};
|
|
2034
3471
|
}
|
|
2035
3472
|
async completeOidcSignIn(input) {
|
|
@@ -2074,6 +3511,7 @@ class InMemoryAuthStorage2 {
|
|
|
2074
3511
|
}
|
|
2075
3512
|
}
|
|
2076
3513
|
this.consumeOidcAttempt(input, completedAt, projectId);
|
|
3514
|
+
const previousUser = user ? cloneRecord(user) : null;
|
|
2077
3515
|
if (!user) {
|
|
2078
3516
|
user = {
|
|
2079
3517
|
id: newUserId ?? assertNonEmpty4(input.newUserId, "User id"),
|
|
@@ -2086,6 +3524,8 @@ class InMemoryAuthStorage2 {
|
|
|
2086
3524
|
updatedAt: completedAt
|
|
2087
3525
|
};
|
|
2088
3526
|
this.state.users.set(userKey(projectId, user.id), cloneRecord(user));
|
|
3527
|
+
} else {
|
|
3528
|
+
user = this.refreshProviderProfile(user, input, completedAt);
|
|
2089
3529
|
}
|
|
2090
3530
|
const invitation = this.acceptInvitationAndApplyGroups({
|
|
2091
3531
|
activeInvitation,
|
|
@@ -2128,7 +3568,8 @@ class InMemoryAuthStorage2 {
|
|
|
2128
3568
|
session: cloneRecord(session),
|
|
2129
3569
|
identity: cloneRecord(nextIdentity),
|
|
2130
3570
|
invitation: invitation.invitation ? cloneRecord(invitation.invitation) : undefined,
|
|
2131
|
-
groupMemberships: memberships.map(cloneRecord)
|
|
3571
|
+
groupMemberships: memberships.map(cloneRecord),
|
|
3572
|
+
previousUser
|
|
2132
3573
|
};
|
|
2133
3574
|
}
|
|
2134
3575
|
async suspendUserAndRevokeSessions(input) {
|
|
@@ -2144,7 +3585,17 @@ class InMemoryAuthStorage2 {
|
|
|
2144
3585
|
};
|
|
2145
3586
|
this.state.users.set(key, cloneRecord(next));
|
|
2146
3587
|
revokeActiveSessionsForUser(this.state, input.projectId, input.userId, input.suspendedAt);
|
|
2147
|
-
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;
|
|
2148
3599
|
}
|
|
2149
3600
|
acceptInvitationAndApplyGroups(input) {
|
|
2150
3601
|
if (!input.activeInvitation) {
|
|
@@ -2219,6 +3670,166 @@ function restoreMap(target, snapshot) {
|
|
|
2219
3670
|
target.set(key, value);
|
|
2220
3671
|
}
|
|
2221
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
|
+
|
|
2222
3833
|
// src/auth/session-cache.ts
|
|
2223
3834
|
class SessionCache {
|
|
2224
3835
|
ttlMs;
|
|
@@ -2331,6 +3942,7 @@ var SESSION_TOUCH_INTERVAL_MS = 60000;
|
|
|
2331
3942
|
var ACCESS_TOKEN_TOUCH_INTERVAL_MS = 60000;
|
|
2332
3943
|
var BEARER_ACCESS_TOKEN_TTL_MS = 15 * 60000;
|
|
2333
3944
|
var REFRESH_REUSE_GRACE_MS = 60000;
|
|
3945
|
+
var PROFILE_FIELDS = ["displayName", "avatarUrl"];
|
|
2334
3946
|
|
|
2335
3947
|
class AuthRuntime2 {
|
|
2336
3948
|
projectId;
|
|
@@ -2338,10 +3950,12 @@ class AuthRuntime2 {
|
|
|
2338
3950
|
security;
|
|
2339
3951
|
config;
|
|
2340
3952
|
sessionCache;
|
|
3953
|
+
events;
|
|
2341
3954
|
constructor(options) {
|
|
2342
3955
|
this.projectId = options.projectId;
|
|
2343
3956
|
this.storage = options.storage;
|
|
2344
3957
|
this.security = options.security;
|
|
3958
|
+
this.events = options.events;
|
|
2345
3959
|
this.config = resolveAuthConfig2(options.config);
|
|
2346
3960
|
this.sessionCache = this.config.session.cacheTtlMs > 0 ? new SessionCache(this.config.session.cacheTtlMs) : null;
|
|
2347
3961
|
if (this.isEnabled() && !this.storage.auth) {
|
|
@@ -2658,6 +4272,38 @@ class AuthRuntime2 {
|
|
|
2658
4272
|
});
|
|
2659
4273
|
} catch {}
|
|
2660
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
|
+
}
|
|
2661
4307
|
contextFromSession(session) {
|
|
2662
4308
|
return resolveAuthorizationContext2({
|
|
2663
4309
|
principal: session.principal,
|
|
@@ -2959,12 +4605,13 @@ class AuthRuntime2 {
|
|
|
2959
4605
|
if (user.id === caller.user.id) {
|
|
2960
4606
|
throw new AuthRuntimeError2("authorization_denied", "[Sixb] The current user cannot suspend themselves.");
|
|
2961
4607
|
}
|
|
2962
|
-
const suspended = await storage.suspendUserAndRevokeSessions({
|
|
4608
|
+
const { user: suspended, previousUser } = await storage.suspendUserAndRevokeSessions({
|
|
2963
4609
|
projectId: this.projectId,
|
|
2964
4610
|
userId: user.id,
|
|
2965
4611
|
suspendedAt: new Date
|
|
2966
4612
|
});
|
|
2967
4613
|
this.sessionCache?.invalidateUser(user.id);
|
|
4614
|
+
await this.emitMemberEvents(statusChangedEvents(caller, previousUser, suspended));
|
|
2968
4615
|
return { user: suspended, groupIds, managedGroupIds };
|
|
2969
4616
|
}
|
|
2970
4617
|
async reactivateMember(caller, input) {
|
|
@@ -2972,14 +4619,64 @@ class AuthRuntime2 {
|
|
|
2972
4619
|
const scope = this.resolveMembershipPolicyScopeForUser(caller.groupIds);
|
|
2973
4620
|
const userId = assertNonEmpty3(input.userId, "User id");
|
|
2974
4621
|
const { user, groupIds, managedGroupIds } = await this.requireManageableMember(storage, scope, "suspend", userId);
|
|
2975
|
-
const reactivated = await storage.users.updateStatus({
|
|
4622
|
+
const { user: reactivated, previousUser } = await storage.users.updateStatus({
|
|
2976
4623
|
projectId: this.projectId,
|
|
2977
4624
|
id: user.id,
|
|
2978
4625
|
status: "active",
|
|
2979
4626
|
updatedAt: new Date
|
|
2980
4627
|
});
|
|
4628
|
+
await this.emitMemberEvents(statusChangedEvents(caller, previousUser, reactivated));
|
|
2981
4629
|
return { user: reactivated, groupIds, managedGroupIds };
|
|
2982
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
|
+
}
|
|
2983
4680
|
async listSessions(caller) {
|
|
2984
4681
|
return this.requireAuthStorage().sessions.listActiveByUserId({
|
|
2985
4682
|
projectId: this.projectId,
|
|
@@ -3076,13 +4773,11 @@ class AuthRuntime2 {
|
|
|
3076
4773
|
status: delivery.status,
|
|
3077
4774
|
...input.revealLink && delivery.link ? { link: delivery.link } : {}
|
|
3078
4775
|
};
|
|
3079
|
-
if (delivery.status
|
|
3080
|
-
return { invitation, delivery };
|
|
3081
|
-
}
|
|
3082
|
-
if (delivery.status !== "sent") {
|
|
4776
|
+
if (delivery.status !== "sent" && delivery.status !== "not_supported") {
|
|
3083
4777
|
await this.revokeInvitationAfterDeliveryFailure(authStorage, invitation, now);
|
|
3084
4778
|
throw this.createInvitationDeliveryError(delivery.status);
|
|
3085
4779
|
}
|
|
4780
|
+
await this.emitMemberEvents(invitedEvents(caller, invitation));
|
|
3086
4781
|
return { invitation, delivery };
|
|
3087
4782
|
}
|
|
3088
4783
|
async listInvitations(caller, input = {}) {
|
|
@@ -3125,6 +4820,11 @@ class AuthRuntime2 {
|
|
|
3125
4820
|
})
|
|
3126
4821
|
};
|
|
3127
4822
|
}
|
|
4823
|
+
async emitMemberEvents(events) {
|
|
4824
|
+
if (events.length === 0)
|
|
4825
|
+
return;
|
|
4826
|
+
await this.events.emit({ events }, { source: "Sixb" });
|
|
4827
|
+
}
|
|
3128
4828
|
requireAuthStorage() {
|
|
3129
4829
|
if (!this.storage.auth) {
|
|
3130
4830
|
throw new AuthRuntimeError2("auth_storage_missing", "[Sixb] Auth is enabled but storage.auth is not configured.");
|
|
@@ -3298,6 +4998,6 @@ var SYSTEM_PRINCIPAL2 = { type: "system", id: "system" };
|
|
|
3298
4998
|
function principalsEqual2(left, right) {
|
|
3299
4999
|
return left.type === right.type && left.id === right.id;
|
|
3300
5000
|
}
|
|
3301
|
-
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,
|
|
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 };
|
|
3302
5002
|
|
|
3303
|
-
//# debugId=
|
|
5003
|
+
//# debugId=86A4C82302343CA464756E2164756E21
|