htm 0.0.18 → 0.0.30

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +119 -1
  3. data/README.md +12 -0
  4. data/Rakefile +104 -18
  5. data/db/migrate/00001_enable_extensions.rb +9 -5
  6. data/db/migrate/00002_create_robots.rb +18 -6
  7. data/db/migrate/00003_create_file_sources.rb +30 -17
  8. data/db/migrate/00004_create_nodes.rb +60 -48
  9. data/db/migrate/00005_create_tags.rb +24 -12
  10. data/db/migrate/00006_create_node_tags.rb +28 -13
  11. data/db/migrate/00007_create_robot_nodes.rb +40 -26
  12. data/db/schema.sql +17 -1
  13. data/db/seeds.rb +34 -34
  14. data/docs/api/embedding-service.md +140 -110
  15. data/docs/api/yard/HTM/ActiveRecordConfig.md +6 -0
  16. data/docs/api/yard/HTM/Config.md +173 -0
  17. data/docs/api/yard/HTM/ConfigSection.md +28 -0
  18. data/docs/api/yard/HTM/Database.md +1 -1
  19. data/docs/api/yard/HTM/Railtie.md +2 -2
  20. data/docs/api/yard/HTM.md +0 -57
  21. data/docs/api/yard/index.csv +76 -61
  22. data/docs/api/yard-reference.md +2 -1
  23. data/docs/architecture/adrs/003-ollama-embeddings.md +45 -36
  24. data/docs/architecture/adrs/004-hive-mind.md +1 -1
  25. data/docs/architecture/adrs/008-robot-identification.md +1 -1
  26. data/docs/architecture/index.md +11 -9
  27. data/docs/architecture/overview.md +11 -7
  28. data/docs/assets/images/balanced-strategy-decay.svg +41 -0
  29. data/docs/assets/images/class-hierarchy.svg +1 -1
  30. data/docs/assets/images/eviction-priority.svg +43 -0
  31. data/docs/assets/images/exception-hierarchy.svg +2 -2
  32. data/docs/assets/images/hive-mind-shared-memory.svg +52 -0
  33. data/docs/assets/images/htm-architecture-overview.svg +3 -3
  34. data/docs/assets/images/htm-core-components.svg +4 -4
  35. data/docs/assets/images/htm-layered-architecture.svg +1 -1
  36. data/docs/assets/images/htm-memory-addition-flow.svg +2 -2
  37. data/docs/assets/images/htm-memory-recall-flow.svg +2 -2
  38. data/docs/assets/images/memory-topology.svg +53 -0
  39. data/docs/assets/images/two-tier-memory-architecture.svg +55 -0
  40. data/docs/database/naming-convention.md +244 -0
  41. data/docs/database_rake_tasks.md +31 -0
  42. data/docs/development/rake-tasks.md +80 -35
  43. data/docs/development/setup.md +76 -44
  44. data/docs/examples/basic-usage.md +133 -0
  45. data/docs/examples/config-files.md +170 -0
  46. data/docs/examples/file-loading.md +208 -0
  47. data/docs/examples/index.md +116 -0
  48. data/docs/examples/llm-configuration.md +168 -0
  49. data/docs/examples/mcp-client.md +172 -0
  50. data/docs/examples/rails-integration.md +173 -0
  51. data/docs/examples/robot-groups.md +210 -0
  52. data/docs/examples/sinatra-integration.md +218 -0
  53. data/docs/examples/standalone-app.md +216 -0
  54. data/docs/examples/telemetry.md +224 -0
  55. data/docs/examples/timeframes.md +143 -0
  56. data/docs/getting-started/installation.md +97 -40
  57. data/docs/getting-started/quick-start.md +28 -11
  58. data/docs/guides/configuration.md +515 -0
  59. data/docs/guides/file-loading.md +322 -0
  60. data/docs/guides/getting-started.md +40 -9
  61. data/docs/guides/index.md +3 -3
  62. data/docs/guides/mcp-server.md +100 -13
  63. data/docs/guides/propositions.md +264 -0
  64. data/docs/guides/recalling-memories.md +4 -4
  65. data/docs/guides/search-strategies.md +3 -3
  66. data/docs/guides/tags.md +318 -0
  67. data/docs/guides/telemetry.md +229 -0
  68. data/docs/index.md +8 -16
  69. data/docs/{architecture → robots}/hive-mind.md +8 -111
  70. data/docs/robots/index.md +73 -0
  71. data/docs/{guides → robots}/multi-robot.md +3 -3
  72. data/docs/{guides → robots}/robot-groups.md +8 -7
  73. data/docs/{architecture → robots}/two-tier-memory.md +13 -149
  74. data/docs/robots/why-robots.md +85 -0
  75. data/examples/.envrc +6 -0
  76. data/examples/.gitignore +2 -0
  77. data/examples/00_create_examples_db.rb +94 -0
  78. data/examples/{basic_usage.rb → 01_basic_usage.rb} +12 -16
  79. data/examples/{custom_llm_configuration.rb → 03_custom_llm_configuration.rb} +13 -3
  80. data/examples/{file_loader_usage.rb → 04_file_loader_usage.rb} +11 -14
  81. data/examples/{timeframe_demo.rb → 05_timeframe_demo.rb} +10 -3
  82. data/examples/{example_app → 06_example_app}/app.rb +15 -15
  83. data/examples/{cli_app → 07_cli_app}/htm_cli.rb +15 -22
  84. data/examples/08_sinatra_app/Gemfile.lock +241 -0
  85. data/examples/{sinatra_app → 08_sinatra_app}/app.rb +19 -18
  86. data/examples/{mcp_client.rb → 09_mcp_client.rb} +5 -8
  87. data/examples/{telemetry → 10_telemetry}/SETUP_README.md +1 -1
  88. data/examples/{telemetry → 10_telemetry}/demo.rb +14 -10
  89. data/examples/11_robot_groups/README.md +335 -0
  90. data/examples/{robot_groups → 11_robot_groups/lib}/robot_worker.rb +17 -3
  91. data/examples/{robot_groups → 11_robot_groups}/multi_process.rb +9 -9
  92. data/examples/{robot_groups → 11_robot_groups}/same_process.rb +9 -12
  93. data/examples/{rails_app → 12_rails_app}/Gemfile +3 -0
  94. data/examples/{rails_app → 12_rails_app}/Gemfile.lock +87 -58
  95. data/examples/{rails_app → 12_rails_app}/app/controllers/dashboard_controller.rb +10 -6
  96. data/examples/{rails_app → 12_rails_app}/app/controllers/files_controller.rb +5 -5
  97. data/examples/{rails_app → 12_rails_app}/app/controllers/memories_controller.rb +11 -7
  98. data/examples/{rails_app → 12_rails_app}/app/controllers/robots_controller.rb +8 -8
  99. data/examples/12_rails_app/app/controllers/tags_controller.rb +36 -0
  100. data/examples/{rails_app → 12_rails_app}/app/views/dashboard/index.html.erb +2 -2
  101. data/examples/{rails_app → 12_rails_app}/app/views/files/new.html.erb +5 -2
  102. data/examples/{rails_app → 12_rails_app}/app/views/memories/_memory_card.html.erb +3 -3
  103. data/examples/{rails_app → 12_rails_app}/app/views/memories/deleted.html.erb +3 -3
  104. data/examples/{rails_app → 12_rails_app}/app/views/memories/edit.html.erb +3 -3
  105. data/examples/{rails_app → 12_rails_app}/app/views/memories/show.html.erb +4 -4
  106. data/examples/{rails_app → 12_rails_app}/app/views/robots/index.html.erb +2 -2
  107. data/examples/{rails_app → 12_rails_app}/app/views/robots/show.html.erb +4 -4
  108. data/examples/{rails_app → 12_rails_app}/app/views/search/index.html.erb +1 -1
  109. data/examples/{rails_app → 12_rails_app}/app/views/tags/index.html.erb +2 -2
  110. data/examples/{rails_app → 12_rails_app}/app/views/tags/show.html.erb +1 -1
  111. data/examples/12_rails_app/config/initializers/htm.rb +7 -0
  112. data/examples/12_rails_app/config/initializers/rack.rb +5 -0
  113. data/examples/README.md +230 -211
  114. data/examples/examples_helper.rb +138 -0
  115. data/lib/htm/config/builder.rb +167 -0
  116. data/lib/htm/config/database.rb +317 -0
  117. data/lib/htm/config/defaults.yml +41 -13
  118. data/lib/htm/config/section.rb +74 -0
  119. data/lib/htm/config/validator.rb +83 -0
  120. data/lib/htm/config.rb +65 -361
  121. data/lib/htm/database.rb +85 -127
  122. data/lib/htm/errors.rb +14 -0
  123. data/lib/htm/integrations/sinatra.rb +13 -44
  124. data/lib/htm/job_adapter.rb +75 -1
  125. data/lib/htm/jobs/generate_embedding_job.rb +3 -4
  126. data/lib/htm/jobs/generate_propositions_job.rb +4 -5
  127. data/lib/htm/jobs/generate_tags_job.rb +16 -15
  128. data/lib/htm/loaders/defaults_loader.rb +23 -0
  129. data/lib/htm/loaders/markdown_loader.rb +17 -15
  130. data/lib/htm/loaders/xdg_config_loader.rb +9 -9
  131. data/lib/htm/long_term_memory/fulltext_search.rb +14 -14
  132. data/lib/htm/long_term_memory/hybrid_search.rb +396 -229
  133. data/lib/htm/long_term_memory/node_operations.rb +24 -23
  134. data/lib/htm/long_term_memory/relevance_scorer.rb +23 -20
  135. data/lib/htm/long_term_memory/robot_operations.rb +4 -4
  136. data/lib/htm/long_term_memory/tag_operations.rb +91 -77
  137. data/lib/htm/long_term_memory/vector_search.rb +4 -5
  138. data/lib/htm/long_term_memory.rb +13 -13
  139. data/lib/htm/mcp/cli.rb +115 -8
  140. data/lib/htm/mcp/resources.rb +4 -3
  141. data/lib/htm/mcp/server.rb +5 -4
  142. data/lib/htm/mcp/tools.rb +37 -28
  143. data/lib/htm/migration.rb +72 -0
  144. data/lib/htm/models/file_source.rb +52 -31
  145. data/lib/htm/models/node.rb +224 -108
  146. data/lib/htm/models/node_tag.rb +49 -28
  147. data/lib/htm/models/robot.rb +38 -27
  148. data/lib/htm/models/robot_node.rb +63 -35
  149. data/lib/htm/models/tag.rb +126 -123
  150. data/lib/htm/observability.rb +45 -41
  151. data/lib/htm/proposition_service.rb +76 -7
  152. data/lib/htm/railtie.rb +2 -2
  153. data/lib/htm/robot_group.rb +30 -18
  154. data/lib/htm/sequel_config.rb +215 -0
  155. data/lib/htm/sql_builder.rb +14 -16
  156. data/lib/htm/tag_service.rb +78 -0
  157. data/lib/htm/tasks.rb +3 -0
  158. data/lib/htm/version.rb +1 -1
  159. data/lib/htm/workflows/remember_workflow.rb +213 -0
  160. data/lib/htm.rb +27 -22
  161. data/lib/tasks/db.rake +0 -2
  162. data/lib/tasks/doc.rake +2 -2
  163. data/lib/tasks/files.rake +11 -18
  164. data/lib/tasks/htm.rake +190 -62
  165. data/lib/tasks/jobs.rake +179 -54
  166. data/lib/tasks/tags.rake +8 -13
  167. data/mkdocs.yml +33 -8
  168. data/scripts/backfill_parent_tags.rb +376 -0
  169. data/scripts/normalize_plural_tags.rb +335 -0
  170. metadata +168 -86
  171. data/docs/api/yard/HTM/Configuration.md +0 -240
  172. data/docs/telemetry.md +0 -391
  173. data/examples/rails_app/app/controllers/tags_controller.rb +0 -30
  174. data/examples/sinatra_app/Gemfile.lock +0 -166
  175. data/lib/htm/active_record_config.rb +0 -104
  176. /data/examples/{config_file_example → 02_config_file_example}/README.md +0 -0
  177. /data/examples/{config_file_example → 02_config_file_example}/config/htm.local.yml +0 -0
  178. /data/examples/{config_file_example → 02_config_file_example}/custom_config.yml +0 -0
  179. /data/examples/{config_file_example → 02_config_file_example}/show_config.rb +0 -0
  180. /data/examples/{example_app → 06_example_app}/Rakefile +0 -0
  181. /data/examples/{cli_app → 07_cli_app}/README.md +0 -0
  182. /data/examples/{sinatra_app → 08_sinatra_app}/Gemfile +0 -0
  183. /data/examples/{telemetry → 10_telemetry}/README.md +0 -0
  184. /data/examples/{telemetry → 10_telemetry}/grafana/dashboards/htm-metrics.json +0 -0
  185. /data/examples/{rails_app → 12_rails_app}/.gitignore +0 -0
  186. /data/examples/{rails_app → 12_rails_app}/Procfile.dev +0 -0
  187. /data/examples/{rails_app → 12_rails_app}/README.md +0 -0
  188. /data/examples/{rails_app → 12_rails_app}/Rakefile +0 -0
  189. /data/examples/{rails_app → 12_rails_app}/app/assets/stylesheets/application.css +0 -0
  190. /data/examples/{rails_app → 12_rails_app}/app/assets/stylesheets/inter-font.css +0 -0
  191. /data/examples/{rails_app → 12_rails_app}/app/controllers/application_controller.rb +0 -0
  192. /data/examples/{rails_app → 12_rails_app}/app/controllers/search_controller.rb +0 -0
  193. /data/examples/{rails_app → 12_rails_app}/app/javascript/application.js +0 -0
  194. /data/examples/{rails_app → 12_rails_app}/app/javascript/controllers/application.js +0 -0
  195. /data/examples/{rails_app → 12_rails_app}/app/javascript/controllers/index.js +0 -0
  196. /data/examples/{rails_app → 12_rails_app}/app/views/files/index.html.erb +0 -0
  197. /data/examples/{rails_app → 12_rails_app}/app/views/files/show.html.erb +0 -0
  198. /data/examples/{rails_app → 12_rails_app}/app/views/layouts/application.html.erb +0 -0
  199. /data/examples/{rails_app → 12_rails_app}/app/views/memories/index.html.erb +0 -0
  200. /data/examples/{rails_app → 12_rails_app}/app/views/memories/new.html.erb +0 -0
  201. /data/examples/{rails_app → 12_rails_app}/app/views/robots/new.html.erb +0 -0
  202. /data/examples/{rails_app → 12_rails_app}/app/views/shared/_navbar.html.erb +0 -0
  203. /data/examples/{rails_app → 12_rails_app}/app/views/shared/_stat_card.html.erb +0 -0
  204. /data/examples/{rails_app → 12_rails_app}/bin/dev +0 -0
  205. /data/examples/{rails_app → 12_rails_app}/bin/rails +0 -0
  206. /data/examples/{rails_app → 12_rails_app}/bin/rake +0 -0
  207. /data/examples/{rails_app → 12_rails_app}/config/application.rb +0 -0
  208. /data/examples/{rails_app → 12_rails_app}/config/boot.rb +0 -0
  209. /data/examples/{rails_app → 12_rails_app}/config/database.yml +0 -0
  210. /data/examples/{rails_app → 12_rails_app}/config/environment.rb +0 -0
  211. /data/examples/{rails_app → 12_rails_app}/config/importmap.rb +0 -0
  212. /data/examples/{rails_app → 12_rails_app}/config/routes.rb +0 -0
  213. /data/examples/{rails_app → 12_rails_app}/config/tailwind.config.js +0 -0
  214. /data/examples/{rails_app → 12_rails_app}/config.ru +0 -0
  215. /data/examples/{rails_app → 12_rails_app}/log/.keep +0 -0
  216. /data/examples/{rails_app → 12_rails_app}/tmp/local_secret.txt +0 -0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: htm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.18
