htm 0.0.14 → 0.0.15

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +269 -79
  4. data/db/migrate/00003_create_file_sources.rb +5 -0
  5. data/db/migrate/00004_create_nodes.rb +17 -0
  6. data/db/migrate/00005_create_tags.rb +7 -0
  7. data/db/migrate/00006_create_node_tags.rb +2 -0
  8. data/db/migrate/00007_create_robot_nodes.rb +7 -0
  9. data/db/schema.sql +41 -29
  10. data/docs/api/yard/HTM/Configuration.md +54 -0
  11. data/docs/api/yard/HTM/Database.md +13 -10
  12. data/docs/api/yard/HTM/EmbeddingService.md +5 -1
  13. data/docs/api/yard/HTM/LongTermMemory.md +18 -277
  14. data/docs/api/yard/HTM/PropositionError.md +18 -0
  15. data/docs/api/yard/HTM/PropositionService.md +66 -0
  16. data/docs/api/yard/HTM/QueryCache.md +88 -0
  17. data/docs/api/yard/HTM/RobotGroup.md +481 -0
  18. data/docs/api/yard/HTM/SqlBuilder.md +108 -0
  19. data/docs/api/yard/HTM/TagService.md +4 -0
  20. data/docs/api/yard/HTM/Telemetry/NullInstrument.md +13 -0
  21. data/docs/api/yard/HTM/Telemetry/NullMeter.md +15 -0
  22. data/docs/api/yard/HTM/Telemetry.md +109 -0
  23. data/docs/api/yard/HTM/WorkingMemoryChannel.md +176 -0
  24. data/docs/api/yard/HTM.md +11 -23
  25. data/docs/api/yard/index.csv +102 -25
  26. data/docs/api/yard-reference.md +8 -0
  27. data/docs/assets/images/multi-provider-failover.svg +51 -0
  28. data/docs/assets/images/robot-group-architecture.svg +65 -0
  29. data/docs/database/README.md +3 -3
  30. data/docs/database/public.file_sources.svg +29 -21
  31. data/docs/database/public.node_tags.md +2 -0
  32. data/docs/database/public.node_tags.svg +53 -41
  33. data/docs/database/public.nodes.md +2 -0
  34. data/docs/database/public.nodes.svg +52 -40
  35. data/docs/database/public.robot_nodes.md +2 -0
  36. data/docs/database/public.robot_nodes.svg +30 -22
  37. data/docs/database/public.robots.svg +16 -12
  38. data/docs/database/public.tags.md +3 -0
  39. data/docs/database/public.tags.svg +41 -33
  40. data/docs/database/schema.json +66 -0
  41. data/docs/database/schema.svg +60 -48
  42. data/docs/development/index.md +13 -0
  43. data/docs/development/rake-tasks.md +1068 -0
  44. data/docs/getting-started/quick-start.md +144 -155
  45. data/docs/guides/adding-memories.md +2 -3
  46. data/docs/guides/context-assembly.md +185 -184
  47. data/docs/guides/getting-started.md +154 -148
  48. data/docs/guides/index.md +7 -0
  49. data/docs/guides/long-term-memory.md +60 -92
  50. data/docs/guides/mcp-server.md +617 -0
  51. data/docs/guides/multi-robot.md +249 -345
  52. data/docs/guides/recalling-memories.md +153 -163
  53. data/docs/guides/robot-groups.md +604 -0
  54. data/docs/guides/search-strategies.md +61 -58
  55. data/docs/guides/working-memory.md +103 -136
  56. data/docs/index.md +30 -26
  57. data/examples/robot_groups/robot_worker.rb +1 -2
  58. data/examples/robot_groups/same_process.rb +1 -4
  59. data/lib/htm/robot_group.rb +721 -0
  60. data/lib/htm/version.rb +1 -1
  61. data/lib/htm/working_memory_channel.rb +250 -0
  62. data/lib/htm.rb +2 -0
  63. data/mkdocs.yml +2 -0
  64. metadata +18 -9
  65. data/db/migrate/00009_add_working_memory_to_robot_nodes.rb +0 -12
  66. data/db/migrate/00010_add_soft_delete_to_associations.rb +0 -29
  67. data/db/migrate/00011_add_performance_indexes.rb +0 -21
  68. data/db/migrate/00012_add_tags_trigram_index.rb +0 -18
  69. data/db/migrate/00013_enable_lz4_compression.rb +0 -43
  70. data/examples/robot_groups/lib/robot_group.rb +0 -419
  71. data/examples/robot_groups/lib/working_memory_channel.rb +0 -140
@@ -15,10 +15,23 @@ HTM::Observability.record_query_timing,Method,HTM/Observability.md#method-c-reco
15
15
  HTM::Observability.record_tag_timing,Method,HTM/Observability.md#method-c-record_tag_timing
16
16
  HTM::Observability.reset_metrics!,Method,HTM/Observability.md#method-c-reset_metrics!
17
17
  HTM::Observability.service_timing_stats,Method,HTM/Observability.md#method-c-service_timing_stats
18
+ HTM::Telemetry,Module,HTM/Telemetry.md
19
+ HTM::Telemetry.cache_operations,Method,HTM/Telemetry.md#method-c-cache_operations
20
+ HTM::Telemetry.embedding_latency,Method,HTM/Telemetry.md#method-c-embedding_latency
21
+ HTM::Telemetry.enabled?,Method,HTM/Telemetry.md#method-c-enabled?
22
+ HTM::Telemetry.job_counter,Method,HTM/Telemetry.md#method-c-job_counter
23
+ HTM::Telemetry.measure,Method,HTM/Telemetry.md#method-c-measure
24
+ HTM::Telemetry.meter,Method,HTM/Telemetry.md#method-c-meter
25
+ HTM::Telemetry.reset!,Method,HTM/Telemetry.md#method-c-reset!
26
+ HTM::Telemetry.sdk_available?,Method,HTM/Telemetry.md#method-c-sdk_available?
27
+ HTM::Telemetry.search_latency,Method,HTM/Telemetry.md#method-c-search_latency
28
+ HTM::Telemetry.setup,Method,HTM/Telemetry.md#method-c-setup
29
+ HTM::Telemetry.tag_latency,Method,HTM/Telemetry.md#method-c-tag_latency
18
30
  HTM,Class,HTM.md
19
31
  HTM.configure,Method,HTM.md#method-c-configure
20
32
  HTM.count_tokens,Method,HTM.md#method-c-count_tokens
21
33
  HTM.embed,Method,HTM.md#method-c-embed
