smart_rag 0.1.0 → 0.2.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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +252 -0
  3. data/.rspec +2 -0
  4. data/AGENTS.md +33 -0
  5. data/API_DOCUMENTATION.md +828 -0
  6. data/CHANGELOG.md +11 -1
  7. data/ER-diagram.mmd +144 -0
  8. data/Gemfile +50 -0
  9. data/Gemfile.lock +381 -0
  10. data/Hybrid_Reranking.md +171 -0
  11. data/README.en.md +420 -28
  12. data/README.md +534 -63
  13. data/Rakefile +268 -0
  14. data/SETUP_GUIDE.md +650 -0
  15. data/SmartChunking.md +180 -0
  16. data/USAGE_EXAMPLES.md +1002 -0
  17. data/config/llm_config.yml +4 -2
  18. data/config/smart_rag.yml +45 -1
  19. data/config.ru +15 -0
  20. data/db/migrations/006_create_text_search_configs.rb +3 -2
  21. data/db/migrations/008_create_embeddings.rb +5 -4
  22. data/db/migrations/012_add_metadata_to_source_sections.rb +11 -0
  23. data/db/migrations/013_create_media_jobs.rb +25 -0
  24. data/db/migrations/014_add_media_job_operations_indexes.rb +11 -0
  25. data/db/migrations/015_add_media_leases_and_objects.rb +80 -0
  26. data/db/migrations/016_add_document_principals_and_staging_references.rb +38 -0
  27. data/db/migrations/017_add_media_job_request_fingerprint.rb +48 -0
  28. data/db/seeds/text_search_configs.sql +3 -3
  29. data/design.md +1057 -0
  30. data/docs/API_DOCUMENTATION.md +838 -0
  31. data/docs/DOCUMENTATION_INDEX.en.md +60 -0
  32. data/docs/DOCUMENTATION_INDEX.md +65 -0
  33. data/docs/FIX_SUMMARY.md +256 -0
  34. data/docs/FIX_SUMMARY_COMPLETE.md +273 -0
  35. data/docs/Hybrid_Reranking.md +171 -0
  36. data/docs/MIGRATION_GUIDE.md +151 -0
  37. data/docs/PERFORMANCE_GUIDE.md +58 -0
  38. data/docs/SETUP_GUIDE.md +659 -0
  39. data/docs/SmartChunking.md +180 -0
  40. data/docs/USAGE_EXAMPLES.md +1008 -0
  41. data/docs/design.md +1057 -0
  42. data/docs/evidence_pack.md +211 -0
  43. data/docs/requirements.md +376 -0
  44. data/docs/retrieval_plan.md +251 -0
  45. data/docs/smartrag_improvement_plan.md +201 -0
  46. data/docs/smartrag_refactor.md +216 -0
  47. data/docs/todo.md +931 -0
  48. data/examples/common.rb +1 -1
  49. data/exe/smart-rag-db +163 -0
  50. data/exe/smart-rag-media-worker +34 -0
  51. data/lib/smart_rag/config.rb +12 -0
  52. data/lib/smart_rag/core/document_processor.rb +80 -16
  53. data/lib/smart_rag/core/local_content_store.rb +51 -0
  54. data/lib/smart_rag/core/media_extractors.rb +140 -0
  55. data/lib/smart_rag/core/media_job_queue.rb +353 -0
  56. data/lib/smart_rag/core/media_metadata_extractor.rb +188 -0
  57. data/lib/smart_rag/core/media_object_registry.rb +79 -0
  58. data/lib/smart_rag/core/media_processor.rb +228 -0
  59. data/lib/smart_rag/core/media_safety_policy.rb +61 -0
  60. data/lib/smart_rag/core/s3_content_store.rb +78 -0
  61. data/lib/smart_rag/core/transcript_normalizer.rb +44 -0
  62. data/lib/smart_rag/core/video_semantic_extractor.rb +130 -0
  63. data/lib/smart_rag/http_access_policy.rb +86 -0
  64. data/lib/smart_rag/http_app.rb +188 -0
  65. data/lib/smart_rag/models/embedding.rb +1 -1
  66. data/lib/smart_rag/models/research_topic.rb +1 -1
  67. data/lib/smart_rag/models/research_topic_section.rb +5 -0
  68. data/lib/smart_rag/models/research_topic_tag.rb +5 -0
  69. data/lib/smart_rag/models/search_log.rb +1 -1
  70. data/lib/smart_rag/models/section_fts.rb +5 -0
  71. data/lib/smart_rag/models/section_tag.rb +5 -0
  72. data/lib/smart_rag/models/source_document.rb +1 -1
  73. data/lib/smart_rag/models/source_section.rb +1 -1
  74. data/lib/smart_rag/models/tag.rb +1 -1
  75. data/lib/smart_rag/models/text_search_config.rb +5 -0
  76. data/lib/smart_rag/retrieve.rb +72 -1
  77. data/lib/smart_rag/services/embedding_service.rb +1 -1
  78. data/lib/smart_rag/services/fulltext_search_service.rb +11 -13
  79. data/lib/smart_rag/services/hybrid_search_service.rb +15 -11
  80. data/lib/smart_rag/services/summarization_service.rb +1 -1
  81. data/lib/smart_rag/services/tag_service.rb +1 -1
  82. data/lib/smart_rag/version.rb +1 -1
  83. data/lib/smart_rag.rb +264 -30
  84. data/patch_language.rb +27 -0
  85. data/requirements.md +376 -0
  86. data/source_documents_export.json +11072 -0
  87. data/todo.md +931 -0
  88. data/workers/analyze_content.rb +6 -2
  89. data/workers/get_embedding.rb +1 -1
  90. metadata +151 -38
