parse-stack-next 5.6.0 → 5.7.0

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +409 -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 +167 -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/classes/role.rb +227 -28
  75. data/lib/parse/model/classes/user.rb +60 -1
  76. data/lib/parse/model/clp.rb +4 -4
  77. data/lib/parse/model/core/actions.rb +97 -15
  78. data/lib/parse/model/core/create_lock.rb +0 -2
  79. data/lib/parse/model/core/describe.rb +57 -57
  80. data/lib/parse/model/core/embed_managed.rb +21 -23
  81. data/lib/parse/model/core/fetching.rb +2 -0
  82. data/lib/parse/model/core/indexing.rb +14 -14
  83. data/lib/parse/model/core/parse_reference.rb +1 -1
  84. data/lib/parse/model/core/properties.rb +2 -2
  85. data/lib/parse/model/core/querying.rb +1 -1
  86. data/lib/parse/model/core/schema.rb +2 -2
  87. data/lib/parse/model/core/search_indexing.rb +2 -2
  88. data/lib/parse/model/core/vector_searchable.rb +4 -5
  89. data/lib/parse/model/file.rb +21 -15
  90. data/lib/parse/model/geojson.rb +2 -2
  91. data/lib/parse/model/geopoint.rb +1 -0
  92. data/lib/parse/model/object.rb +132 -66
  93. data/lib/parse/model/pointer.rb +2 -0
  94. data/lib/parse/model/polygon.rb +3 -6
  95. data/lib/parse/model/push.rb +2 -2
  96. data/lib/parse/model/vector.rb +3 -1
  97. data/lib/parse/mongodb.rb +512 -282
  98. data/lib/parse/pipeline_security.rb +3 -0
  99. data/lib/parse/query/constraints.rb +46 -46
  100. data/lib/parse/query.rb +146 -59
  101. data/lib/parse/retrieval/agent_tool.rb +34 -20
  102. data/lib/parse/retrieval/chunk.rb +1 -0
  103. data/lib/parse/retrieval/reranker/cohere.rb +11 -11
  104. data/lib/parse/retrieval/reranker.rb +3 -4
  105. data/lib/parse/retrieval/retriever.rb +4 -6
  106. data/lib/parse/schema/index_migrator.rb +26 -26
  107. data/lib/parse/schema/search_index_migrator.rb +19 -19
  108. data/lib/parse/stack/tasks.rb +6 -6
  109. data/lib/parse/stack/version.rb +1 -1
  110. data/lib/parse/stack.rb +10 -10
  111. data/lib/parse/vector_search/hybrid.rb +66 -41
  112. data/lib/parse/vector_search.rb +14 -11
  113. data/lib/parse/webhooks/payload.rb +1 -0
  114. data/lib/parse/webhooks/registration.rb +4 -4
  115. data/lib/parse/webhooks/trigger_audit.rb +50 -49
  116. data/lib/parse/webhooks.rb +22 -4
  117. data/parse-stack-next.gemspec +6 -6
  118. metadata +10 -1
@@ -198,10 +198,10 @@ module Parse
198
198
  },
199
199
 
200
200
  "find_relationship" => ->(args) {
201
- pc = Validators.validate_identifier!(args["parent_class"], "parent_class")
202
- pid = Validators.validate_object_id!(args["parent_id"], "parent_id")
203
- cc = Validators.validate_identifier!(args["child_class"], "child_class")
204
- pf = Validators.validate_identifier!(args["pointer_field"], "pointer_field")
201
+ pc = Validators.validate_identifier!(args["parent_class"], "parent_class")
202
+ pid = Validators.validate_object_id!(args["parent_id"], "parent_id")
203
+ cc = Validators.validate_identifier!(args["child_class"], "child_class")
204
+ pf = Validators.validate_identifier!(args["pointer_field"], "pointer_field")
205
205
  where = { pf => { "__type" => "Pointer", "className" => pc, "objectId" => pid } }
206
206
  "Find #{cc} objects whose #{pf} field points to #{pc} #{pid}. " \
207
207
  "First call count_objects with class_name=\"#{cc}\" and where=#{where.to_json}. " \
@@ -210,7 +210,7 @@ module Parse
210
210
  },
211
211
 
212
212
  "created_in_range" => ->(args) {
213
- cn = Validators.validate_identifier!(args["class_name"], "class_name")
213
+ cn = Validators.validate_identifier!(args["class_name"], "class_name")
214
214
  since = Validators.validate_iso8601!(args["since"], "since")
215
215
  upper = Validators.validate_iso8601!(args["until"], "until", required: false)
216
216
  date_constraint = { "$gte" => { "__type" => "Date", "iso" => since } }
@@ -268,17 +268,17 @@ module Parse
268
268
 
269
269
  if result.is_a?(Hash)
270
270
  description = (result[:description] || result["description"]).to_s
271
- text = (result[:text] || result["text"]).to_s
271
+ text = (result[:text] || result["text"]).to_s
272
272
  else
273
273
  description = "Parse analytics prompt: #{name}"
274
- text = result.to_s
274
+ text = result.to_s
275
275
  end
276
276
 
277
277
  {
278
278
  "description" => description,
279
279
  "messages" => [
280
280
  {
281
- "role" => "user",
281
+ "role" => "user",
282
282
  "content" => { "type" => "text", "text" => text },
283
283
  },
284
284
  ],
@@ -294,9 +294,9 @@ module Parse
294
294
  # Hash with :description and :text keys
295
295
  def register(name:, description:, arguments: [], renderer:)
296
296
  prompt = {
297
- "name" => name.to_s,
297
+ "name" => name.to_s,
298
298
  "description" => description.to_s,
299
- "arguments" => arguments,
299
+ "arguments" => arguments,
300
300
  }
301
301
  REGISTRY_MUTEX.synchronize do
302
302
  @registry[name.to_s] = { prompt: prompt, renderer: renderer }
@@ -160,8 +160,8 @@ module Parse
160
160
  # @param include [Array<String>, nil] pointer includes from the original call
161
161
  # @return [Hash] formatted results
162
162
  def format_query_results(class_name, results, limit:, skip:,
163
- where: nil, keys: nil, order: nil, include: nil,
164
- truncated_include_fields: nil)
163
+ where: nil, keys: nil, order: nil, include: nil,
164
+ truncated_include_fields: nil)
165
165
  total = results.size
166
166
  truncated = total > MAX_RESULTS_DISPLAY
167
167
  has_more = total >= limit
@@ -190,8 +190,7 @@ module Parse
190
190
  # dotted paths (`keys: ["user.iconImage"]`) if it needs fields
191
191
  # that were dropped. Suppress the key when nothing was auto-
192
192
  # projected — keeps the envelope minimal for the common case.
193
- truncated_includes_payload =
194
- if truncated_include_fields && !truncated_include_fields.empty?
193
+ truncated_includes_payload = if truncated_include_fields && !truncated_include_fields.empty?
195
194
  truncated_include_fields.transform_values { |meta| meta[:dropped] }.compact
196
195
  end
197
196
 
@@ -404,6 +403,7 @@ module Parse
404
403
  acc[key] = simplify_value(value)
405
404
  end
406
405
  end
406
+
407
407
  public :simplify_object
408
408
 
409
409
  # Simplify a single value