34
+ HTM.extract_propositions,Method,HTM.md#method-c-extract_propositions
22
35
  HTM.extract_tags,Method,HTM.md#method-c-extract_tags
23
36
  HTM.logger,Method,HTM.md#method-c-logger
24
37
  HTM.reset_configuration!,Method,HTM.md#method-c-reset_configuration!
@@ -55,6 +68,11 @@ azure_endpoint,Attribute,HTM/Configuration.md#attribute-i-azure_endpoint
55
68
  bedrock_access_key,Attribute,HTM/Configuration.md#attribute-i-bedrock_access_key
56
69
  bedrock_region,Attribute,HTM/Configuration.md#attribute-i-bedrock_region
57
70
  bedrock_secret_key,Attribute,HTM/Configuration.md#attribute-i-bedrock_secret_key
71
+ chunk_overlap,Attribute,HTM/Configuration.md#attribute-i-chunk_overlap
72
+ chunk_size,Attribute,HTM/Configuration.md#attribute-i-chunk_size
73
+ circuit_breaker_failure_threshold,Attribute,HTM/Configuration.md#attribute-i-circuit_breaker_failure_threshold
74
+ circuit_breaker_half_open_max_calls,Attribute,HTM/Configuration.md#attribute-i-circuit_breaker_half_open_max_calls
75
+ circuit_breaker_reset_timeout,Attribute,HTM/Configuration.md#attribute-i-circuit_breaker_reset_timeout
58
76
  connection_timeout,Attribute,HTM/Configuration.md#attribute-i-connection_timeout
59
77
  deepseek_api_key,Attribute,HTM/Configuration.md#attribute-i-deepseek_api_key
60
78
  embedding_dimensions,Attribute,HTM/Configuration.md#attribute-i-embedding_dimensions
@@ -62,19 +80,32 @@ embedding_generator,Attribute,HTM/Configuration.md#attribute-i-embedding_generat
62
80
  embedding_model,Attribute,HTM/Configuration.md#attribute-i-embedding_model
63
81
  embedding_provider,Attribute,HTM/Configuration.md#attribute-i-embedding_provider
64
82
  embedding_timeout,Attribute,HTM/Configuration.md#attribute-i-embedding_timeout
83
+ extract_propositions,Attribute,HTM/Configuration.md#attribute-i-extract_propositions
65
84
  gemini_api_key,Attribute,HTM/Configuration.md#attribute-i-gemini_api_key
66
85
  huggingface_api_key,Attribute,HTM/Configuration.md#attribute-i-huggingface_api_key
67
86
  job_backend,Attribute,HTM/Configuration.md#attribute-i-job_backend
68
87
  logger,Attribute,HTM/Configuration.md#attribute-i-logger
88
+ max_embedding_dimension,Attribute,HTM/Configuration.md#attribute-i-max_embedding_dimension
89
+ max_tag_depth,Attribute,HTM/Configuration.md#attribute-i-max_tag_depth
69
90
  ollama_url,Attribute,HTM/Configuration.md#attribute-i-ollama_url
70
91
  openai_api_key,Attribute,HTM/Configuration.md#attribute-i-openai_api_key
71
92
  openai_organization,Attribute,HTM/Configuration.md#attribute-i-openai_organization
72
93
  openai_project,Attribute,HTM/Configuration.md#attribute-i-openai_project
73
94
  openrouter_api_key,Attribute,HTM/Configuration.md#attribute-i-openrouter_api_key
95
+ proposition_extractor,Attribute,HTM/Configuration.md#attribute-i-proposition_extractor
96
+ proposition_model,Attribute,HTM/Configuration.md#attribute-i-proposition_model
97
+ proposition_provider,Attribute,HTM/Configuration.md#attribute-i-proposition_provider
98
+ proposition_timeout,Attribute,HTM/Configuration.md#attribute-i-proposition_timeout
99
+ relevance_access_weight,Attribute,HTM/Configuration.md#attribute-i-relevance_access_weight
100
+ relevance_recency_half_life_hours,Attribute,HTM/Configuration.md#attribute-i-relevance_recency_half_life_hours
101
+ relevance_recency_weight,Attribute,HTM/Configuration.md#attribute-i-relevance_recency_weight
102
+ relevance_semantic_weight,Attribute,HTM/Configuration.md#attribute-i-relevance_semantic_weight
103
+ relevance_tag_weight,Attribute,HTM/Configuration.md#attribute-i-relevance_tag_weight
74
104
  tag_extractor,Attribute,HTM/Configuration.md#attribute-i-tag_extractor
75
105
  tag_model,Attribute,HTM/Configuration.md#attribute-i-tag_model
76
106
  tag_provider,Attribute,HTM/Configuration.md#attribute-i-tag_provider
77
107
  tag_timeout,Attribute,HTM/Configuration.md#attribute-i-tag_timeout
108
+ telemetry_enabled,Attribute,HTM/Configuration.md#attribute-i-telemetry_enabled
78
109
  token_counter,Attribute,HTM/Configuration.md#attribute-i-token_counter
79
110
  week_start,Attribute,HTM/Configuration.md#attribute-i-week_start
80
111
  HTM::Database,Class,HTM/Database.md
@@ -94,6 +125,7 @@ HTM::EmbeddingService,Class,HTM/EmbeddingService.md
94
125
  HTM::EmbeddingService.circuit_breaker,Method,HTM/EmbeddingService.md#method-c-circuit_breaker
95
126
  HTM::EmbeddingService.format_for_storage,Method,HTM/EmbeddingService.md#method-c-format_for_storage
96
127
  HTM::EmbeddingService.generate,Method,HTM/EmbeddingService.md#method-c-generate
128
+ HTM::EmbeddingService.max_dimension,Method,HTM/EmbeddingService.md#method-c-max_dimension
97
129
  HTM::EmbeddingService.pad_embedding,Method,HTM/EmbeddingService.md#method-c-pad_embedding
98
130
  HTM::EmbeddingService.reset_circuit_breaker!,Method,HTM/EmbeddingService.md#method-c-reset_circuit_breaker!
99
131
  HTM::EmbeddingService.validate_embedding!,Method,HTM/EmbeddingService.md#method-c-validate_embedding!
@@ -103,51 +135,87 @@ HTM::ResourceExhaustedError,Class,HTM/ResourceExhaustedError.md
103
135
  HTM::NotFoundError,Class,HTM/NotFoundError.md
104
136
  HTM::EmbeddingError,Class,HTM/EmbeddingError.md
105
137
  HTM::TagError,Class,HTM/TagError.md