4
+ version: 0.0.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
@@ -24,21 +24,21 @@ dependencies:
24
24
  - !ruby/object:Gem::Version
25
25
  version: 1.5.0
26
26
  - !ruby/object:Gem::Dependency
27
- name: neighbor
27
+ name: sequel
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: '0'
32
+ version: '5.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '0'
39
+ version: '5.0'
40
40
  - !ruby/object:Gem::Dependency
41
- name: activerecord
41
+ name: sequel_pg
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
@@ -163,6 +163,48 @@ dependencies:
163
163
  - - ">="
164
164
  - !ruby/object:Gem::Version
165
165
  version: '2.6'
166
+ - !ruby/object:Gem::Dependency
167
+ name: simple_flow
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: async
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '2.0'
187
+ type: :runtime
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '2.0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: activesupport
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :runtime
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
166
208
  - !ruby/object:Gem::Dependency
167
209
  name: rake
168
210
  requirement: !ruby/object:Gem::Requirement
@@ -329,7 +371,8 @@ files:
329
371
  - docs/api/yard/HTM/AuthorizationError.md
330
372
  - docs/api/yard/HTM/CircuitBreaker.md
331
373
  - docs/api/yard/HTM/CircuitBreakerOpenError.md
332
- - docs/api/yard/HTM/Configuration.md
374
+ - docs/api/yard/HTM/Config.md
375
+ - docs/api/yard/HTM/ConfigSection.md
333
376
  - docs/api/yard/HTM/Database.md
