robot_lab 0.0.1 → 0.0.6

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 (187) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/deploy-github-pages.yml +9 -9
  3. data/.irbrc +6 -0
  4. data/CHANGELOG.md +140 -0
  5. data/README.md +263 -48
  6. data/Rakefile +71 -1
  7. data/docs/api/core/index.md +53 -46
  8. data/docs/api/core/memory.md +200 -154
  9. data/docs/api/core/network.md +13 -3
  10. data/docs/api/core/robot.md +490 -130
  11. data/docs/api/core/state.md +55 -73
  12. data/docs/api/core/tool.md +205 -209
  13. data/docs/api/index.md +7 -28
  14. data/docs/api/mcp/client.md +119 -48
  15. data/docs/api/mcp/index.md +75 -60
  16. data/docs/api/mcp/server.md +120 -136
  17. data/docs/api/mcp/transports.md +172 -184
  18. data/docs/api/messages/index.md +35 -20
  19. data/docs/api/messages/text-message.md +67 -21
  20. data/docs/api/messages/tool-call-message.md +80 -41
  21. data/docs/api/messages/tool-result-message.md +119 -50
  22. data/docs/api/messages/user-message.md +48 -24
  23. data/docs/api/streaming/context.md +157 -74
  24. data/docs/api/streaming/events.md +114 -166
  25. data/docs/api/streaming/index.md +74 -72
  26. data/docs/architecture/core-concepts.md +360 -116
  27. data/docs/architecture/index.md +97 -59
  28. data/docs/architecture/message-flow.md +138 -129
  29. data/docs/architecture/network-orchestration.md +197 -50
  30. data/docs/architecture/robot-execution.md +199 -146
  31. data/docs/architecture/state-management.md +255 -187
  32. data/docs/concepts.md +311 -49
  33. data/docs/examples/basic-chat.md +89 -77
  34. data/docs/examples/index.md +222 -47
  35. data/docs/examples/mcp-server.md +207 -203
  36. data/docs/examples/multi-robot-network.md +129 -35
  37. data/docs/examples/rails-application.md +159 -160
  38. data/docs/examples/tool-usage.md +295 -204
  39. data/docs/getting-started/configuration.md +347 -154
  40. data/docs/getting-started/index.md +1 -1
  41. data/docs/getting-started/installation.md +22 -13
  42. data/docs/getting-started/quick-start.md +166 -121
  43. data/docs/guides/building-robots.md +418 -212
  44. data/docs/guides/creating-networks.md +143 -24
  45. data/docs/guides/index.md +0 -5
  46. data/docs/guides/mcp-integration.md +152 -113
  47. data/docs/guides/memory.md +220 -164
  48. data/docs/guides/rails-integration.md +244 -162
  49. data/docs/guides/streaming.md +137 -187
  50. data/docs/guides/using-tools.md +259 -212
  51. data/docs/index.md +46 -41
  52. data/examples/01_simple_robot.rb +6 -9
  53. data/examples/02_tools.rb +6 -9
  54. data/examples/03_network.rb +19 -17
  55. data/examples/04_mcp.rb +5 -8
  56. data/examples/05_streaming.rb +5 -8
  57. data/examples/06_prompt_templates.rb +42 -37
  58. data/examples/07_network_memory.rb +13 -14
  59. data/examples/08_llm_config.rb +169 -0
  60. data/examples/09_chaining.rb +262 -0
  61. data/examples/10_memory.rb +331 -0
  62. data/examples/11_network_introspection.rb +253 -0
  63. data/examples/12_message_bus.rb +74 -0
  64. data/examples/13_spawn.rb +90 -0
  65. data/examples/14_rusty_circuit/comic.rb +143 -0
  66. data/examples/14_rusty_circuit/display.rb +203 -0
  67. data/examples/14_rusty_circuit/heckler.rb +63 -0
  68. data/examples/14_rusty_circuit/open_mic.rb +123 -0
  69. data/examples/14_rusty_circuit/prompts/open_mic_comic.md +20 -0
  70. data/examples/14_rusty_circuit/prompts/open_mic_heckler.md +23 -0
  71. data/examples/14_rusty_circuit/prompts/open_mic_scout.md +20 -0
  72. data/examples/14_rusty_circuit/scout.rb +156 -0
  73. data/examples/14_rusty_circuit/scout_notes.md +89 -0
  74. data/examples/14_rusty_circuit/show.log +234 -0
  75. data/examples/15_memory_network_and_bus/editor_in_chief.rb +24 -0
  76. data/examples/15_memory_network_and_bus/editorial_pipeline.rb +206 -0
  77. data/examples/15_memory_network_and_bus/linux_writer.rb +80 -0
  78. data/examples/15_memory_network_and_bus/os_editor.rb +46 -0
  79. data/examples/15_memory_network_and_bus/os_writer.rb +46 -0
  80. data/examples/15_memory_network_and_bus/output/combined_article.md +13 -0
  81. data/examples/15_memory_network_and_bus/output/final_article.md +15 -0
  82. data/examples/15_memory_network_and_bus/output/linux_draft.md +5 -0
  83. data/examples/15_memory_network_and_bus/output/mac_draft.md +7 -0
  84. data/examples/15_memory_network_and_bus/output/memory.json +13 -0
  85. data/examples/15_memory_network_and_bus/output/revision_1.md +19 -0
  86. data/examples/15_memory_network_and_bus/output/revision_2.md +15 -0
  87. data/examples/15_memory_network_and_bus/output/windows_draft.md +7 -0
  88. data/examples/15_memory_network_and_bus/prompts/os_advocate.md +13 -0
  89. data/examples/15_memory_network_and_bus/prompts/os_chief.md +13 -0
  90. data/examples/15_memory_network_and_bus/prompts/os_editor.md +13 -0
  91. data/examples/16_writers_room/display.rb +158 -0
  92. data/examples/16_writers_room/output/.gitignore +2 -0
  93. data/examples/16_writers_room/output/opus_001.md +263 -0
  94. data/examples/16_writers_room/output/opus_001_notes.log +470 -0
  95. data/examples/16_writers_room/prompts/writer.md +37 -0
  96. data/examples/16_writers_room/room.rb +150 -0
  97. data/examples/16_writers_room/tools.rb +162 -0
  98. data/examples/16_writers_room/writer.rb +121 -0
  99. data/examples/16_writers_room/writers_room.rb +162 -0
  100. data/examples/README.md +197 -0
  101. data/examples/prompts/{assistant/system.txt.erb → assistant.md} +3 -0
  102. data/examples/prompts/{billing/system.txt.erb → billing.md} +3 -0
  103. data/examples/prompts/{classifier/system.txt.erb → classifier.md} +3 -0
  104. data/examples/prompts/comedian.md +6 -0
  105. data/examples/prompts/comedy_critic.md +10 -0
  106. data/examples/prompts/configurable.md +9 -0
  107. data/examples/prompts/dispatcher.md +12 -0
  108. data/examples/prompts/{entity_extractor/system.txt.erb → entity_extractor.md} +3 -0
  109. data/examples/prompts/{escalation/system.txt.erb → escalation.md} +7 -0
  110. data/examples/prompts/frontmatter_mcp_test.md +9 -0
  111. data/examples/prompts/frontmatter_named_test.md +5 -0
  112. data/examples/prompts/frontmatter_tools_test.md +6 -0
  113. data/examples/prompts/{general/system.txt.erb → general.md} +3 -0
  114. data/examples/prompts/{github_assistant/system.txt.erb → github_assistant.md} +8 -0
  115. data/examples/prompts/{helper/system.txt.erb → helper.md} +3 -0
  116. data/examples/prompts/{keyword_extractor/system.txt.erb → keyword_extractor.md} +3 -0
  117. data/examples/prompts/llm_config_demo.md +20 -0
  118. data/examples/prompts/{order_support/system.txt.erb → order_support.md} +8 -0
  119. data/examples/prompts/os_advocate.md +13 -0
  120. data/examples/prompts/os_chief.md +13 -0
  121. data/examples/prompts/os_editor.md +13 -0
  122. data/examples/prompts/{product_support/system.txt.erb → product_support.md} +7 -0
  123. data/examples/prompts/{sentiment_analyzer/system.txt.erb → sentiment_analyzer.md} +3 -0
  124. data/examples/prompts/{synthesizer/system.txt.erb → synthesizer.md} +3 -0
  125. data/examples/prompts/{technical/system.txt.erb → technical.md} +3 -0
  126. data/examples/prompts/{triage/system.txt.erb → triage.md} +6 -0
  127. data/lib/generators/robot_lab/templates/initializer.rb.tt +0 -13
  128. data/lib/robot_lab/ask_user.rb +75 -0
  129. data/lib/robot_lab/config/defaults.yml +121 -0
  130. data/lib/robot_lab/config.rb +183 -0
  131. data/lib/robot_lab/error.rb +6 -0
  132. data/lib/robot_lab/mcp/client.rb +1 -1
  133. data/lib/robot_lab/memory.rb +10 -34
  134. data/lib/robot_lab/network.rb +13 -20
  135. data/lib/robot_lab/robot/bus_messaging.rb +239 -0
  136. data/lib/robot_lab/robot/mcp_management.rb +88 -0
  137. data/lib/robot_lab/robot/template_rendering.rb +130 -0
  138. data/lib/robot_lab/robot.rb +240 -330
  139. data/lib/robot_lab/robot_message.rb +44 -0
  140. data/lib/robot_lab/robot_result.rb +1 -0
  141. data/lib/robot_lab/run_config.rb +184 -0
  142. data/lib/robot_lab/state_proxy.rb +2 -12
  143. data/lib/robot_lab/streaming/context.rb +1 -1
  144. data/lib/robot_lab/task.rb +8 -1
  145. data/lib/robot_lab/tool.rb +108 -172
  146. data/lib/robot_lab/tool_config.rb +1 -1
  147. data/lib/robot_lab/tool_manifest.rb +2 -18
  148. data/lib/robot_lab/utils.rb +39 -0
  149. data/lib/robot_lab/version.rb +1 -1
  150. data/lib/robot_lab.rb +89 -57
  151. data/mkdocs.yml +0 -11
  152. metadata +121 -135
  153. data/docs/api/adapters/anthropic.md +0 -121
  154. data/docs/api/adapters/gemini.md +0 -133
  155. data/docs/api/adapters/index.md +0 -104
  156. data/docs/api/adapters/openai.md +0 -134
  157. data/docs/api/history/active-record-adapter.md +0 -195
  158. data/docs/api/history/config.md +0 -191
  159. data/docs/api/history/index.md +0 -132
  160. data/docs/api/history/thread-manager.md +0 -144
  161. data/docs/guides/history.md +0 -359
  162. data/examples/prompts/assistant/user.txt.erb +0 -1
  163. data/examples/prompts/billing/user.txt.erb +0 -1
  164. data/examples/prompts/classifier/user.txt.erb +0 -1
  165. data/examples/prompts/entity_extractor/user.txt.erb +0 -3
  166. data/examples/prompts/escalation/user.txt.erb +0 -34
  167. data/examples/prompts/general/user.txt.erb +0 -1
  168. data/examples/prompts/github_assistant/user.txt.erb +0 -1
  169. data/examples/prompts/helper/user.txt.erb +0 -1
  170. data/examples/prompts/keyword_extractor/user.txt.erb +0 -3
  171. data/examples/prompts/order_support/user.txt.erb +0 -22
  172. data/examples/prompts/product_support/user.txt.erb +0 -32
  173. data/examples/prompts/sentiment_analyzer/user.txt.erb +0 -3
  174. data/examples/prompts/synthesizer/user.txt.erb +0 -15
  175. data/examples/prompts/technical/user.txt.erb +0 -1
  176. data/examples/prompts/triage/user.txt.erb +0 -17
  177. data/lib/robot_lab/adapters/anthropic.rb +0 -163
  178. data/lib/robot_lab/adapters/base.rb +0 -85
  179. data/lib/robot_lab/adapters/gemini.rb +0 -193
  180. data/lib/robot_lab/adapters/openai.rb +0 -159
  181. data/lib/robot_lab/adapters/registry.rb +0 -81
  182. data/lib/robot_lab/configuration.rb +0 -143
  183. data/lib/robot_lab/errors.rb +0 -70
  184. data/lib/robot_lab/history/active_record_adapter.rb +0 -146
  185. data/lib/robot_lab/history/config.rb +0 -115
  186. data/lib/robot_lab/history/thread_manager.rb +0 -93
  187. data/lib/robot_lab/robotic_model.rb +0 -324