138
+ HTM::PropositionError,Class,HTM/PropositionError.md
106
139
  HTM::DatabaseError,Class,HTM/DatabaseError.md
107
140
  HTM::QueryTimeoutError,Class,HTM/QueryTimeoutError.md
108
141
  HTM::AuthorizationError,Class,HTM/AuthorizationError.md
109
142
  HTM::CircuitBreakerOpenError,Class,HTM/CircuitBreakerOpenError.md
110
143
  HTM::LongTermMemory,Class,HTM/LongTermMemory.md
111
- HTM::LongTermMemory.add,Method,HTM/LongTermMemory.md#method-i-add
112
- HTM::LongTermMemory.add_tag,Method,HTM/LongTermMemory.md#method-i-add_tag
113
- HTM::LongTermMemory.batch_load_node_tags,Method,HTM/LongTermMemory.md#method-i-batch_load_node_tags
114
- HTM::LongTermMemory.calculate_relevance,Method,HTM/LongTermMemory.md#method-i-calculate_relevance
115
144
  HTM::LongTermMemory.clear_cache!,Method,HTM/LongTermMemory.md#method-i-clear_cache!
116
- HTM::LongTermMemory.delete,Method,HTM/LongTermMemory.md#method-i-delete
117
- HTM::LongTermMemory.exists?,Method,HTM/LongTermMemory.md#method-i-exists?
118
- HTM::LongTermMemory.find_query_matching_tags,Method,HTM/LongTermMemory.md#method-i-find_query_matching_tags
119
- HTM::LongTermMemory.get_node_tags,Method,HTM/LongTermMemory.md#method-i-get_node_tags
120
145
  HTM::LongTermMemory.initialize,Method,HTM/LongTermMemory.md#method-i-initialize
121
- HTM::LongTermMemory.link_robot_to_node,Method,HTM/LongTermMemory.md#method-i-link_robot_to_node
122
- HTM::LongTermMemory.mark_evicted,Method,HTM/LongTermMemory.md#method-i-mark_evicted
123
- HTM::LongTermMemory.node_topics,Method,HTM/LongTermMemory.md#method-i-node_topics
124
- HTM::LongTermMemory.nodes_by_topic,Method,HTM/LongTermMemory.md#method-i-nodes_by_topic
125
- HTM::LongTermMemory.ontology_structure,Method,HTM/LongTermMemory.md#method-i-ontology_structure
126
146
  HTM::LongTermMemory.pool_size,Method,HTM/LongTermMemory.md#method-i-pool_size
127
- HTM::LongTermMemory.popular_tags,Method,HTM/LongTermMemory.md#method-i-popular_tags
128
- HTM::LongTermMemory.register_robot,Method,HTM/LongTermMemory.md#method-i-register_robot
129
- HTM::LongTermMemory.retrieve,Method,HTM/LongTermMemory.md#method-i-retrieve
130
- HTM::LongTermMemory.search,Method,HTM/LongTermMemory.md#method-i-search
131
- HTM::LongTermMemory.search_by_tags,Method,HTM/LongTermMemory.md#method-i-search_by_tags
132
- HTM::LongTermMemory.search_fulltext,Method,HTM/LongTermMemory.md#method-i-search_fulltext
133
- HTM::LongTermMemory.search_hybrid,Method,HTM/LongTermMemory.md#method-i-search_hybrid
134
- HTM::LongTermMemory.search_with_relevance,Method,HTM/LongTermMemory.md#method-i-search_with_relevance
135
147
  HTM::LongTermMemory.shutdown,Method,HTM/LongTermMemory.md#method-i-shutdown
136
148
  HTM::LongTermMemory.stats,Method,HTM/LongTermMemory.md#method-i-stats
137
- HTM::LongTermMemory.topic_relationships,Method,HTM/LongTermMemory.md#method-i-topic_relationships
138
- HTM::LongTermMemory.track_access,Method,HTM/LongTermMemory.md#method-i-track_access
139
- HTM::LongTermMemory.update_last_accessed,Method,HTM/LongTermMemory.md#method-i-update_last_accessed
140
- HTM::LongTermMemory.update_robot_activity,Method,HTM/LongTermMemory.md#method-i-update_robot_activity
141
149
  query_timeout,Attribute,HTM/LongTermMemory.md#attribute-i-query_timeout
150
+ HTM::PropositionService,Class,HTM/PropositionService.md
151
+ HTM::PropositionService.circuit_breaker,Method,HTM/PropositionService.md#method-c-circuit_breaker
152
+ HTM::PropositionService.extract,Method,HTM/PropositionService.md#method-c-extract
153
+ HTM::PropositionService.parse_propositions,Method,HTM/PropositionService.md#method-c-parse_propositions
154
+ HTM::PropositionService.reset_circuit_breaker!,Method,HTM/PropositionService.md#method-c-reset_circuit_breaker!
155
+ HTM::PropositionService.valid_proposition?,Method,HTM/PropositionService.md#method-c-valid_proposition?
156
+ HTM::PropositionService.validate_and_filter_propositions,Method,HTM/PropositionService.md#method-c-validate_and_filter_propositions
157
+ HTM::QueryCache,Class,HTM/QueryCache.md
158
+ HTM::QueryCache.clear!,Method,HTM/QueryCache.md#method-i-clear!
159
+ HTM::QueryCache.enabled?,Method,HTM/QueryCache.md#method-i-enabled?
160
+ HTM::QueryCache.fetch,Method,HTM/QueryCache.md#method-i-fetch
161
+ HTM::QueryCache.initialize,Method,HTM/QueryCache.md#method-i-initialize
162
+ HTM::QueryCache.invalidate!,Method,HTM/QueryCache.md#method-i-invalidate!
163
+ HTM::QueryCache.invalidate_methods!,Method,HTM/QueryCache.md#method-i-invalidate_methods!
164
+ HTM::QueryCache.stats,Method,HTM/QueryCache.md#method-i-stats
165
+ enabled,Attribute,HTM/QueryCache.md#attribute-i-enabled
142
166
  HTM::Railtie,Class,HTM/Railtie.md