334
377
  - docs/api/yard/HTM/DatabaseError.md
335
378
  - docs/api/yard/HTM/EmbeddingError.md
@@ -372,16 +415,17 @@ files:
372
415
  - docs/architecture/adrs/010-redis-working-memory-rejected.md
373
416
  - docs/architecture/adrs/011-pgai-integration.md
374
417
  - docs/architecture/adrs/index.md
375
- - docs/architecture/hive-mind.md
376
418
  - docs/architecture/index.md
377
419
  - docs/architecture/overview.md
378
- - docs/architecture/two-tier-memory.md
379
420
  - docs/assets/css/custom.css
380
421
  - docs/assets/images/adr-010-current-architecture.svg
381
422
  - docs/assets/images/adr-010-proposed-architecture.svg
382
423
  - docs/assets/images/adr-dependency-tree.svg
424
+ - docs/assets/images/balanced-strategy-decay.svg
383
425
  - docs/assets/images/class-hierarchy.svg
426
+ - docs/assets/images/eviction-priority.svg
384
427
  - docs/assets/images/exception-hierarchy.svg
428
+ - docs/assets/images/hive-mind-shared-memory.svg
385
429
  - docs/assets/images/htm-architecture-overview.svg
386
430
  - docs/assets/images/htm-complete-memory-flow.svg