@@ -1,54 +1,43 @@
1
- # State
1
+ # Memory (State Management)
2
2
 
3
- Manages conversation data, results, and memory.
3
+ Memory manages conversation data, results, and runtime state. There is no separate `State` class; `Memory` serves this role.
4
4
 
5
- ## Class: `RobotLab::State`
5
+ ## Class: `RobotLab::Memory`
6
6
 
7
7
  ```ruby
8
- state = RobotLab.create_state(
9
- message: "Hello",
8
+ memory = RobotLab.create_memory(
10
9
  data: { user_id: "123" }
11
10
  )
12
11
  ```
13
12
 
14
13
  ## Attributes
15
14
 
16
- ### thread_id
15
+ ### session_id
17
16
 
18
17
  ```ruby
19
- state.thread_id # => String | nil
18
+ memory.session_id # => String | nil
20
19
  ```
21
20
 
22
- Conversation thread identifier for persistence.
23
-
24
- ### memory
25
-
26
- ```ruby
27
- state.memory # => Memory
28
- ```
29
-
30
- Shared key-value store.
31
-
32
- ## Methods
21
+ Conversation session identifier for persistence.
33
22
 
34
23
  ### data
35
24
 
36
25
  ```ruby
37
- state.data # => StateProxy
26
+ memory.data # => StateProxy
38
27
  ```