167
+ HTM::RobotGroup,Class,HTM/RobotGroup.md
168
+ HTM::RobotGroup.active?,Method,HTM/RobotGroup.md#method-i-active?
169
+ HTM::RobotGroup.active_robot_names,Method,HTM/RobotGroup.md#method-i-active_robot_names
170
+ HTM::RobotGroup.add_active,Method,HTM/RobotGroup.md#method-i-add_active
171
+ HTM::RobotGroup.add_passive,Method,HTM/RobotGroup.md#method-i-add_passive
172
+ HTM::RobotGroup.clear_working_memory,Method,HTM/RobotGroup.md#method-i-clear_working_memory
173
+ HTM::RobotGroup.demote,Method,HTM/RobotGroup.md#method-i-demote
174
+ HTM::RobotGroup.failover!,Method,HTM/RobotGroup.md#method-i-failover!
175
+ HTM::RobotGroup.in_sync?,Method,HTM/RobotGroup.md#method-i-in_sync?
176
+ HTM::RobotGroup.initialize,Method,HTM/RobotGroup.md#method-i-initialize
177
+ HTM::RobotGroup.member?,Method,HTM/RobotGroup.md#method-i-member?
178
+ HTM::RobotGroup.member_ids,Method,HTM/RobotGroup.md#method-i-member_ids
179
+ HTM::RobotGroup.passive?,Method,HTM/RobotGroup.md#method-i-passive?
180
+ HTM::RobotGroup.passive_robot_names,Method,HTM/RobotGroup.md#method-i-passive_robot_names
181
+ HTM::RobotGroup.promote,Method,HTM/RobotGroup.md#method-i-promote
182
+ HTM::RobotGroup.recall,Method,HTM/RobotGroup.md#method-i-recall
183
+ HTM::RobotGroup.remember,Method,HTM/RobotGroup.md#method-i-remember
184
+ HTM::RobotGroup.remove,Method,HTM/RobotGroup.md#method-i-remove
185
+ HTM::RobotGroup.shutdown,Method,HTM/RobotGroup.md#method-i-shutdown
186
+ HTM::RobotGroup.status,Method,HTM/RobotGroup.md#method-i-status
187
+ HTM::RobotGroup.sync_all,Method,HTM/RobotGroup.md#method-i-sync_all
188
+ HTM::RobotGroup.sync_robot,Method,HTM/RobotGroup.md#method-i-sync_robot
189
+ HTM::RobotGroup.sync_stats,Method,HTM/RobotGroup.md#method-i-sync_stats
190
+ HTM::RobotGroup.transfer_working_memory,Method,HTM/RobotGroup.md#method-i-transfer_working_memory
191
+ HTM::RobotGroup.working_memory_contents,Method,HTM/RobotGroup.md#method-i-working_memory_contents
192
+ channel,Attribute,HTM/RobotGroup.md#attribute-i-channel
193
+ max_tokens,Attribute,HTM/RobotGroup.md#attribute-i-max_tokens
194
+ name,Attribute,HTM/RobotGroup.md#attribute-i-name
195
+ HTM::SqlBuilder,Class,HTM/SqlBuilder.md
196
+ HTM::SqlBuilder.apply_metadata,Method,HTM/SqlBuilder.md#method-c-apply_metadata
197
+ HTM::SqlBuilder.apply_timeframe,Method,HTM/SqlBuilder.md#method-c-apply_timeframe
198
+ HTM::SqlBuilder.metadata_condition,Method,HTM/SqlBuilder.md#method-c-metadata_condition
199
+ HTM::SqlBuilder.pad_embedding,Method,HTM/SqlBuilder.md#method-c-pad_embedding
200
+ HTM::SqlBuilder.sanitize_embedding,Method,HTM/SqlBuilder.md#method-c-sanitize_embedding
201
+ HTM::SqlBuilder.sanitize_like_pattern,Method,HTM/SqlBuilder.md#method-c-sanitize_like_pattern
202
+ HTM::SqlBuilder.timeframe_condition,Method,HTM/SqlBuilder.md#method-c-timeframe_condition
143
203
  HTM::TagService,Class,HTM/TagService.md
144
204
  HTM::TagService.circuit_breaker,Method,HTM/TagService.md#method-c-circuit_breaker
145
205
  HTM::TagService.extract,Method,HTM/TagService.md#method-c-extract
206
+ HTM::TagService.max_depth,Method,HTM/TagService.md#method-c-max_depth
146
207
  HTM::TagService.parse_hierarchy,Method,HTM/TagService.md#method-c-parse_hierarchy
147
208
  HTM::TagService.parse_tags,Method,HTM/TagService.md#method-c-parse_tags
148
209
  HTM::TagService.reset_circuit_breaker!,Method,HTM/TagService.md#method-c-reset_circuit_breaker!
149
210
  HTM::TagService.valid_tag?,Method,HTM/TagService.md#method-c-valid_tag?
150
211
  HTM::TagService.validate_and_filter_tags,Method,HTM/TagService.md#method-c-validate_and_filter_tags
212
+ HTM::Telemetry::NullMeter,Class,HTM/Telemetry/NullMeter.md
213
+ HTM::Telemetry::NullMeter.create_counter,Method,HTM/Telemetry/NullMeter.md#method-i-create_counter
214
+ HTM::Telemetry::NullMeter.create_histogram,Method,HTM/Telemetry/NullMeter.md#method-i-create_histogram
215
+ HTM::Telemetry::NullMeter.create_up_down_counter,Method,HTM/Telemetry/NullMeter.md#method-i-create_up_down_counter
216
+ HTM::Telemetry::NullInstrument,Class,HTM/Telemetry/NullInstrument.md
217
+ HTM::Telemetry::NullInstrument.add,Method,HTM/Telemetry/NullInstrument.md#method-i-add
218
+ HTM::Telemetry::NullInstrument.record,Method,HTM/Telemetry/NullInstrument.md#method-i-record
151
219
  HTM::TimeframeExtractor,Class,HTM/TimeframeExtractor.md
152
220
  HTM::TimeframeExtractor.extract,Method,HTM/TimeframeExtractor.md#method-c-extract
153
221
  HTM::TimeframeExtractor.temporal?,Method,HTM/TimeframeExtractor.md#method-c-temporal?
@@ -162,6 +230,15 @@ HTM::Timeframe::Result,Class,HTM/Timeframe/Result.md
162
230
  extracted,Attribute,HTM/Timeframe/Result.md#attribute-i-extracted
163
231
  query,Attribute,HTM/Timeframe/Result.md#attribute-i-query
164
232
  timeframe,Attribute,HTM/Timeframe/Result.md#attribute-i-timeframe