387
431
  - docs/assets/images/htm-context-assembly-flow.svg
@@ -398,13 +442,16 @@ files:
398
442
  - docs/assets/images/htm-working-memory-architecture.svg
399
443
  - docs/assets/images/htm.jpg
400
444
  - docs/assets/images/htm_demo.gif
445
+ - docs/assets/images/memory-topology.svg
401
446
  - docs/assets/images/multi-provider-failover.svg
402
447
  - docs/assets/images/project-structure.svg
403
448
  - docs/assets/images/robot-group-architecture.svg
404
449
  - docs/assets/images/test-directory-structure.svg
450
+ - docs/assets/images/two-tier-memory-architecture.svg
405
451
  - docs/assets/js/mathjax.js
406
452
  - docs/assets/videos/htm_video.mp4
407
453
  - docs/database/README.md
454
+ - docs/database/naming-convention.md
408
455
  - docs/database/public.file_sources.md
409
456
  - docs/database/public.file_sources.svg
410
457
  - docs/database/public.node_stats.md
@@ -442,106 +489,136 @@ files:
442
489
  - docs/development/schema.md
443
490
  - docs/development/setup.md
444
491
  - docs/development/testing.md
492
+ - docs/examples/basic-usage.md
493
+ - docs/examples/config-files.md
494
+ - docs/examples/file-loading.md
495
+ - docs/examples/index.md
496
+ - docs/examples/llm-configuration.md
497
+ - docs/examples/mcp-client.md
498
+ - docs/examples/rails-integration.md
499
+ - docs/examples/robot-groups.md
500
+ - docs/examples/sinatra-integration.md
501
+ - docs/examples/standalone-app.md
502
+ - docs/examples/telemetry.md
503
+ - docs/examples/timeframes.md
445
504
  - docs/getting-started/index.md
446
505
  - docs/getting-started/installation.md
447
506
  - docs/getting-started/quick-start.md
448
507
  - docs/guides/adding-memories.md
508
+ - docs/guides/configuration.md
449
509
  - docs/guides/context-assembly.md
510
+ - docs/guides/file-loading.md
450
511
  - docs/guides/getting-started.md
451
512
  - docs/guides/index.md
452
513
  - docs/guides/long-term-memory.md
453
514
  - docs/guides/mcp-server.md
454
- - docs/guides/multi-robot.md
515
+ - docs/guides/propositions.md
455
516
  - docs/guides/recalling-memories.md
456
- - docs/guides/robot-groups.md
457
517
  - docs/guides/search-strategies.md
518
+ - docs/guides/tags.md
519
+ - docs/guides/telemetry.md
458
520
  - docs/guides/working-memory.md
459
521
  - docs/images/htm-er-diagram.svg
460
522
  - docs/images/telemetry-architecture.svg
461
523
  - docs/index.md
462
524
  - docs/multi_framework_support.md
525
+ - docs/robots/hive-mind.md
526
+ - docs/robots/index.md
527
+ - docs/robots/multi-robot.md
528
+ - docs/robots/robot-groups.md
529
+ - docs/robots/two-tier-memory.md
530
+ - docs/robots/why-robots.md
463
531
  - docs/setup_local_database.md
464
- - docs/telemetry.md
465
532
  - docs/using_rake_tasks_in_your_app.md
