mirror of
https://github.com/we-promise/sure.git
synced 2026-06-03 17:59:05 +00:00
* feat(ai): add Anthropic provider with chat parity (1/5)
Introduces Provider::Anthropic alongside Provider::Openai, implementing
the LlmConcept chat_response contract over the official anthropic Ruby
SDK. Batch ops, PDF, and RAG land in follow-up PRs.
- Provider::Anthropic uses Messages API for sync and streaming responses
- ChatConfig builds requests with ephemeral prompt-cache markers on the
system prompt and the last tool definition
- MessageFormatter reconstructs multi-turn history (text + tool_use +
tool_result blocks) from raw Message records, including the paired
user-role tool_result turn Anthropic requires after every tool_use
- ChatParser maps Anthropic Message into the shared ChatResponse Data
- Registry, Setting, User, Chat default model wired for ANTHROPIC_*
envs and Setting.anthropic_*; LLM_PROVIDER selects between providers
- Responder forwards raw conversation_history (Array<Message>) so
providers without hosted conversation state can rebuild context
- OpenAI provider accepts and ignores the new kwarg (no behavior change)
Tests cover provider init, model gating, MessageFormatter for all turn
shapes, ChatConfig request building (max_tokens, system cache, tool
conversion), ChatParser for text / tool_use / mixed blocks, Registry
discovery, and mocked chat_response success / error / function_request
paths. Live VCR cassettes recorded in a follow-up with a real key.
Stacked PRs: 2/5 batch ops + cost ledger, 3/5 PDF, 4/5 pgvector RAG,
5/5 settings UI + disclosure.
* fix(ai): address PR review on Anthropic provider foundation
Surface fixes raised by Codex + CodeRabbit on PR 1/5:
- Provider::Anthropic#chat_response now accepts (and ignores) a
`messages:` kwarg. Assistant::Responder passes both `messages:`
(OpenAI-shape) and `conversation_history:` (raw Message records) for
cross-provider parity, so the previous signature raised
ArgumentError on the first chat turn through the Anthropic provider.
- Provider::Anthropic#supports_model? bypasses the `claude` prefix
gate when a custom base_url is configured, mirroring the OpenAI
provider. Bedrock-shaped IDs like
`anthropic.claude-sonnet-4-5-20250929-v1:0` and
`claude-opus-4@20250514` are otherwise rejected by
Assistant::Provided#get_model_provider and the chat dies.
- Setting.anthropic_access_token is now in
EncryptedSettingFields::ENCRYPTED_FIELDS so the Anthropic API key
is encrypted at rest like every other provider secret. Previously
plaintext while siblings (openai_access_token, twelve_data_api_key,
external_assistant_token) were ciphertext.
- Chat.default_model falls back to whichever provider is actually
configured. Previously, with LLM_PROVIDER=anthropic but no
Anthropic credentials, the default model resolved to a Claude ID
that no registered provider supported, so chats failed even when
OpenAI was fully configured. Adds Provider::{Anthropic,Openai}#configured?
class methods for the readable callsite.
- Provider::Anthropic.effective_model uses
`ENV["ANTHROPIC_MODEL"].presence || Setting.anthropic_model` so the
Setting lookup is only performed when the env var is absent — the
previous `ENV.fetch(KEY, default)` evaluated the default arg
eagerly on every call.
- Provider::Anthropic::ChatConfig#anthropic_input_schema strips both
`:strict` and `"strict"` keys so JSON-decoded schemas with string
keys cannot leak the OpenAI-only flag through to Anthropic.
Test coverage added: supports_model? bypass on custom endpoints,
chat_response messages: kwarg compatibility, default_model fallback
in the three credential combinations, configured? against ENV +
Setting, strict-flag stripping for both key types, and a
`Setting.expects(:anthropic_model).never` assertion proving the
ENV-precedence test now exercises the lazy path.
All 4365 tests pass (1 pre-existing libvips env error unrelated).
* test(chat): make default_model tests resilient to ENV model overrides
CodeRabbit flagged on PR review: the new default_model tests asserted
against Provider::*::DEFAULT_MODEL, but Chat.default_model actually
returns Provider::*.effective_model.presence (which reads
OPENAI_MODEL / ANTHROPIC_MODEL from the environment). With either env
var set, the tests would fail intermittently even though routing was
correct.
- New default_model tests now assert against the provider's
effective_model directly, so they verify the routing decision
(which provider's value wins) without coupling to the constant.
- Pre-existing "creates with default model" assertions had the same
brittleness; switch them to compare against Chat.default_model so
the chosen model is whatever the env / Setting cascade resolves to.
Verified by running `ANTHROPIC_MODEL=claude-haiku-4-5 OPENAI_MODEL=gpt-4o
bin/rails test test/models/chat_test.rb` — 16 runs, 0 failures
(previously 2 pre-existing failures + 0 from the new tests).
* fix(ai): address local review on Anthropic foundation
- Provider::Anthropic#supports_pdf_processing? bypasses prefix gate for
custom endpoints, mirroring supports_model?
- Provider::Anthropic#initialize raises Error when custom_endpoint? AND
model.blank?, parity with Provider::Openai
- stream_chat_response captures partial usage on mid-stream errors and
records it via the new on_partial callback so chat_response can skip
the duplicate error row in the outer rescue
- safe_accumulated_message swallows the secondary failure when the SDK
cannot reconstruct a snapshot
- langfuse_client memoizes properly (||= instead of =) so repeated calls
don't churn Langfuse instances
- MessageFormatter sorts tool_calls by created_at then id so the
message array is deterministic across replays; skips tool_calls
missing both provider_call_id and provider_id rather than sending
`id: nil` and getting rejected by Anthropic
- Setting.anthropic_access_token default falls back through
ENV["ANTHROPIC_API_KEY"].presence (was missing .presence, so an
empty-string env value bled through)
- User#openai_configured? / #anthropic_configured? delegate to the
Provider::* class methods — single source of truth
- Assistant::Responder renames the OpenAI-shape history builder
conversation_history → openai_messages_payload so the kwarg name
matches the local method name (messages: openai_messages_payload,
conversation_history: chat_message_records)
- Assistant::Builtin stale-history comment updated to reference both
builders
Adds a streaming chat_response test using ad-hoc subclasses of the
SDK event types so the case/when dispatch matches via is_a? without
stubbing class-level === behavior.
* test(ai): add Anthropic tool_use round-trip + multi-tool turn coverage
Addresses @jjmata's "worth confirming" note on PR #1983: tool-use turns
from prior assistant messages must round-trip correctly when retrieved
from the database.
- New `ChatParser → ToolCall::Function → MessageFormatter` test walks
the full path: Anthropic response with a tool_use block →
ChatFunctionRequest → ToolCall::Function.from_function_request →
persisted on the AssistantMessage → MessageFormatter rebuild on the
next turn. Asserts the original `tool_use.id` is preserved end-to-end
as both `tool_use.id` and the paired `tool_result.tool_use_id`, and
that the original `input` hash and serialized result content survive.
- New multi-tool assistant turn test confirms two tool_use blocks on a
single assistant message render as two tool_use blocks followed by
two paired tool_result blocks in a single user-role follow-up,
matching Anthropic's required alternation.
Both tests exercise the existing PR1 code without behavior changes.
* test(ai): require "ostruct" explicitly in Anthropic provider tests
OpenStruct is moving out of Ruby's default load path (warning in 3.4+,
removed in 3.5+). Tests work today because ActiveSupport transitively
loads it, but that's incidental. Match the existing convention in
test/controllers/settings/hostings_controller_test.rb which explicitly
requires ostruct for the same reason.
* fix(ai): sanitize Langfuse warn logs, normalize tool_use.input, dedup history fetch
Addresses three open CodeRabbit findings on PR #1983.
- Provider::Anthropic Langfuse rescue branches no longer include
`e.full_message` in `Rails.logger.warn`. `full_message` bundles the
backtrace + cause chain and on some SDK error types includes the
serialized request/response payload (prompt, model output). Logs
now report `#{e.class}: #{e.message}` only. Three sites:
create_langfuse_trace, log_langfuse_generation, upsert_langfuse_trace.
Note: Provider::Openai has the same pattern (copy-pasted source) —
harmonization deferred to a follow-up cleanup PR; this commit fixes
only the Anthropic provider to keep PR scope tight.
- MessageFormatter#parse_arguments now coerces any non-Hash parsed
result to `{}`. Anthropic's Messages API requires `tool_use.input`
to be a JSON object (map); a stored ToolCall::Function record whose
arguments parse to a scalar, bool, or array (corrupt row, legacy
data, cross-provider bleed) would otherwise produce a payload the
API rejects. Normal flow stores Hash arguments end-to-end so the
fix is defensive — adds 2 tests covering scalar/array JSON strings
and non-String non-Hash inputs.
- Assistant::Responder dedups the chat-history fetch. The previous
layout fired two near-identical `chat.messages.where(...).includes(
:tool_calls).ordered` queries per LLM turn (one for the OpenAI-shape
payload, one for the raw-records kwarg). A new memoized
`complete_chat_messages` fetches once; `chat_message_records` filters
out the current message via `Array#reject`, `openai_messages_payload`
iterates the cached array unchanged. One SQL query per turn instead
of two. Memoization scope = single Responder instance (per LLM call),
so cache invalidation is not a concern.
All 4370 tests pass (1 pre-existing libvips env error unrelated).
Rubocop + brakeman clean.
* fix(ci): replace sk-ant- prefixed test placeholders
Pipelock secret scanner pattern-matches `sk-ant-*` as a real Anthropic
API key and fails the PR security-scan check. Test stubs and
ClimateControl env values used `sk-ant-test`, `sk-ant-from-setting`,
`sk-ant-x`, `sk-ant-y` as obvious placeholders, but the scanner does
not care about value entropy.
Switched to `fake-anthropic-key-*` / `fake-token-*` strings so the
scanner stops flagging them. No production code touched, no behavior
change — Provider::Anthropic still accepts any non-blank token.
968 lines
23 KiB
Plaintext
968 lines
23 KiB
Plaintext
GEM
|
|
remote: https://rubygems.org/
|
|
specs:
|
|
Ascii85 (2.0.1)
|
|
aasm (5.5.1)
|
|
concurrent-ruby (~> 1.0)
|
|
actioncable (7.2.3.1)
|
|
actionpack (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
nio4r (~> 2.0)
|
|
websocket-driver (>= 0.6.1)
|
|
zeitwerk (~> 2.6)
|
|
actionmailbox (7.2.3.1)
|
|
actionpack (= 7.2.3.1)
|
|
activejob (= 7.2.3.1)
|
|
activerecord (= 7.2.3.1)
|
|
activestorage (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
mail (>= 2.8.0)
|
|
actionmailer (7.2.3.1)
|
|
actionpack (= 7.2.3.1)
|
|
actionview (= 7.2.3.1)
|
|
activejob (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
mail (>= 2.8.0)
|
|
rails-dom-testing (~> 2.2)
|
|
actionpack (7.2.3.1)
|
|
actionview (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
cgi
|
|
nokogiri (>= 1.8.5)
|
|
racc
|
|
rack (>= 2.2.4, < 3.3)
|
|
rack-session (>= 1.0.1)
|
|
rack-test (>= 0.6.3)
|
|
rails-dom-testing (~> 2.2)
|
|
rails-html-sanitizer (~> 1.6)
|
|
useragent (~> 0.16)
|
|
actiontext (7.2.3.1)
|
|
actionpack (= 7.2.3.1)
|
|
activerecord (= 7.2.3.1)
|
|
activestorage (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
globalid (>= 0.6.0)
|
|
nokogiri (>= 1.8.5)
|
|
actionview (7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
builder (~> 3.1)
|
|
cgi
|
|
erubi (~> 1.11)
|
|
rails-dom-testing (~> 2.2)
|
|
rails-html-sanitizer (~> 1.6)
|
|
activejob (7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
globalid (>= 0.3.6)
|
|
activemodel (7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
activerecord (7.2.3.1)
|
|
activemodel (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
timeout (>= 0.4.0)
|
|
activerecord-import (2.2.0)
|
|
activerecord (>= 4.2)
|
|
activestorage (7.2.3.1)
|
|
actionpack (= 7.2.3.1)
|
|
activejob (= 7.2.3.1)
|
|
activerecord (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
marcel (~> 1.0)
|
|
activesupport (7.2.3.1)
|
|
base64
|
|
benchmark (>= 0.3)
|
|
bigdecimal
|
|
concurrent-ruby (~> 1.0, >= 1.3.1)
|
|
connection_pool (>= 2.2.5)
|
|
drb
|
|
i18n (>= 1.6, < 2)
|
|
logger (>= 1.4.2)
|
|
minitest (>= 5.1, < 6)
|
|
securerandom (>= 0.3)
|
|
tzinfo (~> 2.0, >= 2.0.5)
|
|
addressable (2.8.7)
|
|
public_suffix (>= 2.0.2, < 7.0)
|
|
aes_key_wrap (1.1.0)
|
|
afm (1.0.0)
|
|
after_commit_everywhere (1.6.0)
|
|
activerecord (>= 4.2)
|
|
activesupport
|
|
android_key_attestation (0.3.0)
|
|
anthropic (1.43.0)
|
|
cgi
|
|
connection_pool
|
|
standardwebhooks
|
|
ast (2.4.3)
|
|
attr_required (1.0.2)
|
|
aws-eventstream (1.4.0)
|
|
aws-partitions (1.1196.0)
|
|
aws-sdk-core (3.240.0)
|
|
aws-eventstream (~> 1, >= 1.3.0)
|
|
aws-partitions (~> 1, >= 1.992.0)
|
|
aws-sigv4 (~> 1.9)
|
|
base64
|
|
bigdecimal
|
|
jmespath (~> 1, >= 1.6.1)
|
|
logger
|
|
aws-sdk-kms (1.118.0)
|
|
aws-sdk-core (~> 3, >= 3.239.1)
|
|
aws-sigv4 (~> 1.5)
|
|
aws-sdk-s3 (1.208.0)
|
|
aws-sdk-core (~> 3, >= 3.234.0)
|
|
aws-sdk-kms (~> 1)
|
|
aws-sigv4 (~> 1.5)
|
|
aws-sigv4 (1.12.1)
|
|
aws-eventstream (~> 1, >= 1.0.2)
|
|
base64 (0.3.0)
|
|
bcrypt (3.1.22)
|
|
benchmark (0.5.0)
|
|
benchmark-ips (2.14.0)
|
|
better_html (2.1.1)
|
|
actionview (>= 6.0)
|
|
activesupport (>= 6.0)
|
|
ast (~> 2.0)
|
|
erubi (~> 1.4)
|
|
parser (>= 2.4)
|
|
smart_properties
|
|
bigdecimal (3.3.1)
|
|
bindata (2.5.1)
|
|
bindex (0.8.1)
|
|
bootsnap (1.18.6)
|
|
msgpack (~> 1.2)
|
|
brakeman (7.1.2)
|
|
racc
|
|
builder (3.3.0)
|
|
capybara (3.40.0)
|
|
addressable
|
|
matrix
|
|
mini_mime (>= 0.1.3)
|
|
nokogiri (~> 1.11)
|
|
rack (>= 1.6.0)
|
|
rack-test (>= 0.6.3)
|
|
regexp_parser (>= 1.5, < 3.0)
|
|
xpath (~> 3.2)
|
|
cbor (0.5.10.2)
|
|
cgi (0.5.1)
|
|
childprocess (5.1.0)
|
|
logger (~> 1.5)
|
|
chunky_png (1.4.0)
|
|
climate_control (1.2.0)
|
|
concurrent-ruby (1.3.6)
|
|
connection_pool (2.5.5)
|
|
cose (1.3.1)
|
|
cbor (~> 0.5.9)
|
|
openssl-signature_algorithm (~> 1.0)
|
|
countries (8.0.3)
|
|
unaccent (~> 0.3)
|
|
crack (1.0.0)
|
|
bigdecimal
|
|
rexml
|
|
crass (1.0.6)
|
|
cronex (0.15.0)
|
|
tzinfo
|
|
unicode (>= 0.4.4.5)
|
|
css_parser (1.21.1)
|
|
addressable
|
|
csv (3.3.5)
|
|
date (3.4.1)
|
|
debug (1.11.0)
|
|
irb (~> 1.10)
|
|
reline (>= 0.3.8)
|
|
declarative (0.0.20)
|
|
derailed_benchmarks (2.2.1)
|
|
base64
|
|
benchmark-ips (~> 2)
|
|
bigdecimal
|
|
drb
|
|
get_process_mem
|
|
heapy (~> 0)
|
|
logger
|
|
memory_profiler (>= 0, < 2)
|
|
mini_histogram (>= 0.3.0)
|
|
mutex_m
|
|
ostruct
|
|
rack (>= 1)
|
|
rack-test
|
|
rake (> 10, < 14)
|
|
ruby-statistics (>= 4.0.1)
|
|
ruby2_keywords
|
|
thor (>= 0.19, < 2)
|
|
diff-lcs (1.6.2)
|
|
digest-crc (0.7.0)
|
|
rake (>= 12.0.0, < 14.0.0)
|
|
docile (1.4.1)
|
|
doorkeeper (5.8.2)
|
|
railties (>= 5)
|
|
dotenv (3.1.8)
|
|
dotenv-rails (3.1.8)
|
|
dotenv (= 3.1.8)
|
|
railties (>= 6.1)
|
|
drb (2.2.3)
|
|
ed25519 (1.4.0)
|
|
email_validator (2.2.4)
|
|
activemodel
|
|
erb (5.0.1)
|
|
erb_lint (0.9.0)
|
|
activesupport
|
|
better_html (>= 2.0.1)
|
|
parser (>= 2.7.1.4)
|
|
rainbow
|
|
rubocop (>= 1)
|
|
smart_properties
|
|
erubi (1.13.1)
|
|
et-orbi (1.2.11)
|
|
tzinfo
|
|
event_stream_parser (1.0.0)
|
|
faker (3.5.2)
|
|
i18n (>= 1.8.11, < 2)
|
|
faraday (2.14.1)
|
|
faraday-net_http (>= 2.0, < 3.5)
|
|
json
|
|
logger
|
|
faraday-follow_redirects (0.3.0)
|
|
faraday (>= 1, < 3)
|
|
faraday-multipart (1.1.1)
|
|
multipart-post (~> 2.0)
|
|
faraday-net_http (3.4.2)
|
|
net-http (~> 0.5)
|
|
faraday-retry (2.3.2)
|
|
faraday (~> 2.0)
|
|
ffi (1.17.2-aarch64-linux-gnu)
|
|
ffi (1.17.2-aarch64-linux-musl)
|
|
ffi (1.17.2-arm-linux-gnu)
|
|
ffi (1.17.2-arm-linux-musl)
|
|
ffi (1.17.2-arm64-darwin)
|
|
ffi (1.17.2-x86_64-darwin)
|
|
ffi (1.17.2-x86_64-linux-gnu)
|
|
ffi (1.17.2-x86_64-linux-musl)
|
|
foreman (0.88.1)
|
|
fugit (1.11.1)
|
|
et-orbi (~> 1, >= 1.2.11)
|
|
raabro (~> 1.4)
|
|
get_process_mem (1.0.0)
|
|
bigdecimal (>= 2.0)
|
|
ffi (~> 1.0)
|
|
globalid (1.3.0)
|
|
activesupport (>= 6.1)
|
|
google-apis-core (1.0.2)
|
|
addressable (~> 2.8, >= 2.8.7)
|
|
faraday (~> 2.13)
|
|
faraday-follow_redirects (~> 0.3)
|
|
googleauth (~> 1.14)
|
|
mini_mime (~> 1.1)
|
|
representable (~> 3.0)
|
|
retriable (~> 3.1)
|
|
google-apis-iamcredentials_v1 (0.26.0)
|
|
google-apis-core (>= 0.15.0, < 2.a)
|
|
google-apis-storage_v1 (0.61.0)
|
|
google-apis-core (>= 0.15.0, < 2.a)
|
|
google-cloud-core (1.8.0)
|
|
google-cloud-env (>= 1.0, < 3.a)
|
|
google-cloud-errors (~> 1.0)
|
|
google-cloud-env (2.3.1)
|
|
base64 (~> 0.2)
|
|
faraday (>= 1.0, < 3.a)
|
|
google-cloud-errors (1.6.0)
|
|
google-cloud-storage (1.59.0)
|
|
addressable (~> 2.8)
|
|
digest-crc (~> 0.4)
|
|
google-apis-core (>= 0.18, < 2)
|
|
google-apis-iamcredentials_v1 (~> 0.18)
|
|
google-apis-storage_v1 (>= 0.42)
|
|
google-cloud-core (~> 1.6)
|
|
googleauth (~> 1.9)
|
|
mini_mime (~> 1.0)
|
|
google-logging-utils (0.2.0)
|
|
googleauth (1.16.2)
|
|
faraday (>= 1.0, < 3.a)
|
|
google-cloud-env (~> 2.2)
|
|
google-logging-utils (~> 0.1)
|
|
jwt (>= 1.4, < 4.0)
|
|
multi_json (~> 1.11)
|
|
os (>= 0.9, < 2.0)
|
|
signet (>= 0.16, < 2.a)
|
|
hashdiff (1.2.0)
|
|
hashery (2.1.2)
|
|
hashie (5.0.0)
|
|
heapy (0.2.0)
|
|
thor
|
|
highline (3.1.2)
|
|
reline
|
|
hotwire-livereload (2.0.0)
|
|
actioncable (>= 7.0.0)
|
|
listen (>= 3.0.0)
|
|
railties (>= 7.0.0)
|
|
hotwire_combobox (0.4.0)
|
|
platform_agent (>= 1.0.1)
|
|
rails (>= 7.0.7.2)
|
|
stimulus-rails (>= 1.2)
|
|
turbo-rails (>= 1.2)
|
|
htmlbeautifier (1.4.3)
|
|
htmlentities (4.3.4)
|
|
httparty (0.24.0)
|
|
csv
|
|
mini_mime (>= 1.0.0)
|
|
multi_xml (>= 0.5.2)
|
|
i18n (1.14.8)
|
|
concurrent-ruby (~> 1.0)
|
|
i18n-tasks (1.0.15)
|
|
activesupport (>= 4.0.2)
|
|
ast (>= 2.1.0)
|
|
erubi
|
|
highline (>= 2.0.0)
|
|
i18n
|
|
parser (>= 3.2.2.1)
|
|
rails-i18n
|
|
rainbow (>= 2.2.2, < 4.0)
|
|
ruby-progressbar (~> 1.8, >= 1.8.1)
|
|
terminal-table (>= 1.5.1)
|
|
image_processing (1.14.0)
|
|
mini_magick (>= 4.9.5, < 6)
|
|
ruby-vips (>= 2.0.17, < 3)
|
|
importmap-rails (2.1.0)
|
|
actionpack (>= 6.0.0)
|
|
activesupport (>= 6.0.0)
|
|
railties (>= 6.0.0)
|
|
inline_svg (1.10.0)
|
|
activesupport (>= 3.0)
|
|
nokogiri (>= 1.6)
|
|
io-console (0.8.0)
|
|
irb (1.15.2)
|
|
pp (>= 0.6.0)
|
|
rdoc (>= 4.0.0)
|
|
reline (>= 0.4.2)
|
|
jbuilder (2.13.0)
|
|
actionview (>= 5.0.0)
|
|
activesupport (>= 5.0.0)
|
|
jmespath (1.6.2)
|
|
json (2.19.2)
|
|
json-jwt (1.16.7)
|
|
activesupport (>= 4.2)
|
|
aes_key_wrap
|
|
base64
|
|
bindata
|
|
faraday (~> 2.0)
|
|
faraday-follow_redirects
|
|
json-schema (5.2.2)
|
|
addressable (~> 2.8)
|
|
bigdecimal (~> 3.1)
|
|
jwt (2.10.2)
|
|
base64
|
|
langfuse-ruby (0.1.4)
|
|
concurrent-ruby (~> 1.0)
|
|
faraday (>= 1.8, < 3.0)
|
|
faraday-net_http (>= 1.0, < 4.0)
|
|
json (~> 2.0)
|
|
language_server-protocol (3.17.0.5)
|
|
launchy (3.1.1)
|
|
addressable (~> 2.8)
|
|
childprocess (~> 5.0)
|
|
logger (~> 1.6)
|
|
letter_opener (1.10.0)
|
|
launchy (>= 2.2, < 4)
|
|
lint_roller (1.1.0)
|
|
listen (3.9.0)
|
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
|
rb-inotify (~> 0.9, >= 0.9.10)
|
|
logger (1.7.0)
|
|
logtail (0.1.17)
|
|
msgpack (~> 1.0)
|
|
logtail-rack (0.2.6)
|
|
logtail (~> 0.1)
|
|
rack (>= 1.2, < 4.0)
|
|
logtail-rails (0.2.10)
|
|
actionpack (>= 5.0.0)
|
|
activerecord (>= 5.0.0)
|
|
logtail (~> 0.1, >= 0.1.14)
|
|
logtail-rack (~> 0.1)
|
|
railties (>= 5.0.0)
|
|
loofah (2.25.1)
|
|
crass (~> 1.0.2)
|
|
nokogiri (>= 1.12.0)
|
|
lookbook (2.3.11)
|
|
activemodel
|
|
css_parser
|
|
htmlbeautifier (~> 1.3)
|
|
htmlentities (~> 4.3.4)
|
|
marcel (~> 1.0)
|
|
railties (>= 5.0)
|
|
redcarpet (~> 3.5)
|
|
rouge (>= 3.26, < 5.0)
|
|
view_component (>= 2.0)
|
|
yard (~> 0.9)
|
|
zeitwerk (~> 2.5)
|
|
lucide-rails (0.7.3)
|
|
railties (>= 4.1.0)
|
|
mail (2.8.1)
|
|
mini_mime (>= 0.1.1)
|
|
net-imap
|
|
net-pop
|
|
net-smtp
|
|
marcel (1.1.0)
|
|
matrix (0.4.2)
|
|
memory_profiler (1.1.0)
|
|
method_source (1.1.0)
|
|
mini_histogram (0.3.1)
|
|
mini_magick (5.2.0)
|
|
benchmark
|
|
logger
|
|
mini_mime (1.1.5)
|
|
minitest (5.27.0)
|
|
mocha (2.7.1)
|
|
ruby2_keywords (>= 0.0.5)
|
|
msgpack (1.8.0)
|
|
multi_json (1.20.1)
|
|
multi_xml (0.8.0)
|
|
bigdecimal (>= 3.1, < 5)
|
|
multipart-post (2.4.1)
|
|
mutex_m (0.3.0)
|
|
net-http (0.9.1)
|
|
uri (>= 0.11.1)
|
|
net-imap (0.5.8)
|
|
date
|
|
net-protocol
|
|
net-pop (0.1.2)
|
|
net-protocol
|
|
net-protocol (0.2.2)
|
|
timeout
|
|
net-smtp (0.5.1)
|
|
net-protocol
|
|
nio4r (2.7.4)
|
|
nokogiri (1.19.2-aarch64-linux-gnu)
|
|
racc (~> 1.4)
|
|
nokogiri (1.19.2-aarch64-linux-musl)
|
|
racc (~> 1.4)
|
|
nokogiri (1.19.2-arm-linux-gnu)
|
|
racc (~> 1.4)
|
|
nokogiri (1.19.2-arm-linux-musl)
|
|
racc (~> 1.4)
|
|
nokogiri (1.19.2-arm64-darwin)
|
|
racc (~> 1.4)
|
|
nokogiri (1.19.2-x86_64-darwin)
|
|
racc (~> 1.4)
|
|
nokogiri (1.19.2-x86_64-linux-gnu)
|
|
racc (~> 1.4)
|
|
nokogiri (1.19.2-x86_64-linux-musl)
|
|
racc (~> 1.4)
|
|
oauth2 (2.0.18)
|
|
faraday (>= 0.17.3, < 4.0)
|
|
jwt (>= 1.0, < 4.0)
|
|
logger (~> 1.2)
|
|
multi_xml (~> 0.5)
|
|
rack (>= 1.2, < 4)
|
|
snaky_hash (~> 2.0, >= 2.0.3)
|
|
version_gem (~> 1.1, >= 1.1.9)
|
|
octokit (10.0.0)
|
|
faraday (>= 1, < 3)
|
|
sawyer (~> 0.9)
|
|
omniauth (2.1.3)
|
|
hashie (>= 3.4.6)
|
|
rack (>= 2.2.3)
|
|
rack-protection
|
|
omniauth-github (2.0.1)
|
|
omniauth (~> 2.0)
|
|
omniauth-oauth2 (~> 1.8)
|
|
omniauth-google-oauth2 (1.2.1)
|
|
jwt (>= 2.9.2)
|
|
oauth2 (~> 2.0)
|
|
omniauth (~> 2.0)
|
|
omniauth-oauth2 (~> 1.8)
|
|
omniauth-oauth2 (1.8.0)
|
|
oauth2 (>= 1.4, < 3)
|
|
omniauth (~> 2.0)
|
|
omniauth-rails_csrf_protection (1.0.2)
|
|
actionpack (>= 4.2)
|
|
omniauth (~> 2.0)
|
|
omniauth-saml (2.2.4)
|
|
omniauth (~> 2.1)
|
|
ruby-saml (~> 1.18)
|
|
omniauth_openid_connect (0.8.0)
|
|
omniauth (>= 1.9, < 3)
|
|
openid_connect (~> 2.2)
|
|
openid_connect (2.3.1)
|
|
activemodel
|
|
attr_required (>= 1.0.0)
|
|
email_validator
|
|
faraday (~> 2.0)
|
|
faraday-follow_redirects
|
|
json-jwt (>= 1.16)
|
|
mail
|
|
rack-oauth2 (~> 2.2)
|
|
swd (~> 2.0)
|
|
tzinfo
|
|
validate_url
|
|
webfinger (~> 2.0)
|
|
openssl (4.0.1)
|
|
openssl-signature_algorithm (1.3.0)
|
|
openssl (> 2.0)
|
|
os (1.1.4)
|
|
ostruct (0.6.2)
|
|
pagy (9.3.5)
|
|
parallel (1.27.0)
|
|
parser (3.3.10.2)
|
|
ast (~> 2.4.1)
|
|
racc
|
|
pdf-reader (2.15.1)
|
|
Ascii85 (>= 1.0, < 3.0, != 2.0.0)
|
|
afm (>= 0.2.1, < 2)
|
|
hashery (~> 2.0)
|
|
ruby-rc4
|
|
ttfunk
|
|
pg (1.5.9)
|
|
plaid (41.0.0)
|
|
faraday (>= 1.0.1, < 3.0)
|
|
faraday-multipart (>= 1.0.1, < 2.0)
|
|
platform_agent (1.0.1)
|
|
activesupport (>= 5.2.0)
|
|
useragent (~> 0.16.3)
|
|
posthog-ruby (3.3.3)
|
|
concurrent-ruby (~> 1)
|
|
pp (0.6.2)
|
|
prettyprint
|
|
prettyprint (0.2.0)
|
|
prism (1.4.0)
|
|
propshaft (1.1.0)
|
|
actionpack (>= 7.0.0)
|
|
activesupport (>= 7.0.0)
|
|
rack
|
|
railties (>= 7.0.0)
|
|
psych (5.2.6)
|
|
date
|
|
stringio
|
|
public_suffix (6.0.2)
|
|
puma (6.6.0)
|
|
nio4r (~> 2.0)
|
|
pundit (2.5.2)
|
|
activesupport (>= 3.0.0)
|
|
raabro (1.4.0)
|
|
racc (1.8.1)
|
|
rack (3.2.6)
|
|
rack-attack (6.7.0)
|
|
rack (>= 1.0, < 4)
|
|
rack-cors (3.0.0)
|
|
logger
|
|
rack (>= 3.0.14)
|
|
rack-mini-profiler (4.0.0)
|
|
rack (>= 1.2.0)
|
|
rack-oauth2 (2.2.1)
|
|
activesupport
|
|
attr_required
|
|
faraday (~> 2.0)
|
|
faraday-follow_redirects
|
|
json-jwt (>= 1.11.0)
|
|
rack (>= 2.1.0)
|
|
rack-protection (4.1.1)
|
|
base64 (>= 0.1.0)
|
|
logger (>= 1.6.0)
|
|
rack (>= 3.0.0, < 4)
|
|
rack-session (2.1.2)
|
|
base64 (>= 0.1.0)
|
|
rack (>= 3.0.0)
|
|
rack-test (2.2.0)
|
|
rack (>= 1.3)
|
|
rackup (2.2.1)
|
|
rack (>= 3)
|
|
rails (7.2.3.1)
|
|
actioncable (= 7.2.3.1)
|
|
actionmailbox (= 7.2.3.1)
|
|
actionmailer (= 7.2.3.1)
|
|
actionpack (= 7.2.3.1)
|
|
actiontext (= 7.2.3.1)
|
|
actionview (= 7.2.3.1)
|
|
activejob (= 7.2.3.1)
|
|
activemodel (= 7.2.3.1)
|
|
activerecord (= 7.2.3.1)
|
|
activestorage (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
bundler (>= 1.15.0)
|
|
railties (= 7.2.3.1)
|
|
rails-dom-testing (2.3.0)
|
|
activesupport (>= 5.0.0)
|
|
minitest
|
|
nokogiri (>= 1.6)
|
|
rails-html-sanitizer (1.7.0)
|
|
loofah (~> 2.25)
|
|
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
|
rails-i18n (7.0.10)
|
|
i18n (>= 0.7, < 2)
|
|
railties (>= 6.0.0, < 8)
|
|
rails-settings-cached (2.9.6)
|
|
activerecord (>= 5.0.0)
|
|
railties (>= 5.0.0)
|
|
railties (7.2.3.1)
|
|
actionpack (= 7.2.3.1)
|
|
activesupport (= 7.2.3.1)
|
|
cgi
|
|
irb (~> 1.13)
|
|
rackup (>= 1.0.0)
|
|
rake (>= 12.2)
|
|
thor (~> 1.0, >= 1.2.2)
|
|
tsort (>= 0.2)
|
|
zeitwerk (~> 2.6)
|
|
rainbow (3.1.1)
|
|
rake (13.3.0)
|
|
rb-fsevent (0.11.2)
|
|
rb-inotify (0.11.1)
|
|
ffi (~> 1.0)
|
|
rbs (3.9.4)
|
|
logger
|
|
rchardet (1.10.0)
|
|
rdoc (6.14.2)
|
|
erb
|
|
psych (>= 4.0.0)
|
|
redcarpet (3.6.1)
|
|
redis (5.4.0)
|
|
redis-client (>= 0.22.0)
|
|
redis-client (0.25.0)
|
|
connection_pool
|
|
regexp_parser (2.10.0)
|
|
reline (0.6.1)
|
|
io-console (~> 0.5)
|
|
representable (3.2.0)
|
|
declarative (< 0.1.0)
|
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
|
uber (< 0.2.0)
|
|
retriable (3.4.1)
|
|
rexml (3.4.2)
|
|
rotp (6.3.0)
|
|
rouge (4.5.2)
|
|
rqrcode (3.1.0)
|
|
chunky_png (~> 1.0)
|
|
rqrcode_core (~> 2.0)
|
|
rqrcode_core (2.0.0)
|
|
rspec-core (3.13.6)
|
|
rspec-support (~> 3.13.0)
|
|
rspec-expectations (3.13.5)
|
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
rspec-support (~> 3.13.0)
|
|
rspec-mocks (3.13.6)
|
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
rspec-support (~> 3.13.0)
|
|
rspec-rails (8.0.2)
|
|
actionpack (>= 7.2)
|
|
activesupport (>= 7.2)
|
|
railties (>= 7.2)
|
|
rspec-core (~> 3.13)
|
|
rspec-expectations (~> 3.13)
|
|
rspec-mocks (~> 3.13)
|
|
rspec-support (~> 3.13)
|
|
rspec-support (3.13.6)
|
|
rswag-api (2.16.0)
|
|
activesupport (>= 5.2, < 8.1)
|
|
railties (>= 5.2, < 8.1)
|
|
rswag-specs (2.16.0)
|
|
activesupport (>= 5.2, < 8.1)
|
|
json-schema (>= 2.2, < 6.0)
|
|
railties (>= 5.2, < 8.1)
|
|
rspec-core (>= 2.14)
|
|
rswag-ui (2.16.0)
|
|
actionpack (>= 5.2, < 8.1)
|
|
railties (>= 5.2, < 8.1)
|
|
rubocop (1.76.1)
|
|
json (~> 2.3)
|
|
language_server-protocol (~> 3.17.0.2)
|
|
lint_roller (~> 1.1.0)
|
|
parallel (~> 1.10)
|
|
parser (>= 3.3.0.2)
|
|
rainbow (>= 2.2.2, < 4.0)
|
|
regexp_parser (>= 2.9.3, < 3.0)
|
|
rubocop-ast (>= 1.45.0, < 2.0)
|
|
ruby-progressbar (~> 1.7)
|
|
unicode-display_width (>= 2.4.0, < 4.0)
|
|
rubocop-ast (1.45.1)
|
|
parser (>= 3.3.7.2)
|
|
prism (~> 1.4)
|
|
rubocop-performance (1.25.0)
|
|
lint_roller (~> 1.1)
|
|
rubocop (>= 1.75.0, < 2.0)
|
|
rubocop-ast (>= 1.38.0, < 2.0)
|
|
rubocop-rails (2.32.0)
|
|
activesupport (>= 4.2.0)
|
|
lint_roller (~> 1.1)
|
|
rack (>= 1.1)
|
|
rubocop (>= 1.75.0, < 2.0)
|
|
rubocop-ast (>= 1.44.0, < 2.0)
|
|
rubocop-rails-omakase (1.1.0)
|
|
rubocop (>= 1.72)
|
|
rubocop-performance (>= 1.24)
|
|
rubocop-rails (>= 2.30)
|
|
ruby-lsp (0.26.9)
|
|
language_server-protocol (~> 3.17.0)
|
|
prism (>= 1.2, < 2.0)
|
|
rbs (>= 3, < 5)
|
|
ruby-lsp-rails (0.4.8)
|
|
ruby-lsp (>= 0.26.0, < 0.27.0)
|
|
ruby-openai (8.1.0)
|
|
event_stream_parser (>= 0.3.0, < 2.0.0)
|
|
faraday (>= 1)
|
|
faraday-multipart (>= 1)
|
|
ruby-progressbar (1.13.0)
|
|
ruby-rc4 (0.1.5)
|
|
ruby-saml (1.18.1)
|
|
nokogiri (>= 1.13.10)
|
|
rexml
|
|
ruby-statistics (4.1.0)
|
|
ruby-vips (2.2.4)
|
|
ffi (~> 1.12)
|
|
logger
|
|
ruby2_keywords (0.0.5)
|
|
rubyzip (2.4.1)
|
|
safety_net_attestation (0.5.0)
|
|
jwt (>= 2.0, < 4.0)
|
|
sawyer (0.9.2)
|
|
addressable (>= 2.3.5)
|
|
faraday (>= 0.17.3, < 3)
|
|
securerandom (0.4.1)
|
|
selenium-webdriver (4.34.0)
|
|
base64 (~> 0.2)
|
|
logger (~> 1.4)
|
|
rexml (~> 3.2, >= 3.2.5)
|
|
rubyzip (>= 1.2.2, < 3.0)
|
|
websocket (~> 1.0)
|
|
sentry-rails (5.26.0)
|
|
railties (>= 5.0)
|
|
sentry-ruby (~> 5.26.0)
|
|
sentry-ruby (5.26.0)
|
|
bigdecimal
|
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
sentry-sidekiq (5.26.0)
|
|
sentry-ruby (~> 5.26.0)
|
|
sidekiq (>= 3.0)
|
|
sidekiq (8.0.5)
|
|
connection_pool (>= 2.5.0)
|
|
json (>= 2.9.0)
|
|
logger (>= 1.6.2)
|
|
rack (>= 3.1.0)
|
|
redis-client (>= 0.23.2)
|
|
sidekiq-cron (2.3.0)
|
|
cronex (>= 0.13.0)
|
|
fugit (~> 1.8, >= 1.11.1)
|
|
globalid (>= 1.0.1)
|
|
sidekiq (>= 6.5.0)
|
|
sidekiq-unique-jobs (8.0.11)
|
|
concurrent-ruby (~> 1.0, >= 1.0.5)
|
|
sidekiq (>= 7.0.0, < 9.0.0)
|
|
thor (>= 1.0, < 3.0)
|
|
signet (0.21.0)
|
|
addressable (~> 2.8)
|
|
faraday (>= 0.17.5, < 3.a)
|
|
jwt (>= 1.5, < 4.0)
|
|
multi_json (~> 1.10)
|
|
simplecov (0.22.0)
|
|
docile (~> 1.1)
|
|
simplecov-html (~> 0.11)
|
|
simplecov_json_formatter (~> 0.1)
|
|
simplecov-html (0.13.1)
|
|
simplecov_json_formatter (0.1.4)
|
|
skylight (6.0.4)
|
|
activesupport (>= 5.2.0)
|
|
smart_properties (1.17.0)
|
|
snaky_hash (2.0.3)
|
|
hashie (>= 0.1.0, < 6)
|
|
version_gem (>= 1.1.8, < 3)
|
|
snaptrade (2.0.156)
|
|
faraday (>= 1.0.1, < 3.0)
|
|
faraday-multipart (~> 1.0, >= 1.0.4)
|
|
stackprof (0.2.27)
|
|
standardwebhooks (1.1.0)
|
|
stimulus-rails (1.3.4)
|
|
railties (>= 6.0.0)
|
|
stringio (3.1.7)
|
|
stripe (15.3.0)
|
|
swd (2.0.3)
|
|
activesupport (>= 3)
|
|
attr_required (>= 0.0.5)
|
|
faraday (~> 2.0)
|
|
faraday-follow_redirects
|
|
tailwindcss-rails (4.2.3)
|
|
railties (>= 7.0.0)
|
|
tailwindcss-ruby (~> 4.0)
|
|
tailwindcss-ruby (4.1.8)
|
|
tailwindcss-ruby (4.1.8-aarch64-linux-gnu)
|
|
tailwindcss-ruby (4.1.8-aarch64-linux-musl)
|
|
tailwindcss-ruby (4.1.8-arm64-darwin)
|
|
tailwindcss-ruby (4.1.8-x86_64-darwin)
|
|
tailwindcss-ruby (4.1.8-x86_64-linux-gnu)
|
|
tailwindcss-ruby (4.1.8-x86_64-linux-musl)
|
|
terminal-table (4.0.0)
|
|
unicode-display_width (>= 1.1.1, < 4)
|
|
thor (1.4.0)
|
|
timeout (0.6.1)
|
|
tpm-key_attestation (0.14.1)
|
|
bindata (~> 2.4)
|
|
openssl (> 2.0)
|
|
openssl-signature_algorithm (~> 1.0)
|
|
trailblazer-option (0.1.2)
|
|
tsort (0.2.0)
|
|
ttfunk (1.8.0)
|
|
bigdecimal (~> 3.1)
|
|
turbo-rails (2.0.16)
|
|
actionpack (>= 7.1.0)
|
|
railties (>= 7.1.0)
|
|
tzinfo (2.0.6)
|
|
concurrent-ruby (~> 1.0)
|
|
uber (0.1.0)
|
|
unaccent (0.4.0)
|
|
unicode (0.4.4.5)
|
|
unicode-display_width (3.1.4)
|
|
unicode-emoji (~> 4.0, >= 4.0.4)
|
|
unicode-emoji (4.0.4)
|
|
uri (1.1.1)
|
|
useragent (0.16.11)
|
|
validate_url (1.0.15)
|
|
activemodel (>= 3.0.0)
|
|
public_suffix
|
|
vcr (6.3.1)
|
|
base64
|
|
vernier (1.8.0)
|
|
version_gem (1.1.9)
|
|
view_component (3.23.2)
|
|
activesupport (>= 5.2.0, < 8.1)
|
|
concurrent-ruby (~> 1)
|
|
method_source (~> 1.0)
|
|
web-console (4.2.1)
|
|
actionview (>= 6.0.0)
|
|
activemodel (>= 6.0.0)
|
|
bindex (>= 0.4.0)
|
|
railties (>= 6.0.0)
|
|
webauthn (3.4.3)
|
|
android_key_attestation (~> 0.3.0)
|
|
bindata (~> 2.4)
|
|
cbor (~> 0.5.9)
|
|
cose (~> 1.1)
|
|
openssl (>= 2.2)
|
|
safety_net_attestation (~> 0.5.0)
|
|
tpm-key_attestation (~> 0.14.0)
|
|
webfinger (2.1.3)
|
|
activesupport
|
|
faraday (~> 2.0)
|
|
faraday-follow_redirects
|
|
webmock (3.25.1)
|
|
addressable (>= 2.8.0)
|
|
crack (>= 0.3.2)
|
|
hashdiff (>= 0.4.0, < 2.0.0)
|
|
websocket (1.2.11)
|
|
websocket-driver (0.8.0)
|
|
base64
|
|
websocket-extensions (>= 0.1.0)
|
|
websocket-extensions (0.1.5)
|
|
xpath (3.2.0)
|
|
nokogiri (~> 1.8)
|
|
yard (0.9.37)
|
|
zeitwerk (2.7.3)
|
|
|
|
PLATFORMS
|
|
aarch64-linux-gnu
|
|
aarch64-linux-musl
|
|
arm-linux-gnu
|
|
arm-linux-musl
|
|
arm64-darwin
|
|
x86_64-darwin
|
|
x86_64-linux-gnu
|
|
x86_64-linux-musl
|
|
|
|
DEPENDENCIES
|
|
aasm
|
|
activerecord-import
|
|
after_commit_everywhere (~> 1.0)
|
|
anthropic (~> 1.0)
|
|
aws-sdk-s3 (~> 1.208.0)
|
|
bcrypt (~> 3.1)
|
|
benchmark-ips
|
|
bootsnap
|
|
brakeman
|
|
capybara
|
|
climate_control
|
|
connection_pool (~> 2.5)
|
|
countries
|
|
csv
|
|
debug
|
|
derailed_benchmarks
|
|
doorkeeper
|
|
dotenv-rails
|
|
ed25519
|
|
erb_lint
|
|
faker
|
|
faraday
|
|
faraday-multipart
|
|
faraday-retry
|
|
foreman
|
|
google-cloud-storage (~> 1.59)
|
|
hotwire-livereload
|
|
hotwire_combobox
|
|
httparty
|
|
i18n-tasks
|
|
image_processing (>= 1.2)
|
|
importmap-rails
|
|
inline_svg
|
|
jbuilder
|
|
jwt
|
|
langfuse-ruby (~> 0.1.4)
|
|
letter_opener
|
|
logtail-rails
|
|
lookbook (= 2.3.11)
|
|
lucide-rails
|
|
mocha
|
|
octokit
|
|
omniauth (~> 2.1)
|
|
omniauth-github
|
|
omniauth-google-oauth2
|
|
omniauth-rails_csrf_protection
|
|
omniauth-saml (~> 2.1)
|
|
omniauth_openid_connect
|
|
ostruct
|
|
pagy
|
|
pdf-reader (~> 2.12)
|
|
pg (~> 1.5)
|
|
plaid
|
|
posthog-ruby
|
|
propshaft
|
|
puma (>= 5.0)
|
|
pundit
|
|
rack-attack (~> 6.6)
|
|
rack-cors
|
|
rack-mini-profiler
|
|
rails (~> 7.2.2)
|
|
rails-i18n
|
|
rails-settings-cached
|
|
rchardet
|
|
redcarpet
|
|
redis (~> 5.4)
|
|
rotp (~> 6.3)
|
|
rqrcode (~> 3.0)
|
|
rspec-rails
|
|
rswag-api
|
|
rswag-specs
|
|
rswag-ui
|
|
rubocop-rails-omakase
|
|
ruby-lsp-rails
|
|
ruby-openai
|
|
rubyzip (~> 2.3)
|
|
selenium-webdriver
|
|
sentry-rails
|
|
sentry-ruby
|
|
sentry-sidekiq
|
|
sidekiq
|
|
sidekiq-cron
|
|
sidekiq-unique-jobs
|
|
simplecov
|
|
skylight
|
|
snaptrade (~> 2.0)
|
|
stackprof
|
|
stimulus-rails
|
|
stripe
|
|
tailwindcss-rails
|
|
turbo-rails
|
|
tzinfo-data
|
|
vcr
|
|
vernier
|
|
view_component
|
|
web-console
|
|
webauthn (~> 3.4)
|
|
webmock
|
|
|
|
RUBY VERSION
|
|
ruby 3.4.7p58
|
|
|
|
BUNDLED WITH
|
|
2.6.7
|