233
+ HTM::WorkingMemoryChannel,Class,HTM/WorkingMemoryChannel.md
234
+ HTM::WorkingMemoryChannel.channel_name,Method,HTM/WorkingMemoryChannel.md#method-i-channel_name
235
+ HTM::WorkingMemoryChannel.initialize,Method,HTM/WorkingMemoryChannel.md#method-i-initialize
236
+ HTM::WorkingMemoryChannel.listening?,Method,HTM/WorkingMemoryChannel.md#method-i-listening?
237
+ HTM::WorkingMemoryChannel.notify,Method,HTM/WorkingMemoryChannel.md#method-i-notify
238
+ HTM::WorkingMemoryChannel.on_change,Method,HTM/WorkingMemoryChannel.md#method-i-on_change
239
+ HTM::WorkingMemoryChannel.start_listening,Method,HTM/WorkingMemoryChannel.md#method-i-start_listening
240
+ HTM::WorkingMemoryChannel.stop_listening,Method,HTM/WorkingMemoryChannel.md#method-i-stop_listening
241
+ notifications_received,Attribute,HTM/WorkingMemoryChannel.md#attribute-i-notifications_received
165
242
  HTM::WorkingMemory,Class,HTM/WorkingMemory.md
166
243
  HTM::WorkingMemory.add,Method,HTM/WorkingMemory.md#method-i-add
167
244
  HTM::WorkingMemory.add_from_sync,Method,HTM/WorkingMemory.md#method-i-add_from_sync