533
+ - examples/.envrc
534
+ - examples/.gitignore
535
+ - examples/00_create_examples_db.rb
536
+ - examples/01_basic_usage.rb
537
+ - examples/02_config_file_example/README.md
538
+ - examples/02_config_file_example/config/htm.local.yml
539
+ - examples/02_config_file_example/custom_config.yml
540
+ - examples/02_config_file_example/show_config.rb
541
+ - examples/03_custom_llm_configuration.rb
542
+ - examples/04_file_loader_usage.rb
543
+ - examples/05_timeframe_demo.rb
544
+ - examples/06_example_app/Rakefile
545
+ - examples/06_example_app/app.rb
546
+ - examples/07_cli_app/README.md
547
+ - examples/07_cli_app/htm_cli.rb
548
+ - examples/08_sinatra_app/Gemfile
549
+ - examples/08_sinatra_app/Gemfile.lock
550
+ - examples/08_sinatra_app/app.rb
551
+ - examples/09_mcp_client.rb
552
+ - examples/10_telemetry/README.md
553
+ - examples/10_telemetry/SETUP_README.md
554
+ - examples/10_telemetry/demo.rb
555
+ - examples/10_telemetry/grafana/dashboards/htm-metrics.json
556
+ - examples/11_robot_groups/README.md
557
+ - examples/11_robot_groups/lib/robot_worker.rb
558
+ - examples/11_robot_groups/multi_process.rb
559
+ - examples/11_robot_groups/same_process.rb
560
+ - examples/12_rails_app/.gitignore
561
+ - examples/12_rails_app/Gemfile
562
+ - examples/12_rails_app/Gemfile.lock
563
+ - examples/12_rails_app/Procfile.dev
564
+ - examples/12_rails_app/README.md
565
+ - examples/12_rails_app/Rakefile
566
+ - examples/12_rails_app/app/assets/stylesheets/application.css
567
+ - examples/12_rails_app/app/assets/stylesheets/inter-font.css
568
+ - examples/12_rails_app/app/controllers/application_controller.rb
569
+ - examples/12_rails_app/app/controllers/dashboard_controller.rb
570
+ - examples/12_rails_app/app/controllers/files_controller.rb
571
+ - examples/12_rails_app/app/controllers/memories_controller.rb
572
+ - examples/12_rails_app/app/controllers/robots_controller.rb
573
+ - examples/12_rails_app/app/controllers/search_controller.rb
574
+ - examples/12_rails_app/app/controllers/tags_controller.rb
575
+ - examples/12_rails_app/app/javascript/application.js
576
+ - examples/12_rails_app/app/javascript/controllers/application.js
577
+ - examples/12_rails_app/app/javascript/controllers/index.js
578
+ - examples/12_rails_app/app/views/dashboard/index.html.erb
579
+ - examples/12_rails_app/app/views/files/index.html.erb
580
+ - examples/12_rails_app/app/views/files/new.html.erb
581
+ - examples/12_rails_app/app/views/files/show.html.erb
582
+ - examples/12_rails_app/app/views/layouts/application.html.erb
583
+ - examples/12_rails_app/app/views/memories/_memory_card.html.erb
584
+ - examples/12_rails_app/app/views/memories/deleted.html.erb
585
+ - examples/12_rails_app/app/views/memories/edit.html.erb
586
+ - examples/12_rails_app/app/views/memories/index.html.erb
587
+ - examples/12_rails_app/app/views/memories/new.html.erb
588
+ - examples/12_rails_app/app/views/memories/show.html.erb
589
+ - examples/12_rails_app/app/views/robots/index.html.erb
590
+ - examples/12_rails_app/app/views/robots/new.html.erb
591
+ - examples/12_rails_app/app/views/robots/show.html.erb
592
+ - examples/12_rails_app/app/views/search/index.html.erb
593
+ - examples/12_rails_app/app/views/shared/_navbar.html.erb
594
+ - examples/12_rails_app/app/views/shared/_stat_card.html.erb
595
+ - examples/12_rails_app/app/views/tags/index.html.erb
596
+ - examples/12_rails_app/app/views/tags/show.html.erb
597
+ - examples/12_rails_app/bin/dev
598
+ - examples/12_rails_app/bin/rails
599
+ - examples/12_rails_app/bin/rake
600
+ - examples/12_rails_app/config.ru
601
+ - examples/12_rails_app/config/application.rb
602
+ - examples/12_rails_app/config/boot.rb
603
+ - examples/12_rails_app/config/database.yml
604
+ - examples/12_rails_app/config/environment.rb
605
+ - examples/12_rails_app/config/importmap.rb
606
+ - examples/12_rails_app/config/initializers/htm.rb
607
+ - examples/12_rails_app/config/initializers/rack.rb
608
+ - examples/12_rails_app/config/routes.rb
609
+ - examples/12_rails_app/config/tailwind.config.js
610
+ - examples/12_rails_app/log/.keep
611
+ - examples/12_rails_app/tmp/local_secret.txt
466
612
  - examples/README.md
