parse-stack-next 5.6.0 → 5.7.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +489 -0
- data/README.md +378 -6
- data/docs/caching.md +748 -0
- data/examples/basic_client.rb +3 -3
- data/examples/basic_server.rb +3 -3
- data/examples/live_query_listener.rb +12 -12
- data/examples/rag_chatbot.rb +14 -14
- data/examples/transaction_example.rb +44 -45
- data/examples/webhook_server.rb +3 -3
- data/lib/parse/access.rb +493 -0
- data/lib/parse/acl_scope.rb +125 -52
- data/lib/parse/agent/approval_gate.rb +0 -0
- data/lib/parse/agent/cancellation_token.rb +3 -3
- data/lib/parse/agent/constraint_translator.rb +4 -4
- data/lib/parse/agent/describe.rb +34 -34
- data/lib/parse/agent/errors.rb +9 -9
- data/lib/parse/agent/mcp_client.rb +61 -59
- data/lib/parse/agent/mcp_dispatcher.rb +89 -101
- data/lib/parse/agent/mcp_rack_app.rb +92 -93
- data/lib/parse/agent/mcp_server.rb +1 -1
- data/lib/parse/agent/mcp_subscriptions.rb +22 -22
- data/lib/parse/agent/metadata_audit.rb +1 -2
- data/lib/parse/agent/metadata_dsl.rb +7 -7
- data/lib/parse/agent/metadata_registry.rb +12 -12
- data/lib/parse/agent/prompt_hardening.rb +4 -4
- data/lib/parse/agent/prompts.rb +10 -10
- data/lib/parse/agent/result_formatter.rb +4 -4
- data/lib/parse/agent/tools.rb +493 -400
- data/lib/parse/agent.rb +157 -116
- data/lib/parse/api/hooks.rb +1 -1
- data/lib/parse/api/server.rb +2 -2
- data/lib/parse/api/users.rb +2 -2
- data/lib/parse/atlas_search/index_manager.rb +1 -1
- data/lib/parse/atlas_search/session.rb +40 -218
- data/lib/parse/atlas_search.rb +181 -60
- data/lib/parse/authorization.rb +466 -0
- data/lib/parse/cache/invalidation.rb +219 -0
- data/lib/parse/cache/keyspace.rb +306 -0
- data/lib/parse/cache/moneta_surface.rb +126 -0
- data/lib/parse/cache/pool.rb +48 -5
- data/lib/parse/cache/redis.rb +425 -10
- data/lib/parse/cache/scoped_view.rb +443 -0
- data/lib/parse/cache/sub_cache.rb +264 -0
- data/lib/parse/cache/upstream_roles.rb +230 -0
- data/lib/parse/client/authentication.rb +1 -1
- data/lib/parse/client/body_builder.rb +1 -2
- data/lib/parse/client/caching.rb +84 -5
- data/lib/parse/client.rb +327 -189
- data/lib/parse/clp_scope.rb +225 -28
- data/lib/parse/console.rb +3 -3
- data/lib/parse/embeddings/batch_embedder.rb +3 -3
- data/lib/parse/embeddings/cache.rb +17 -17
- data/lib/parse/embeddings/cohere.rb +21 -22
- data/lib/parse/embeddings/image_fetch.rb +22 -21
- data/lib/parse/embeddings/jina.rb +21 -21
- data/lib/parse/embeddings/local_http.rb +6 -7
- data/lib/parse/embeddings/media_file.rb +5 -4
- data/lib/parse/embeddings/openai.rb +5 -5
- data/lib/parse/embeddings/provider.rb +1 -1
- data/lib/parse/embeddings/qwen.rb +10 -10
- data/lib/parse/embeddings/spend_cap.rb +2 -3
- data/lib/parse/embeddings/streaming_body.rb +11 -11
- data/lib/parse/embeddings/video_source.rb +7 -6
- data/lib/parse/embeddings/voyage.rb +59 -61
- data/lib/parse/embeddings.rb +28 -27
- data/lib/parse/graphql/type_generator.rb +1 -1
- data/lib/parse/graphql.rb +5 -5
- data/lib/parse/live_query/client.rb +1 -1
- data/lib/parse/live_query.rb +1 -1
- data/lib/parse/lock.rb +15 -18
- data/lib/parse/lock_backend.rb +1 -1
- data/lib/parse/lookup_rewriter.rb +6 -6
- data/lib/parse/model/associations/belongs_to.rb +4 -0
- data/lib/parse/model/associations/collection_proxy.rb +3 -0
- data/lib/parse/model/associations/has_many.rb +4 -0
- data/lib/parse/model/classes/role.rb +227 -28
- data/lib/parse/model/classes/user.rb +60 -1
- data/lib/parse/model/clp.rb +4 -4
- data/lib/parse/model/core/actions.rb +366 -113
- data/lib/parse/model/core/create_lock.rb +0 -2
- data/lib/parse/model/core/describe.rb +57 -57
- data/lib/parse/model/core/embed_managed.rb +21 -23
- data/lib/parse/model/core/fetching.rb +6 -0
- data/lib/parse/model/core/indexing.rb +14 -14
- data/lib/parse/model/core/parse_reference.rb +1 -1
- data/lib/parse/model/core/properties.rb +6 -2
- data/lib/parse/model/core/querying.rb +1 -1
- data/lib/parse/model/core/schema.rb +2 -2
- data/lib/parse/model/core/search_indexing.rb +2 -2
- data/lib/parse/model/core/vector_searchable.rb +4 -5
- data/lib/parse/model/file.rb +21 -15
- data/lib/parse/model/geojson.rb +2 -2
- data/lib/parse/model/geopoint.rb +1 -0
- data/lib/parse/model/object.rb +136 -66
- data/lib/parse/model/pointer.rb +2 -0
- data/lib/parse/model/polygon.rb +3 -6
- data/lib/parse/model/push.rb +2 -2
- data/lib/parse/model/vector.rb +3 -1
- data/lib/parse/mongodb.rb +512 -282
- data/lib/parse/pipeline_security.rb +3 -0
- data/lib/parse/query/constraints.rb +46 -46
- data/lib/parse/query.rb +146 -59
- data/lib/parse/retrieval/agent_tool.rb +34 -20
- data/lib/parse/retrieval/chunk.rb +1 -0
- data/lib/parse/retrieval/reranker/cohere.rb +11 -11
- data/lib/parse/retrieval/reranker.rb +3 -4
- data/lib/parse/retrieval/retriever.rb +4 -6
- data/lib/parse/schema/index_migrator.rb +26 -26
- data/lib/parse/schema/search_index_migrator.rb +19 -19
- data/lib/parse/stack/tasks.rb +6 -6
- data/lib/parse/stack/version.rb +1 -1
- data/lib/parse/stack.rb +10 -10
- data/lib/parse/vector_search/hybrid.rb +66 -41
- data/lib/parse/vector_search.rb +14 -11
- data/lib/parse/webhooks/payload.rb +1 -0
- data/lib/parse/webhooks/registration.rb +4 -4
- data/lib/parse/webhooks/trigger_audit.rb +50 -49
- data/lib/parse/webhooks.rb +120 -5
- data/parse-stack-next.gemspec +6 -6
- metadata +10 -1
|
@@ -493,6 +493,7 @@ module Parse
|
|
|
493
493
|
end
|
|
494
494
|
nil
|
|
495
495
|
end
|
|
496
|
+
|
|
496
497
|
private_class_method :walk_for_protected_ref!
|
|
497
498
|
|
|
498
499
|
# @!visibility private
|
|
@@ -532,6 +533,7 @@ module Parse
|
|
|
532
533
|
walk_for_denied!(value, depth: 1, stage_idx: idx)
|
|
533
534
|
end
|
|
534
535
|
end
|
|
536
|
+
|
|
535
537
|
private_class_method :validate_stage!
|
|
536
538
|
|
|
537
539
|
# @!visibility private
|
|
@@ -674,6 +676,7 @@ module Parse
|
|
|
674
676
|
# Other primitives (Integer, etc.) are always safe.
|
|
675
677
|
nil
|
|
676
678
|
end
|
|
679
|
+
|
|
677
680
|
private_class_method :walk_for_denied!
|
|
678
681
|
end
|
|
679
682
|
end
|
|
@@ -900,10 +900,10 @@ module Parse
|
|
|
900
900
|
"$expr" => {
|
|
901
901
|
"$setEquals" => [
|
|
902
902
|
{ "$map" => {
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
903
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
904
|
+
"as" => "p",
|
|
905
|
+
"in" => "$$p.objectId",
|
|
906
|
+
} },
|
|
907
907
|
target_ids,
|
|
908
908
|
],
|
|
909
909
|
},
|
|
@@ -996,10 +996,10 @@ module Parse
|
|
|
996
996
|
"$expr" => {
|
|
997
997
|
"$eq" => [
|
|
998
998
|
{ "$map" => {
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
999
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1000
|
+
"as" => "p",
|
|
1001
|
+
"in" => "$$p.objectId",
|
|
1002
|
+
} },
|
|
1003
1003
|
target_ids,
|
|
1004
1004
|
],
|
|
1005
1005
|
},
|
|
@@ -1086,10 +1086,10 @@ module Parse
|
|
|
1086
1086
|
"$expr" => {
|
|
1087
1087
|
"$ne" => [
|
|
1088
1088
|
{ "$map" => {
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1089
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1090
|
+
"as" => "p",
|
|
1091
|
+
"in" => "$$p.objectId",
|
|
1092
|
+
} },
|
|
1093
1093
|
target_ids,
|
|
1094
1094
|
],
|
|
1095
1095
|
},
|
|
@@ -1178,10 +1178,10 @@ module Parse
|
|
|
1178
1178
|
"$not" => {
|
|
1179
1179
|
"$setEquals" => [
|
|
1180
1180
|
{ "$map" => {
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1181
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1182
|
+
"as" => "p",
|
|
1183
|
+
"in" => "$$p.objectId",
|
|
1184
|
+
} },
|
|
1185
1185
|
target_ids,
|
|
1186
1186
|
],
|
|
1187
1187
|
},
|
|
@@ -1344,10 +1344,10 @@ module Parse
|
|
|
1344
1344
|
"$expr" => {
|
|
1345
1345
|
"$setIsSubset" => [
|
|
1346
1346
|
{ "$map" => {
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1347
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1348
|
+
"as" => "p",
|
|
1349
|
+
"in" => "$$p.objectId",
|
|
1350
|
+
} },
|
|
1351
1351
|
target_ids,
|
|
1352
1352
|
],
|
|
1353
1353
|
},
|
|
@@ -1409,10 +1409,10 @@ module Parse
|
|
|
1409
1409
|
"$expr" => {
|
|
1410
1410
|
"$eq" => [
|
|
1411
1411
|
{ "$arrayElemAt" => [{ "$map" => {
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1412
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1413
|
+
"as" => "p",
|
|
1414
|
+
"in" => "$$p.objectId",
|
|
1415
|
+
} }, 0] },
|
|
1416
1416
|
compare_val,
|
|
1417
1417
|
],
|
|
1418
1418
|
},
|
|
@@ -1427,10 +1427,10 @@ module Parse
|
|
|
1427
1427
|
"$expr" => {
|
|
1428
1428
|
"$eq" => [
|
|
1429
1429
|
{ "$arrayElemAt" => [{ "$map" => {
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1430
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1431
|
+
"as" => "p",
|
|
1432
|
+
"in" => "$$p.objectId",
|
|
1433
|
+
} }, 0] },
|
|
1434
1434
|
compare_val,
|
|
1435
1435
|
],
|
|
1436
1436
|
},
|
|
@@ -1490,10 +1490,10 @@ module Parse
|
|
|
1490
1490
|
"$expr" => {
|
|
1491
1491
|
"$eq" => [
|
|
1492
1492
|
{ "$arrayElemAt" => [{ "$map" => {
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1493
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1494
|
+
"as" => "p",
|
|
1495
|
+
"in" => "$$p.objectId",
|
|
1496
|
+
} }, -1] },
|
|
1497
1497
|
compare_val,
|
|
1498
1498
|
],
|
|
1499
1499
|
},
|
|
@@ -1508,10 +1508,10 @@ module Parse
|
|
|
1508
1508
|
"$expr" => {
|
|
1509
1509
|
"$eq" => [
|
|
1510
1510
|
{ "$arrayElemAt" => [{ "$map" => {
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1511
|
+
"input" => { "$ifNull" => ["$#{field_name}", []] },
|
|
1512
|
+
"as" => "p",
|
|
1513
|
+
"in" => "$$p.objectId",
|
|
1514
|
+
} }, -1] },
|
|
1515
1515
|
compare_val,
|
|
1516
1516
|
],
|
|
1517
1517
|
},
|
|
@@ -1679,8 +1679,8 @@ module Parse
|
|
|
1679
1679
|
Parse::RegexSecurity.validate!(pattern_str)
|
|
1680
1680
|
|
|
1681
1681
|
return options.empty? ?
|
|
1682
|
-
|
|
1683
|
-
|
|
1682
|
+
{ @operation.operand => { key => pattern_str } } :
|
|
1683
|
+
{ @operation.operand => { key => pattern_str, :$options => options } }
|
|
1684
1684
|
end
|
|
1685
1685
|
|
|
1686
1686
|
value = formatted_value
|
|
@@ -1838,8 +1838,7 @@ module Parse
|
|
|
1838
1838
|
# of the chosen unit. Without this cap, an attacker-controlled
|
|
1839
1839
|
# `max_*` (e.g. user-supplied km) can submit a huge value and
|
|
1840
1840
|
# force a full-collection scan.
|
|
1841
|
-
radians_for_check =
|
|
1842
|
-
case unit
|
|
1841
|
+
radians_for_check = case unit
|
|
1843
1842
|
when :km then max_distance.to_f / KM_PER_RADIAN
|
|
1844
1843
|
when :radians then max_distance.to_f
|
|
1845
1844
|
else max_distance.to_f / MILES_PER_RADIAN
|
|
@@ -1851,8 +1850,7 @@ module Parse
|
|
|
1851
1850
|
"and degenerates $nearSphere into a full collection scan."
|
|
1852
1851
|
end
|
|
1853
1852
|
|
|
1854
|
-
distance_key =
|
|
1855
|
-
case unit
|
|
1853
|
+
distance_key = case unit
|
|
1856
1854
|
when :km then :$maxDistanceInKilometers
|
|
1857
1855
|
when :radians then :$maxDistance
|
|
1858
1856
|
else :$maxDistanceInMiles
|
|
@@ -2020,8 +2018,7 @@ module Parse
|
|
|
2020
2018
|
raise ArgumentError, "[Parse::Query] `within_sphere` distance must be a positive number."
|
|
2021
2019
|
end
|
|
2022
2020
|
|
|
2023
|
-
radians =
|
|
2024
|
-
case unit
|
|
2021
|
+
radians = case unit
|
|
2025
2022
|
when :radians then distance.to_f
|
|
2026
2023
|
when :km, :kilometers then distance.to_f / KM_PER_RADIAN
|
|
2027
2024
|
when :miles then distance.to_f / MILES_PER_RADIAN
|
|
@@ -2157,8 +2154,7 @@ module Parse
|
|
|
2157
2154
|
# @return [Hash] the compiled constraint.
|
|
2158
2155
|
def build
|
|
2159
2156
|
value = formatted_value
|
|
2160
|
-
point =
|
|
2161
|
-
case value
|
|
2157
|
+
point = case value
|
|
2162
2158
|
when Parse::GeoPoint
|
|
2163
2159
|
{ __type: "GeoPoint", latitude: value.latitude, longitude: value.longitude }
|
|
2164
2160
|
when Array
|
|
@@ -2863,6 +2859,7 @@ module Parse
|
|
|
2863
2859
|
# than access simulation ("what can this principal read").
|
|
2864
2860
|
class ACLReadableByExactConstraint < ACLReadableByConstraint
|
|
2865
2861
|
register :readable_by_exact
|
|
2862
|
+
|
|
2866
2863
|
def strict?
|
|
2867
2864
|
true
|
|
2868
2865
|
end
|
|
@@ -2904,6 +2901,7 @@ module Parse
|
|
|
2904
2901
|
# {ACLReadableByExactConstraint}.
|
|
2905
2902
|
class ACLReadableByRoleExactConstraint < ACLReadableByRoleConstraint
|
|
2906
2903
|
register :readable_by_role_exact
|
|
2904
|
+
|
|
2907
2905
|
def strict?
|
|
2908
2906
|
true
|
|
2909
2907
|
end
|
|
@@ -2956,6 +2954,7 @@ module Parse
|
|
|
2956
2954
|
# {ACLReadableByExactConstraint}.
|
|
2957
2955
|
class ACLWritableByExactConstraint < ACLWritableByConstraint
|
|
2958
2956
|
register :writable_by_exact
|
|
2957
|
+
|
|
2959
2958
|
def strict?
|
|
2960
2959
|
true
|
|
2961
2960
|
end
|
|
@@ -2997,6 +2996,7 @@ module Parse
|
|
|
2997
2996
|
# {ACLReadableByExactConstraint}.
|
|
2998
2997
|
class ACLWritableByRoleExactConstraint < ACLWritableByRoleConstraint
|
|
2999
2998
|
register :writable_by_role_exact
|
|
2999
|
+
|
|
3000
3000
|
def strict?
|
|
3001
3001
|
true
|
|
3002
3002
|
end
|