@@ -30,12 +30,20 @@ Complete API documentation generated by [YARD](https://yardoc.org/) with [yard-m
30
30
  | [HTM::JobAdapter](yard/HTM/JobAdapter.md) | Background job abstraction layer |
31
31
  | [HTM::LongTermMemory](yard/HTM/LongTermMemory.md) | PostgreSQL-backed permanent storage |
32
32
  | [HTM::Observability](yard/HTM/Observability.md) | Metrics and logging instrumentation |
33
+ | [HTM::PropositionService](yard/HTM/PropositionService.md) | HTM::PropositionService class |
34
+ | [HTM::QueryCache](yard/HTM/QueryCache.md) | HTM::QueryCache class |
35
+ | [HTM::RobotGroup](yard/HTM/RobotGroup.md) | HTM::RobotGroup class |
36
+ | [HTM::SqlBuilder](yard/HTM/SqlBuilder.md) | HTM::SqlBuilder class |
33
37
  | [HTM::TagService](yard/HTM/TagService.md) | Hierarchical tag extraction service |
38
+ | [HTM::Telemetry](yard/HTM/Telemetry.md) | HTM::Telemetry class |
39
+ | [HTM::Telemetry::NullInstrument](yard/HTM/Telemetry/NullInstrument.md) | HTM::Telemetry::NullInstrument class |
40
+ | [HTM::Telemetry::NullMeter](yard/HTM/Telemetry/NullMeter.md) | HTM::Telemetry::NullMeter class |
34
41
  | [HTM::Timeframe](yard/HTM/Timeframe.md) | Time-based query filtering |
35
42
  | [HTM::Timeframe::Result](yard/HTM/Timeframe/Result.md) | HTM::Timeframe::Result class |
36
43
  | [HTM::TimeframeExtractor](yard/HTM/TimeframeExtractor.md) | Natural language time parsing |
37
44
  | [HTM::TimeframeExtractor::Result](yard/HTM/TimeframeExtractor/Result.md) | HTM::TimeframeExtractor::Result class |
38
45
  | [HTM::WorkingMemory](yard/HTM/WorkingMemory.md) | Token-limited in-memory cache |
46
+ | [HTM::WorkingMemoryChannel](yard/HTM/WorkingMemoryChannel.md) | HTM::WorkingMemoryChannel class |
39
47
 
40
48
  ## Generating Documentation
41
49
 
@@ -0,0 +1,51 @@
1
+ <svg viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <!-- Title -->
3
+ <text x="400" y="30" text-anchor="middle" fill="#E0E0E0" font-size="16" font-weight="bold">Multi-Provider Failover Strategy</text>
4
+
5
+ <!-- Primary -->
6
+ <rect x="50" y="80" width="200" height="100" fill="rgba(76, 175, 80, 0.2)" stroke="#4CAF50" stroke-width="2" rx="5"/>
7
+ <text x="150" y="105" text-anchor="middle" fill="#4CAF50" font-size="12" font-weight="bold">PRIMARY</text>
8
+ <text x="150" y="130" text-anchor="middle" fill="#E0E0E0" font-size="14">OpenAI GPT-4</text>
9
+ <text x="150" y="155" text-anchor="middle" fill="#B0B0B0" font-size="10">Fast, cost-effective</text>
10
+ <text x="150" y="170" text-anchor="middle" fill="#B0B0B0" font-size="10">JSON output format</text>
11
+
12
+ <!-- Standby 1 -->
13
+ <rect x="300" y="80" width="200" height="100" fill="rgba(255, 152, 0, 0.2)" stroke="#FF9800" stroke-width="2" rx="5"/>
14
+ <text x="400" y="105" text-anchor="middle" fill="#FF9800" font-size="12" font-weight="bold">STANDBY 1</text>
15
+ <text x="400" y="130" text-anchor="middle" fill="#E0E0E0" font-size="14">Anthropic Claude</text>
16
+ <text x="400" y="155" text-anchor="middle" fill="#B0B0B0" font-size="10">Different provider</text>
17
+ <text x="400" y="170" text-anchor="middle" fill="#B0B0B0" font-size="10">XML output format</text>
18
+
19
+ <!-- Standby 2 -->
20
+ <rect x="550" y="80" width="200" height="100" fill="rgba(255, 152, 0, 0.2)" stroke="#FF9800" stroke-width="2" rx="5"/>
21
+ <text x="650" y="105" text-anchor="middle" fill="#FF9800" font-size="12" font-weight="bold">STANDBY 2</text>
22
+ <text x="650" y="130" text-anchor="middle" fill="#E0E0E0" font-size="14">Google Gemini</text>
23
+ <text x="650" y="155" text-anchor="middle" fill="#B0B0B0" font-size="10">Third provider option</text>
24
+ <text x="650" y="170" text-anchor="middle" fill="#B0B0B0" font-size="10">Markdown output format</text>
25
+
26
+ <!-- Arrows -->
27
+ <path d="M 250 130 L 290 130" stroke="#4CAF50" stroke-width="2" marker-end="url(#arrow-fail)"/>
28
+ <path d="M 500 130 L 540 130" stroke="#FF9800" stroke-width="2" marker-end="url(#arrow-fail)"/>
29
+ <text x="270" y="120" fill="#F44336" font-size="10">failover</text>
30
+ <text x="520" y="120" fill="#F44336" font-size="10">failover</text>
31
+
32
+ <!-- Shared Context Box -->
33
+ <rect x="150" y="230" width="500" height="80" fill="rgba(33, 150, 243, 0.15)" stroke="#2196F3" stroke-width="2" rx="5"/>
34
+ <text x="400" y="260" text-anchor="middle" fill="#E0E0E0" font-size="14" font-weight="bold">Shared Working Memory</text>
35
+ <text x="400" y="285" text-anchor="middle" fill="#2196F3" font-size="12">Same context across all providers</text>
36
+
37
+ <!-- Connections to shared -->
38
+ <line x1="150" y1="180" x2="200" y2="230" stroke="#4CAF50" stroke-width="1.5"/>
39
+ <line x1="400" y1="180" x2="400" y2="230" stroke="#FF9800" stroke-width="1.5"/>
40
+ <line x1="650" y1="180" x2="600" y2="230" stroke="#FF9800" stroke-width="1.5"/>
41
+
42
+ <!-- Key points -->
43
+ <text x="400" y="350" text-anchor="middle" fill="#4CAF50" font-size="12">Context is shared</text>
44
+ <text x="400" y="370" text-anchor="middle" fill="#F44336" font-size="12">Prompts are provider-specific</text>
45
+
46
+ <defs>
47
+ <marker id="arrow-fail" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
48
+ <polygon points="0 0, 10 3, 0 6" fill="#F44336"/>
49
+ </marker>
50
+ </defs>
51
+ </svg>
@@ -0,0 +1,65 @@
1
+ <svg viewBox="0 0 900 550" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <!-- Title -->
3
+ <text x="450" y="30" text-anchor="middle" fill="#E0E0E0" font-size="18" font-weight="bold">Robot Group: Shared Working Memory + Real-Time Sync</text>
4
+
5
+ <!-- Active Robot 1 -->
6
+ <rect x="50" y="80" width="220" height="120" fill="rgba(76, 175, 80, 0.2)" stroke="#4CAF50" stroke-width="2" rx="5"/>
7
+ <text x="160" y="105" text-anchor="middle" fill="#4CAF50" font-size="12" font-weight="bold">ACTIVE</text>
8
+ <text x="160" y="130" text-anchor="middle" fill="#E0E0E0" font-size="14" font-weight="bold">Primary Agent</text>
9
+ <text x="160" y="155" text-anchor="middle" fill="#B0B0B0" font-size="11">Working Memory: 5 nodes</text>
10
+ <text x="160" y="175" text-anchor="middle" fill="#B0B0B0" font-size="11">Provider: OpenAI</text>
11
+
12
+ <!-- Active Robot 2 -->
13
+ <rect x="340" y="80" width="220" height="120" fill="rgba(76, 175, 80, 0.2)" stroke="#4CAF50" stroke-width="2" rx="5"/>
14
+ <text x="450" y="105" text-anchor="middle" fill="#4CAF50" font-size="12" font-weight="bold">ACTIVE</text>
15
+ <text x="450" y="130" text-anchor="middle" fill="#E0E0E0" font-size="14" font-weight="bold">Secondary Agent</text>
16
+ <text x="450" y="155" text-anchor="middle" fill="#B0B0B0" font-size="11">Working Memory: 5 nodes</text>
17
+ <text x="450" y="175" text-anchor="middle" fill="#B0B0B0" font-size="11">Provider: Anthropic</text>
18
+
19
+ <!-- Passive Robot -->
20
+ <rect x="630" y="80" width="220" height="120" fill="rgba(255, 152, 0, 0.2)" stroke="#FF9800" stroke-width="2" rx="5"/>
21
+ <text x="740" y="105" text-anchor="middle" fill="#FF9800" font-size="12" font-weight="bold">PASSIVE (Standby)</text>
22
+ <text x="740" y="130" text-anchor="middle" fill="#E0E0E0" font-size="14" font-weight="bold">Backup Agent</text>
23
+ <text x="740" y="155" text-anchor="middle" fill="#B0B0B0" font-size="11">Working Memory: 5 nodes</text>
24
+ <text x="740" y="175" text-anchor="middle" fill="#B0B0B0" font-size="11">Provider: Gemini</text>
25
+
26
+ <!-- Sync Layer -->
27
+ <rect x="100" y="250" width="700" height="80" fill="rgba(33, 150, 243, 0.15)" stroke="#2196F3" stroke-width="2" rx="5"/>
28
+ <text x="450" y="280" text-anchor="middle" fill="#E0E0E0" font-size="14" font-weight="bold">Real-Time Sync Layer</text>
29
+ <text x="450" y="305" text-anchor="middle" fill="#2196F3" font-size="12">PostgreSQL LISTEN/NOTIFY (HTM::WorkingMemoryChannel)</text>
30
+
31
+ <!-- Connections to sync layer -->
32
+ <line x1="160" y1="200" x2="160" y2="250" stroke="#4CAF50" stroke-width="2" marker-end="url(#arrow-green)"/>
33
+ <line x1="450" y1="200" x2="450" y2="250" stroke="#4CAF50" stroke-width="2" marker-end="url(#arrow-green)"/>
34
+ <line x1="740" y1="200" x2="740" y2="250" stroke="#FF9800" stroke-width="2" marker-end="url(#arrow-orange)"/>
35
+
36
+ <!-- Shared Long-Term Memory -->
37
+ <ellipse cx="450" cy="430" rx="200" ry="80" fill="rgba(156, 39, 176, 0.2)" stroke="#9C27B0" stroke-width="3"/>
38
+ <text x="450" y="415" text-anchor="middle" fill="#E0E0E0" font-size="14" font-weight="bold">Shared Long-Term Memory</text>
39
+ <text x="450" y="440" text-anchor="middle" fill="#B0B0B0" font-size="12">PostgreSQL (Hive Mind)</text>
40
+ <text x="450" y="460" text-anchor="middle" fill="#9C27B0" font-size="11">All Robots Access Here</text>
41
+
42
+ <!-- Connection from sync to LTM -->
43
+ <line x1="450" y1="330" x2="450" y2="350" stroke="#9C27B0" stroke-width="2" marker-end="url(#arrow-purple)"/>
44
+
45
+ <!-- Arrows -->
46
+ <defs>
47
+ <marker id="arrow-green" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
48
+ <polygon points="0 0, 10 3, 0 6" fill="#4CAF50"/>
49
+ </marker>
50
+ <marker id="arrow-orange" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
51
+ <polygon points="0 0, 10 3, 0 6" fill="#FF9800"/>
52
+ </marker>
53
+ <marker id="arrow-purple" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
54
+ <polygon points="0 0, 10 3, 0 6" fill="#9C27B0"/>
55
+ </marker>
56
+ </defs>
57
+
58
+ <!-- Legend -->
59
+ <rect x="50" y="520" width="15" height="15" fill="rgba(76, 175, 80, 0.3)" stroke="#4CAF50"/>
60
+ <text x="75" y="532" fill="#B0B0B0" font-size="11">Active (handles requests)</text>
61
+ <rect x="250" y="520" width="15" height="15" fill="rgba(255, 152, 0, 0.3)" stroke="#FF9800"/>
62
+ <text x="275" y="532" fill="#B0B0B0" font-size="11">Passive (warm standby)</text>
63
+ <rect x="450" y="520" width="15" height="15" fill="rgba(33, 150, 243, 0.3)" stroke="#2196F3"/>
64
+ <text x="475" y="532" fill="#B0B0B0" font-size="11">Real-time sync</text>
65
+ </svg>
@@ -5,12 +5,12 @@
5
5
  | Name | Columns | Comment | Type |
6
6
  | ---- | ------- | ------- | ---- |
7
7
  | [public.file_sources](public.file_sources.md) | 9 | Source file metadata for loaded documents | BASE TABLE |
8
- | [public.node_tags](public.node_tags.md) | 4 | Join table connecting nodes to tags (many-to-many) | BASE TABLE |
8
+ | [public.node_tags](public.node_tags.md) | 5 | Join table connecting nodes to tags (many-to-many) | BASE TABLE |
9
9
  | [public.nodes](public.nodes.md) | 14 | Core memory storage for conversation messages and context | BASE TABLE |
10
- | [public.robot_nodes](public.robot_nodes.md) | 9 | Join table connecting robots to nodes (many-to-many) | BASE TABLE |
10
+ | [public.robot_nodes](public.robot_nodes.md) | 10 | Join table connecting robots to nodes (many-to-many) | BASE TABLE |
11
11
  | [public.robots](public.robots.md) | 4 | Registry of all LLM robots using the HTM system | BASE TABLE |
12
12
  | [public.schema_migrations](public.schema_migrations.md) | 1 | | BASE TABLE |
13
- | [public.tags](public.tags.md) | 3 | Unique tag names for categorization | BASE TABLE |
13
+ | [public.tags](public.tags.md) | 4 | Unique tag names for categorization | BASE TABLE |
14
14
 
15
15
  ## Stored procedures and functions
16
16
 
@@ -4,11 +4,11 @@
4
4
  <!-- Generated by graphviz version 12.1.2 (20240928.0832)
5
5
  -->
6
6
  <!-- Title: public.file_sources Pages: 1 -->
7
- <svg width="1329pt" height="1469pt"
8
- viewBox="0.00 0.00 1328.70 1468.80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
- <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1464.8)">
7
+ <svg width="1329pt" height="1500pt"
8
+ viewBox="0.00 0.00 1328.70 1499.60" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
+ <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1495.6)">
10
10
  <title>public.file_sources</title>