467
- - examples/basic_usage.rb
468
- - examples/cli_app/README.md
469
- - examples/cli_app/htm_cli.rb
470
- - examples/config_file_example/README.md
471
- - examples/config_file_example/config/htm.local.yml
472
- - examples/config_file_example/custom_config.yml
473
- - examples/config_file_example/show_config.rb
474
- - examples/custom_llm_configuration.rb
475
- - examples/example_app/Rakefile
476
- - examples/example_app/app.rb
477
- - examples/file_loader_usage.rb
478
- - examples/mcp_client.rb
479
- - examples/rails_app/.gitignore
480
- - examples/rails_app/Gemfile
481
- - examples/rails_app/Gemfile.lock
482
- - examples/rails_app/Procfile.dev
483
- - examples/rails_app/README.md
484
- - examples/rails_app/Rakefile
485
- - examples/rails_app/app/assets/stylesheets/application.css
486
- - examples/rails_app/app/assets/stylesheets/inter-font.css
487
- - examples/rails_app/app/controllers/application_controller.rb
488
- - examples/rails_app/app/controllers/dashboard_controller.rb
489
- - examples/rails_app/app/controllers/files_controller.rb
490
- - examples/rails_app/app/controllers/memories_controller.rb
491
- - examples/rails_app/app/controllers/robots_controller.rb
492
- - examples/rails_app/app/controllers/search_controller.rb
493
- - examples/rails_app/app/controllers/tags_controller.rb
494
- - examples/rails_app/app/javascript/application.js
495
- - examples/rails_app/app/javascript/controllers/application.js
496
- - examples/rails_app/app/javascript/controllers/index.js
497
- - examples/rails_app/app/views/dashboard/index.html.erb
498
- - examples/rails_app/app/views/files/index.html.erb
499
- - examples/rails_app/app/views/files/new.html.erb
500
- - examples/rails_app/app/views/files/show.html.erb
501
- - examples/rails_app/app/views/layouts/application.html.erb
502
- - examples/rails_app/app/views/memories/_memory_card.html.erb
503
- - examples/rails_app/app/views/memories/deleted.html.erb
504
- - examples/rails_app/app/views/memories/edit.html.erb
505
- - examples/rails_app/app/views/memories/index.html.erb
506
- - examples/rails_app/app/views/memories/new.html.erb
507
- - examples/rails_app/app/views/memories/show.html.erb
508
- - examples/rails_app/app/views/robots/index.html.erb
509
- - examples/rails_app/app/views/robots/new.html.erb
510
- - examples/rails_app/app/views/robots/show.html.erb
511
- - examples/rails_app/app/views/search/index.html.erb
512
- - examples/rails_app/app/views/shared/_navbar.html.erb
513
- - examples/rails_app/app/views/shared/_stat_card.html.erb
514
- - examples/rails_app/app/views/tags/index.html.erb
515
- - examples/rails_app/app/views/tags/show.html.erb
516
- - examples/rails_app/bin/dev
517
- - examples/rails_app/bin/rails
518
- - examples/rails_app/bin/rake
519
- - examples/rails_app/config.ru
520
- - examples/rails_app/config/application.rb
521
- - examples/rails_app/config/boot.rb
522
- - examples/rails_app/config/database.yml
523
- - examples/rails_app/config/environment.rb
524
- - examples/rails_app/config/importmap.rb
525
- - examples/rails_app/config/routes.rb
526
- - examples/rails_app/config/tailwind.config.js
527
- - examples/rails_app/log/.keep
528
- - examples/rails_app/tmp/local_secret.txt
529
- - examples/robot_groups/multi_process.rb
530
- - examples/robot_groups/robot_worker.rb
531
- - examples/robot_groups/same_process.rb
532
- - examples/sinatra_app/Gemfile
533
- - examples/sinatra_app/Gemfile.lock
534
- - examples/sinatra_app/app.rb
535
- - examples/telemetry/README.md
536
- - examples/telemetry/SETUP_README.md
537
- - examples/telemetry/demo.rb
538
- - examples/telemetry/grafana/dashboards/htm-metrics.json
539
- - examples/timeframe_demo.rb
613
+ - examples/examples_helper.rb
540
614
  - lib/htm.rb
541
- - lib/htm/active_record_config.rb
542
615
  - lib/htm/circuit_breaker.rb
543
616
  - lib/htm/config.rb
617
+ - lib/htm/config/builder.rb
618
+ - lib/htm/config/database.rb
544
619
  - lib/htm/config/defaults.yml
620
+ - lib/htm/config/section.rb
621
+ - lib/htm/config/validator.rb
545
622
  - lib/htm/database.rb
546
623
  - lib/htm/embedding_service.rb
547
624
  - lib/htm/errors.rb
@@ -567,6 +644,7 @@ files:
567
644
  - lib/htm/mcp/resources.rb
568
645
  - lib/htm/mcp/server.rb
569
646
  - lib/htm/mcp/tools.rb
647
+ - lib/htm/migration.rb
570
648
  - lib/htm/models/file_source.rb
571
649
  - lib/htm/models/node.rb
572
650
  - lib/htm/models/node_tag.rb
@@ -578,6 +656,7 @@ files:
578
656
  - lib/htm/query_cache.rb
579
657
  - lib/htm/railtie.rb
580
658
  - lib/htm/robot_group.rb
659
+ - lib/htm/sequel_config.rb
581
660
  - lib/htm/sql_builder.rb
582
661
  - lib/htm/tag_service.rb
583
662
  - lib/htm/tasks.rb
@@ -585,6 +664,7 @@ files:
585
664
  - lib/htm/timeframe.rb
586
665
  - lib/htm/timeframe_extractor.rb
587
666
  - lib/htm/version.rb
667
+ - lib/htm/workflows/remember_workflow.rb
588
668
  - lib/htm/working_memory.rb
589
669
  - lib/htm/working_memory_channel.rb
590
670
  - lib/tasks/db.rake
@@ -594,7 +674,9 @@ files:
594
674
  - lib/tasks/jobs.rake
595
675
  - lib/tasks/tags.rake
596
676
  - mkdocs.yml
677
+ - scripts/backfill_parent_tags.rb
597
678
  - scripts/install_local_database.sh