39
28
 
40
29
  Access workflow data as a proxy object.
41
30
 
42
31
  ```ruby
43
- state.data[:user_id] # Hash access
44
- state.data.user_id # Method access
45
- state.data[:status] = "active"
32
+ memory.data[:user_id] # Hash access
33
+ memory.data.user_id # Method access
34
+ memory.data[:status] = "active"
46
35
  ```
47
36
 
48
37
  ### results
49
38
 
50
39
  ```ruby
51
- state.results # => Array<RobotResult>
40
+ memory.results # => Array<RobotResult>
52
41
  ```
53
42
 
54
43
  All robot execution results.
@@ -56,15 +45,17 @@ All robot execution results.
56
45
  ### messages
57
46
 
58
47
  ```ruby
59
- state.messages # => Array<Message>
48
+ memory.messages # => Array<Message>
60
49
  ```
61
50
 
62
51
  Formatted conversation messages for LLM.
63
52
 
53
+ ## Methods
54
+
64
55
  ### append_result
65
56
 
66
57
  ```ruby
67
- state.append_result(robot_result)
58
+ memory.append_result(robot_result)
68
59
  ```
69
60
 
70
61
  Add a robot result to history.
@@ -72,7 +63,7 @@ Add a robot result to history.
72
63
  ### set_results