11
- <polygon fill="white" stroke="none" points="-4,4 -4,-1464.8 1324.7,-1464.8 1324.7,4 -4,4"/>
11
+ <polygon fill="white" stroke="none" points="-4,4 -4,-1495.6 1324.7,-1495.6 1324.7,4 -4,4"/>
12
12
  <!-- public.file_sources -->
13
13
  <g id="node1" class="node">
14
14
  <title>public.file_sources</title>
@@ -128,16 +128,20 @@
128
128
  <!-- public.node_tags -->
129
129
  <g id="node3" class="node">
130
130
  <title>public.node_tags</title>
131
- <polygon fill="#efefef" stroke="none" points="43.2,-1294.6 43.2,-1340.6 512.41,-1340.6 512.41,-1294.6 43.2,-1294.6"/>
132
- <polygon fill="none" stroke="black" points="43.2,-1294.6 43.2,-1340.6 512.41,-1340.6 512.41,-1294.6 43.2,-1294.6"/>
133
- <text text-anchor="start" x="154.32" y="-1318.4" font-family="Arial Bold" font-size="18.00">public.node_tags</text>
134
- <text text-anchor="start" x="276.8" y="-1318.4" font-family="Arial" font-size="14.00">    </text>
135
- <text text-anchor="start" x="307.92" y="-1318.4" font-family="Arial" font-size="14.00" fill="#666666">[BASE TABLE]</text>
136
- <text text-anchor="start" x="116.72" y="-1304" font-family="Arial" font-size="14.00" fill="#333333">Join table connecting nodes to tags (many&#45;to&#45;many)</text>
131
+ <polygon fill="#efefef" stroke="none" points="43.2,-1325.4 43.2,-1371.4 512.41,-1371.4 512.41,-1325.4 43.2,-1325.4"/>
132
+ <polygon fill="none" stroke="black" points="43.2,-1325.4 43.2,-1371.4 512.41,-1371.4 512.41,-1325.4 43.2,-1325.4"/>
133
+ <text text-anchor="start" x="154.32" y="-1349.2" font-family="Arial Bold" font-size="18.00">public.node_tags</text>
134
+ <text text-anchor="start" x="276.8" y="-1349.2" font-family="Arial" font-size="14.00">    </text>
135
+ <text text-anchor="start" x="307.92" y="-1349.2" font-family="Arial" font-size="14.00" fill="#666666">[BASE TABLE]</text>
136
+ <text text-anchor="start" x="116.72" y="-1334.8" font-family="Arial" font-size="14.00" fill="#333333">Join table connecting nodes to tags (many&#45;to&#45;many)</text>
137
+ <polygon fill="none" stroke="black" points="43.2,-1294.6 43.2,-1325.4 512.41,-1325.4 512.41,-1294.6 43.2,-1294.6"/>
138
+ <text text-anchor="start" x="50.2" y="-1306.8" font-family="Arial" font-size="14.00">created_at </text>
139
+ <text text-anchor="start" x="120.25" y="-1306.8" font-family="Arial" font-size="14.00" fill="#666666">[timestamp with time zone]</text>
140
+ <text text-anchor="start" x="285.97" y="-1306.8" font-family="Arial" font-size="14.00"> When this association was created</text>
137
141
  <polygon fill="none" stroke="black" points="43.2,-1263.8 43.2,-1294.6 512.41,-1294.6 512.41,-1263.8 43.2,-1263.8"/>
138
- <text text-anchor="start" x="50.2" y="-1276" font-family="Arial" font-size="14.00">created_at </text>
139
- <text text-anchor="start" x="120.25" y="-1276" font-family="Arial" font-size="14.00" fill="#666666">[timestamp with time zone]</text>
140
- <text text-anchor="start" x="285.97" y="-1276" font-family="Arial" font-size="14.00"> When this association was created</text>
142
+ <text text-anchor="start" x="50.2" y="-1276" font-family="Arial" font-size="14.00">deleted_at </text>
143
+ <text text-anchor="start" x="119.48" y="-1276" font-family="Arial" font-size="14.00" fill="#666666">[timestamp with time zone]</text>
144
+ <text text-anchor="start" x="285.21" y="-1276" font-family="Arial" font-size="14.00"> Soft delete timestamp</text>
141
145
  <polygon fill="none" stroke="black" points="43.2,-1233 43.2,-1263.8 512.41,-1263.8 512.41,-1233 43.2,-1233"/>
142
146
  <text text-anchor="start" x="50.2" y="-1245.2" font-family="Arial" font-size="14.00">id </text>
143
147
  <text text-anchor="start" x="64.99" y="-1245.2" font-family="Arial" font-size="14.00" fill="#666666">[bigint]</text>
@@ -160,15 +164,19 @@
160
164
  <!-- public.robot_nodes -->
161
165
  <g id="node4" class="node">
162
166
  <title>public.robot_nodes</title>
163
- <polygon fill="#efefef" stroke="none" points="617.06,-1371.6 617.06,-1417.6 1246.55,-1417.6 1246.55,-1371.6 617.06,-1371.6"/>
164
- <polygon fill="none" stroke="black" points="617.06,-1371.6 617.06,-1417.6 1246.55,-1417.6 1246.55,-1371.6 617.06,-1371.6"/>
165
- <text text-anchor="start" x="800.32" y="-1395.4" font-family="Arial Bold" font-size="18.00">public.robot_nodes</text>
166
- <text text-anchor="start" x="938.8" y="-1395.4" font-family="Arial" font-size="14.00">    </text>
167
- <text text-anchor="start" x="969.92" y="-1395.4" font-family="Arial" font-size="14.00" fill="#666666">[BASE TABLE]</text>
168
- <text text-anchor="start" x="764.5" y="-1381" font-family="Arial" font-size="14.00" fill="#333333">Join table connecting robots to nodes (many&#45;to&#45;many)</text>
167
+ <polygon fill="#efefef" stroke="none" points="617.06,-1402.4 617.06,-1448.4 1246.55,-1448.4 1246.55,-1402.4 617.06,-1402.4"/>
168
+ <polygon fill="none" stroke="black" points="617.06,-1402.4 617.06,-1448.4 1246.55,-1448.4 1246.55,-1402.4 617.06,-1402.4"/>
169
+ <text text-anchor="start" x="800.32" y="-1426.2" font-family="Arial Bold" font-size="18.00">public.robot_nodes</text>
170
+ <text text-anchor="start" x="938.8" y="-1426.2" font-family="Arial" font-size="14.00">    </text>
171
+ <text text-anchor="start" x="969.92" y="-1426.2" font-family="Arial" font-size="14.00" fill="#666666">[BASE TABLE]</text>
172
+ <text text-anchor="start" x="764.5" y="-1411.8" font-family="Arial" font-size="14.00" fill="#333333">Join table connecting robots to nodes (many&#45;to&#45;many)</text>
173
+ <polygon fill="none" stroke="black" points="617.06,-1371.6 617.06,-1402.4 1246.55,-1402.4 1246.55,-1371.6 617.06,-1371.6"/>
174
+ <text text-anchor="start" x="624.06" y="-1383.8" font-family="Arial" font-size="14.00">created_at </text>
175
+ <text text-anchor="start" x="694.11" y="-1383.8" font-family="Arial" font-size="14.00" fill="#666666">[timestamp with time zone]</text>
169
176
  <polygon fill="none" stroke="black" points="617.06,-1340.8 617.06,-1371.6 1246.55,-1371.6 1246.55,-1340.8 617.06,-1340.8"/>
170
- <text text-anchor="start" x="624.06" y="-1353" font-family="Arial" font-size="14.00">created_at </text>
171
- <text text-anchor="start" x="694.11" y="-1353" font-family="Arial" font-size="14.00" fill="#666666">[timestamp with time zone]</text>
177
+ <text text-anchor="start" x="624.06" y="-1353" font-family="Arial" font-size="14.00">deleted_at </text>
178
+ <text text-anchor="start" x="693.34" y="-1353" font-family="Arial" font-size="14.00" fill="#666666">[timestamp with time zone]</text>
179
+ <text text-anchor="start" x="859.07" y="-1353" font-family="Arial" font-size="14.00"> Soft delete timestamp</text>
172
180
  <polygon fill="none" stroke="black" points="617.06,-1310 617.06,-1340.8 1246.55,-1340.8 1246.55,-1310 617.06,-1310"/>
173
181
  <text text-anchor="start" x="624.06" y="-1322.2" font-family="Arial" font-size="14.00">first_remembered_at </text>
174
182
  <text text-anchor="start" x="757.12" y="-1322.2" font-family="Arial" font-size="14.00" fill="#666666">[timestamp with time zone]</text>
@@ -9,6 +9,7 @@ Join table connecting nodes to tags (many-to-many)
9
9
  | Name | Type | Default | Nullable | Children | Parents | Comment |
10
10
  | ---- | ---- | ------- | -------- | -------- | ------- | ------- |
11
11
  | created_at | timestamp with time zone | CURRENT_TIMESTAMP | true | | | When this association was created |
12
+ | deleted_at | timestamp with time zone | | true | | | Soft delete timestamp |
12
13
  | id | bigint | nextval('node_tags_id_seq'::regclass) | false | | | |
13
14
  | node_id | bigint | | false | | [public.nodes](public.nodes.md) | ID of the node being tagged |
14
15
  | tag_id | bigint | | false | | [public.tags](public.tags.md) | ID of the tag being applied |
@@ -25,6 +26,7 @@ Join table connecting nodes to tags (many-to-many)
25
26
 
26
27
  | Name | Definition |
27
28
  | ---- | ---------- |
29
+ | idx_node_tags_deleted_at | CREATE INDEX idx_node_tags_deleted_at ON public.node_tags USING btree (deleted_at) |
28
30
  | idx_node_tags_node_id | CREATE INDEX idx_node_tags_node_id ON public.node_tags USING btree (node_id) |
29
31
  | idx_node_tags_tag_id | CREATE INDEX idx_node_tags_tag_id ON public.node_tags USING btree (tag_id) |
30
32
  | idx_node_tags_unique | CREATE UNIQUE INDEX idx_node_tags_unique ON public.node_tags USING btree (node_id, tag_id) |