679
+ - scripts/normalize_plural_tags.rb
598
680
  homepage: https://github.com/madbomber/htm
599
681
  licenses:
600
682
  - MIT
@@ -616,7 +698,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
616
698
  - !ruby/object:Gem::Version
617
699
  version: '0'
618
700
  requirements: []
619
- rubygems_version: 4.0.2
701
+ rubygems_version: 4.0.4
620
702
  specification_version: 4
621
703
  summary: Hierarchical Temporal Memory for LLM robots
622
704
  test_files: []
@@ -1,240 +0,0 @@
1
- # Class: HTM::Configuration
2
- **Inherits:** Object
3
-
4
-
5
- HTM Configuration
6
-
7
- HTM uses RubyLLM for multi-provider LLM support. Supported providers:
8
- * :openai (OpenAI API)
9
- * :anthropic (Anthropic Claude)
10
- * :gemini (Google Gemini)
11
- * :azure (Azure OpenAI)
12
- * :ollama (Local Ollama - default)
13
- * :huggingface (HuggingFace Inference API)
14
- * :openrouter (OpenRouter)
15
- * :bedrock (AWS Bedrock)
16
- * :deepseek (DeepSeek)
17
-
18
-
19
- **`@example`** Using nested configuration sections
20
- ```ruby
21
- HTM.configure do |config|
22
- config.embedding.provider = :openai
23
- config.embedding.model = 'text-embedding-3-small'
24
- config.tag.provider = :openai
25
- config.tag.model = 'gpt-4o-mini'
26
- config.openai_api_key = ENV['OPENAI_API_KEY']
27
- end
28
- ```
29
- **`@example`** Using Ollama (local default)
30
- ```ruby
31
- HTM.configure do |config|
32
- config.embedding.provider = :ollama
33
- config.embedding.model = 'nomic-embed-text'
34
- config.tag.provider = :ollama
35
- config.tag.model = 'llama3'
36
- config.ollama_url = 'http://localhost:11434'
37
- end
38
- ```
39
- **`@example`** Mixed providers
40
- ```ruby
41
- HTM.configure do |config|
42
- config.embedding.provider = :openai
43
- config.embedding.model = 'text-embedding-3-small'
44
- config.openai_api_key = ENV['OPENAI_API_KEY']
45
- config.tag.provider = :anthropic
46
- config.tag.model = 'claude-3-haiku-20240307'
47
- config.anthropic_api_key = ENV['ANTHROPIC_API_KEY']
48
- end
49
- ```
50
- **`@example`** Job and chunking configuration
51
- ```ruby
52
- HTM.configure do |config|
53
- config.job.backend = :inline # or :sidekiq, :active_job, :thread
54
- config.chunking.size = 1024
55
- config.chunking.overlap = 64
56
- config.proposition.enabled = true
57
- config.proposition.provider = :ollama
58
- config.proposition.model = 'gemma3:latest'
59
- end
60
- ```
61
- **`@example`**
62
- ```ruby
63
- HTM.configure do |config|
64
- config.embedding_generator = ->(text) {
65
- MyApp::LLMService.embed(text) # Returns Array<Float>
66
- }
67
- config.tag_extractor = ->(text, ontology) {
68
- MyApp::LLMService.extract_tags(text, ontology) # Returns Array<String>
69
- }
70
- config.logger = Rails.logger
71
- end
72
- ```
73
- # Attributes
74
- ## anthropic_api_key[RW] {: #attribute-i-anthropic_api_key }
75
- Returns the value of attribute anthropic_api_key.
76
-
77
- ## azure_api_key[RW] {: #attribute-i-azure_api_key }
78
- Returns the value of attribute azure_api_key.
79
-
80
- ## azure_api_version[RW] {: #attribute-i-azure_api_version }
81
- Returns the value of attribute azure_api_version.
82
-
83
- ## azure_endpoint[RW] {: #attribute-i-azure_endpoint }
84
- Returns the value of attribute azure_endpoint.
85
-
86
- ## bedrock_access_key[RW] {: #attribute-i-bedrock_access_key }
87
- Returns the value of attribute bedrock_access_key.
88
-
89
- ## bedrock_region[RW] {: #attribute-i-bedrock_region }
90
- Returns the value of attribute bedrock_region.
91
-
92
- ## bedrock_secret_key[RW] {: #attribute-i-bedrock_secret_key }
93
- Returns the value of attribute bedrock_secret_key.
94
-
95
- ## chunk_overlap[RW] {: #attribute-i-chunk_overlap }
96
- Character overlap between chunks (default: 64)
97
-
98
- ## chunk_size[RW] {: #attribute-i-chunk_size }
99
- Chunking configuration (for file loading)
100
-
101
- ## circuit_breaker_failure_threshold[RW] {: #attribute-i-circuit_breaker_failure_threshold }
102
- Circuit breaker configuration
103
-
104
- ## circuit_breaker_half_open_max_calls[RW] {: #attribute-i-circuit_breaker_half_open_max_calls }
105
- Successes to close (default: 3)
106
-
107
- ## circuit_breaker_reset_timeout[RW] {: #attribute-i-circuit_breaker_reset_timeout }
108
- Seconds before half-open (default: 60)
109
-
110
- ## connection_timeout[RW] {: #attribute-i-connection_timeout }
111
- Returns the value of attribute connection_timeout.
112
-
113
- ## deepseek_api_key[RW] {: #attribute-i-deepseek_api_key }
114
- Returns the value of attribute deepseek_api_key.
115
-
116
- ## embedding_dimensions[RW] {: #attribute-i-embedding_dimensions }
117
- Returns the value of attribute embedding_dimensions.
118
-
119
- ## embedding_generator[RW] {: #attribute-i-embedding_generator }
120
- Returns the value of attribute embedding_generator.
121
-
122
- ## embedding_model[RW] {: #attribute-i-embedding_model }
123
- Returns the value of attribute embedding_model.
124
-
125
- ## embedding_provider[RW] {: #attribute-i-embedding_provider }
126
- Returns the value of attribute embedding_provider.
127
-
128
- ## embedding_timeout[RW] {: #attribute-i-embedding_timeout }
129
- Returns the value of attribute embedding_timeout.
130
-
131
- ## extract_propositions[RW] {: #attribute-i-extract_propositions }
132
- Returns the value of attribute extract_propositions.
133
-
134
- ## gemini_api_key[RW] {: #attribute-i-gemini_api_key }
135
- Returns the value of attribute gemini_api_key.
136
-
137
- ## huggingface_api_key[RW] {: #attribute-i-huggingface_api_key }
138
- Returns the value of attribute huggingface_api_key.
139
-
140
- ## job_backend[RW] {: #attribute-i-job_backend }
141
- Returns the value of attribute job_backend.
142
-
143
- ## logger[RW] {: #attribute-i-logger }
144
- Returns the value of attribute logger.
145
-
146
- ## max_embedding_dimension[RW] {: #attribute-i-max_embedding_dimension }
147
- Limit configuration
148
-
149
- ## max_tag_depth[RW] {: #attribute-i-max_tag_depth }
150
- Max tag hierarchy depth (default: 4)
151
-
152
- ## ollama_url[RW] {: #attribute-i-ollama_url }
153
- Returns the value of attribute ollama_url.
154
-
155
- ## openai_api_key[RW] {: #attribute-i-openai_api_key }
156
- Provider-specific API keys and endpoints
157
-
158
- ## openai_organization[RW] {: #attribute-i-openai_organization }
159
- Provider-specific API keys and endpoints
160
-
161
- ## openai_project[RW] {: #attribute-i-openai_project }
162
- Provider-specific API keys and endpoints
163
-
164
- ## openrouter_api_key[RW] {: #attribute-i-openrouter_api_key }
165
- Returns the value of attribute openrouter_api_key.
166
-
167
- ## proposition_extractor[RW] {: #attribute-i-proposition_extractor }
168
- Returns the value of attribute proposition_extractor.
169
-
170
- ## proposition_model[RW] {: #attribute-i-proposition_model }
171
- Returns the value of attribute proposition_model.
172
-
173
- ## proposition_provider[RW] {: #attribute-i-proposition_provider }
174
- Returns the value of attribute proposition_provider.
175
-
176
- ## proposition_timeout[RW] {: #attribute-i-proposition_timeout }
177
- Returns the value of attribute proposition_timeout.
178
-
179
- ## relevance_access_weight[RW] {: #attribute-i-relevance_access_weight }
180
- Access frequency weight (default: 0.1)
181
-
182
- ## relevance_recency_half_life_hours[RW] {: #attribute-i-relevance_recency_half_life_hours }
183
- Decay half-life in hours (default: 168 = 1 week)
184
-
185
- ## relevance_recency_weight[RW] {: #attribute-i-relevance_recency_weight }
186
- Temporal freshness weight (default: 0.1)
187
-
188
- ## relevance_semantic_weight[RW] {: #attribute-i-relevance_semantic_weight }
189
- Relevance scoring weights (must sum to 1.0)
190
-
191
- ## relevance_tag_weight[RW] {: #attribute-i-relevance_tag_weight }
192
- Tag overlap weight (default: 0.3)
193
-
194
- ## tag_extractor[RW] {: #attribute-i-tag_extractor }
195
- Returns the value of attribute tag_extractor.
196
-
197
- ## tag_model[RW] {: #attribute-i-tag_model }
198
- Returns the value of attribute tag_model.
199
-
200
- ## tag_provider[RW] {: #attribute-i-tag_provider }
201
- Returns the value of attribute tag_provider.
202
-
203
- ## tag_timeout[RW] {: #attribute-i-tag_timeout }
204
- Returns the value of attribute tag_timeout.
205
-
206
- ## telemetry_enabled[RW] {: #attribute-i-telemetry_enabled }
207
- Enable OpenTelemetry metrics (default: false)
208
-
209
- ## token_counter[RW] {: #attribute-i-token_counter }
210
- Returns the value of attribute token_counter.
211
-
212
- ## week_start[RW] {: #attribute-i-week_start }
213
- Returns the value of attribute week_start.
214
-
215
-
216
- # Instance Methods
217
- ## configure_ruby_llm(providernil) {: #method-i-configure_ruby_llm }
218
- Configure RubyLLM with the appropriate provider credentials
219
-
220
- **`@param`** [Symbol] The provider to configure (:openai, :anthropic, etc.)
221
-
222
- ## initialize() {: #method-i-initialize }
223
- **`@return`** [Configuration] a new instance of Configuration
224
-
225
- ## normalize_ollama_model(model_name) {: #method-i-normalize_ollama_model }
226
- Normalize Ollama model name to include tag if missing
227
-
228
- Ollama models require a tag (e.g., :latest, :7b, :13b). If the user specifies
229
- a model without a tag, we append :latest by default.
230
-
231
- **`@param`** [String] Original model name
232
-
233
- **`@return`** [String] Normalized model name with tag
234
-
235
- ## reset_to_defaults() {: #method-i-reset_to_defaults }
236
- Reset to default RubyLLM-based implementations
237
-
238
- ## validate!() {: #method-i-validate! }
239
- Validate configuration
240
-