73
64
 
74
65
  ```ruby
75
- state.set_results(array_of_results)
66
+ memory.set_results(array_of_results)
76
67
  ```
77
68
 
78
69
  Replace all results.
@@ -80,23 +71,23 @@ Replace all results.
80
71
  ### results_from
81
72
 
82
73
  ```ruby
83
- state.results_from(5) # => Array<RobotResult>
74
+ memory.results_from(5) # => Array<RobotResult>
84
75
  ```
85
76
 
86
77
  Get results starting at index.
87
78
 
88
- ### thread_id=
79
+ ### session_id=
89
80
 
90
81
  ```ruby
91
- state.thread_id = "thread_123"
82
+ memory.session_id = "session_123"
92
83
  ```
93
84
 
94
- Set the thread identifier.
85
+ Set the session identifier.
95
86
 
96
87
  ### format_history
97
88
 
98
89
  ```ruby
99
- state.format_history # => Array<Message>
90
+ memory.format_history # => Array<Message>
100
91
  ```
101
92
 
102
93
  Format results as conversation history.
@@ -104,7 +95,7 @@ Format results as conversation history.
104
95
  ### clone
105
96
 
106
97
  ```ruby
107
- new_state = state.clone
98
+ new_memory = memory.clone
108
99
  ```
109
100
 
110
101
  Create a deep copy.
@@ -112,7 +103,7 @@ Create a deep copy.
112
103
  ### to_h
113
104
 
114
105
  ```ruby
115
- state.to_h # => Hash
106
+ memory.to_h # => Hash
116
107
  ```
117
108
 
118
109
  Hash representation.
@@ -120,7 +111,7 @@ Hash representation.
120
111
  ### to_json
121
112
 
122
113
  ```ruby
123
- state.to_json # => String
114
+ memory.to_json # => String
124
115
  ```
125
116
 
126
117
  JSON representation.
@@ -128,7 +119,7 @@ JSON representation.
128
119
  ### from_hash (class method)
129
120
 
130
121
  ```ruby
131
- state = State.from_hash(hash)
122
+ memory = Memory.from_hash(hash)
132
123
  ```
133
124
 
134
125
  Restore from hash.
@@ -138,7 +129,7 @@ Restore from hash.
138
129
  The `data` attribute is a `StateProxy`:
139
130
 
140
131
  ```ruby
141
- proxy = state.data
132
+ proxy = memory.data
142
133
 
143
134
  # Hash-style access
144
135
  proxy[:key]
@@ -160,19 +151,18 @@ proxy.empty?
160
151
  proxy.size
161
152
  ```
162
153
 
163
- ## Creating State
154
+ ## Creating Memory
164
155
 
165
156
  ### Basic
166
157
 