data/CHANGELOG.md CHANGED
@@ -1,8 +1,15 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.2.0 - 2026-08-14
4
4
 
5
5
  ### Added
6
+ - 新增图片、音频、视频和通用媒体导入 API,以及可降级为 `partial` 的媒体元数据与语义提取。
7
+ - 新增 Rack HTTP 服务、Bearer 认证、principal 隔离和 PostgreSQL 配额控制。
8
+ - 新增 PostgreSQL 持久化媒体任务队列、取消/重试、heartbeat lease、卡死任务恢复和保留期清理。
9
+ - 新增本地与 S3/MinIO 内容寻址存储、对象引用计数和垃圾回收。
10
+ - 新增按 principal 隔离的幂等键与规范化请求指纹;冲突请求返回 `idempotency_conflict`。
11
+ - 新增数据库迁移 012-017,覆盖 section metadata、媒体任务、租约、对象引用、文档所有权和请求指纹。
12
+ - 新增 `smart-rag-media-worker` 可执行文件和 Rack `config.ru` 启动入口。
6
13
  - 新增 `retrieve(plan:)` 结构化检索入口(`RetrievalPlan -> EvidencePack`)。
7
14
  - 新增 `SmartRAG::Retrieve` 执行器:支持多 query、mode 映射、signals、provenance、stats、explain。
8
15
  - 新增索引治理接口:
@@ -22,6 +29,9 @@
22
29
  - `prepare_release_indexes(document_id: nil, dry_run: false)`
23
30
 
24
31
  ### Changed
32
+ - 文档、检索、统计和媒体任务 API 支持 principal 所有权过滤。
33
+ - 文档与 section metadata 在全文、混合和结构化检索结果中统一合并。
34
+ - URL 下载新增私网地址限制、主机白名单、重定向上限、超时和流式大小限制。
25
35
  - `retrieve` 现支持 `global_filters.source_type` 与 `global_filters.source_uri_prefix` 的执行过滤。
26
36
  - `retrieve` 新增 `global_filters.topic_ids` 的执行过滤(按 section-topic 关系过滤)。
27
37
  - `retrieve` 新增 `budget.diversity.by_source` 执行约束。
