pyric 0.1.0-alpha.21 → 0.1.0-alpha.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/ai/activity.d.ts +9 -0
- package/dist/ai/activity.d.ts.map +1 -0
- package/dist/ai/activity.js +45 -0
- package/dist/ai/activity.js.map +1 -0
- package/dist/ai/broker/broker.d.ts +25 -0
- package/dist/ai/broker/broker.d.ts.map +1 -1
- package/dist/ai/broker/broker.js +46 -42
- package/dist/ai/broker/broker.js.map +1 -1
- package/dist/ai/broker/gemini-engine.d.ts +7 -0
- package/dist/ai/broker/gemini-engine.d.ts.map +1 -1
- package/dist/ai/broker/gemini-engine.js +15 -0
- package/dist/ai/broker/gemini-engine.js.map +1 -1
- package/dist/ai/broker/index.d.ts +1 -1
- package/dist/ai/broker/index.d.ts.map +1 -1
- package/dist/ai/broker/index.js.map +1 -1
- package/dist/ai/broker/openai-engine.d.ts.map +1 -1
- package/dist/ai/broker/openai-engine.js +7 -3
- package/dist/ai/broker/openai-engine.js.map +1 -1
- package/dist/ai/broker/scripted-engine.d.ts +9 -1
- package/dist/ai/broker/scripted-engine.d.ts.map +1 -1
- package/dist/ai/broker/scripted-engine.js +14 -5
- package/dist/ai/broker/scripted-engine.js.map +1 -1
- package/dist/ai/broker/types.d.ts +6 -2
- package/dist/ai/broker/types.d.ts.map +1 -1
- package/dist/ai/events.d.ts +12 -0
- package/dist/ai/events.d.ts.map +1 -0
- package/dist/ai/events.js +17 -0
- package/dist/ai/events.js.map +1 -0
- package/dist/ai/generation-enums.d.ts +43 -0
- package/dist/ai/generation-enums.d.ts.map +1 -0
- package/dist/ai/generation-enums.js +37 -0
- package/dist/ai/generation-enums.js.map +1 -0
- package/dist/ai/index.d.ts +1 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/instances.d.ts +6 -0
- package/dist/ai/instances.d.ts.map +1 -1
- package/dist/ai/instances.js +20 -2
- package/dist/ai/instances.js.map +1 -1
- package/dist/ai/internal.d.ts +3 -0
- package/dist/ai/internal.d.ts.map +1 -1
- package/dist/ai/internal.js +3 -0
- package/dist/ai/internal.js.map +1 -1
- package/dist/ai/sandbox-plane.d.ts.map +1 -1
- package/dist/ai/sandbox-plane.js +23 -8
- package/dist/ai/sandbox-plane.js.map +1 -1
- package/dist/ai/scripting.d.ts +20 -2
- package/dist/ai/scripting.d.ts.map +1 -1
- package/dist/ai/scripting.js +30 -3
- package/dist/ai/scripting.js.map +1 -1
- package/dist/app/internal.d.ts +1 -0
- package/dist/app/internal.d.ts.map +1 -1
- package/dist/app/internal.js +1 -0
- package/dist/app/internal.js.map +1 -1
- package/dist/auth/email-link.d.ts +8 -1
- package/dist/auth/email-link.d.ts.map +1 -1
- package/dist/auth/email-link.js +29 -20
- package/dist/auth/email-link.js.map +1 -1
- package/dist/auth/events.d.ts +12 -0
- package/dist/auth/events.d.ts.map +1 -0
- package/dist/auth/events.js +18 -0
- package/dist/auth/events.js.map +1 -0
- package/dist/auth/factor-id.d.ts +7 -0
- package/dist/auth/factor-id.d.ts.map +1 -0
- package/dist/auth/factor-id.js +6 -0
- package/dist/auth/factor-id.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/instances.d.ts.map +1 -1
- package/dist/auth/instances.js +13 -1
- package/dist/auth/instances.js.map +1 -1
- package/dist/auth/internal.d.ts +20 -0
- package/dist/auth/internal.d.ts.map +1 -0
- package/dist/auth/internal.js +19 -0
- package/dist/auth/internal.js.map +1 -0
- package/dist/auth/modular.d.ts +9 -0
- package/dist/auth/modular.d.ts.map +1 -1
- package/dist/auth/modular.js +20 -0
- package/dist/auth/modular.js.map +1 -1
- package/dist/auth/reauth.js +3 -2
- package/dist/auth/reauth.js.map +1 -1
- package/dist/auth/sandbox/default-avatar.d.ts +64 -0
- package/dist/auth/sandbox/default-avatar.d.ts.map +1 -0
- package/dist/auth/sandbox/default-avatar.js +118 -0
- package/dist/auth/sandbox/default-avatar.js.map +1 -0
- package/dist/auth/sandbox/driver.d.ts +36 -0
- package/dist/auth/sandbox/driver.d.ts.map +1 -1
- package/dist/auth/sandbox/driver.js +47 -0
- package/dist/auth/sandbox/driver.js.map +1 -1
- package/dist/auth/sandbox/project-store.d.ts +0 -1
- package/dist/auth/sandbox/project-store.d.ts.map +1 -1
- package/dist/auth/sandbox/project-store.js +0 -1
- package/dist/auth/sandbox/project-store.js.map +1 -1
- package/dist/auth/sandbox-backend-types.d.ts +34 -20
- package/dist/auth/sandbox-backend-types.d.ts.map +1 -1
- package/dist/auth/sandbox-backend-types.js +2 -3
- package/dist/auth/sandbox-backend-types.js.map +1 -1
- package/dist/auth/sandbox-backend.d.ts +98 -20
- package/dist/auth/sandbox-backend.d.ts.map +1 -1
- package/dist/auth/sandbox-backend.js +403 -96
- package/dist/auth/sandbox-backend.js.map +1 -1
- package/dist/auth/seed-user.d.ts +38 -0
- package/dist/auth/seed-user.d.ts.map +1 -0
- package/dist/auth/seed-user.js +2 -0
- package/dist/auth/seed-user.js.map +1 -0
- package/dist/auth/tokens.d.ts +6 -1
- package/dist/auth/tokens.d.ts.map +1 -1
- package/dist/auth/tokens.js +19 -17
- package/dist/auth/tokens.js.map +1 -1
- package/dist/auth/types.d.ts +13 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/database/activity-coverage.d.ts +9 -0
- package/dist/database/activity-coverage.d.ts.map +1 -0
- package/dist/database/activity-coverage.js +11 -0
- package/dist/database/activity-coverage.js.map +1 -0
- package/dist/database/connection-lifecycle.d.ts +3 -0
- package/dist/database/connection-lifecycle.d.ts.map +1 -1
- package/dist/database/connection-lifecycle.js +54 -23
- package/dist/database/connection-lifecycle.js.map +1 -1
- package/dist/database/events.d.ts +12 -0
- package/dist/database/events.d.ts.map +1 -0
- package/dist/database/events.js +10 -0
- package/dist/database/events.js.map +1 -0
- package/dist/database/instances.d.ts +7 -7
- package/dist/database/instances.d.ts.map +1 -1
- package/dist/database/instances.js +35 -13
- package/dist/database/instances.js.map +1 -1
- package/dist/database/internal/query-projection.d.ts +102 -0
- package/dist/database/internal/query-projection.d.ts.map +1 -0
- package/dist/database/internal/query-projection.js +293 -0
- package/dist/database/internal/query-projection.js.map +1 -0
- package/dist/database/internal.d.ts +2 -0
- package/dist/database/internal.d.ts.map +1 -1
- package/dist/database/internal.js +2 -0
- package/dist/database/internal.js.map +1 -1
- package/dist/database/listeners.d.ts.map +1 -1
- package/dist/database/listeners.js +165 -37
- package/dist/database/listeners.js.map +1 -1
- package/dist/database/operations.d.ts.map +1 -1
- package/dist/database/operations.js +77 -50
- package/dist/database/operations.js.map +1 -1
- package/dist/database/replay.d.ts.map +1 -1
- package/dist/database/replay.js +6 -2
- package/dist/database/replay.js.map +1 -1
- package/dist/database/routing.d.ts +4 -0
- package/dist/database/routing.d.ts.map +1 -1
- package/dist/database/routing.js.map +1 -1
- package/dist/database/sandbox/backend-for.d.ts +4 -3
- package/dist/database/sandbox/backend-for.d.ts.map +1 -1
- package/dist/database/sandbox/backend-for.js +130 -24
- package/dist/database/sandbox/backend-for.js.map +1 -1
- package/dist/database/sandbox/backend-state.d.ts +7 -0
- package/dist/database/sandbox/backend-state.d.ts.map +1 -1
- package/dist/database/sandbox/backend-state.js +15 -1
- package/dist/database/sandbox/backend-state.js.map +1 -1
- package/dist/database/sandbox/backend.d.ts +2 -1
- package/dist/database/sandbox/backend.d.ts.map +1 -1
- package/dist/database/sandbox/backend.js +3 -3
- package/dist/database/sandbox/backend.js.map +1 -1
- package/dist/database/sandbox/child-listeners.d.ts +5 -0
- package/dist/database/sandbox/child-listeners.d.ts.map +1 -1
- package/dist/database/sandbox/child-listeners.js +34 -14
- package/dist/database/sandbox/child-listeners.js.map +1 -1
- package/dist/database/sandbox/listener-types.d.ts +5 -0
- package/dist/database/sandbox/listener-types.d.ts.map +1 -1
- package/dist/database/sandbox/operation-events.d.ts +5 -0
- package/dist/database/sandbox/operation-events.d.ts.map +1 -1
- package/dist/database/sandbox/operation-events.js +18 -3
- package/dist/database/sandbox/operation-events.js.map +1 -1
- package/dist/database/sandbox/persistence-state.d.ts.map +1 -1
- package/dist/database/sandbox/persistence-state.js +1 -8
- package/dist/database/sandbox/persistence-state.js.map +1 -1
- package/dist/database/sandbox/priority-writes.js +2 -2
- package/dist/database/sandbox/priority-writes.js.map +1 -1
- package/dist/database/sandbox/query.d.ts +2 -101
- package/dist/database/sandbox/query.d.ts.map +1 -1
- package/dist/database/sandbox/query.js +1 -225
- package/dist/database/sandbox/query.js.map +1 -1
- package/dist/database/sandbox/rules-eval.d.ts +28 -0
- package/dist/database/sandbox/rules-eval.d.ts.map +1 -1
- package/dist/database/sandbox/rules-eval.js +136 -9
- package/dist/database/sandbox/rules-eval.js.map +1 -1
- package/dist/database/sandbox/transactions.d.ts.map +1 -1
- package/dist/database/sandbox/transactions.js +17 -38
- package/dist/database/sandbox/transactions.js.map +1 -1
- package/dist/database/sandbox/value-listeners.d.ts +11 -1
- package/dist/database/sandbox/value-listeners.d.ts.map +1 -1
- package/dist/database/sandbox/value-listeners.js +65 -27
- package/dist/database/sandbox/value-listeners.js.map +1 -1
- package/dist/database/sandbox/write-plane.d.ts.map +1 -1
- package/dist/database/sandbox/write-plane.js +30 -22
- package/dist/database/sandbox/write-plane.js.map +1 -1
- package/dist/database/sdk-activity.d.ts +5 -0
- package/dist/database/sdk-activity.d.ts.map +1 -0
- package/dist/database/sdk-activity.js +20 -0
- package/dist/database/sdk-activity.js.map +1 -0
- package/dist/database/transactions.d.ts.map +1 -1
- package/dist/database/transactions.js +7 -3
- package/dist/database/transactions.js.map +1 -1
- package/dist/database/types.d.ts +9 -1
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/deferred/entry.d.ts +6 -3
- package/dist/deferred/entry.d.ts.map +1 -1
- package/dist/deferred/entry.js +13 -10
- package/dist/deferred/entry.js.map +1 -1
- package/dist/firestore/activity-coverage.d.ts +9 -0
- package/dist/firestore/activity-coverage.d.ts.map +1 -0
- package/dist/firestore/activity-coverage.js +9 -0
- package/dist/firestore/activity-coverage.js.map +1 -0
- package/dist/firestore/aggregates.d.ts.map +1 -1
- package/dist/firestore/aggregates.js +32 -10
- package/dist/firestore/aggregates.js.map +1 -1
- package/dist/firestore/bytes.d.ts +13 -0
- package/dist/firestore/bytes.d.ts.map +1 -0
- package/dist/firestore/bytes.js +51 -0
- package/dist/firestore/bytes.js.map +1 -0
- package/dist/firestore/converter-method.d.ts +11 -0
- package/dist/firestore/converter-method.d.ts.map +1 -0
- package/dist/firestore/converter-method.js +39 -0
- package/dist/firestore/converter-method.js.map +1 -0
- package/dist/firestore/errors.d.ts.map +1 -1
- package/dist/firestore/errors.js +4 -0
- package/dist/firestore/errors.js.map +1 -1
- package/dist/firestore/field-values.d.ts +3 -36
- package/dist/firestore/field-values.d.ts.map +1 -1
- package/dist/firestore/field-values.js +3 -136
- package/dist/firestore/field-values.js.map +1 -1
- package/dist/firestore/geo-point.d.ts +15 -0
- package/dist/firestore/geo-point.d.ts.map +1 -0
- package/dist/firestore/geo-point.js +50 -0
- package/dist/firestore/geo-point.js.map +1 -0
- package/dist/firestore/index.d.ts +1 -1
- package/dist/firestore/index.d.ts.map +1 -1
- package/dist/firestore/index.js +1 -1
- package/dist/firestore/index.js.map +1 -1
- package/dist/firestore/instances.d.ts.map +1 -1
- package/dist/firestore/instances.js +23 -2
- package/dist/firestore/instances.js.map +1 -1
- package/dist/firestore/internal/document-data.d.ts +3 -0
- package/dist/firestore/internal/document-data.d.ts.map +1 -0
- package/dist/firestore/internal/document-data.js +10 -0
- package/dist/firestore/internal/document-data.js.map +1 -0
- package/dist/firestore/internal/index.d.ts +3 -0
- package/dist/firestore/internal/index.d.ts.map +1 -1
- package/dist/firestore/internal/index.js +5 -0
- package/dist/firestore/internal/index.js.map +1 -1
- package/dist/firestore/internal/value-codec.d.ts +16 -61
- package/dist/firestore/internal/value-codec.d.ts.map +1 -1
- package/dist/firestore/internal/value-codec.js +137 -82
- package/dist/firestore/internal/value-codec.js.map +1 -1
- package/dist/firestore/internal/value-depth.d.ts +3 -0
- package/dist/firestore/internal/value-depth.d.ts.map +1 -0
- package/dist/firestore/internal/value-depth.js +19 -0
- package/dist/firestore/internal/value-depth.js.map +1 -0
- package/dist/firestore/listeners.d.ts +18 -1
- package/dist/firestore/listeners.d.ts.map +1 -1
- package/dist/firestore/listeners.js +60 -21
- package/dist/firestore/listeners.js.map +1 -1
- package/dist/firestore/persistence.d.ts +0 -9
- package/dist/firestore/persistence.d.ts.map +1 -1
- package/dist/firestore/persistence.js +23 -9
- package/dist/firestore/persistence.js.map +1 -1
- package/dist/firestore/plain-object.d.ts +3 -0
- package/dist/firestore/plain-object.d.ts.map +1 -0
- package/dist/firestore/plain-object.js +9 -0
- package/dist/firestore/plain-object.js.map +1 -0
- package/dist/firestore/query-constraints.d.ts.map +1 -1
- package/dist/firestore/query-constraints.js +4 -3
- package/dist/firestore/query-constraints.js.map +1 -1
- package/dist/firestore/reads.d.ts +9 -7
- package/dist/firestore/reads.d.ts.map +1 -1
- package/dist/firestore/reads.js +74 -36
- package/dist/firestore/reads.js.map +1 -1
- package/dist/firestore/refs.d.ts +2 -1
- package/dist/firestore/refs.d.ts.map +1 -1
- package/dist/firestore/refs.js +37 -24
- package/dist/firestore/refs.js.map +1 -1
- package/dist/firestore/sandbox/activity-query-display.d.ts +67 -0
- package/dist/firestore/sandbox/activity-query-display.d.ts.map +1 -0
- package/dist/firestore/sandbox/activity-query-display.js +119 -0
- package/dist/firestore/sandbox/activity-query-display.js.map +1 -0
- package/dist/firestore/sandbox/admin-compat/batch.d.ts +4 -8
- package/dist/firestore/sandbox/admin-compat/batch.d.ts.map +1 -1
- package/dist/firestore/sandbox/admin-compat/batch.js +27 -19
- package/dist/firestore/sandbox/admin-compat/batch.js.map +1 -1
- package/dist/firestore/sandbox/admin-compat/query-comparison.d.ts.map +1 -1
- package/dist/firestore/sandbox/admin-compat/query-comparison.js +8 -3
- package/dist/firestore/sandbox/admin-compat/query-comparison.js.map +1 -1
- package/dist/firestore/sandbox/admin-compat/query.d.ts +8 -0
- package/dist/firestore/sandbox/admin-compat/query.d.ts.map +1 -1
- package/dist/firestore/sandbox/admin-compat/query.js +44 -5
- package/dist/firestore/sandbox/admin-compat/query.js.map +1 -1
- package/dist/firestore/sandbox/admin-compat/read-translation.d.ts.map +1 -1
- package/dist/firestore/sandbox/admin-compat/read-translation.js +18 -9
- package/dist/firestore/sandbox/admin-compat/read-translation.js.map +1 -1
- package/dist/firestore/sandbox/admin-compat/transaction.d.ts +2 -2
- package/dist/firestore/sandbox/admin-compat/transaction.d.ts.map +1 -1
- package/dist/firestore/sandbox/admin-compat/transaction.js +13 -4
- package/dist/firestore/sandbox/admin-compat/transaction.js.map +1 -1
- package/dist/firestore/sandbox/admin-compat/types.d.ts +6 -33
- package/dist/firestore/sandbox/admin-compat/types.d.ts.map +1 -1
- package/dist/firestore/sandbox/admin-compat/types.js +1 -76
- package/dist/firestore/sandbox/admin-compat/types.js.map +1 -1
- package/dist/firestore/sandbox/atomic-state.d.ts +4 -0
- package/dist/firestore/sandbox/atomic-state.d.ts.map +1 -0
- package/dist/firestore/sandbox/atomic-state.js +105 -0
- package/dist/firestore/sandbox/atomic-state.js.map +1 -0
- package/dist/firestore/sandbox/atomic-write-pipeline.d.ts +3 -2
- package/dist/firestore/sandbox/atomic-write-pipeline.d.ts.map +1 -1
- package/dist/firestore/sandbox/atomic-write-pipeline.js +128 -58
- package/dist/firestore/sandbox/atomic-write-pipeline.js.map +1 -1
- package/dist/firestore/sandbox/batch-write-executor.d.ts.map +1 -1
- package/dist/firestore/sandbox/batch-write-executor.js +54 -28
- package/dist/firestore/sandbox/batch-write-executor.js.map +1 -1
- package/dist/firestore/sandbox/converters/user-timestamp.d.ts +6 -40
- package/dist/firestore/sandbox/converters/user-timestamp.d.ts.map +1 -1
- package/dist/firestore/sandbox/converters/user-timestamp.js +20 -43
- package/dist/firestore/sandbox/converters/user-timestamp.js.map +1 -1
- package/dist/firestore/sandbox/document-copy.d.ts +4 -0
- package/dist/firestore/sandbox/document-copy.d.ts.map +1 -0
- package/dist/firestore/sandbox/document-copy.js +28 -0
- package/dist/firestore/sandbox/document-copy.js.map +1 -0
- package/dist/firestore/sandbox/document-store.d.ts +99 -0
- package/dist/firestore/sandbox/document-store.d.ts.map +1 -0
- package/dist/firestore/sandbox/document-store.js +2 -0
- package/dist/firestore/sandbox/document-store.js.map +1 -0
- package/dist/firestore/sandbox/errors.d.ts +4 -1
- package/dist/firestore/sandbox/errors.d.ts.map +1 -1
- package/dist/firestore/sandbox/errors.js +2 -25
- package/dist/firestore/sandbox/errors.js.map +1 -1
- package/dist/firestore/sandbox/event-log.d.ts +22 -4
- package/dist/firestore/sandbox/event-log.d.ts.map +1 -1
- package/dist/firestore/sandbox/event-log.js +66 -6
- package/dist/firestore/sandbox/event-log.js.map +1 -1
- package/dist/firestore/sandbox/field-merge.d.ts.map +1 -1
- package/dist/firestore/sandbox/field-merge.js +10 -20
- package/dist/firestore/sandbox/field-merge.js.map +1 -1
- package/dist/firestore/sandbox/history-controls.d.ts +1 -1
- package/dist/firestore/sandbox/history-controls.d.ts.map +1 -1
- package/dist/firestore/sandbox/history-controls.js +1 -1
- package/dist/firestore/sandbox/history-controls.js.map +1 -1
- package/dist/firestore/sandbox/list-query-proof.d.ts +4 -1
- package/dist/firestore/sandbox/list-query-proof.d.ts.map +1 -1
- package/dist/firestore/sandbox/list-query-proof.js +32 -96
- package/dist/firestore/sandbox/list-query-proof.js.map +1 -1
- package/dist/firestore/sandbox/listener-dispatch.d.ts +26 -1
- package/dist/firestore/sandbox/listener-dispatch.d.ts.map +1 -1
- package/dist/firestore/sandbox/listener-dispatch.js +58 -5
- package/dist/firestore/sandbox/listener-dispatch.js.map +1 -1
- package/dist/firestore/sandbox/local-environment.d.ts +16 -2
- package/dist/firestore/sandbox/local-environment.d.ts.map +1 -1
- package/dist/firestore/sandbox/local-environment.js +33 -9
- package/dist/firestore/sandbox/local-environment.js.map +1 -1
- package/dist/firestore/sandbox/local-state.d.ts +5 -99
- package/dist/firestore/sandbox/local-state.d.ts.map +1 -1
- package/dist/firestore/sandbox/local-state.js +64 -117
- package/dist/firestore/sandbox/local-state.js.map +1 -1
- package/dist/firestore/sandbox/query-execution.d.ts +4 -1
- package/dist/firestore/sandbox/query-execution.d.ts.map +1 -1
- package/dist/firestore/sandbox/query-execution.js +51 -26
- package/dist/firestore/sandbox/query-execution.js.map +1 -1
- package/dist/firestore/sandbox/query-operand-equality.d.ts.map +1 -1
- package/dist/firestore/sandbox/query-operand-equality.js +50 -14
- package/dist/firestore/sandbox/query-operand-equality.js.map +1 -1
- package/dist/firestore/sandbox/query-operators.d.ts +4 -0
- package/dist/firestore/sandbox/query-operators.d.ts.map +1 -0
- package/dist/firestore/sandbox/query-operators.js +17 -0
- package/dist/firestore/sandbox/query-operators.js.map +1 -0
- package/dist/firestore/sandbox/query-value-registry.d.ts +1 -1
- package/dist/firestore/sandbox/query-value-registry.d.ts.map +1 -1
- package/dist/firestore/sandbox/query-value-registry.js +3 -1
- package/dist/firestore/sandbox/query-value-registry.js.map +1 -1
- package/dist/firestore/sandbox/request-events.d.ts +3 -0
- package/dist/firestore/sandbox/request-events.d.ts.map +1 -1
- package/dist/firestore/sandbox/request-events.js +4 -0
- package/dist/firestore/sandbox/request-events.js.map +1 -1
- package/dist/firestore/sandbox/rules-evidence.d.ts +7 -0
- package/dist/firestore/sandbox/rules-evidence.d.ts.map +1 -0
- package/dist/firestore/sandbox/rules-evidence.js +87 -0
- package/dist/firestore/sandbox/rules-evidence.js.map +1 -0
- package/dist/firestore/sandbox/rules-list-authorizer.d.ts +13 -1
- package/dist/firestore/sandbox/rules-list-authorizer.d.ts.map +1 -1
- package/dist/firestore/sandbox/rules-list-authorizer.js +53 -74
- package/dist/firestore/sandbox/rules-list-authorizer.js.map +1 -1
- package/dist/firestore/sandbox/rules-operation-reader.d.ts +8 -1
- package/dist/firestore/sandbox/rules-operation-reader.d.ts.map +1 -1
- package/dist/firestore/sandbox/rules-operation-reader.js +13 -5
- package/dist/firestore/sandbox/rules-operation-reader.js.map +1 -1
- package/dist/firestore/sandbox/rules-read-engine.d.ts +8 -1
- package/dist/firestore/sandbox/rules-read-engine.d.ts.map +1 -1
- package/dist/firestore/sandbox/rules-read-engine.js +21 -10
- package/dist/firestore/sandbox/rules-read-engine.js.map +1 -1
- package/dist/firestore/sandbox/rules-state.d.ts +5 -0
- package/dist/firestore/sandbox/rules-state.d.ts.map +1 -1
- package/dist/firestore/sandbox/rules-state.js +16 -0
- package/dist/firestore/sandbox/rules-state.js.map +1 -1
- package/dist/firestore/sandbox/snapshot-listeners.d.ts +9 -1
- package/dist/firestore/sandbox/snapshot-listeners.d.ts.map +1 -1
- package/dist/firestore/sandbox/snapshot-listeners.js.map +1 -1
- package/dist/firestore/sandbox/transaction-merge.d.ts +2 -33
- package/dist/firestore/sandbox/transaction-merge.d.ts.map +1 -1
- package/dist/firestore/sandbox/transaction-merge.js +19 -7
- package/dist/firestore/sandbox/transaction-merge.js.map +1 -1
- package/dist/firestore/sandbox/transaction-types.d.ts +11 -21
- package/dist/firestore/sandbox/transaction-types.d.ts.map +1 -1
- package/dist/firestore/sandbox/transaction-types.js.map +1 -1
- package/dist/firestore/sandbox/transaction-write-executor.d.ts +2 -1
- package/dist/firestore/sandbox/transaction-write-executor.d.ts.map +1 -1
- package/dist/firestore/sandbox/transaction-write-executor.js +110 -69
- package/dist/firestore/sandbox/transaction-write-executor.js.map +1 -1
- package/dist/firestore/sandbox/transaction.d.ts +3 -2
- package/dist/firestore/sandbox/transaction.d.ts.map +1 -1
- package/dist/firestore/sandbox/transaction.js +23 -6
- package/dist/firestore/sandbox/transaction.js.map +1 -1
- package/dist/firestore/sandbox/value-resolver.d.ts +1 -8
- package/dist/firestore/sandbox/value-resolver.d.ts.map +1 -1
- package/dist/firestore/sandbox/value-resolver.js +2 -13
- package/dist/firestore/sandbox/value-resolver.js.map +1 -1
- package/dist/firestore/sandbox/write-engine.d.ts +5 -1
- package/dist/firestore/sandbox/write-engine.d.ts.map +1 -1
- package/dist/firestore/sandbox/write-engine.js +14 -7
- package/dist/firestore/sandbox/write-engine.js.map +1 -1
- package/dist/firestore/sandbox/write-runtime.d.ts +12 -4
- package/dist/firestore/sandbox/write-runtime.d.ts.map +1 -1
- package/dist/firestore/sandbox/write-runtime.js +72 -38
- package/dist/firestore/sandbox/write-runtime.js.map +1 -1
- package/dist/firestore/sandbox/writes.d.ts +3 -1
- package/dist/firestore/sandbox/writes.d.ts.map +1 -1
- package/dist/firestore/sdk-activity.d.ts +8 -0
- package/dist/firestore/sdk-activity.d.ts.map +1 -0
- package/dist/firestore/sdk-activity.js +23 -0
- package/dist/firestore/sdk-activity.js.map +1 -0
- package/dist/firestore/snapshots.d.ts +18 -2
- package/dist/firestore/snapshots.d.ts.map +1 -1
- package/dist/firestore/snapshots.js +69 -16
- package/dist/firestore/snapshots.js.map +1 -1
- package/dist/firestore/state.d.ts +8 -3
- package/dist/firestore/state.d.ts.map +1 -1
- package/dist/firestore/state.js +30 -13
- package/dist/firestore/state.js.map +1 -1
- package/dist/firestore/timestamp.d.ts +28 -0
- package/dist/firestore/timestamp.d.ts.map +1 -0
- package/dist/firestore/timestamp.js +80 -0
- package/dist/firestore/timestamp.js.map +1 -0
- package/dist/firestore/tools.d.ts.map +1 -1
- package/dist/firestore/tools.js +2 -4
- package/dist/firestore/tools.js.map +1 -1
- package/dist/firestore/transactions.d.ts.map +1 -1
- package/dist/firestore/transactions.js +76 -3
- package/dist/firestore/transactions.js.map +1 -1
- package/dist/firestore/types.d.ts +26 -5
- package/dist/firestore/types.d.ts.map +1 -1
- package/dist/firestore/types.js.map +1 -1
- package/dist/firestore/vector-value.d.ts +11 -0
- package/dist/firestore/vector-value.d.ts.map +1 -0
- package/dist/firestore/vector-value.js +51 -0
- package/dist/firestore/vector-value.js.map +1 -0
- package/dist/firestore/writes.d.ts +0 -7
- package/dist/firestore/writes.d.ts.map +1 -1
- package/dist/firestore/writes.js +42 -25
- package/dist/firestore/writes.js.map +1 -1
- package/dist/functions/events.d.ts +12 -0
- package/dist/functions/events.d.ts.map +1 -0
- package/dist/functions/events.js +10 -0
- package/dist/functions/events.js.map +1 -0
- package/dist/messaging/broker/broker.d.ts +43 -30
- package/dist/messaging/broker/broker.d.ts.map +1 -1
- package/dist/messaging/broker/broker.js +148 -43
- package/dist/messaging/broker/broker.js.map +1 -1
- package/dist/messaging/broker/delivery-history.d.ts +5 -0
- package/dist/messaging/broker/delivery-history.d.ts.map +1 -0
- package/dist/messaging/broker/delivery-history.js +46 -0
- package/dist/messaging/broker/delivery-history.js.map +1 -0
- package/dist/messaging/broker/index.d.ts +2 -1
- package/dist/messaging/broker/index.d.ts.map +1 -1
- package/dist/messaging/broker/index.js +7 -0
- package/dist/messaging/broker/index.js.map +1 -1
- package/dist/messaging/broker/persistence.d.ts +12 -0
- package/dist/messaging/broker/persistence.d.ts.map +1 -0
- package/dist/messaging/broker/persistence.js +42 -0
- package/dist/messaging/broker/persistence.js.map +1 -0
- package/dist/messaging/broker/types.d.ts +44 -0
- package/dist/messaging/broker/types.d.ts.map +1 -1
- package/dist/messaging/broker/types.js +10 -1
- package/dist/messaging/broker/types.js.map +1 -1
- package/dist/messaging/events.d.ts +12 -0
- package/dist/messaging/events.d.ts.map +1 -0
- package/dist/messaging/events.js +19 -0
- package/dist/messaging/events.js.map +1 -0
- package/dist/rules/api/case-types.d.ts +7 -0
- package/dist/rules/api/case-types.d.ts.map +1 -1
- package/dist/rules/api/rtdb.d.ts.map +1 -1
- package/dist/rules/api/rtdb.js +20 -7
- package/dist/rules/api/rtdb.js.map +1 -1
- package/dist/rules/grammar/parse-error-wording.d.ts +31 -0
- package/dist/rules/grammar/parse-error-wording.d.ts.map +1 -0
- package/dist/rules/grammar/parse-error-wording.js +86 -0
- package/dist/rules/grammar/parse-error-wording.js.map +1 -0
- package/dist/rules/indexes/query-analysis.d.ts +33 -0
- package/dist/rules/indexes/query-analysis.d.ts.map +1 -0
- package/dist/rules/indexes/query-analysis.js +153 -0
- package/dist/rules/indexes/query-analysis.js.map +1 -0
- package/dist/rules/indexes/service-query.d.ts +48 -0
- package/dist/rules/indexes/service-query.d.ts.map +1 -0
- package/dist/rules/indexes/service-query.js +60 -0
- package/dist/rules/indexes/service-query.js.map +1 -0
- package/dist/rules/internal/index.d.ts +4 -0
- package/dist/rules/internal/index.d.ts.map +1 -1
- package/dist/rules/internal/index.js +10 -0
- package/dist/rules/internal/index.js.map +1 -1
- package/dist/rules/modules/rules-capabilities.generated.d.ts +1 -1
- package/dist/rules/modules/rules-capabilities.generated.js +1 -1
- package/dist/rules/modules/rules-capabilities.generated.js.map +1 -1
- package/dist/rules/rtdb/constraints/atoms.d.ts.map +1 -1
- package/dist/rules/rtdb/constraints/atoms.js +7 -7
- package/dist/rules/rtdb/constraints/atoms.js.map +1 -1
- package/dist/rules/rtdb/constraints/data.d.ts +2 -2
- package/dist/rules/rtdb/constraints/data.d.ts.map +1 -1
- package/dist/rules/rtdb/constraints/data.js +4 -4
- package/dist/rules/rtdb/constraints/data.js.map +1 -1
- package/dist/rules/rtdb/constraints/document.d.ts.map +1 -1
- package/dist/rules/rtdb/constraints/document.js +6 -2
- package/dist/rules/rtdb/constraints/document.js.map +1 -1
- package/dist/rules/rtdb/constraints/policies.d.ts +2 -2
- package/dist/rules/rtdb/constraints/policies.d.ts.map +1 -1
- package/dist/rules/rtdb/constraints/policies.js +3 -3
- package/dist/rules/rtdb/constraints/policies.js.map +1 -1
- package/dist/rules/rtdb/constraints/schema.js +3 -3
- package/dist/rules/rtdb/constraints/schema.js.map +1 -1
- package/dist/rules/rtdb/grammar/RtdbExpr.ohm +1 -3
- package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.d.ts +1 -1
- package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.d.ts.map +1 -1
- package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.js +1 -3
- package/dist/rules/rtdb/grammar/RtdbExpr.ohm.generated.js.map +1 -1
- package/dist/rules/rtdb/grammar/linter.d.ts.map +1 -1
- package/dist/rules/rtdb/grammar/linter.js +28 -30
- package/dist/rules/rtdb/grammar/linter.js.map +1 -1
- package/dist/rules/rtdb/grammar/simulator.d.ts +15 -1
- package/dist/rules/rtdb/grammar/simulator.d.ts.map +1 -1
- package/dist/rules/rtdb/grammar/simulator.js +93 -65
- package/dist/rules/rtdb/grammar/simulator.js.map +1 -1
- package/dist/rules/rtdb/grammar/validator.d.ts.map +1 -1
- package/dist/rules/rtdb/grammar/validator.js +25 -26
- package/dist/rules/rtdb/grammar/validator.js.map +1 -1
- package/dist/rules/rtdb/simulation/handler.d.ts.map +1 -1
- package/dist/rules/rtdb/simulation/handler.js +136 -32
- package/dist/rules/rtdb/simulation/handler.js.map +1 -1
- package/dist/rules/rtdb/simulation/spec.d.ts +95 -5
- package/dist/rules/rtdb/simulation/spec.d.ts.map +1 -1
- package/dist/rules/rtdb/simulation/spec.js +22 -1
- package/dist/rules/rtdb/simulation/spec.js.map +1 -1
- package/dist/rules/rtdb/types.d.ts +18 -18
- package/dist/rules/simulator/evaluator.js +35 -69
- package/dist/rules/simulator/evaluator.js.map +1 -1
- package/dist/rules/simulator/handler.d.ts.map +1 -1
- package/dist/rules/simulator/handler.js +12 -3
- package/dist/rules/simulator/handler.js.map +1 -1
- package/dist/rules/simulator/mapdiff.d.ts +2 -0
- package/dist/rules/simulator/mapdiff.d.ts.map +1 -1
- package/dist/rules/simulator/mapdiff.js +7 -5
- package/dist/rules/simulator/mapdiff.js.map +1 -1
- package/dist/rules/simulator/query-proof-residual.d.ts +11 -0
- package/dist/rules/simulator/query-proof-residual.d.ts.map +1 -0
- package/dist/rules/simulator/query-proof-residual.js +177 -0
- package/dist/rules/simulator/query-proof-residual.js.map +1 -0
- package/dist/rules/simulator/query-proof.d.ts +21 -47
- package/dist/rules/simulator/query-proof.d.ts.map +1 -1
- package/dist/rules/simulator/query-proof.js +78 -13
- package/dist/rules/simulator/query-proof.js.map +1 -1
- package/dist/rules/simulator/request-path.d.ts +26 -0
- package/dist/rules/simulator/request-path.d.ts.map +1 -0
- package/dist/rules/simulator/request-path.js +36 -0
- package/dist/rules/simulator/request-path.js.map +1 -0
- package/dist/rules/simulator/trace-recorder.d.ts +1 -0
- package/dist/rules/simulator/trace-recorder.d.ts.map +1 -1
- package/dist/rules/simulator/trace-recorder.js +4 -0
- package/dist/rules/simulator/trace-recorder.js.map +1 -1
- package/dist/rules/simulator/wrappers/timestamp.d.ts +6 -0
- package/dist/rules/simulator/wrappers/timestamp.d.ts.map +1 -1
- package/dist/rules/simulator/wrappers/timestamp.js +8 -1
- package/dist/rules/simulator/wrappers/timestamp.js.map +1 -1
- package/dist/rules/simulator-tools-impl.d.ts.map +1 -1
- package/dist/rules/simulator-tools-impl.js +6 -3
- package/dist/rules/simulator-tools-impl.js.map +1 -1
- package/dist/rules/stdlib-tools.js +4 -4
- package/dist/rules/stdlib-tools.js.map +1 -1
- package/dist/rules/test/spec.d.ts +4 -4
- package/dist/sandbox/active-listeners.d.ts +69 -0
- package/dist/sandbox/active-listeners.d.ts.map +1 -0
- package/dist/sandbox/active-listeners.js +159 -0
- package/dist/sandbox/active-listeners.js.map +1 -0
- package/dist/sandbox/admin-firestore/error-translation.d.ts.map +1 -1
- package/dist/sandbox/admin-firestore/error-translation.js +15 -2
- package/dist/sandbox/admin-firestore/error-translation.js.map +1 -1
- package/dist/sandbox/admin-firestore/listeners.d.ts +0 -25
- package/dist/sandbox/admin-firestore/listeners.d.ts.map +1 -1
- package/dist/sandbox/admin-firestore/listeners.js +26 -2
- package/dist/sandbox/admin-firestore/listeners.js.map +1 -1
- package/dist/sandbox/admin-firestore/remote/listeners.d.ts.map +1 -1
- package/dist/sandbox/admin-firestore/remote/listeners.js +50 -29
- package/dist/sandbox/admin-firestore/remote/listeners.js.map +1 -1
- package/dist/sandbox/admin-firestore/remote/value-codec.d.ts +5 -12
- package/dist/sandbox/admin-firestore/remote/value-codec.d.ts.map +1 -1
- package/dist/sandbox/admin-firestore/remote/value-codec.js +7 -14
- package/dist/sandbox/admin-firestore/remote/value-codec.js.map +1 -1
- package/dist/sandbox/admin-firestore/remote/wire-types.d.ts +2 -0
- package/dist/sandbox/admin-firestore/remote/wire-types.d.ts.map +1 -1
- package/dist/sandbox/attribution/attribution-mode.d.ts +36 -0
- package/dist/sandbox/attribution/attribution-mode.d.ts.map +1 -0
- package/dist/sandbox/attribution/attribution-mode.js +68 -0
- package/dist/sandbox/attribution/attribution-mode.js.map +1 -0
- package/dist/sandbox/attribution/effect-regions.d.ts +37 -0
- package/dist/sandbox/attribution/effect-regions.d.ts.map +1 -0
- package/dist/sandbox/attribution/effect-regions.js +114 -0
- package/dist/sandbox/attribution/effect-regions.js.map +1 -0
- package/dist/sandbox/attribution/element-selector.d.ts +42 -0
- package/dist/sandbox/attribution/element-selector.d.ts.map +1 -0
- package/dist/sandbox/attribution/element-selector.js +109 -0
- package/dist/sandbox/attribution/element-selector.js.map +1 -0
- package/dist/sandbox/attribution/listener-owners.d.ts +111 -0
- package/dist/sandbox/attribution/listener-owners.d.ts.map +1 -0
- package/dist/sandbox/attribution/listener-owners.js +215 -0
- package/dist/sandbox/attribution/listener-owners.js.map +1 -0
- package/dist/sandbox/branches/engine.d.ts +129 -0
- package/dist/sandbox/branches/engine.d.ts.map +1 -0
- package/dist/sandbox/branches/engine.js +280 -0
- package/dist/sandbox/branches/engine.js.map +1 -0
- package/dist/sandbox/branches/index.d.ts +12 -139
- package/dist/sandbox/branches/index.d.ts.map +1 -1
- package/dist/sandbox/branches/index.js +8 -390
- package/dist/sandbox/branches/index.js.map +1 -1
- package/dist/sandbox/branches/promotion.d.ts +27 -0
- package/dist/sandbox/branches/promotion.d.ts.map +1 -0
- package/dist/sandbox/branches/promotion.js +160 -0
- package/dist/sandbox/branches/promotion.js.map +1 -0
- package/dist/sandbox/branches/state-diff.d.ts +66 -0
- package/dist/sandbox/branches/state-diff.d.ts.map +1 -0
- package/dist/sandbox/branches/state-diff.js +270 -0
- package/dist/sandbox/branches/state-diff.js.map +1 -0
- package/dist/sandbox/branches/store.d.ts +64 -0
- package/dist/sandbox/branches/store.d.ts.map +1 -0
- package/dist/sandbox/branches/store.js +264 -0
- package/dist/sandbox/branches/store.js.map +1 -0
- package/dist/sandbox/checkpoints/capture.d.ts +39 -0
- package/dist/sandbox/checkpoints/capture.d.ts.map +1 -0
- package/dist/sandbox/checkpoints/capture.js +69 -0
- package/dist/sandbox/checkpoints/capture.js.map +1 -0
- package/dist/sandbox/checkpoints/directory-backend.d.ts +30 -0
- package/dist/sandbox/checkpoints/directory-backend.d.ts.map +1 -0
- package/dist/sandbox/checkpoints/directory-backend.js +98 -0
- package/dist/sandbox/checkpoints/directory-backend.js.map +1 -0
- package/dist/sandbox/checkpoints/index.d.ts +15 -0
- package/dist/sandbox/checkpoints/index.d.ts.map +1 -0
- package/dist/sandbox/checkpoints/index.js +13 -0
- package/dist/sandbox/checkpoints/index.js.map +1 -0
- package/dist/sandbox/checkpoints/record-backend.d.ts +25 -0
- package/dist/sandbox/checkpoints/record-backend.d.ts.map +1 -0
- package/dist/sandbox/checkpoints/record-backend.js +81 -0
- package/dist/sandbox/checkpoints/record-backend.js.map +1 -0
- package/dist/sandbox/checkpoints/saved-states.d.ts +35 -0
- package/dist/sandbox/checkpoints/saved-states.d.ts.map +1 -0
- package/dist/sandbox/checkpoints/saved-states.js +47 -0
- package/dist/sandbox/checkpoints/saved-states.js.map +1 -0
- package/dist/sandbox/checkpoints/types.d.ts +84 -0
- package/dist/sandbox/checkpoints/types.d.ts.map +1 -0
- package/dist/sandbox/checkpoints/types.js +51 -0
- package/dist/sandbox/checkpoints/types.js.map +1 -0
- package/dist/sandbox/checkpoints/validation.d.ts +3 -0
- package/dist/sandbox/checkpoints/validation.d.ts.map +1 -0
- package/dist/sandbox/checkpoints/validation.js +99 -0
- package/dist/sandbox/checkpoints/validation.js.map +1 -0
- package/dist/sandbox/clock.d.ts +121 -0
- package/dist/sandbox/clock.d.ts.map +1 -0
- package/dist/sandbox/clock.js +167 -0
- package/dist/sandbox/clock.js.map +1 -0
- package/dist/sandbox/full-state.d.ts +160 -0
- package/dist/sandbox/full-state.d.ts.map +1 -0
- package/dist/sandbox/full-state.js +267 -0
- package/dist/sandbox/full-state.js.map +1 -0
- package/dist/sandbox/index.d.ts +13 -6
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +23 -9
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/internal/ai-evidence.d.ts +27 -0
- package/dist/sandbox/internal/ai-evidence.d.ts.map +1 -0
- package/dist/sandbox/internal/ai-evidence.js +29 -0
- package/dist/sandbox/internal/ai-evidence.js.map +1 -0
- package/dist/sandbox/internal/event-history.d.ts +32 -0
- package/dist/sandbox/internal/event-history.d.ts.map +1 -0
- package/dist/sandbox/internal/event-history.js +199 -0
- package/dist/sandbox/internal/event-history.js.map +1 -0
- package/dist/sandbox/internal/history-integrity.d.ts +3 -0
- package/dist/sandbox/internal/history-integrity.d.ts.map +1 -0
- package/dist/sandbox/internal/history-integrity.js +12 -0
- package/dist/sandbox/internal/history-integrity.js.map +1 -0
- package/dist/sandbox/internal/history-retention.d.ts +6 -0
- package/dist/sandbox/internal/history-retention.d.ts.map +1 -0
- package/dist/sandbox/internal/history-retention.js +12 -0
- package/dist/sandbox/internal/history-retention.js.map +1 -0
- package/dist/sandbox/internal/index.d.ts +27 -0
- package/dist/sandbox/internal/index.d.ts.map +1 -1
- package/dist/sandbox/internal/index.js +26 -0
- package/dist/sandbox/internal/index.js.map +1 -1
- package/dist/sandbox/internal/observation-history.d.ts +6 -0
- package/dist/sandbox/internal/observation-history.d.ts.map +1 -0
- package/dist/sandbox/internal/observation-history.js +6 -0
- package/dist/sandbox/internal/observation-history.js.map +1 -0
- package/dist/sandbox/internal/observation-payload.d.ts +6 -0
- package/dist/sandbox/internal/observation-payload.d.ts.map +1 -0
- package/dist/sandbox/internal/observation-payload.js +24 -0
- package/dist/sandbox/internal/observation-payload.js.map +1 -0
- package/dist/sandbox/internal/provenance.d.ts +0 -1
- package/dist/sandbox/internal/provenance.d.ts.map +1 -1
- package/dist/sandbox/internal/provenance.js +6 -0
- package/dist/sandbox/internal/provenance.js.map +1 -1
- package/dist/sandbox/internal/root.d.ts +2 -1
- package/dist/sandbox/internal/root.d.ts.map +1 -1
- package/dist/sandbox/internal/root.js +2 -2
- package/dist/sandbox/internal/root.js.map +1 -1
- package/dist/sandbox/internal/rules-evidence-retention.d.ts +11 -0
- package/dist/sandbox/internal/rules-evidence-retention.d.ts.map +1 -0
- package/dist/sandbox/internal/rules-evidence-retention.js +27 -0
- package/dist/sandbox/internal/rules-evidence-retention.js.map +1 -0
- package/dist/sandbox/internal/sandbox-impl.d.ts +40 -33
- package/dist/sandbox/internal/sandbox-impl.d.ts.map +1 -1
- package/dist/sandbox/internal/sandbox-impl.js +83 -40
- package/dist/sandbox/internal/sandbox-impl.js.map +1 -1
- package/dist/sandbox/internal/sdk-activity.d.ts +112 -0
- package/dist/sandbox/internal/sdk-activity.d.ts.map +1 -0
- package/dist/sandbox/internal/sdk-activity.js +240 -0
- package/dist/sandbox/internal/sdk-activity.js.map +1 -0
- package/dist/sandbox/internal/sdk-coverage.d.ts +10 -0
- package/dist/sandbox/internal/sdk-coverage.d.ts.map +1 -0
- package/dist/sandbox/internal/sdk-coverage.js +21 -0
- package/dist/sandbox/internal/sdk-coverage.js.map +1 -0
- package/dist/sandbox/internal/sdk-observation.d.ts +32 -0
- package/dist/sandbox/internal/sdk-observation.d.ts.map +1 -0
- package/dist/sandbox/internal/sdk-observation.js +29 -0
- package/dist/sandbox/internal/sdk-observation.js.map +1 -0
- package/dist/sandbox/internal/sdk-rates.d.ts +97 -0
- package/dist/sandbox/internal/sdk-rates.d.ts.map +1 -0
- package/dist/sandbox/internal/sdk-rates.js +187 -0
- package/dist/sandbox/internal/sdk-rates.js.map +1 -0
- package/dist/sandbox/internal/sdk-write-activity.d.ts +5 -0
- package/dist/sandbox/internal/sdk-write-activity.d.ts.map +1 -0
- package/dist/sandbox/internal/sdk-write-activity.js +13 -0
- package/dist/sandbox/internal/sdk-write-activity.js.map +1 -0
- package/dist/sandbox/internal/state-schemas.d.ts +120 -0
- package/dist/sandbox/internal/state-schemas.d.ts.map +1 -0
- package/dist/sandbox/internal/state-schemas.js +42 -0
- package/dist/sandbox/internal/state-schemas.js.map +1 -0
- package/dist/sandbox/internal/state-values.d.ts +6 -0
- package/dist/sandbox/internal/state-values.d.ts.map +1 -0
- package/dist/sandbox/internal/state-values.js +15 -0
- package/dist/sandbox/internal/state-values.js.map +1 -0
- package/dist/sandbox/internal/storage-activity.d.ts +13 -0
- package/dist/sandbox/internal/storage-activity.d.ts.map +1 -0
- package/dist/sandbox/internal/storage-activity.js +48 -0
- package/dist/sandbox/internal/storage-activity.js.map +1 -0
- package/dist/sandbox/internal/usage-evidence.d.ts +24 -0
- package/dist/sandbox/internal/usage-evidence.d.ts.map +1 -0
- package/dist/sandbox/internal/usage-evidence.js +56 -0
- package/dist/sandbox/internal/usage-evidence.js.map +1 -0
- package/dist/sandbox/operation-record.d.ts +20 -1
- package/dist/sandbox/operation-record.d.ts.map +1 -1
- package/dist/sandbox/operation-record.js +100 -4
- package/dist/sandbox/operation-record.js.map +1 -1
- package/dist/sandbox/persistence/changed-buckets.d.ts +19 -0
- package/dist/sandbox/persistence/changed-buckets.d.ts.map +1 -0
- package/dist/sandbox/persistence/changed-buckets.js +72 -0
- package/dist/sandbox/persistence/changed-buckets.js.map +1 -0
- package/dist/sandbox/persistence/chunk-format.d.ts +27 -1
- package/dist/sandbox/persistence/chunk-format.d.ts.map +1 -1
- package/dist/sandbox/persistence/chunk-format.js +37 -25
- package/dist/sandbox/persistence/chunk-format.js.map +1 -1
- package/dist/sandbox/persistence/controller.d.ts.map +1 -1
- package/dist/sandbox/persistence/controller.js +91 -36
- package/dist/sandbox/persistence/controller.js.map +1 -1
- package/dist/sandbox/persistence/import-bundle.d.ts +8 -0
- package/dist/sandbox/persistence/import-bundle.d.ts.map +1 -0
- package/dist/sandbox/persistence/import-bundle.js +66 -0
- package/dist/sandbox/persistence/import-bundle.js.map +1 -0
- package/dist/sandbox/persistence/serialize.d.ts +1 -1
- package/dist/sandbox/persistence/serialize.d.ts.map +1 -1
- package/dist/sandbox/persistence/serialize.js +16 -11
- package/dist/sandbox/persistence/serialize.js.map +1 -1
- package/dist/sandbox/persistence/types.d.ts +4 -0
- package/dist/sandbox/persistence/types.d.ts.map +1 -1
- package/dist/sandbox/persistence/validate-services.d.ts +7 -0
- package/dist/sandbox/persistence/validate-services.d.ts.map +1 -0
- package/dist/sandbox/persistence/validate-services.js +73 -0
- package/dist/sandbox/persistence/validate-services.js.map +1 -0
- package/dist/sandbox/remote.d.ts +6 -0
- package/dist/sandbox/remote.d.ts.map +1 -1
- package/dist/sandbox/remote.js.map +1 -1
- package/dist/sandbox/replay/index.d.ts +1 -1
- package/dist/sandbox/replay/index.d.ts.map +1 -1
- package/dist/sandbox/replay/index.js +18 -8
- package/dist/sandbox/replay/index.js.map +1 -1
- package/dist/sandbox/types/errors.d.ts +3 -1
- package/dist/sandbox/types/errors.d.ts.map +1 -1
- package/dist/sandbox/types/errors.js +0 -4
- package/dist/sandbox/types/errors.js.map +1 -1
- package/dist/sandbox/types/events.d.ts +105 -76
- package/dist/sandbox/types/events.d.ts.map +1 -1
- package/dist/sandbox/types/events.js +0 -5
- package/dist/sandbox/types/events.js.map +1 -1
- package/dist/sandbox/types/index.d.ts +2 -1
- package/dist/sandbox/types/index.d.ts.map +1 -1
- package/dist/sandbox/types/index.js +1 -0
- package/dist/sandbox/types/index.js.map +1 -1
- package/dist/sandbox/types/operation.d.ts +13 -4
- package/dist/sandbox/types/operation.d.ts.map +1 -1
- package/dist/sandbox/types/persistence.d.ts +2 -2
- package/dist/sandbox/types/query-proof.d.ts +25 -0
- package/dist/sandbox/types/query-proof.d.ts.map +1 -0
- package/dist/sandbox/types/query-proof.js +2 -0
- package/dist/sandbox/types/query-proof.js.map +1 -0
- package/dist/sandbox/types/request-observation.d.ts +19 -0
- package/dist/sandbox/types/request-observation.d.ts.map +1 -0
- package/dist/sandbox/types/request-observation.js +13 -0
- package/dist/sandbox/types/request-observation.js.map +1 -0
- package/dist/sandbox/types/rules-evidence.d.ts +48 -0
- package/dist/sandbox/types/rules-evidence.d.ts.map +1 -0
- package/dist/sandbox/types/rules-evidence.js +2 -0
- package/dist/sandbox/types/rules-evidence.js.map +1 -0
- package/dist/sandbox/types/service-event-record.d.ts +30 -0
- package/dist/sandbox/types/service-event-record.d.ts.map +1 -0
- package/dist/sandbox/types/service-event-record.js +13 -0
- package/dist/sandbox/types/service-event-record.js.map +1 -0
- package/dist/sandbox/types/service-event-records.d.ts +64 -0
- package/dist/sandbox/types/service-event-records.d.ts.map +1 -0
- package/dist/sandbox/types/service-event-records.js +31 -0
- package/dist/sandbox/types/service-event-records.js.map +1 -0
- package/dist/sandbox/types/service-mutation-event.d.ts +88 -0
- package/dist/sandbox/types/service-mutation-event.d.ts.map +1 -0
- package/dist/sandbox/types/service-mutation-event.js +2 -0
- package/dist/sandbox/types/service-mutation-event.js.map +1 -0
- package/dist/storage/activity-coverage.d.ts +9 -0
- package/dist/storage/activity-coverage.d.ts.map +1 -0
- package/dist/storage/activity-coverage.js +9 -0
- package/dist/storage/activity-coverage.js.map +1 -0
- package/dist/storage/base64.d.ts +14 -0
- package/dist/storage/base64.d.ts.map +1 -0
- package/dist/storage/base64.js +34 -0
- package/dist/storage/base64.js.map +1 -0
- package/dist/storage/download.d.ts +12 -4
- package/dist/storage/download.d.ts.map +1 -1
- package/dist/storage/download.js +19 -6
- package/dist/storage/download.js.map +1 -1
- package/dist/storage/enforce.d.ts +13 -2
- package/dist/storage/enforce.d.ts.map +1 -1
- package/dist/storage/enforce.js +21 -3
- package/dist/storage/enforce.js.map +1 -1
- package/dist/storage/errors.d.ts +29 -5
- package/dist/storage/errors.d.ts.map +1 -1
- package/dist/storage/errors.js +28 -0
- package/dist/storage/errors.js.map +1 -1
- package/dist/storage/events.d.ts +12 -0
- package/dist/storage/events.d.ts.map +1 -0
- package/dist/storage/events.js +10 -0
- package/dist/storage/events.js.map +1 -0
- package/dist/storage/index.d.ts +7 -7
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +7 -5
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +10 -1
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +9 -1
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/metadata.d.ts +19 -0
- package/dist/storage/metadata.d.ts.map +1 -1
- package/dist/storage/metadata.js +50 -19
- package/dist/storage/metadata.js.map +1 -1
- package/dist/storage/observed.d.ts +16 -0
- package/dist/storage/observed.d.ts.map +1 -0
- package/dist/storage/observed.js +17 -0
- package/dist/storage/observed.js.map +1 -0
- package/dist/storage/persistence.d.ts +157 -20
- package/dist/storage/persistence.d.ts.map +1 -1
- package/dist/storage/persistence.js +423 -53
- package/dist/storage/persistence.js.map +1 -1
- package/dist/storage/reference.d.ts +3 -1
- package/dist/storage/reference.d.ts.map +1 -1
- package/dist/storage/reference.js +3 -2
- package/dist/storage/reference.js.map +1 -1
- package/dist/storage/remote-bytes.d.ts +44 -0
- package/dist/storage/remote-bytes.d.ts.map +1 -0
- package/dist/storage/remote-bytes.js +97 -0
- package/dist/storage/remote-bytes.js.map +1 -0
- package/dist/storage/resumable.d.ts.map +1 -1
- package/dist/storage/resumable.js +16 -0
- package/dist/storage/resumable.js.map +1 -1
- package/dist/storage/rules-resolution.d.ts +13 -1
- package/dist/storage/rules-resolution.d.ts.map +1 -1
- package/dist/storage/rules-resolution.js +28 -0
- package/dist/storage/rules-resolution.js.map +1 -1
- package/dist/storage/sandbox/persistence-state.d.ts +25 -0
- package/dist/storage/sandbox/persistence-state.d.ts.map +1 -0
- package/dist/storage/sandbox/persistence-state.js +53 -0
- package/dist/storage/sandbox/persistence-state.js.map +1 -0
- package/dist/storage/sandbox/rules-bindings.d.ts +15 -0
- package/dist/storage/sandbox/rules-bindings.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-bindings.js +69 -0
- package/dist/storage/sandbox/rules-bindings.js.map +1 -0
- package/dist/storage/sandbox/rules-collection-methods.d.ts +3 -0
- package/dist/storage/sandbox/rules-collection-methods.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-collection-methods.js +149 -0
- package/dist/storage/sandbox/rules-collection-methods.js.map +1 -0
- package/dist/storage/sandbox/rules-evaluator.d.ts +2 -2
- package/dist/storage/sandbox/rules-evaluator.d.ts.map +1 -1
- package/dist/storage/sandbox/rules-evaluator.js +51 -129
- package/dist/storage/sandbox/rules-evaluator.js.map +1 -1
- package/dist/storage/sandbox/rules-firestore-lookup.d.ts +25 -0
- package/dist/storage/sandbox/rules-firestore-lookup.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-firestore-lookup.js +94 -0
- package/dist/storage/sandbox/rules-firestore-lookup.js.map +1 -0
- package/dist/storage/sandbox/rules-hashing-methods.d.ts +16 -0
- package/dist/storage/sandbox/rules-hashing-methods.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-hashing-methods.js +41 -0
- package/dist/storage/sandbox/rules-hashing-methods.js.map +1 -0
- package/dist/storage/sandbox/rules-method-calls.d.ts +40 -0
- package/dist/storage/sandbox/rules-method-calls.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-method-calls.js +47 -0
- package/dist/storage/sandbox/rules-method-calls.js.map +1 -0
- package/dist/storage/sandbox/rules-methods.d.ts +11 -12
- package/dist/storage/sandbox/rules-methods.d.ts.map +1 -1
- package/dist/storage/sandbox/rules-methods.js +62 -359
- package/dist/storage/sandbox/rules-methods.js.map +1 -1
- package/dist/storage/sandbox/rules-operators.d.ts +32 -0
- package/dist/storage/sandbox/rules-operators.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-operators.js +85 -0
- package/dist/storage/sandbox/rules-operators.js.map +1 -0
- package/dist/storage/sandbox/rules-string-methods.d.ts +3 -0
- package/dist/storage/sandbox/rules-string-methods.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-string-methods.js +199 -0
- package/dist/storage/sandbox/rules-string-methods.js.map +1 -0
- package/dist/storage/sandbox/rules-time-methods.d.ts +25 -0
- package/dist/storage/sandbox/rules-time-methods.d.ts.map +1 -0
- package/dist/storage/sandbox/rules-time-methods.js +89 -0
- package/dist/storage/sandbox/rules-time-methods.js.map +1 -0
- package/dist/storage/sandbox/rules-values.d.ts +6 -0
- package/dist/storage/sandbox/rules-values.d.ts.map +1 -1
- package/dist/storage/sandbox/rules-values.js +29 -2
- package/dist/storage/sandbox/rules-values.js.map +1 -1
- package/dist/storage/sandbox/rules.d.ts +25 -13
- package/dist/storage/sandbox/rules.d.ts.map +1 -1
- package/dist/storage/sandbox/rules.js +19 -10
- package/dist/storage/sandbox/rules.js.map +1 -1
- package/dist/storage/sandbox/running-service.d.ts +65 -0
- package/dist/storage/sandbox/running-service.d.ts.map +1 -0
- package/dist/storage/sandbox/running-service.js +30 -0
- package/dist/storage/sandbox/running-service.js.map +1 -0
- package/dist/storage/service.d.ts +46 -28
- package/dist/storage/service.d.ts.map +1 -1
- package/dist/storage/service.js +169 -57
- package/dist/storage/service.js.map +1 -1
- package/dist/storage/string-format.d.ts +9 -0
- package/dist/storage/string-format.d.ts.map +1 -0
- package/dist/storage/string-format.js +8 -0
- package/dist/storage/string-format.js.map +1 -0
- package/dist/storage/upload.d.ts +2 -1
- package/dist/storage/upload.d.ts.map +1 -1
- package/dist/storage/upload.js +6 -2
- package/dist/storage/upload.js.map +1 -1
- package/dist/storage/url.d.ts +18 -0
- package/dist/storage/url.d.ts.map +1 -0
- package/dist/storage/url.js +84 -0
- package/dist/storage/url.js.map +1 -0
- package/package.json +17 -1
- package/src/ai/activity.ts +43 -0
- package/src/ai/broker/broker.ts +59 -6
- package/src/ai/broker/gemini-engine.ts +16 -0
- package/src/ai/broker/index.ts +1 -1
- package/src/ai/broker/openai-engine.ts +6 -3
- package/src/ai/broker/scripted-engine.ts +16 -5
- package/src/ai/broker/types.ts +6 -2
- package/src/ai/events.ts +29 -0
- package/src/ai/generation-enums.ts +48 -0
- package/src/ai/index.ts +9 -0
- package/src/ai/instances.ts +22 -2
- package/src/ai/internal.ts +5 -0
- package/src/ai/sandbox-plane.ts +23 -8
- package/src/ai/scripting.ts +42 -7
- package/src/app/internal.ts +1 -0
- package/src/auth/email-link.ts +32 -21
- package/src/auth/events.ts +29 -0
- package/src/auth/factor-id.ts +7 -0
- package/src/auth/index.ts +2 -0
- package/src/auth/instances.ts +13 -1
- package/src/auth/internal.ts +24 -0
- package/src/auth/modular.ts +27 -0
- package/src/auth/reauth.ts +3 -2
- package/src/auth/sandbox/default-avatar.ts +177 -0
- package/src/auth/sandbox/driver.ts +54 -0
- package/src/auth/sandbox/project-store.ts +0 -2
- package/src/auth/sandbox-backend-types.ts +31 -20
- package/src/auth/sandbox-backend.ts +400 -94
- package/src/auth/seed-user.ts +38 -0
- package/src/auth/tokens.ts +21 -18
- package/src/auth/types.ts +13 -1
- package/src/database/activity-coverage.ts +10 -0
- package/src/database/connection-lifecycle.ts +53 -24
- package/src/database/events.ts +20 -0
- package/src/database/instances.ts +52 -21
- package/src/database/internal/query-projection.ts +333 -0
- package/src/database/internal.ts +2 -0
- package/src/database/listeners.ts +162 -44
- package/src/database/operations.ts +73 -50
- package/src/database/replay.ts +6 -2
- package/src/database/routing.ts +4 -0
- package/src/database/sandbox/backend-for.ts +145 -25
- package/src/database/sandbox/backend-state.ts +15 -1
- package/src/database/sandbox/backend.ts +4 -2
- package/src/database/sandbox/child-listeners.ts +32 -13
- package/src/database/sandbox/listener-types.ts +5 -0
- package/src/database/sandbox/operation-events.ts +23 -9
- package/src/database/sandbox/persistence-state.ts +4 -11
- package/src/database/sandbox/priority-writes.ts +2 -2
- package/src/database/sandbox/query.ts +13 -268
- package/src/database/sandbox/rules-eval.ts +144 -10
- package/src/database/sandbox/transactions.ts +17 -39
- package/src/database/sandbox/value-listeners.ts +66 -23
- package/src/database/sandbox/write-plane.ts +29 -22
- package/src/database/sdk-activity.ts +26 -0
- package/src/database/transactions.ts +15 -11
- package/src/database/types.ts +12 -1
- package/src/deferred/entry.ts +16 -10
- package/src/firestore/activity-coverage.ts +8 -0
- package/src/firestore/aggregates.ts +17 -9
- package/src/firestore/bytes.ts +56 -0
- package/src/firestore/converter-method.ts +49 -0
- package/src/firestore/errors.ts +8 -0
- package/src/firestore/field-values.ts +3 -158
- package/src/firestore/geo-point.ts +56 -0
- package/src/firestore/index.ts +1 -1
- package/src/firestore/instances.ts +23 -2
- package/src/firestore/internal/document-data.ts +9 -0
- package/src/firestore/internal/index.ts +7 -0
- package/src/firestore/internal/value-codec.ts +150 -83
- package/src/firestore/internal/value-depth.ts +19 -0
- package/src/firestore/listeners.ts +60 -18
- package/src/firestore/persistence.ts +14 -9
- package/src/firestore/plain-object.ts +7 -0
- package/src/firestore/query-constraints.ts +4 -8
- package/src/firestore/reads.ts +81 -48
- package/src/firestore/refs.ts +56 -41
- package/src/firestore/sandbox/activity-query-display.ts +138 -0
- package/src/firestore/sandbox/admin-compat/batch.ts +26 -19
- package/src/firestore/sandbox/admin-compat/query-comparison.ts +9 -8
- package/src/firestore/sandbox/admin-compat/query.ts +46 -12
- package/src/firestore/sandbox/admin-compat/read-translation.ts +18 -6
- package/src/firestore/sandbox/admin-compat/transaction.ts +14 -4
- package/src/firestore/sandbox/admin-compat/types.ts +6 -88
- package/src/firestore/sandbox/atomic-state.ts +112 -0
- package/src/firestore/sandbox/atomic-write-pipeline.ts +129 -77
- package/src/firestore/sandbox/batch-write-executor.ts +51 -29
- package/src/firestore/sandbox/converters/user-timestamp.ts +19 -42
- package/src/firestore/sandbox/document-copy.ts +27 -0
- package/src/firestore/sandbox/document-store.ts +108 -0
- package/src/firestore/sandbox/errors.ts +5 -1
- package/src/firestore/sandbox/event-log.ts +72 -7
- package/src/firestore/sandbox/field-merge.ts +10 -19
- package/src/firestore/sandbox/history-controls.ts +1 -1
- package/src/firestore/sandbox/list-query-proof.ts +43 -72
- package/src/firestore/sandbox/listener-dispatch.ts +59 -4
- package/src/firestore/sandbox/local-environment.ts +35 -7
- package/src/firestore/sandbox/local-state.ts +72 -232
- package/src/firestore/sandbox/query-execution.ts +56 -34
- package/src/firestore/sandbox/query-operand-equality.ts +57 -14
- package/src/firestore/sandbox/query-operators.ts +20 -0
- package/src/firestore/sandbox/query-value-registry.ts +3 -2
- package/src/firestore/sandbox/request-events.ts +5 -0
- package/src/firestore/sandbox/rules-evidence.ts +94 -0
- package/src/firestore/sandbox/rules-list-authorizer.ts +62 -107
- package/src/firestore/sandbox/rules-operation-reader.ts +11 -4
- package/src/firestore/sandbox/rules-read-engine.ts +19 -8
- package/src/firestore/sandbox/rules-state.ts +21 -0
- package/src/firestore/sandbox/snapshot-listeners.ts +12 -1
- package/src/firestore/sandbox/transaction-merge.ts +33 -20
- package/src/firestore/sandbox/transaction-types.ts +11 -21
- package/src/firestore/sandbox/transaction-write-executor.ts +103 -69
- package/src/firestore/sandbox/transaction.ts +24 -7
- package/src/firestore/sandbox/value-resolver.ts +2 -13
- package/src/firestore/sandbox/write-engine.ts +13 -5
- package/src/firestore/sandbox/write-runtime.ts +68 -40
- package/src/firestore/sandbox/writes.ts +3 -1
- package/src/firestore/sdk-activity.ts +31 -0
- package/src/firestore/snapshots.ts +84 -18
- package/src/firestore/state.ts +34 -14
- package/src/firestore/timestamp.ts +86 -0
- package/src/firestore/tools.ts +3 -3
- package/src/firestore/transactions.ts +88 -8
- package/src/firestore/types.ts +26 -5
- package/src/firestore/vector-value.ts +54 -0
- package/src/firestore/writes.ts +53 -43
- package/src/functions/events.ts +27 -0
- package/src/messaging/broker/broker.test.ts +114 -0
- package/src/messaging/broker/broker.ts +152 -65
- package/src/messaging/broker/delivery-history.ts +49 -0
- package/src/messaging/broker/index.ts +11 -0
- package/src/messaging/broker/persistence.ts +54 -0
- package/src/messaging/broker/types.ts +50 -0
- package/src/messaging/events.ts +29 -0
- package/src/rules/api/case-types.ts +7 -0
- package/src/rules/api/rtdb.ts +15 -7
- package/src/rules/grammar/parse-error-wording.ts +98 -0
- package/src/rules/indexes/query-analysis.ts +136 -0
- package/src/rules/indexes/service-query.ts +69 -0
- package/src/rules/internal/index.ts +16 -0
- package/src/rules/modules/rules-capabilities.generated.ts +1 -1
- package/src/rules/rtdb/constraints/atoms.spec.ts +7 -7
- package/src/rules/rtdb/constraints/atoms.ts +7 -7
- package/src/rules/rtdb/constraints/data.ts +4 -4
- package/src/rules/rtdb/constraints/document.ts +4 -2
- package/src/rules/rtdb/constraints/game.spec.ts +4 -4
- package/src/rules/rtdb/constraints/policies.spec.ts +5 -5
- package/src/rules/rtdb/constraints/policies.ts +4 -4
- package/src/rules/rtdb/constraints/schema.ts +3 -3
- package/src/rules/rtdb/grammar/RtdbExpr.ohm +1 -3
- package/src/rules/rtdb/grammar/RtdbExpr.ohm.generated.ts +1 -3
- package/src/rules/rtdb/grammar/linter.ts +34 -30
- package/src/rules/rtdb/grammar/simulator.ts +112 -74
- package/src/rules/rtdb/grammar/validator.ts +30 -26
- package/src/rules/rtdb/simulation/handler.ts +139 -36
- package/src/rules/rtdb/simulation/spec.ts +24 -1
- package/src/rules/simulator/evaluator.ts +34 -41
- package/src/rules/simulator/handler.ts +12 -3
- package/src/rules/simulator/mapdiff.ts +7 -5
- package/src/rules/simulator/query-proof-residual.ts +209 -0
- package/src/rules/simulator/query-proof.ts +53 -27
- package/src/rules/simulator/request-path.ts +39 -0
- package/src/rules/simulator/trace-recorder.ts +3 -0
- package/src/rules/simulator/wrappers/timestamp.ts +8 -1
- package/src/rules/simulator-tools-impl.ts +6 -3
- package/src/rules/stdlib-tools.ts +4 -4
- package/src/sandbox/active-listeners.ts +245 -0
- package/src/sandbox/admin-firestore/error-translation.ts +16 -2
- package/src/sandbox/admin-firestore/listeners.ts +26 -1
- package/src/sandbox/admin-firestore/remote/listeners.ts +50 -32
- package/src/sandbox/admin-firestore/remote/value-codec.ts +7 -14
- package/src/sandbox/admin-firestore/remote/wire-types.ts +3 -0
- package/src/sandbox/attribution/attribution-mode.ts +74 -0
- package/src/sandbox/attribution/effect-regions.ts +130 -0
- package/src/sandbox/attribution/element-selector.ts +118 -0
- package/src/sandbox/attribution/listener-owners.ts +277 -0
- package/src/sandbox/branches/engine.ts +362 -0
- package/src/sandbox/branches/index.ts +12 -448
- package/src/sandbox/branches/promotion.ts +207 -0
- package/src/sandbox/branches/state-diff.ts +333 -0
- package/src/sandbox/branches/store.ts +317 -0
- package/src/sandbox/checkpoints/capture.ts +77 -0
- package/src/sandbox/checkpoints/directory-backend.ts +110 -0
- package/src/sandbox/checkpoints/index.ts +32 -0
- package/src/sandbox/checkpoints/record-backend.ts +109 -0
- package/src/sandbox/checkpoints/saved-states.ts +72 -0
- package/src/sandbox/checkpoints/types.ts +115 -0
- package/src/sandbox/checkpoints/validation.ts +102 -0
- package/src/sandbox/clock.ts +205 -0
- package/src/sandbox/full-state.ts +403 -0
- package/src/sandbox/index.ts +53 -10
- package/src/sandbox/internal/ai-evidence.ts +38 -0
- package/src/sandbox/internal/event-history.ts +193 -0
- package/src/sandbox/internal/history-integrity.ts +12 -0
- package/src/sandbox/internal/history-retention.ts +16 -0
- package/src/sandbox/internal/index.ts +65 -0
- package/src/sandbox/internal/observation-history.ts +5 -0
- package/src/sandbox/internal/observation-payload.ts +18 -0
- package/src/sandbox/internal/provenance.ts +5 -0
- package/src/sandbox/internal/root.ts +3 -2
- package/src/sandbox/internal/rules-evidence-retention.ts +28 -0
- package/src/sandbox/internal/sandbox-impl.ts +91 -45
- package/src/sandbox/internal/sdk-activity.ts +291 -0
- package/src/sandbox/internal/sdk-coverage.ts +28 -0
- package/src/sandbox/internal/sdk-observation.ts +62 -0
- package/src/sandbox/internal/sdk-rates.ts +240 -0
- package/src/sandbox/internal/sdk-write-activity.ts +14 -0
- package/src/sandbox/internal/state-schemas.ts +47 -0
- package/src/sandbox/internal/state-values.ts +20 -0
- package/src/sandbox/internal/storage-activity.ts +43 -0
- package/src/sandbox/internal/usage-evidence.ts +77 -0
- package/src/sandbox/operation-record.ts +107 -4
- package/src/sandbox/persistence/changed-buckets.ts +61 -0
- package/src/sandbox/persistence/chunk-format.ts +39 -27
- package/src/sandbox/persistence/controller.ts +85 -33
- package/src/sandbox/persistence/import-bundle.ts +64 -0
- package/src/sandbox/persistence/serialize.ts +16 -10
- package/src/sandbox/persistence/types.ts +4 -0
- package/src/sandbox/persistence/validate-services.ts +70 -0
- package/src/sandbox/remote.ts +7 -0
- package/src/sandbox/replay/index.ts +15 -8
- package/src/sandbox/types/errors.ts +3 -1
- package/src/sandbox/types/events.ts +118 -75
- package/src/sandbox/types/index.ts +12 -0
- package/src/sandbox/types/operation.ts +14 -4
- package/src/sandbox/types/persistence.ts +2 -2
- package/src/sandbox/types/query-proof.ts +26 -0
- package/src/sandbox/types/request-observation.ts +25 -0
- package/src/sandbox/types/rules-evidence.ts +37 -0
- package/src/sandbox/types/service-event-record.ts +34 -0
- package/src/sandbox/types/service-event-records.ts +42 -0
- package/src/sandbox/types/service-mutation-event.ts +93 -0
- package/src/storage/activity-coverage.ts +8 -0
- package/src/storage/base64.ts +35 -0
- package/src/storage/download.ts +19 -6
- package/src/storage/enforce.ts +26 -4
- package/src/storage/errors.ts +29 -14
- package/src/storage/events.ts +21 -0
- package/src/storage/index.ts +7 -7
- package/src/storage/internal.ts +21 -0
- package/src/storage/metadata.ts +68 -19
- package/src/storage/observed.ts +16 -0
- package/src/storage/persistence.ts +574 -66
- package/src/storage/reference.ts +6 -3
- package/src/storage/remote-bytes.ts +122 -0
- package/src/storage/resumable.ts +16 -3
- package/src/storage/rules-resolution.ts +43 -1
- package/src/storage/sandbox/persistence-state.ts +71 -0
- package/src/storage/sandbox/rules-bindings.ts +69 -0
- package/src/storage/sandbox/rules-collection-methods.ts +161 -0
- package/src/storage/sandbox/rules-evaluator.ts +65 -142
- package/src/storage/sandbox/rules-firestore-lookup.ts +112 -0
- package/src/storage/sandbox/rules-hashing-methods.ts +50 -0
- package/src/storage/sandbox/rules-method-calls.ts +67 -0
- package/src/storage/sandbox/rules-methods.ts +63 -404
- package/src/storage/sandbox/rules-operators.ts +93 -0
- package/src/storage/sandbox/rules-string-methods.ts +214 -0
- package/src/storage/sandbox/rules-time-methods.ts +98 -0
- package/src/storage/sandbox/rules-values.ts +20 -1
- package/src/storage/sandbox/rules.ts +27 -14
- package/src/storage/sandbox/running-service.ts +52 -0
- package/src/storage/service.ts +196 -85
- package/src/storage/string-format.ts +8 -0
- package/src/storage/upload.ts +8 -3
- package/src/storage/url.ts +106 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a parse failure says it wanted.
|
|
3
|
+
*
|
|
4
|
+
* The parser reports its rightmost failure as the set of terminals that could
|
|
5
|
+
* have continued the match, which for a missing semicolon is nineteen of them:
|
|
6
|
+
* `";", "[", ".", "%", "/", "*", "<", ">", "<=", ">=", "-", "+", "is", "in",
|
|
7
|
+
* "!=", "==", "&&", "?", or "||"`. That set is the parser's own state, not the
|
|
8
|
+
* edit the source needs, and a reader who is handed it reads the whole list
|
|
9
|
+
* before working out that a semicolon is missing.
|
|
10
|
+
*
|
|
11
|
+
* So the set is read for the one terminal that decides the edit, and the line
|
|
12
|
+
* it failed on says which construct the edit belongs to. Where neither is
|
|
13
|
+
* decidable the wording says `syntax error` and lets the line and column carry
|
|
14
|
+
* the whole message, which is still more than a list of nineteen alternatives.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** One parse failure, as the grammar reports it. */
|
|
18
|
+
export interface ParseFailurePosition {
|
|
19
|
+
line: number;
|
|
20
|
+
column: number;
|
|
21
|
+
expected: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The keywords a rules source opens a statement with, and what each one is. */
|
|
25
|
+
const CONSTRUCTS: Readonly<Record<string, string>> = {
|
|
26
|
+
allow: 'after the allow statement',
|
|
27
|
+
let: 'after the let binding',
|
|
28
|
+
return: 'after the return expression',
|
|
29
|
+
rules_version: 'after the version line',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** How a missing terminator is worded when the line names no construct. */
|
|
33
|
+
const UNNAMED_CONSTRUCT = 'at the end of the statement';
|
|
34
|
+
|
|
35
|
+
/** How far back an unterminated statement is looked for from the failure point. */
|
|
36
|
+
const STATEMENT_LOOKBACK = 4;
|
|
37
|
+
|
|
38
|
+
/** What one source line opens with, lower-cased, or the empty string. */
|
|
39
|
+
function openingWord(line: string | undefined): string {
|
|
40
|
+
if (line === undefined) return '';
|
|
41
|
+
const word = line.trim().split(/[^A-Za-z_]+/)[0];
|
|
42
|
+
return (word ?? '').toLowerCase();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Which construct an unterminated statement belongs to.
|
|
47
|
+
*
|
|
48
|
+
* A missing terminator is reported at the token that followed it, which is
|
|
49
|
+
* usually the closing brace on the next line, so the failing line is read
|
|
50
|
+
* first and then the few lines above it, and the nearest one that opens a
|
|
51
|
+
* statement is the one that was never terminated.
|
|
52
|
+
*/
|
|
53
|
+
function unterminatedConstruct(source: string, line: number): string {
|
|
54
|
+
const lines = source.split('\n');
|
|
55
|
+
const earliest = Math.max(1, line - STATEMENT_LOOKBACK);
|
|
56
|
+
for (let at = line; at >= earliest; at--) {
|
|
57
|
+
const named = CONSTRUCTS[openingWord(lines[at - 1])];
|
|
58
|
+
if (named !== undefined) return named;
|
|
59
|
+
}
|
|
60
|
+
return UNNAMED_CONSTRUCT;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Whether the parser named one terminal among the alternatives it expected. */
|
|
64
|
+
function expects(expected: string, terminal: string): boolean {
|
|
65
|
+
return expected.includes(`"${terminal}"`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* How many alternatives a reader can still act on. A set this size is a
|
|
70
|
+
* vocabulary, such as the allow verbs a match block takes, and reading it is
|
|
71
|
+
* the fastest way to the edit. Past it the set is the parser's state.
|
|
72
|
+
*/
|
|
73
|
+
const READABLE_ALTERNATIVES = 8;
|
|
74
|
+
|
|
75
|
+
/** How many alternatives one expectation set names. */
|
|
76
|
+
function alternativeCount(expected: string): number {
|
|
77
|
+
const quoted = expected.match(/"[^"]*"/g);
|
|
78
|
+
if (quoted === null) return 0;
|
|
79
|
+
return quoted.length;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* What the source needs, in the reader's terms rather than the parser's.
|
|
84
|
+
*
|
|
85
|
+
* A missing terminator is decided from the failing line, so the wording says
|
|
86
|
+
* which statement is unterminated rather than only which character is absent.
|
|
87
|
+
* A short set of alternatives is a vocabulary and is kept as it is. A long one
|
|
88
|
+
* is the parser's state and is dropped for the line and column.
|
|
89
|
+
*/
|
|
90
|
+
export function parseErrorWording(failure: ParseFailurePosition, source: string): string {
|
|
91
|
+
if (expects(failure.expected, ';')) {
|
|
92
|
+
return `expected ';' ${unterminatedConstruct(source, failure.line)}`;
|
|
93
|
+
}
|
|
94
|
+
if (alternativeCount(failure.expected) <= READABLE_ALTERNATIVES) {
|
|
95
|
+
return `expected ${failure.expected}`;
|
|
96
|
+
}
|
|
97
|
+
return 'syntax error';
|
|
98
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { IndexesConfig, IndexesConfigEntry, IndexField } from './types.js';
|
|
2
|
+
|
|
3
|
+
/** Index diagnostics contain field names and operators, never query operands. */
|
|
4
|
+
export interface IndexQuery {
|
|
5
|
+
collectionGroup: string;
|
|
6
|
+
queryScope: 'COLLECTION' | 'COLLECTION_GROUP';
|
|
7
|
+
filters: Array<{ field: string; op: string }>;
|
|
8
|
+
orders: Array<{ field: string; direction: 'asc' | 'desc' }>;
|
|
9
|
+
unsupported?: string;
|
|
10
|
+
}
|
|
11
|
+
export type IndexFinding =
|
|
12
|
+
| { status: 'covered'; basis: 'automatic' | 'configured' }
|
|
13
|
+
| { status: 'missing'; index: IndexesConfigEntry }
|
|
14
|
+
| { status: 'unavailable'; reason: string; index?: IndexesConfigEntry };
|
|
15
|
+
|
|
16
|
+
function object(value: unknown): Record<string, unknown> | undefined {
|
|
17
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Adapters supply captured descriptors; values/cursors are deliberately never read. */
|
|
21
|
+
export function captureIndexQuery(path: string, group: boolean, filters: readonly unknown[], orders: readonly unknown[]): IndexQuery {
|
|
22
|
+
const query: IndexQuery = { collectionGroup: path.split('/').filter(Boolean).at(-1) ?? '', queryScope: group ? 'COLLECTION_GROUP' : 'COLLECTION', filters: [], orders: [] };
|
|
23
|
+
const visit = (input: unknown, depth: number): void => {
|
|
24
|
+
const entry = object(input);
|
|
25
|
+
if (!entry || depth > 12 || query.filters.length >= 64) { query.unsupported = 'This query exceeds the index checker’s supported limits.'; return; }
|
|
26
|
+
if (entry.kind === 'and' && Array.isArray(entry.filters)) { entry.filters.forEach(child => visit(child, depth + 1)); return; }
|
|
27
|
+
if (entry.kind !== 'where' || typeof entry.field !== 'string' || typeof entry.op !== 'string') { query.unsupported = 'This query uses a filter the index checker does not support yet.'; return; }
|
|
28
|
+
query.filters.push({ field: entry.field, op: entry.op });
|
|
29
|
+
};
|
|
30
|
+
filters.forEach(entry => visit(entry, 0));
|
|
31
|
+
for (const input of orders.slice(0, 64)) {
|
|
32
|
+
const entry = object(input);
|
|
33
|
+
if (!entry || typeof entry.field !== 'string' || (entry.direction !== 'asc' && entry.direction !== 'desc')) { query.unsupported = 'This sort order cannot be checked yet.'; continue; }
|
|
34
|
+
query.orders.push({ field: entry.field, direction: entry.direction });
|
|
35
|
+
}
|
|
36
|
+
if (orders.length > 64) query.unsupported = 'This query exceeds the index checker’s supported limits.';
|
|
37
|
+
return query;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function hasOneIndexMode(field: Record<string, unknown>): boolean {
|
|
41
|
+
const modes = [field.order, field.arrayConfig, field.vectorConfig].filter(value => value !== undefined);
|
|
42
|
+
if (modes.length !== 1) return false;
|
|
43
|
+
return field.order === 'ASCENDING' || field.order === 'DESCENDING' || field.arrayConfig === 'CONTAINS' || object(field.vectorConfig) !== undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function hasUnsupportedFilterCombination(ranges: string[], arrays: IndexQuery['filters']): boolean {
|
|
47
|
+
if (ranges.length > 1 || arrays.length > 1) return true;
|
|
48
|
+
return ranges.length > 0 && arrays.length > 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Validate before claiming coverage or allowing a file edit. Preserve unrelated metadata. */
|
|
52
|
+
export function readIndexConfig(value: unknown): IndexesConfig {
|
|
53
|
+
const config = object(value);
|
|
54
|
+
if (!config || !Array.isArray(config.indexes) || (config.fieldOverrides !== undefined && !Array.isArray(config.fieldOverrides))) throw new Error('The index configuration is invalid. Fix the file before adding an index.');
|
|
55
|
+
for (const item of config.indexes) {
|
|
56
|
+
const index = object(item);
|
|
57
|
+
if (!index || typeof index.collectionGroup !== 'string' || !['COLLECTION', 'COLLECTION_GROUP'].includes(String(index.queryScope)) || !Array.isArray(index.fields)) throw new Error('The index configuration contains an invalid index.');
|
|
58
|
+
for (const value of index.fields) {
|
|
59
|
+
const field = object(value);
|
|
60
|
+
if (!field || typeof field.fieldPath !== 'string' || !hasOneIndexMode(field)) throw new Error('The index configuration contains an invalid field.');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const value of config.fieldOverrides ?? []) {
|
|
64
|
+
const field = object(value);
|
|
65
|
+
if (!field || typeof field.collectionGroup !== 'string' || typeof field.fieldPath !== 'string' || (field.indexes !== undefined && !Array.isArray(field.indexes))) throw new Error('The index configuration contains an invalid field override.');
|
|
66
|
+
}
|
|
67
|
+
return config as unknown as IndexesConfig;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function automaticField(config: IndexesConfig, query: IndexQuery, field: IndexField): boolean {
|
|
71
|
+
const overrides = (config.fieldOverrides ?? []).map(object).filter(item => item?.collectionGroup === query.collectionGroup && typeof item.fieldPath === 'string');
|
|
72
|
+
const candidates = overrides.filter(item => item && (item.fieldPath === '*' || item.fieldPath === field.fieldPath || field.fieldPath.startsWith(`${item.fieldPath}.`)))
|
|
73
|
+
.sort((a, b) => (b?.fieldPath === '*' ? 0 : String(b?.fieldPath).length) - (a?.fieldPath === '*' ? 0 : String(a?.fieldPath).length));
|
|
74
|
+
const override = candidates.find(item => item?.indexes !== undefined);
|
|
75
|
+
if (!override) return query.queryScope === 'COLLECTION';
|
|
76
|
+
return (override.indexes as unknown[]).some(value => {
|
|
77
|
+
const index = object(value);
|
|
78
|
+
return index?.queryScope === query.queryScope && (field.arrayConfig ? index.arrayConfig === field.arrayConfig : index?.order === field.order);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function matches(index: IndexesConfigEntry, query: IndexQuery, equality: string[], ordered: IndexField[]): boolean {
|
|
83
|
+
if (index.collectionGroup !== query.collectionGroup || index.queryScope !== query.queryScope || index.fields.some(field => field.vectorConfig)) return false;
|
|
84
|
+
// Firestore appends __name__ automatically. Explicit document-ID queries are not inferred here.
|
|
85
|
+
const fields = index.fields.filter(field => field.fieldPath !== '__name__');
|
|
86
|
+
if (fields.length !== equality.length + ordered.length) return false;
|
|
87
|
+
const prefix = fields.slice(0, equality.length);
|
|
88
|
+
if (!equality.every(field => prefix.some(item => item.fieldPath === field && !!item.order))) return false;
|
|
89
|
+
return ordered.every((field, offset) => {
|
|
90
|
+
const actual = fields[equality.length + offset];
|
|
91
|
+
return actual.fieldPath === field.fieldPath && actual.order === field.order && actual.arrayConfig === field.arrayConfig;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** A bounded, conservative subset. Unsupported shapes never produce a guessed requirement. */
|
|
96
|
+
export function analyzeIndexQuery(query: IndexQuery, config: IndexesConfig | null): IndexFinding {
|
|
97
|
+
const unavailable = (reason: string): IndexFinding => ({ status: 'unavailable', reason });
|
|
98
|
+
if (query.unsupported) return unavailable(query.unsupported);
|
|
99
|
+
if (!query.collectionGroup || [...query.filters, ...query.orders].some(field => field.field === '__name__' || field.field.includes('`'))) return unavailable('Document ID and escaped field-path queries cannot be checked yet.');
|
|
100
|
+
if (query.filters.some(filter => !['==', '<', '<=', '>', '>=', 'array-contains'].includes(filter.op))) return unavailable('This filter combination cannot be checked yet.');
|
|
101
|
+
const ranges = [...new Set(query.filters.filter(filter => ['<', '<=', '>', '>='].includes(filter.op)).map(filter => filter.field))];
|
|
102
|
+
const arrays = query.filters.filter(filter => filter.op === 'array-contains');
|
|
103
|
+
if (hasUnsupportedFilterCombination(ranges, arrays)) return unavailable('Queries combining these range or array filters cannot be checked yet.');
|
|
104
|
+
const equality = [...new Set(query.filters.filter(filter => filter.op === '==').map(filter => filter.field))].sort();
|
|
105
|
+
if (equality.some(field => ranges.includes(field) || arrays.some(array => array.field === field))) return unavailable('Multiple filter types on the same field cannot be checked yet.');
|
|
106
|
+
const orders = query.orders.filter(order => !equality.includes(order.field));
|
|
107
|
+
if (ranges.length && orders.length && orders[0].field !== ranges[0]) return unavailable('The first sort field must match the range filter before indexing can be checked.');
|
|
108
|
+
const ordered: IndexField[] = arrays.map(array => ({ fieldPath: array.field, arrayConfig: 'CONTAINS' }));
|
|
109
|
+
ordered.push(...orders.map(order => ({ fieldPath: order.field, order: order.direction === 'asc' ? 'ASCENDING' as const : 'DESCENDING' as const })));
|
|
110
|
+
if (ranges.length && !orders.some(order => order.field === ranges[0])) ordered.push({ fieldPath: ranges[0], order: 'ASCENDING' });
|
|
111
|
+
const fields: IndexField[] = [...equality.map(fieldPath => ({ fieldPath, order: 'ASCENDING' as const })), ...ordered];
|
|
112
|
+
if (new Set(fields.map(field => field.fieldPath)).size !== fields.length) return unavailable('Repeated index fields cannot be checked yet.');
|
|
113
|
+
const index: IndexesConfigEntry = { collectionGroup: query.collectionGroup, queryScope: query.queryScope, fields };
|
|
114
|
+
if (!config) return { status: 'unavailable', reason: 'No local index configuration is connected.', ...(fields.length > 1 ? { index } : {}) };
|
|
115
|
+
if (config.indexes.some(entry => matches(entry, query, equality, ordered))) return { status: 'covered', basis: 'configured' };
|
|
116
|
+
// Equality-only queries can merge single-field indexes. Do not invent a composite requirement.
|
|
117
|
+
if (ordered.length === 0) {
|
|
118
|
+
if (fields.every(field => automaticField(config, query, field) || automaticField(config, query, { ...field, order: 'DESCENDING' }))) return { status: 'covered', basis: 'automatic' };
|
|
119
|
+
return unavailable('A field used by this query has no matching single-field index. Review its field override.');
|
|
120
|
+
}
|
|
121
|
+
if (fields.length === 1) {
|
|
122
|
+
if (automaticField(config, query, fields[0])) return { status: 'covered', basis: 'automatic' };
|
|
123
|
+
return unavailable('This query needs a single-field index. Review its field override.');
|
|
124
|
+
}
|
|
125
|
+
// Array membership plus equality can merge automatic indexes; a composite is an optimization.
|
|
126
|
+
// https://firebase.google.com/docs/firestore/query-data/index-overview#index_merging
|
|
127
|
+
if (arrays.length === 1 && orders.length === 0) {
|
|
128
|
+
if (fields.every(field => automaticField(config, query, field))) return { status: 'covered', basis: 'automatic' };
|
|
129
|
+
return unavailable('Array index merging with these field overrides cannot be checked yet.');
|
|
130
|
+
}
|
|
131
|
+
// Equality + sorting can also be served by merged compound indexes. Be conservative when present.
|
|
132
|
+
if (equality.length > 1 && ordered.length === 1 && !arrays.length && !ranges.length && equality.every(field => config.indexes.some(entry => matches(entry, query, [field], ordered)))) return { status: 'covered', basis: 'configured' };
|
|
133
|
+
const hasBroaderIndex = config.indexes.some(entry => entry.collectionGroup === query.collectionGroup && entry.queryScope === query.queryScope && entry.fields.length > fields.length && fields.every(field => entry.fields.some(candidate => candidate.fieldPath === field.fieldPath)));
|
|
134
|
+
if (hasBroaderIndex) return unavailable('A broader index is configured. Its coverage cannot be checked yet.');
|
|
135
|
+
return { status: 'missing', index };
|
|
136
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { analyzeIndexQuery, type IndexQuery } from './query-analysis.js';
|
|
2
|
+
import type { IndexesConfig, IndexesConfigEntry } from './types.js';
|
|
3
|
+
|
|
4
|
+
/** RTDB index evidence includes ordering only, never bounds or their values. */
|
|
5
|
+
export interface DatabaseIndexQuery {
|
|
6
|
+
service: 'rtdb';
|
|
7
|
+
path: string;
|
|
8
|
+
orderBy: { kind: 'child'; path: string } | { kind: 'key' | 'value' | 'priority' } | null;
|
|
9
|
+
}
|
|
10
|
+
export interface DatabaseIndexDefinition { path: string; indexOn: string[] }
|
|
11
|
+
export interface DatabaseIndexConfig { rules: Record<string, unknown> }
|
|
12
|
+
export type ServiceIndexQuery = IndexQuery | DatabaseIndexQuery;
|
|
13
|
+
export type ServiceIndexConfig = IndexesConfig | DatabaseIndexConfig;
|
|
14
|
+
export type ServiceIndexDefinition = IndexesConfigEntry | DatabaseIndexDefinition;
|
|
15
|
+
export type ServiceIndexFinding =
|
|
16
|
+
| { status: 'covered'; basis: 'automatic' | 'configured' }
|
|
17
|
+
| { status: 'missing'; index: ServiceIndexDefinition; editBlocked?: string }
|
|
18
|
+
| { status: 'unavailable'; reason: string; index?: ServiceIndexDefinition };
|
|
19
|
+
|
|
20
|
+
export function isDatabaseIndexQuery(query: ServiceIndexQuery): query is DatabaseIndexQuery {
|
|
21
|
+
return 'service' in query && query.service === 'rtdb';
|
|
22
|
+
}
|
|
23
|
+
export function indexService(query: ServiceIndexQuery): 'firestore' | 'rtdb' {
|
|
24
|
+
return isDatabaseIndexQuery(query) ? 'rtdb' : 'firestore';
|
|
25
|
+
}
|
|
26
|
+
export function captureDatabaseIndexQuery(path: string, spec: { orderBy: DatabaseIndexQuery['orderBy'] }): DatabaseIndexQuery {
|
|
27
|
+
return { service: 'rtdb', path: '/' + path.split('/').filter(Boolean).join('/'), orderBy: spec.orderBy ? { ...spec.orderBy } : null };
|
|
28
|
+
}
|
|
29
|
+
function object(value: unknown): value is Record<string, unknown> {
|
|
30
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Find the existing rule locations at the query path. Multiple wildcard/literal
|
|
34
|
+
* matches are kept: diagnostics can prove coverage without guessing where to edit. */
|
|
35
|
+
export function databaseIndexLocations(config: DatabaseIndexConfig, path: string) {
|
|
36
|
+
let matches = [{ path: [] as string[], node: config.rules }];
|
|
37
|
+
for (const segment of path.split('/').filter(Boolean)) {
|
|
38
|
+
matches = matches.flatMap(match => Object.entries(match.node)
|
|
39
|
+
.filter(([key, value]) => (key === segment || key.startsWith('$')) && object(value))
|
|
40
|
+
.map(([key, value]) => ({ path: [...match.path, key], node: value as Record<string, unknown> })));
|
|
41
|
+
}
|
|
42
|
+
return matches;
|
|
43
|
+
}
|
|
44
|
+
export function analyzeServiceIndex(query: ServiceIndexQuery, config: ServiceIndexConfig | null): ServiceIndexFinding {
|
|
45
|
+
if (!isDatabaseIndexQuery(query)) return analyzeIndexQuery(query, config && 'indexes' in config ? config : null);
|
|
46
|
+
const ordering = query.orderBy;
|
|
47
|
+
if (!ordering || ordering.kind === 'key' || ordering.kind === 'priority') return { status: 'covered', basis: 'automatic' };
|
|
48
|
+
const key = ordering.kind === 'child' ? ordering.path.split('/').filter(Boolean).join('/') : '.value';
|
|
49
|
+
if (!config || !('rules' in config)) return { status: 'unavailable', reason: 'No local database rules are connected.' };
|
|
50
|
+
const locations = databaseIndexLocations(config, query.path);
|
|
51
|
+
for (const { node } of locations) {
|
|
52
|
+
const indexes = node['.indexOn'];
|
|
53
|
+
let keys: unknown[] = [];
|
|
54
|
+
if (typeof indexes === 'string') keys = [indexes];
|
|
55
|
+
else if (Array.isArray(indexes)) keys = indexes;
|
|
56
|
+
if (keys.some(value => typeof value === 'string' && value.split('/').filter(Boolean).join('/') === key)) return { status: 'covered', basis: 'configured' };
|
|
57
|
+
}
|
|
58
|
+
if (locations.length !== 1) {
|
|
59
|
+
const editBlocked = locations.length ? 'Several rule paths match. Choose where to add .indexOn in your rules file.' : 'No rule exists at this query path. Choose where to add .indexOn in your rules file.';
|
|
60
|
+
return { status: 'missing', index: { path: query.path, indexOn: [key] }, editBlocked };
|
|
61
|
+
}
|
|
62
|
+
const location = locations[0]!;
|
|
63
|
+
const existing = location.node['.indexOn'];
|
|
64
|
+
if (existing !== undefined && typeof existing !== 'string' && (!Array.isArray(existing) || !existing.every(value => typeof value === 'string'))) return { status: 'unavailable', reason: 'The existing .indexOn value must be a field name or a list of field names.' };
|
|
65
|
+
let indexOn: string[] = [];
|
|
66
|
+
if (typeof existing === 'string') indexOn = [existing];
|
|
67
|
+
else if (Array.isArray(existing)) indexOn = existing;
|
|
68
|
+
return { status: 'missing', index: { path: '/' + location.path.join('/'), indexOn: [...indexOn, key] } };
|
|
69
|
+
}
|
|
@@ -67,6 +67,9 @@ export type { ResolveResult, ResolveOptions } from '../modules/resolver.js';
|
|
|
67
67
|
|
|
68
68
|
// ─── Rules simulator ─────────────────────────────────────────────────
|
|
69
69
|
export { SimulateFirestoreRulesHandler, SERVER_TIMESTAMP } from '../simulator/handler.js';
|
|
70
|
+
export { DOCUMENT_PATH_FORM, documentRelativePath } from '../simulator/request-path.js';
|
|
71
|
+
export { parseErrorWording } from '../grammar/parse-error-wording.js';
|
|
72
|
+
export type { ParseFailurePosition } from '../grammar/parse-error-wording.js';
|
|
70
73
|
export {
|
|
71
74
|
collectMatches,
|
|
72
75
|
renderMatchBlockPath,
|
|
@@ -180,6 +183,19 @@ export { resolveModulesBrowser, STDLIB_INLINE, resolveAuthoredSourceLoc, type Au
|
|
|
180
183
|
// so neither tree-shaking nor lazy-loading keeps it out). See `./extract.ts`.
|
|
181
184
|
// The erasable TYPES stay here (type-only exports compile away, never bundled).
|
|
182
185
|
export type { ExtractIndexesOptions } from '../indexes/extractHandler.js';
|
|
186
|
+
|
|
187
|
+
// Composite-index detection over a structured query shape, not source text.
|
|
188
|
+
// `needsCompositeIndex` and `shapeToIndexEntry` have no TypeScript-compiler
|
|
189
|
+
// dependency (pure data functions over `QueryShape`), unlike the source-text
|
|
190
|
+
// extractor above, so they stay on this browser-safe entry rather than the
|
|
191
|
+
// compiler-heavy `pyric/rules/extract` subpath. A caller that already has a
|
|
192
|
+
// query's collection path, filters, and orderings (a recorded sandbox query,
|
|
193
|
+
// or one an agent names directly) reaches these without paying for the parser.
|
|
194
|
+
export {
|
|
195
|
+
needsCompositeIndex,
|
|
196
|
+
shapeToIndexEntry,
|
|
197
|
+
indexEntryKey,
|
|
198
|
+
} from '../indexes/extract/composite.js';
|
|
183
199
|
export type {
|
|
184
200
|
ExtractResult,
|
|
185
201
|
ExtractionWarning,
|
|
@@ -70,7 +70,7 @@ export const STORAGE_METHOD_RECEIVER_TYPES = {
|
|
|
70
70
|
"split": ["string"] as const,
|
|
71
71
|
} as const;
|
|
72
72
|
export const STORAGE_NAMESPACE_METHODS = {
|
|
73
|
-
duration: ["value"] as const,
|
|
73
|
+
duration: ["abs", "time", "value"] as const,
|
|
74
74
|
firestore: ["exists", "get"] as const,
|
|
75
75
|
timestamp: ["date", "value"] as const,
|
|
76
76
|
} as const;
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
|
|
8
8
|
export const ATOM_SPECS = {
|
|
9
9
|
// --- Authentication ---
|
|
10
|
-
authenticated: { args: [], output: 'auth
|
|
10
|
+
authenticated: { args: [], output: 'auth != null' },
|
|
11
11
|
|
|
12
12
|
// --- Ownership ---
|
|
13
|
-
ownPath: { args: ['$uid'], output: 'auth.uid
|
|
14
|
-
ownField: { args: ['author'], output: 'auth.uid
|
|
13
|
+
ownPath: { args: ['$uid'], output: 'auth.uid == $uid' },
|
|
14
|
+
ownField: { args: ['author'], output: 'auth.uid == data.child("author").val()' },
|
|
15
15
|
|
|
16
16
|
// --- Existence ---
|
|
17
17
|
isNew: { args: [], output: '!data.exists()' },
|
|
@@ -24,12 +24,12 @@ export const ATOM_SPECS = {
|
|
|
24
24
|
fieldIsBoolean: { args: ['active'], output: 'newData.child("active").isBoolean()' },
|
|
25
25
|
fieldEnum: {
|
|
26
26
|
args: ['role', ['user', 'admin']],
|
|
27
|
-
output: 'newData.child("role").val()
|
|
27
|
+
output: 'newData.child("role").val() == "user" || newData.child("role").val() == "admin"',
|
|
28
28
|
},
|
|
29
29
|
|
|
30
30
|
// --- Immutability ---
|
|
31
|
-
immutable: { args: ['createdAt'], output: '!data.exists() || newData.child("createdAt").val()
|
|
32
|
-
immutableSelf: { args: [], output: '!data.exists() || newData.val()
|
|
31
|
+
immutable: { args: ['createdAt'], output: '!data.exists() || newData.child("createdAt").val() == data.child("createdAt").val()' },
|
|
32
|
+
immutableSelf: { args: [], output: '!data.exists() || newData.val() == data.val()' },
|
|
33
33
|
|
|
34
34
|
// --- Cross-path ---
|
|
35
35
|
rootExistsPathVar: {
|
|
@@ -42,6 +42,6 @@ export const ATOM_SPECS = {
|
|
|
42
42
|
},
|
|
43
43
|
rootEquals: {
|
|
44
44
|
args: [['users', { $: 'auth.uid' }, 'role'], 'admin'],
|
|
45
|
-
output: 'root.child("users").child(auth.uid).child("role").val()
|
|
45
|
+
output: 'root.child("users").child(auth.uid).child("role").val() == "admin"',
|
|
46
46
|
},
|
|
47
47
|
} as const;
|
|
@@ -12,15 +12,15 @@ function buildPath(segments: Segment[]): string {
|
|
|
12
12
|
|
|
13
13
|
// --- Authentication ---
|
|
14
14
|
|
|
15
|
-
export const authenticated = (): Expr => e('auth
|
|
15
|
+
export const authenticated = (): Expr => e('auth != null');
|
|
16
16
|
|
|
17
17
|
// --- Ownership ---
|
|
18
18
|
|
|
19
19
|
/** Path-based ownership: auth.uid matches a URL path variable */
|
|
20
|
-
export const ownPath = (pathVar: string): Expr => e(`auth.uid
|
|
20
|
+
export const ownPath = (pathVar: string): Expr => e(`auth.uid == ${pathVar}`);
|
|
21
21
|
|
|
22
22
|
/** Field-based ownership: auth.uid matches a value stored in a data field */
|
|
23
|
-
export const ownField = (field: string): Expr => e(`auth.uid
|
|
23
|
+
export const ownField = (field: string): Expr => e(`auth.uid == data.child("${field}").val()`);
|
|
24
24
|
|
|
25
25
|
// --- Existence ---
|
|
26
26
|
|
|
@@ -46,17 +46,17 @@ export const fieldIsBoolean = (field: string): Expr => e(`newData.child("${field
|
|
|
46
46
|
|
|
47
47
|
/** Field must be one of the allowed string values */
|
|
48
48
|
export const fieldEnum = (field: string, values: string[]): Expr =>
|
|
49
|
-
e(values.map(v => `newData.child("${field}").val()
|
|
49
|
+
e(values.map(v => `newData.child("${field}").val() == "${v}"`).join(' || '));
|
|
50
50
|
|
|
51
51
|
// --- Immutability ---
|
|
52
52
|
|
|
53
53
|
/** Field can be set on creation but never changed after */
|
|
54
54
|
export const immutable = (field: string): Expr =>
|
|
55
|
-
e(`!data.exists() || newData.child("${field}").val()
|
|
55
|
+
e(`!data.exists() || newData.child("${field}").val() == data.child("${field}").val()`);
|
|
56
56
|
|
|
57
57
|
/** This node's own value can be set on creation but never changed */
|
|
58
58
|
export const immutableSelf = (): Expr =>
|
|
59
|
-
e('!data.exists() || newData.val()
|
|
59
|
+
e('!data.exists() || newData.val() == data.val()');
|
|
60
60
|
|
|
61
61
|
// --- Cross-path lookups ---
|
|
62
62
|
|
|
@@ -66,4 +66,4 @@ export const rootExists = (segments: Segment[]): Expr =>
|
|
|
66
66
|
|
|
67
67
|
/** Check if a path's value equals a specific string (via root) */
|
|
68
68
|
export const rootEquals = (segments: Segment[], value: string): Expr =>
|
|
69
|
-
e(`root.${buildPath(segments)}.val()
|
|
69
|
+
e(`root.${buildPath(segments)}.val() == "${value}"`);
|
|
@@ -57,13 +57,13 @@ export const newDataParentExists = (depth: number, field: string): Expr =>
|
|
|
57
57
|
|
|
58
58
|
// ---- Comparisons ----
|
|
59
59
|
|
|
60
|
-
/**
|
|
60
|
+
/** Equality: left == right (right is a literal value or runtime ref) */
|
|
61
61
|
export const eq = (left: Expr, right: CompareValue): Expr =>
|
|
62
|
-
e(`${left}
|
|
62
|
+
e(`${left} == ${formatRight(right)}`);
|
|
63
63
|
|
|
64
|
-
/**
|
|
64
|
+
/** Inequality: left != right */
|
|
65
65
|
export const neq = (left: Expr, right: CompareValue): Expr =>
|
|
66
|
-
e(`${left}
|
|
66
|
+
e(`${left} != ${formatRight(right)}`);
|
|
67
67
|
|
|
68
68
|
/** Greater than: left > right */
|
|
69
69
|
export const gt = (left: Expr, right: number): Expr =>
|
|
@@ -75,13 +75,15 @@ function normalizeAuth(auth: RtdbRulesSimulationAuth | undefined): SimulationInp
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
function normalizeSimulationInput(input: RtdbRulesSimulationInput): SimulationInput {
|
|
78
|
-
|
|
78
|
+
const simulation: SimulationInput = {
|
|
79
79
|
operation: input.operation,
|
|
80
80
|
path: input.path,
|
|
81
81
|
auth: normalizeAuth(input.auth),
|
|
82
82
|
mockData: input.mockData ?? input.data ?? {},
|
|
83
|
-
...(input.newData !== undefined ? { newData: input.newData } : {}),
|
|
84
83
|
};
|
|
84
|
+
if (input.newData !== undefined) simulation.newData = input.newData;
|
|
85
|
+
if (input.now !== undefined) simulation.now = input.now;
|
|
86
|
+
return simulation;
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
function collectExpressionFindings(
|
|
@@ -8,19 +8,19 @@
|
|
|
8
8
|
export const GAME_SPECS = {
|
|
9
9
|
turnGuardWithStatus: {
|
|
10
10
|
args: { turnField: 'currentTurn', players: { X: 'playerX', O: 'playerO' }, statusField: 'status', playingValue: 'playing' },
|
|
11
|
-
output: '(data.child("status").val()
|
|
11
|
+
output: '(data.child("status").val() == "playing") && (data.child("currentTurn").val() == "X" && data.child("playerX").val() == auth.uid || data.child("currentTurn").val() == "O" && data.child("playerO").val() == auth.uid)',
|
|
12
12
|
},
|
|
13
13
|
turnGuardNoStatus: {
|
|
14
14
|
args: { turnField: 'currentTurn', players: { X: 'playerX', O: 'playerO' } },
|
|
15
|
-
output: 'data.child("currentTurn").val()
|
|
15
|
+
output: 'data.child("currentTurn").val() == "X" && data.child("playerX").val() == auth.uid || data.child("currentTurn").val() == "O" && data.child("playerO").val() == auth.uid',
|
|
16
16
|
},
|
|
17
17
|
flipTwoMarks: {
|
|
18
18
|
args: { marks: ['X', 'O'] },
|
|
19
|
-
output: '((!(data.exists())) && (newData.val()
|
|
19
|
+
output: '((!(data.exists())) && (newData.val() == "X")) || ((data.val() == "X") && (newData.val() == "O")) || ((data.val() == "O") && (newData.val() == "X"))',
|
|
20
20
|
},
|
|
21
21
|
flipThreeMarks: {
|
|
22
22
|
args: { marks: ['A', 'B', 'C'] },
|
|
23
|
-
output: '((!(data.exists())) && (newData.val()
|
|
23
|
+
output: '((!(data.exists())) && (newData.val() == "A")) || ((data.val() == "A") && (newData.val() == "B")) || ((data.val() == "B") && (newData.val() == "C")) || ((data.val() == "C") && (newData.val() == "A"))',
|
|
24
24
|
},
|
|
25
25
|
winCheckHelper: {
|
|
26
26
|
args: { mark: 'X', lines: [[0,1,2],[3,4,5]], boardPath: 'board' },
|
|
@@ -5,19 +5,19 @@
|
|
|
5
5
|
export const POLICY_SPECS = {
|
|
6
6
|
pathOwnerOnly: {
|
|
7
7
|
args: ['$uid'],
|
|
8
|
-
output: '(auth
|
|
8
|
+
output: '(auth != null) && (auth.uid == $uid)',
|
|
9
9
|
},
|
|
10
10
|
fieldOwnerOnly: {
|
|
11
11
|
args: ['author'],
|
|
12
|
-
output: '(auth
|
|
12
|
+
output: '(auth != null) && (auth.uid == data.child("author").val())',
|
|
13
13
|
},
|
|
14
14
|
ownerOrNew: {
|
|
15
15
|
args: ['author'],
|
|
16
|
-
output: '(auth
|
|
16
|
+
output: '(auth != null) && ((!data.exists()) || (auth.uid == data.child("author").val()))',
|
|
17
17
|
},
|
|
18
18
|
hasRole: {
|
|
19
19
|
args: [['users', { $: 'auth.uid' }, 'role'], 'admin'],
|
|
20
|
-
output: 'root.child("users").child(auth.uid).child("role").val()
|
|
20
|
+
output: 'root.child("users").child(auth.uid).child("role").val() == "admin"',
|
|
21
21
|
},
|
|
22
22
|
isMember: {
|
|
23
23
|
args: ['team-members', 'teamId'],
|
|
@@ -29,6 +29,6 @@ export const POLICY_SPECS = {
|
|
|
29
29
|
},
|
|
30
30
|
transition: {
|
|
31
31
|
args: ['status', [['open', 'playing'], ['open', 'cancelled']]],
|
|
32
|
-
output: '((data.child("status").val()
|
|
32
|
+
output: '((data.child("status").val() == "open") && (newData.child("status").val() == "playing")) || ((data.child("status").val() == "open") && (newData.child("status").val() == "cancelled"))',
|
|
33
33
|
},
|
|
34
34
|
} as const;
|
|
@@ -2,11 +2,11 @@ import type { Expr, Segment } from './types.js';
|
|
|
2
2
|
import { all, any, expr } from './compose.js';
|
|
3
3
|
import { authenticated, ownPath, ownField, isNew, hasChild, rootExists, rootEquals } from './atoms.js';
|
|
4
4
|
|
|
5
|
-
/** Only the path owner (auth.uid
|
|
5
|
+
/** Only the path owner (auth.uid == $pathVar) can access */
|
|
6
6
|
export const pathOwnerOnly = (pathVar: string): Expr =>
|
|
7
7
|
all(authenticated(), ownPath(pathVar));
|
|
8
8
|
|
|
9
|
-
/** Only the field owner (auth.uid
|
|
9
|
+
/** Only the field owner (auth.uid == data.child(field).val()) can access */
|
|
10
10
|
export const fieldOwnerOnly = (field: string): Expr =>
|
|
11
11
|
all(authenticated(), ownField(field));
|
|
12
12
|
|
|
@@ -30,7 +30,7 @@ export const required = (...fields: string[]): Expr =>
|
|
|
30
30
|
export const transition = (field: string, allowed: Array<[string, string]>): Expr =>
|
|
31
31
|
any(...allowed.map(([from, to]) =>
|
|
32
32
|
all(
|
|
33
|
-
expr(`data.child("${field}").val()
|
|
34
|
-
expr(`newData.child("${field}").val()
|
|
33
|
+
expr(`data.child("${field}").val() == "${from}"`),
|
|
34
|
+
expr(`newData.child("${field}").val() == "${to}"`),
|
|
35
35
|
)
|
|
36
36
|
));
|
|
@@ -69,12 +69,12 @@ function zodTypeToExpr(zodType: z.ZodTypeAny, fieldName: string): Expr {
|
|
|
69
69
|
}
|
|
70
70
|
if (zodType instanceof z.ZodEnum) {
|
|
71
71
|
const values = (zodType as z.ZodEnum<any>).options as string[];
|
|
72
|
-
return expr(values.map(v => `newData.val()
|
|
72
|
+
return expr(values.map(v => `newData.val() == "${v}"`).join(' || '));
|
|
73
73
|
}
|
|
74
74
|
if (zodType instanceof z.ZodLiteral) {
|
|
75
75
|
const v = (zodType as z.ZodLiteral<any>).value;
|
|
76
|
-
if (typeof v === 'string') return expr(`newData.val()
|
|
77
|
-
return expr(`newData.val()
|
|
76
|
+
if (typeof v === 'string') return expr(`newData.val() == "${v}"`);
|
|
77
|
+
return expr(`newData.val() == ${v}`);
|
|
78
78
|
}
|
|
79
79
|
if (zodType instanceof z.ZodUnion) {
|
|
80
80
|
const options = (zodType as z.ZodUnion<any>)._def.options as z.ZodTypeAny[];
|
|
@@ -11,9 +11,7 @@ RtdbExpr {
|
|
|
11
11
|
| Comparison
|
|
12
12
|
|
|
13
13
|
Comparison
|
|
14
|
-
= Comparison "
|
|
15
|
-
| Comparison "!==" Additive -- strictNeq
|
|
16
|
-
| Comparison ">=" Additive -- gte
|
|
14
|
+
= Comparison ">=" Additive -- gte
|
|
17
15
|
| Comparison "<=" Additive -- lte
|
|
18
16
|
| Comparison ">" Additive -- gt
|
|
19
17
|
| Comparison "<" Additive -- lt
|
|
@@ -15,9 +15,7 @@ export const RTDB_EXPR_OHM_SOURCE = `RtdbExpr {
|
|
|
15
15
|
| Comparison
|
|
16
16
|
|
|
17
17
|
Comparison
|
|
18
|
-
= Comparison "
|
|
19
|
-
| Comparison "!==" Additive -- strictNeq
|
|
20
|
-
| Comparison ">=" Additive -- gte
|
|
18
|
+
= Comparison ">=" Additive -- gte
|
|
21
19
|
| Comparison "<=" Additive -- lte
|
|
22
20
|
| Comparison ">" Additive -- gt
|
|
23
21
|
| Comparison "<" Additive -- lt
|