167
158
  ```ruby
168
- state = RobotLab.create_state(message: "Hello")
159
+ memory = RobotLab.create_memory
169
160
  ```
170
161
 
171
162
  ### With Data
172
163
 
173
164
  ```ruby
174
- state = RobotLab.create_state(
175
- message: "Process order",
165
+ memory = RobotLab.create_memory(
176
166
  data: {
177
167
  user_id: "user_123",
178
168
  order_id: "ord_456"
@@ -180,25 +170,18 @@ state = RobotLab.create_state(
180
170
  )
181
171
  ```
182
172
 
183
- ### With Thread ID
173
+ ### With Session ID
184
174
 
185
175
  ```ruby
186
- # Via UserMessage
187
- message = UserMessage.new("Continue", thread_id: "thread_123")
188
- state = RobotLab.create_state(message: message)
189
-
190
- # Direct assignment
191
- state = RobotLab.create_state(message: "Continue")
192
- state.thread_id = "thread_123"
176
+ memory = RobotLab.create_memory
177
+ memory.session_id = "session_123"
193
178
  ```
194
179
 
195
180
  ### With Existing Results
196
181
 
197
182
  ```ruby
198
- state = RobotLab.create_state(
199
- message: "Follow up",
200
- results: previous_results
201
- )
183
+ memory = RobotLab.create_memory
184
+ memory.set_results(previous_results)
202
185
  ```
203
186
 
204
187
  ## UserMessage
@@ -208,13 +191,13 @@ Enhanced message with metadata:
208
191
  ```ruby
209
192
  message = UserMessage.new(
210
193
  "What's my order status?",
211
- thread_id: "thread_123",
194
+ session_id: "session_123",
212
195
  system_prompt: "Respond in Spanish",
213
196
  metadata: { source: "web" }
214
197
  )
215
198
 
216
199
  message.content # => "What's my order status?"
217
- message.thread_id # => "thread_123"
200
+ message.session_id # => "session_123"
218
201
  message.system_prompt # => "Respond in Spanish"
219
202
  message.metadata # => { source: "web" }
220
203
  message.id # => UUID
@@ -226,48 +209,47 @@ message.created_at # => Time
226
209
  ### Accessing Data
227
210
 
228
211
  ```ruby
229
- state = RobotLab.create_state(
230
- message: "Help",
212
+ memory = RobotLab.create_memory(
231
213
  data: { user: { name: "Alice", plan: "pro" } }
232
214
  )
233
215
 
234
- state.data[:user][:name] # => "Alice"
235
- state.data.to_h # => { user: { name: "Alice", plan: "pro" } }
216
+ memory.data[:user][:name] # => "Alice"
217
+ memory.data.to_h # => { user: { name: "Alice", plan: "pro" } }
236
218
  ```
237
219
 
238
220
  ### Working with Results
239
221
 
240
222
  ```ruby
241
223
  # After running network
242
- state.results.size # Number of results
243
- state.results.last # Most recent
244
- state.results.map(&:robot_name) # ["classifier", "support"]
224
+ memory.results.size # Number of results
225
+ memory.results.last # Most recent
226
+ memory.results.map(&:robot_name) # ["classifier", "support"]
245
227
  ```
246
228
 
247
- ### Using Memory
229
+ ### Using Reactive Memory
248
230
 
249
231
  ```ruby
250
- state.memory.remember("intent", "billing")
251
- intent = state.memory.recall("intent")
232
+ memory.set(:intent, "billing")
233
+ intent = memory.get(:intent)
252
234
 
253
- scoped = state.memory.scoped("user:123")
254
- scoped.remember("preference", "dark_mode")
235
+ memory.subscribe(:status) do |change|
236
+ puts "Status changed to #{change.value} by #{change.writer}"
237
+ end
255
238
  ```
256
239
 
257
240
  ### Serialization
258
241
 
259
242
  ```ruby
260
- # Save state
261
- json = state.to_json
262
- File.write("state.json", json)
243
+ # Save memory
244
+ json = memory.to_json
245
+ File.write("memory.json", json)
263
246
 
264
- # Restore state
265
- data = JSON.parse(File.read("state.json"))
266
- state = State.from_hash(data)
247
+ # Restore memory
248
+ data = JSON.parse(File.read("memory.json"))
249
+ memory = Memory.from_hash(data)
267
250
  ```
268
251
 
269
252
  ## See Also
270
253
 
271
254
  - [State Management Architecture](../../architecture/state-management.md)
272
255
  - [Memory](memory.md)
273
- - [History Guide](../../guides/history.md)