data/ER-diagram.mmd ADDED
@@ -0,0 +1,144 @@
1
+ erDiagram
2
+ %% Main tables - Core domain
3
+ source_documents {
4
+ integer id PK
5
+ varchar title "NOT NULL"
6
+ text url
7
+ varchar author
8
+ date publication_date
9
+ varchar language "DEFAULT 'en'"
10
+ text description
11
+ integer download_state "DEFAULT 0, NOT NULL"
12
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
13
+ timestamp updated_at "DEFAULT CURRENT_TIMESTAMP"
14
+ }
15
+
16
+ source_sections {
17
+ integer id PK
18
+ integer document_id FK "NOT NULL"
19
+ text content "NOT NULL"
20
+ varchar section_title
21
+ integer section_number "DEFAULT 0"
22
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
23
+ timestamp updated_at "DEFAULT CURRENT_TIMESTAMP"
24
+ }
25
+
26
+ tags {
27
+ integer id PK
28
+ varchar name "NOT NULL, UNIQUE"
29
+ integer parent_id FK
30
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
31
+ }
32
+
33
+ research_topics {
34
+ integer id PK
35
+ varchar name "NOT NULL"
36
+ text description
37
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
38
+ }
39
+
40
+ %% Many-to-many relationship tables
41
+ section_tags {
42
+ integer section_id PK,FK "NOT NULL"
43
+ integer tag_id PK,FK "NOT NULL"
44
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
45
+ }
46
+
47
+ research_topic_sections {
48
+ integer research_topic_id PK,FK "NOT NULL"
49
+ integer section_id PK,FK "NOT NULL"
50
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
51
+ }
52
+
53
+ research_topic_tags {
54
+ integer research_topic_id PK,FK "NOT NULL"
55
+ integer tag_id PK,FK "NOT NULL"
56
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
57
+ }
58
+
59
+ %% Full-text search optimized table
60
+ section_fts {
61
+ integer section_id PK,FK "NOT NULL"
62
+ integer document_id FK
63
+ text language "DEFAULT 'en'"
64
+ tsvector fts_title
65
+ tsvector fts_content
66
+ tsvector fts_combined
67
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
68
+ timestamp updated_at "DEFAULT CURRENT_TIMESTAMP"
69
+ }
70
+
71
+ %% Embeddings for vector search
72
+ embeddings {
73
+ integer id PK
74
+ integer source_id FK "NOT NULL"
75
+ vector(1024) vector "NOT NULL"
76
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
77
+ }
78
+
79
+ %% Search analytics and logs
80
+ search_logs {
81
+ integer id PK
82
+ text query "NOT NULL"
83
+ varchar search_type
84
+ integer execution_time_ms
85
+ integer results_count
86
+ vector(1024) query_vector
87
+ integer[] result_ids
88
+ jsonb filters
89
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
90
+ }
91
+
92
+ %% Configuration tables
93
+ text_search_configs {
94
+ text language_code PK "NOT NULL"
95
+ text config_name "NOT NULL"
96
+ boolean is_installed "DEFAULT true"
97
+ }
98
+
99
+ %% Database schema version tracking
100
+ schema_info {
101
+ integer version PK "NOT NULL"
102
+ }
103
+
104
+ %% Relationships
105
+ source_documents ||--o{ source_sections : "has many"
106
+ source_documents ||--o{ section_fts : "has many"
107
+ source_documents ||--o{ section_tags : "has many"
108
+ source_documents ||--o{ embeddings : "has many (via sections)"
109
+
110
+ source_sections }o--|| source_documents : "belongs to"
111
+ source_sections ||--o{ section_tags : "has many"
112
+ source_sections ||--o{ research_topic_sections : "has many"
113
+ source_sections ||--o{ embeddings : "has one"
114
+ source_sections ||--|| section_fts : "has one"
115
+
116
+ tags ||--o{ section_tags : "tags many sections"
117
+ tags ||--o{ research_topic_tags : "tags many topics"
118
+ tags }o--o{ tags : "self-referencing parent"
119
+
120
+ research_topics ||--o{ research_topic_sections : "has many sections"
121
+ research_topics ||--o{ research_topic_tags : "has many tags"
122
+
123
+ section_tags }o--|| source_sections : "section belongs to"
124
+ section_tags }o--|| tags : "tag belongs to"
125
+
126
+ research_topic_sections }o--|| research_topics : "topic belongs to"
127
+ research_topic_sections }o--|| source_sections : "section belongs to"
128
+
129
+ research_topic_tags }o--|| research_topics : "topic belongs to"
130
+ research_topic_tags }o--|| tags : "tag belongs to"
131
+
132
+ section_fts }o--|| source_sections : "section has FTS"
133
+ section_fts }o--|| source_documents : "document has FTS"
134
+
135
+ embeddings }o--|| source_sections : "embedding belongs to"
136
+
137
+ %% Indexes (not in Mermaid standard, but important for understanding)
138
+ %% All tables have appropriate indexes on PKs and FKs
139
+ %% source_documents: indexes on download_state, created_at, language
140
+ %% source_sections: indexes on document_id, section_number
141
+ %% section_tags: unique index on (section_id, tag_id)
142
+ %% section_fts: GIN indexes on tsvector columns
143
+ %% embeddings: index on source_id
144
+ %% search_logs: indexes on created_at, search_type, execution_time_ms
data/Gemfile ADDED
@@ -0,0 +1,50 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in smart_rag.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 13.0"
7
+ gem "rspec", "~> 3.0"
8
+ gem "minitest", "~> 5.0"
9
+
10
+ # Database dependencies
11
+ gem "sequel", "~> 5.0"
12
+ gem "pg", "~> 1.0"
13
+ gem "pgvector"
14
+
15
+ # HTTP client for API calls
16
+ gem "httparty", "~> 0.20"
17
+
18
+ # XML/HTML parsing
19
+ gem "nokogiri", "~> 1.0"
20
+
21
+ # Document conversion
22
+ gem "markitdown", "~> 0.1"
23
+
24
+ # Configuration
25
+ gem "yaml", "~> 0.2"
26
+
27
+ # LLM integration
28
+ gem "smart_prompt", "~> 0.3.5"
29
+ gem "numo-narray", github: "ruby-numo/numo-narray"
30
+
31
+ # Concurrent programming
32
+ gem "concurrent-ruby", "~> 1.0"
33
+
34
+ gem "dotenv", "~> 2.8"
35
+
36
+ # Development dependencies
37
+ group :development, :test do
38
+ gem "simplecov", "~> 0.21"
39
+ gem "rubocop", "~> 1.0"
40
+ gem "factory_bot", "~> 6.0"
41
+ gem "database_cleaner-sequel", "~> 2.0"
42
+ gem "faker", "~> 3.0"
43
+ gem "pry", "~> 0.14"
44
+ end
45
+
46
+ gem "rdbg", "~> 0.1.0"
47
+
48
+ gem "ostruct", "~> 0.6.3"
49
+
50
+ gem "benchmark", "~> 0.5.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,381 @@
1
+ GIT
2
+ remote: https://github.com/ruby-numo/numo-narray.git
3
+ revision: 95c05257349b954c027c2284834408736244662a
4
+ specs:
5
+ numo-narray (0.9.2.1)
6
+
7
+ PATH
8
+ remote: .
9
+ specs:
10
+ smart_rag (0.2.0)
11
+ aws-sdk-s3 (~> 1.0)
12
+ concurrent-ruby (~> 1.0)
13
+ dotenv (~> 2.8)
14
+ ostruct (~> 0.6)
15
+ pg (~> 1.0)
16
+ puma (>= 6.0, < 8)
17
+ rack (>= 2.2, < 4)
18
+ sequel (~> 5.0)
19
+ smart_prompt (~> 0.3.5)
20
+
21
+ GEM
22
+ remote: https://rubygems.org/
23
+ specs:
24
+ activemodel (8.1.2)
25
+ activesupport (= 8.1.2)
26
+ activerecord (8.1.2)
27
+ activemodel (= 8.1.2)
28
+ activesupport (= 8.1.2)
29
+ timeout (>= 0.4.0)
30
+ activesupport (8.1.2)
31
+ base64
32
+ bigdecimal
33
+ concurrent-ruby (~> 1.0, >= 1.3.1)
34
+ connection_pool (>= 2.2.5)
35
+ drb
36
+ i18n (>= 1.6, < 2)
37
+ json
38
+ logger (>= 1.4.2)
39
+ minitest (>= 5.1)
40
+ securerandom (>= 0.3)
41
+ tzinfo (~> 2.0, >= 2.0.5)
42
+ uri (>= 0.13.1)
43
+ addressable (2.8.9)
44
+ public_suffix (>= 2.0.2, < 8.0)
45
+ ast (2.4.3)
46
+ aws-eventstream (1.4.0)
47
+ aws-partitions (1.1280.0)
48
+ aws-sdk-core (3.254.1)
49
+ aws-eventstream (~> 1, >= 1.3.0)
50
+ aws-partitions (~> 1, >= 1.992.0)
51
+ aws-sigv4 (~> 1.9)
52
+ base64
53
+ bigdecimal
54
+ jmespath (~> 1, >= 1.6.1)
55
+ logger
56
+ aws-sdk-kms (1.130.0)
57
+ aws-sdk-core (~> 3, >= 3.254.0)
58
+ aws-sigv4 (~> 1.5)
59
+ aws-sdk-s3 (1.229.0)
60
+ aws-sdk-core (~> 3, >= 3.254.1)
61
+ aws-sdk-kms (~> 1)
62
+ aws-sigv4 (~> 1.5)
63
+ aws-sigv4 (1.12.1)
64
+ aws-eventstream (~> 1, >= 1.0.2)
65
+ base64 (0.3.0)
66
+ benchmark (0.5.0)
67
+ bigdecimal (4.0.1)
68
+ childprocess (5.1.0)
69
+ logger (~> 1.5)
70
+ coderay (1.1.3)
71
+ concurrent-ruby (1.3.6)
72
+ connection_pool (3.0.2)
73
+ csv (3.3.5)
74
+ database_cleaner (2.1.0)
75
+ database_cleaner-active_record (>= 2, < 3)
76
+ database_cleaner-active_record (2.2.2)
77
+ activerecord (>= 5.a)
78
+ database_cleaner-core (~> 2.0)
79
+ database_cleaner-core (2.0.1)
80
+ database_cleaner-sequel (2.0.2)
81
+ database_cleaner-core (~> 2.0.0)
82
+ sequel
83
+ date (3.5.1)
84
+ debug (1.11.1)
85
+ irb (~> 1.10)
86
+ reline (>= 0.3.8)
87
+ diff-lcs (1.6.2)
88
+ docile (1.4.1)
89
+ dotenv (2.8.1)
90
+ drb (2.2.3)
91
+ erb (6.0.2)
92
+ event_stream_parser (1.0.0)
93
+ factory_bot (6.5.6)
94
+ activesupport (>= 6.1.0)
95
+ faker (3.6.1)
96
+ i18n (>= 1.8.11, < 2)
97
+ faraday (2.14.1)
98
+ faraday-net_http (>= 2.0, < 3.5)
99
+ json
100
+ logger
101
+ faraday-multipart (1.2.0)
102
+ multipart-post (~> 2.0)
103
+ faraday-net_http (3.4.2)
104
+ net-http (~> 0.5)
105
+ httparty (0.24.2)
106
+ csv
107
+ mini_mime (>= 1.0.0)
108
+ multi_xml (>= 0.5.2)
109
+ i18n (1.14.8)
110
+ concurrent-ruby (~> 1.0)
111
+ io-console (0.8.2)
112
+ irb (1.17.0)
113
+ pp (>= 0.6.0)
114
+ prism (>= 1.3.0)
115
+ rdoc (>= 4.0.0)
116
+ reline (>= 0.4.2)
117
+ jmespath (1.6.2)
118
+ json (2.12.2)
119
+ json-schema (6.2.0)
120
+ addressable (~> 2.8)
121
+ bigdecimal (>= 3.1, < 5)
122
+ language_server-protocol (3.17.0.5)
123
+ lint_roller (1.1.0)
124
+ logger (1.7.0)
125
+ markitdown (0.3.3)
126
+ nokogiri
127
+ mcp (0.8.0)
128
+ json-schema (>= 4.1)
129
+ method_source (1.1.0)
130
+ mini_mime (1.1.5)
131
+ minitest (5.27.0)
132
+ multi_xml (0.8.1)
133
+ bigdecimal (>= 3.1, < 5)
134
+ multipart-post (2.4.1)
135
+ net-http (0.9.1)
136
+ uri (>= 0.11.1)
137
+ nio4r (2.7.5)
138
+ nokogiri (1.19.1-x64-mingw-ucrt)
139
+ racc (~> 1.4)
140
+ nokogiri (1.19.1-x86_64-linux-gnu)
141
+ racc (~> 1.4)
142
+ ostruct (0.6.3)
143
+ parallel (1.27.0)
144
+ parser (3.3.10.2)
145
+ ast (~> 2.4.1)
146
+ racc
147
+ pg (1.6.3-x64-mingw-ucrt)
148
+ pg (1.6.3-x86_64-linux)
149
+ pgvector (0.3.2)
150
+ pp (0.6.3)
151
+ prettyprint
152
+ prettyprint (0.2.0)
153
+ prism (1.9.0)
154
+ pry (0.16.0)
155
+ coderay (~> 1.1)
156
+ method_source (~> 1.0)
157
+ reline (>= 0.6.0)
158
+ psych (5.3.1)
159
+ date
160
+ stringio
161
+ public_suffix (7.0.5)
162
+ puma (7.2.1)
163
+ nio4r (~> 2.0)
164
+ racc (1.8.1)
165
+ rack (3.2.7)
166
+ rainbow (3.1.1)
167
+ rake (13.3.1)
168
+ rdbg (0.1.0)
169
+ debug (>= 1.2.2)
170
+ rdoc (7.2.0)
171
+ erb
172
+ psych (>= 4.0.0)
173
+ tsort
174
+ regexp_parser (2.11.3)
175
+ reline (0.6.3)
176
+ io-console (~> 0.5)
177
+ retriable (3.1.2)
178
+ rspec (3.13.2)
179
+ rspec-core (~> 3.13.0)
180
+ rspec-expectations (~> 3.13.0)
181
+ rspec-mocks (~> 3.13.0)
182
+ rspec-core (3.13.6)
183
+ rspec-support (~> 3.13.0)
184
+ rspec-expectations (3.13.5)
185
+ diff-lcs (>= 1.2.0, < 2.0)
186
+ rspec-support (~> 3.13.0)
187
+ rspec-mocks (3.13.8)
188
+ diff-lcs (>= 1.2.0, < 2.0)
189
+ rspec-support (~> 3.13.0)
190
+ rspec-support (3.13.7)
191
+ rubocop (1.85.1)
192
+ json (~> 2.3)
193
+ language_server-protocol (~> 3.17.0.2)
194
+ lint_roller (~> 1.1.0)
195
+ mcp (~> 0.6)
196
+ parallel (~> 1.10)
197
+ parser (>= 3.3.0.2)
198
+ rainbow (>= 2.2.2, < 4.0)
199
+ regexp_parser (>= 2.9.3, < 3.0)
200
+ rubocop-ast (>= 1.49.0, < 2.0)
201
+ ruby-progressbar (~> 1.7)
202
+ unicode-display_width (>= 2.4.0, < 4.0)
203
+ rubocop-ast (1.49.0)
204
+ parser (>= 3.3.7.2)
205
+ prism (~> 1.7)
206
+ ruby-openai (8.1.0)
207
+ event_stream_parser (>= 0.3.0, < 2.0.0)
208
+ faraday (>= 1)
209
+ faraday-multipart (>= 1)
210
+ ruby-progressbar (1.13.0)
211
+ safe_ruby (1.0.5)
212
+ childprocess (~> 5)
213
+ securerandom (0.4.1)
214
+ sequel (5.102.0)
215
+ bigdecimal
216
+ simplecov (0.22.0)
217
+ docile (~> 1.1)
218
+ simplecov-html (~> 0.11)
219
+ simplecov_json_formatter (~> 0.1)
220
+ simplecov-html (0.13.2)
221
+ simplecov_json_formatter (0.1.4)
222
+ smart_prompt (0.3.5)
223
+ json (~> 2.12.0)
224
+ numo-narray (~> 0.9.2.1)
225
+ retriable (~> 3.1.2)
226
+ ruby-openai (~> 8.1.0)
227
+ safe_ruby (~> 1.0.5)
228
+ yaml (~> 0.4.0)
229
+ stringio (3.2.0)
230
+ timeout (0.6.0)
231
+ tsort (0.2.0)
232
+ tzinfo (2.0.6)
233
+ concurrent-ruby (~> 1.0)
234
+ unicode-display_width (3.2.0)
235
+ unicode-emoji (~> 4.1)
236
+ unicode-emoji (4.2.0)
237
+ uri (1.1.1)
238
+ yaml (0.4.0)
239
+
240
+ PLATFORMS
241
+ x64-mingw-ucrt
242
+ x86_64-linux
243
+
244
+ DEPENDENCIES
245
+ benchmark (~> 0.5.0)
246
+ bundler (~> 4.0)
247
+ concurrent-ruby (~> 1.0)
248
+ database_cleaner (~> 2.0)
249
+ database_cleaner-sequel (~> 2.0)
250
+ dotenv (~> 2.8)
251
+ factory_bot (~> 6.0)
252
+ faker (~> 3.0)
253
+ httparty (~> 0.20)
254
+ markitdown (~> 0.1)
255
+ minitest (~> 5.0)
256
+ nokogiri (~> 1.0)
257
+ numo-narray!
258
+ ostruct (~> 0.6.3)
259
+ pg (~> 1.0)
260
+ pgvector
261
+ pry (~> 0.14)
262
+ rake (~> 13.0)
263
+ rdbg (~> 0.1.0)
264
+ rspec (~> 3.0)
265
+ rubocop (~> 1.0)
266
+ sequel (~> 5.0)
267
+ simplecov (~> 0.21)
268
+ smart_prompt (~> 0.3.5)
269
+ smart_rag!
270
+ yaml (~> 0.2)
271
+
272
+ CHECKSUMS
273
+ activemodel (8.1.2) sha256=e21358c11ce68aed3f9838b7e464977bc007b4446c6e4059781e1d5c03bcf33e
274
+ activerecord (8.1.2) sha256=acfbe0cadfcc50fa208011fe6f4eb01cae682ebae0ef57145ba45380c74bcc44
275
+ activesupport (8.1.2) sha256=88842578ccd0d40f658289b0e8c842acfe9af751afee2e0744a7873f50b6fdae
276
+ addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485
277
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
278
+ aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
279
+ aws-partitions (1.1280.0) sha256=4c5f5f0765603a738d6e212ae228ae6e5129696e907e4a2854c03d55ff9524bc
280
+ aws-sdk-core (3.254.1) sha256=518089e32134c3478cd4ec63d07fb966546a45e9e4cbf5f80d2cf16d5699d29b
281
+ aws-sdk-kms (1.130.0) sha256=a2e83662ca31b77a2a19c9aa2f40a98165a67270c18c718fe1c70d0cbd7cd749
282
+ aws-sdk-s3 (1.229.0) sha256=7dd11a111875b3505d2ec0a0a383a6aab6c1badb3d4e94e7fbb958a24451f596
283
+ aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
284
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
285
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
286
+ bigdecimal (4.0.1) sha256=8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7
287
+ bundler (4.0.14) sha256=d09a0a965cf772266a7e49e83610be7c2f4e49e61134c42a56804bb383cc24b8
288
+ childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec
289
+ coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
290
+ concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab
291
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
292
+ csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f
293
+ database_cleaner (2.1.0) sha256=1dcba26e3b1576da692fc6bac10136a4744da5bcc293d248aae19640c65d89cd
294
+ database_cleaner-active_record (2.2.2) sha256=88296b9f3088c31f7c0d4fcec10f68e4b71c96698043916de59b04debec10388
295
+ database_cleaner-core (2.0.1) sha256=8646574c32162e59ed7b5258a97a208d3c44551b854e510994f24683865d846c
296
+ database_cleaner-sequel (2.0.2) sha256=f1e6566a1a34d7425ff94b447e2c16181bc215555aff3dfe463b7977b621d4bf
297
+ date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
298
+ debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
299
+ diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
300
+ docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
301
+ dotenv (2.8.1) sha256=c5944793349ae03c432e1780a2ca929d60b88c7d14d52d630db0508c3a8a17d8
302
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
303
+ erb (6.0.2) sha256=9fe6264d44f79422c87490a1558479bd0e7dad4dd0e317656e67ea3077b5242b
304
+ event_stream_parser (1.0.0) sha256=a2683bab70126286f8184dc88f7968ffc4028f813161fb073ec90d171f7de3c8
305
+ factory_bot (6.5.6) sha256=12beb373214dccc086a7a63763d6718c49769d5606f0501e0a4442676917e077
306
+ faker (3.6.1) sha256=c513d23c1d26b426283e913b25e0b714576011d7c1ad368a9ac6ea2113a1ccde
307
+ faraday (2.14.1) sha256=a43cceedc1e39d188f4d2cdd360a8aaa6a11da0c407052e426ba8d3fb42ef61c
308
+ faraday-multipart (1.2.0) sha256=7d89a949693714176f612323ca13746a2ded204031a6ba528adee788694ef757
309
+ faraday-net_http (3.4.2) sha256=f147758260d3526939bf57ecf911682f94926a3666502e24c69992765875906c
310
+ httparty (0.24.2) sha256=8fca6a54aa0c4aa4303a0fd33e5e2156175d6a5334f714263b458abd7fda9c38
311
+ i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5
312
+ io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
313
+ irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae
314
+ jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1
315
+ json (2.12.2) sha256=ba94a48ad265605c8fa9a50a5892f3ba6a02661aa010f638211f3cb36f44abf4
316
+ json-schema (6.2.0) sha256=e8bff46ed845a22c1ab2bd0d7eccf831c01fe23bb3920caa4c74db4306813666
317
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
318
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
319
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
320
+ markitdown (0.3.3) sha256=7f51293e19704a57ac1b15c4d5ad6b9780e73cc6af4a3f8b59fd6a14e43e8d26
321
+ mcp (0.8.0) sha256=ae8bd146bb8e168852866fd26f805f52744f6326afb3211e073f78a95e0c34fb
322
+ method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
323
+ mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
324
+ minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5
325
+ multi_xml (0.8.1) sha256=addba0290bac34e9088bfe73dc4878530297a82a7bbd66cb44dcd0a4b86edf5a
326
+ multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
327
+ net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
328
+ nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
329
+ nokogiri (1.19.1-x64-mingw-ucrt) sha256=110d92ae57694ae7866670d298a5d04cd150fae5a6a7849957d66f171e6aec9b
330
+ nokogiri (1.19.1-x86_64-linux-gnu) sha256=1a4902842a186b4f901078e692d12257678e6133858d0566152fe29cdb98456a
331
+ numo-narray (0.9.2.1)
332
+ ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
333
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
334
+ parser (3.3.10.2) sha256=6f60c84aa4bdcedb6d1a2434b738fe8a8136807b6adc8f7f53b97da9bc4e9357
335
+ pg (1.6.3-x64-mingw-ucrt) sha256=cdff974cbde6935e07b8f5cc3c2af7d320bc5263bde06acaae08302194ebf5e1
336
+ pg (1.6.3-x86_64-linux) sha256=5d9e188c8f7a0295d162b7b88a768d8452a899977d44f3274d1946d67920ae8d
337
+ pgvector (0.3.2) sha256=b47cbfb8dcc1aa7adcecc4d6583bd2a6bfff358dad56467488daf4f6efdef3b5
338
+ pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6
339
+ prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
340
+ prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
341
+ pry (0.16.0) sha256=d76c69065698ed1f85e717bd33d7942c38a50868f6b0673c636192b3d1b6054e
342
+ psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974
343
+ public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
344
+ puma (7.2.1) sha256=d7bf0e9cabd532e0d401e142cd94e3ac531e993610e2d80e6fbf9c26961414b0
345
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
346
+ rack (3.2.7) sha256=93e13e1c24f93556671d85d2d79fa228c3485815c50d7e2f265b5330c6528fb7
347
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
348
+ rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
349
+ rdbg (0.1.0) sha256=2111bd41521929e4f469e8b7c1d00b1b7f4d6ab421dd3158cd160a8dcab3ad86
350
+ rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
351
+ regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
352
+ reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
353
+ retriable (3.1.2) sha256=0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0
354
+ rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587
355
+ rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d
356
+ rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
357
+ rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
358
+ rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
359
+ rubocop (1.85.1) sha256=3dbcf9e961baa4c376eeeb2a03913dca5e3987033b04d38fa538aa1e7406cc77
360
+ rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
361
+ ruby-openai (8.1.0) sha256=6f69e7f501b3b039fe21807286230dfd51a91143e160ffb45464af30a20a5e14
362
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
363
+ safe_ruby (1.0.5) sha256=ec43cd08da87b754c5ae741883f45d44e5d867deca9c46e01a70b6ff20c0bb20
364
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
365
+ sequel (5.102.0) sha256=c25bb85a44ae59b3ed41ca7c32c33316cf81a6fcaeabedb4036ba141dde70919
366
+ simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
367
+ simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246
368
+ simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
369
+ smart_prompt (0.3.5) sha256=2fc8fc85aa4b1be90bde65faa244bf09a52db30df186673c5490dd5675a16788
370
+ smart_rag (0.2.0)
371
+ stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
372
+ timeout (0.6.0) sha256=6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af
373
+ tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
374
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
375
+ unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
376
+ unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
377
+ uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
378
+ yaml (0.4.0) sha256=240e69d1e6ce3584d6085978719a0faa6218ae426e034d8f9b02fb54d3471942
379
+
380
+ BUNDLED WITH
381
+ 4.0.14