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.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +489 -0
  3. data/README.md +378 -6
  4. data/docs/caching.md +748 -0
  5. data/examples/basic_client.rb +3 -3
  6. data/examples/basic_server.rb +3 -3
  7. data/examples/live_query_listener.rb +12 -12
  8. data/examples/rag_chatbot.rb +14 -14
  9. data/examples/transaction_example.rb +44 -45
  10. data/examples/webhook_server.rb +3 -3
  11. data/lib/parse/access.rb +493 -0
  12. data/lib/parse/acl_scope.rb +125 -52
  13. data/lib/parse/agent/approval_gate.rb +0 -0
  14. data/lib/parse/agent/cancellation_token.rb +3 -3
  15. data/lib/parse/agent/constraint_translator.rb +4 -4
  16. data/lib/parse/agent/describe.rb +34 -34
  17. data/lib/parse/agent/errors.rb +9 -9
  18. data/lib/parse/agent/mcp_client.rb +61 -59
  19. data/lib/parse/agent/mcp_dispatcher.rb +89 -101
  20. data/lib/parse/agent/mcp_rack_app.rb +92 -93
  21. data/lib/parse/agent/mcp_server.rb +1 -1
  22. data/lib/parse/agent/mcp_subscriptions.rb +22 -22
  23. data/lib/parse/agent/metadata_audit.rb +1 -2
  24. data/lib/parse/agent/metadata_dsl.rb +7 -7
  25. data/lib/parse/agent/metadata_registry.rb +12 -12
  26. data/lib/parse/agent/prompt_hardening.rb +4 -4
  27. data/lib/parse/agent/prompts.rb +10 -10
  28. data/lib/parse/agent/result_formatter.rb +4 -4
  29. data/lib/parse/agent/tools.rb +493 -400
  30. data/lib/parse/agent.rb +157 -116
  31. data/lib/parse/api/hooks.rb +1 -1
  32. data/lib/parse/api/server.rb +2 -2
  33. data/lib/parse/api/users.rb +2 -2
  34. data/lib/parse/atlas_search/index_manager.rb +1 -1
  35. data/lib/parse/atlas_search/session.rb +40 -218
  36. data/lib/parse/atlas_search.rb +181 -60
  37. data/lib/parse/authorization.rb +466 -0
  38. data/lib/parse/cache/invalidation.rb +219 -0
  39. data/lib/parse/cache/keyspace.rb +306 -0
  40. data/lib/parse/cache/moneta_surface.rb +126 -0
  41. data/lib/parse/cache/pool.rb +48 -5
  42. data/lib/parse/cache/redis.rb +425 -10
  43. data/lib/parse/cache/scoped_view.rb +443 -0
  44. data/lib/parse/cache/sub_cache.rb +264 -0
  45. data/lib/parse/cache/upstream_roles.rb +230 -0
  46. data/lib/parse/client/authentication.rb +1 -1
  47. data/lib/parse/client/body_builder.rb +1 -2
  48. data/lib/parse/client/caching.rb +84 -5
  49. data/lib/parse/client.rb +327 -189
  50. data/lib/parse/clp_scope.rb +225 -28
  51. data/lib/parse/console.rb +3 -3
  52. data/lib/parse/embeddings/batch_embedder.rb +3 -3
  53. data/lib/parse/embeddings/cache.rb +17 -17
  54. data/lib/parse/embeddings/cohere.rb +21 -22
  55. data/lib/parse/embeddings/image_fetch.rb +22 -21
  56. data/lib/parse/embeddings/jina.rb +21 -21
  57. data/lib/parse/embeddings/local_http.rb +6 -7
  58. data/lib/parse/embeddings/media_file.rb +5 -4
  59. data/lib/parse/embeddings/openai.rb +5 -5
  60. data/lib/parse/embeddings/provider.rb +1 -1
  61. data/lib/parse/embeddings/qwen.rb +10 -10
  62. data/lib/parse/embeddings/spend_cap.rb +2 -3
  63. data/lib/parse/embeddings/streaming_body.rb +11 -11
  64. data/lib/parse/embeddings/video_source.rb +7 -6
  65. data/lib/parse/embeddings/voyage.rb +59 -61
  66. data/lib/parse/embeddings.rb +28 -27
  67. data/lib/parse/graphql/type_generator.rb +1 -1
  68. data/lib/parse/graphql.rb +5 -5
  69. data/lib/parse/live_query/client.rb +1 -1
  70. data/lib/parse/live_query.rb +1 -1
  71. data/lib/parse/lock.rb +15 -18
  72. data/lib/parse/lock_backend.rb +1 -1
  73. data/lib/parse/lookup_rewriter.rb +6 -6
  74. data/lib/parse/model/associations/belongs_to.rb +4 -0
  75. data/lib/parse/model/associations/collection_proxy.rb +3 -0
  76. data/lib/parse/model/associations/has_many.rb +4 -0
  77. data/lib/parse/model/classes/role.rb +227 -28
  78. data/lib/parse/model/classes/user.rb +60 -1
  79. data/lib/parse/model/clp.rb +4 -4
  80. data/lib/parse/model/core/actions.rb +366 -113
  81. data/lib/parse/model/core/create_lock.rb +0 -2
  82. data/lib/parse/model/core/describe.rb +57 -57
  83. data/lib/parse/model/core/embed_managed.rb +21 -23
  84. data/lib/parse/model/core/fetching.rb +6 -0
  85. data/lib/parse/model/core/indexing.rb +14 -14
  86. data/lib/parse/model/core/parse_reference.rb +1 -1
  87. data/lib/parse/model/core/properties.rb +6 -2
  88. data/lib/parse/model/core/querying.rb +1 -1
  89. data/lib/parse/model/core/schema.rb +2 -2
  90. data/lib/parse/model/core/search_indexing.rb +2 -2
  91. data/lib/parse/model/core/vector_searchable.rb +4 -5
  92. data/lib/parse/model/file.rb +21 -15
  93. data/lib/parse/model/geojson.rb +2 -2
  94. data/lib/parse/model/geopoint.rb +1 -0
  95. data/lib/parse/model/object.rb +136 -66
  96. data/lib/parse/model/pointer.rb +2 -0
  97. data/lib/parse/model/polygon.rb +3 -6
  98. data/lib/parse/model/push.rb +2 -2
  99. data/lib/parse/model/vector.rb +3 -1
  100. data/lib/parse/mongodb.rb +512 -282
  101. data/lib/parse/pipeline_security.rb +3 -0
  102. data/lib/parse/query/constraints.rb +46 -46
  103. data/lib/parse/query.rb +146 -59
  104. data/lib/parse/retrieval/agent_tool.rb +34 -20
  105. data/lib/parse/retrieval/chunk.rb +1 -0
  106. data/lib/parse/retrieval/reranker/cohere.rb +11 -11
  107. data/lib/parse/retrieval/reranker.rb +3 -4
  108. data/lib/parse/retrieval/retriever.rb +4 -6
  109. data/lib/parse/schema/index_migrator.rb +26 -26
  110. data/lib/parse/schema/search_index_migrator.rb +19 -19
  111. data/lib/parse/stack/tasks.rb +6 -6
  112. data/lib/parse/stack/version.rb +1 -1
  113. data/lib/parse/stack.rb +10 -10
  114. data/lib/parse/vector_search/hybrid.rb +66 -41
  115. data/lib/parse/vector_search.rb +14 -11
  116. data/lib/parse/webhooks/payload.rb +1 -0
  117. data/lib/parse/webhooks/registration.rb +4 -4
  118. data/lib/parse/webhooks/trigger_audit.rb +50 -49
  119. data/lib/parse/webhooks.rb +120 -5
  120. data/parse-stack-next.gemspec +6 -6
  121. 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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
904
- "as" => "p",
905
- "in" => "$$p.objectId",
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1000
- "as" => "p",
1001
- "in" => "$$p.objectId",
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1090
- "as" => "p",
1091
- "in" => "$$p.objectId",
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1182
- "as" => "p",
1183
- "in" => "$$p.objectId",
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1348
- "as" => "p",
1349
- "in" => "$$p.objectId",
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1413
- "as" => "p",
1414
- "in" => "$$p.objectId",
1415
- } }, 0] },
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1431
- "as" => "p",
1432
- "in" => "$$p.objectId",
1433
- } }, 0] },
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1494
- "as" => "p",
1495
- "in" => "$$p.objectId",
1496
- } }, -1] },
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
- "input" => { "$ifNull" => ["$#{field_name}", []] },
1512
- "as" => "p",
1513
- "in" => "$$p.objectId",
1514
- } }, -1] },
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
- { @operation.operand => { key => pattern_str } } :
1683
- { @operation.operand => { key => pattern_str, :$options => options } }
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