prompt_objects 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +142 -0
  3. data/README.md +211 -19
  4. data/exe/poop +5 -0
  5. data/exe/prompt_objects +1 -1108
  6. data/exe/prompt_objects_mcp +5 -3
  7. data/lib/prompt_objects/capability.rb +33 -0
  8. data/lib/prompt_objects/cli/diagnostics_command.rb +69 -0
  9. data/lib/prompt_objects/cli/env_command.rb +435 -0
  10. data/lib/prompt_objects/cli/events_command.rb +145 -0
  11. data/lib/prompt_objects/cli/explore_command.rb +155 -0
  12. data/lib/prompt_objects/cli/helpers.rb +91 -0
  13. data/lib/prompt_objects/cli/message_command.rb +216 -0
  14. data/lib/prompt_objects/cli/repl_command.rb +366 -0
  15. data/lib/prompt_objects/cli/serve_command.rb +162 -0
  16. data/lib/prompt_objects/cli.rb +64 -422
  17. data/lib/prompt_objects/connectors/base.rb +16 -29
  18. data/lib/prompt_objects/connectors/mcp.rb +82 -98
  19. data/lib/prompt_objects/domain/records.rb +45 -0
  20. data/lib/prompt_objects/environment/exporter.rb +5 -4
  21. data/lib/prompt_objects/environment/git.rb +21 -1
  22. data/lib/prompt_objects/environment/importer.rb +5 -4
  23. data/lib/prompt_objects/environment/manager.rb +44 -6
  24. data/lib/prompt_objects/environment/manifest.rb +26 -4
  25. data/lib/prompt_objects/environment.rb +1350 -18
  26. data/lib/prompt_objects/execution/blocking_executor.rb +88 -0
  27. data/lib/prompt_objects/execution/context.rb +137 -0
  28. data/lib/prompt_objects/execution/contracts.rb +59 -0
  29. data/lib/prompt_objects/execution/permit_pool.rb +49 -0
  30. data/lib/prompt_objects/execution/policy.rb +47 -0
  31. data/lib/prompt_objects/execution/resource_lock_manager.rb +63 -0
  32. data/lib/prompt_objects/execution/runner.rb +498 -0
  33. data/lib/prompt_objects/execution/scheduler.rb +325 -0
  34. data/lib/prompt_objects/llm/factory.rb +4 -4
  35. data/lib/prompt_objects/llm/gemini_adapter.rb +25 -8
  36. data/lib/prompt_objects/llm/openai_adapter.rb +9 -1
  37. data/lib/prompt_objects/llm/pricing.rb +9 -2
  38. data/lib/prompt_objects/llm/response.rb +9 -4
  39. data/lib/prompt_objects/loader.rb +28 -1
  40. data/lib/prompt_objects/mcp/server.rb +6 -3
  41. data/lib/prompt_objects/mcp/tools/get_conversation.rb +15 -11
  42. data/lib/prompt_objects/mcp/tools/get_pending_requests.rb +2 -2
  43. data/lib/prompt_objects/mcp/tools/respond_to_request.rb +3 -3
  44. data/lib/prompt_objects/mcp/tools/send_message.rb +42 -32
  45. data/lib/prompt_objects/operations/diagnostics.rb +115 -0
  46. data/lib/prompt_objects/operations/retention.rb +75 -0
  47. data/lib/prompt_objects/operations/run_trace_builder.rb +152 -0
  48. data/lib/prompt_objects/primitives/http_get.rb +2 -0
  49. data/lib/prompt_objects/primitives/list_files.rb +2 -0
  50. data/lib/prompt_objects/primitives/read_file.rb +2 -0
  51. data/lib/prompt_objects/primitives/think.rb +36 -0
  52. data/lib/prompt_objects/primitives/write_file.rb +9 -0
  53. data/lib/prompt_objects/prompt_object.rb +190 -432
  54. data/lib/prompt_objects/repositories/artifact_repository.rb +109 -0
  55. data/lib/prompt_objects/repositories/base_repository.rb +37 -0
  56. data/lib/prompt_objects/repositories/definition_repository.rb +36 -0
  57. data/lib/prompt_objects/repositories/env_data_repository.rb +103 -0
  58. data/lib/prompt_objects/repositories/event_repository.rb +105 -0
  59. data/lib/prompt_objects/repositories/message_repository.rb +73 -0
  60. data/lib/prompt_objects/repositories/run_repository.rb +254 -0
  61. data/lib/prompt_objects/repositories/thread_repository.rb +87 -0
  62. data/lib/prompt_objects/repositories/tool_execution_repository.rb +88 -0
  63. data/lib/prompt_objects/repositories/workspace_session_repository.rb +61 -0
  64. data/lib/prompt_objects/server/api/routes.rb +561 -52
  65. data/lib/prompt_objects/server/app.rb +134 -1
  66. data/lib/prompt_objects/server/file_watcher.rb +9 -0
  67. data/lib/prompt_objects/server/public/assets/index-BjKlODDD.js +90 -0
  68. data/lib/prompt_objects/server/public/assets/index-w3fpIb5c.css +1 -0
  69. data/lib/prompt_objects/server/public/index.html +2 -2
  70. data/lib/prompt_objects/server/websocket_handler.rb +202 -207
  71. data/lib/prompt_objects/server.rb +170 -1
  72. data/lib/prompt_objects/service.rb +129 -0
  73. data/lib/prompt_objects/session/store.rb +774 -15
  74. data/lib/prompt_objects/universal/add_capability.rb +1 -1
  75. data/lib/prompt_objects/universal/create_capability.rb +4 -2
  76. data/lib/prompt_objects/universal/delete_env_data.rb +78 -0
  77. data/lib/prompt_objects/universal/delete_primitive.rb +1 -1
  78. data/lib/prompt_objects/universal/dispatch_po.rb +54 -0
  79. data/lib/prompt_objects/universal/get_env_data.rb +58 -0
  80. data/lib/prompt_objects/universal/get_run_status.rb +30 -0
  81. data/lib/prompt_objects/universal/join_runs.rb +35 -0
  82. data/lib/prompt_objects/universal/list_env_data.rb +57 -0
  83. data/lib/prompt_objects/universal/modify_primitive.rb +1 -1
  84. data/lib/prompt_objects/universal/render_artifact.rb +91 -0
  85. data/lib/prompt_objects/universal/request_primitive.rb +1 -1
  86. data/lib/prompt_objects/universal/set_env_data.rb +101 -0
  87. data/lib/prompt_objects/version.rb +5 -0
  88. data/lib/prompt_objects.rb +36 -6
  89. data/objects/coordinator.md +8 -4
  90. data/templates/arc-agi-1/objects/data_manager.md +2 -2
  91. data/templates/arc-agi-1/objects/observer.md +6 -2
  92. data/templates/arc-agi-1/objects/solver.md +14 -4
  93. data/templates/arc-agi-1/objects/verifier.md +6 -2
  94. data/templates/arc-agi-3/manifest.yml +19 -0
  95. data/templates/arc-agi-3/objects/analyst.md +79 -0
  96. data/templates/arc-agi-3/objects/player.md +76 -0
  97. data/templates/arc-agi-3/objects/strategist.md +97 -0
  98. data/templates/arc-agi-3/primitives/action_log.rb +133 -0
  99. data/templates/arc-agi-3/primitives/arc3_api.rb +223 -0
  100. data/templates/arc-agi-3/primitives/arc3_scorecard.rb +131 -0
  101. data/templates/arc-agi-3/primitives/frame_diff.rb +143 -0
  102. data/templates/arc-agi-3/primitives/frame_info.rb +96 -0
  103. data/templates/arc-agi-3/primitives/render_frame.rb +140 -0
  104. data/templates/basic/objects/basic.md +11 -3
  105. data/templates/chiptune/extras/sonic_pi_boot.rb +220 -0
  106. data/templates/chiptune/manifest.yml +20 -0
  107. data/templates/chiptune/objects/conductor.md +184 -0
  108. data/templates/chiptune/objects/sonic_pi.md +65 -0
  109. data/templates/chiptune/objects/voice_bass.md +44 -0
  110. data/templates/chiptune/objects/voice_lead.md +44 -0
  111. data/templates/chiptune/objects/voice_pad.md +43 -0
  112. data/templates/chiptune/objects/voice_perc.md +45 -0
  113. data/templates/chiptune/primitives/play_note.rb +59 -0
  114. data/templates/chiptune/primitives/play_sequence.rb +55 -0
  115. data/templates/chiptune/primitives/query_sonic_pi.rb +141 -0
  116. data/templates/chiptune/primitives/set_synth.rb +57 -0
  117. data/templates/chiptune/primitives/set_tempo.rb +45 -0
  118. data/templates/chiptune/primitives/stop_voice.rb +46 -0
  119. data/templates/chiptune/primitives/support/osc_bridge.rb +33 -0
  120. data/templates/chiptune/vendor/osc-ruby-1.1.5/LICENSE +19 -0
  121. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/address_pattern.rb +58 -0
  122. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/broadcast_client.rb +24 -0
  123. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/bundle.rb +46 -0
  124. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/client.rb +13 -0
  125. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/core_ext/time.rb +6 -0
  126. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/em_server.rb +63 -0
  127. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/message.rb +46 -0
  128. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/network_packet.rb +42 -0
  129. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_argument.rb +26 -0
  130. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_packet.rb +140 -0
  131. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_types.rb +53 -0
  132. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby/server.rb +91 -0
  133. data/templates/chiptune/vendor/osc-ruby-1.1.5/lib/osc-ruby.rb +18 -0
  134. data/templates/developer/objects/code_reviewer.md +1 -1
  135. data/templates/developer/objects/coordinator.md +16 -3
  136. data/templates/developer/objects/debugger.md +3 -3
  137. data/templates/empty/objects/assistant.md +10 -5
  138. data/templates/minimal/objects/assistant.md +10 -5
  139. data/templates/music/extras/sonic_pi_boot.rb +220 -0
  140. data/templates/music/manifest.yml +16 -0
  141. data/templates/music/objects/conductor.md +154 -0
  142. data/templates/music/objects/sonic_pi.md +65 -0
  143. data/templates/music/primitives/play_note.rb +55 -0
  144. data/templates/music/primitives/play_sequence.rb +51 -0
  145. data/templates/music/primitives/query_sonic_pi.rb +139 -0
  146. data/templates/music/primitives/set_synth.rb +53 -0
  147. data/templates/music/primitives/set_tempo.rb +43 -0
  148. data/templates/music/primitives/stop_voice.rb +44 -0
  149. data/templates/music/primitives/support/osc_bridge.rb +33 -0
  150. data/templates/music/vendor/osc-ruby-1.1.5/LICENSE +19 -0
  151. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/address_pattern.rb +58 -0
  152. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/broadcast_client.rb +24 -0
  153. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/bundle.rb +46 -0
  154. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/client.rb +13 -0
  155. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/core_ext/time.rb +6 -0
  156. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/em_server.rb +63 -0
  157. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/message.rb +46 -0
  158. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/network_packet.rb +42 -0
  159. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_argument.rb +26 -0
  160. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_packet.rb +140 -0
  161. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_types.rb +53 -0
  162. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby/server.rb +91 -0
  163. data/templates/music/vendor/osc-ruby-1.1.5/lib/osc-ruby.rb +18 -0
  164. data/templates/music-beginner/README.md +100 -0
  165. data/templates/music-beginner/extras/README.md +27 -0
  166. data/templates/music-beginner/extras/sonic_pi_boot.rb +297 -0
  167. data/templates/music-beginner/manifest.yml +25 -0
  168. data/templates/music-beginner/objects/conductor.md +222 -0
  169. data/templates/music-beginner/objects/engine_setup.md +54 -0
  170. data/templates/music-beginner/objects/voice_bass.md +43 -0
  171. data/templates/music-beginner/objects/voice_keys.md +48 -0
  172. data/templates/music-beginner/objects/voice_pad.md +46 -0
  173. data/templates/music-beginner/objects/voice_percussion.md +45 -0
  174. data/templates/music-beginner/objects/voice_texture.md +37 -0
  175. data/templates/music-beginner/primitives/play_pattern.rb +118 -0
  176. data/templates/music-beginner/primitives/query_music_engine.rb +94 -0
  177. data/templates/music-beginner/primitives/set_instrument.rb +47 -0
  178. data/templates/music-beginner/primitives/set_tempo.rb +43 -0
  179. data/templates/music-beginner/primitives/set_voice_level.rb +46 -0
  180. data/templates/music-beginner/primitives/stop_voice.rb +37 -0
  181. data/templates/music-beginner/primitives/support/osc_bridge.rb +25 -0
  182. data/templates/music-beginner/vendor/osc-ruby-1.1.5/LICENSE +19 -0
  183. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/address_pattern.rb +58 -0
  184. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/broadcast_client.rb +24 -0
  185. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/bundle.rb +46 -0
  186. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/client.rb +13 -0
  187. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/core_ext/time.rb +6 -0
  188. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/em_server.rb +63 -0
  189. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/message.rb +46 -0
  190. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/network_packet.rb +42 -0
  191. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_argument.rb +26 -0
  192. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_packet.rb +140 -0
  193. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_types.rb +53 -0
  194. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby/server.rb +91 -0
  195. data/templates/music-beginner/vendor/osc-ruby-1.1.5/lib/osc-ruby.rb +18 -0
  196. data/templates/music-pro/extras/AUDITION.md +100 -0
  197. data/templates/music-pro/extras/sonic_pi_boot.rb +546 -0
  198. data/templates/music-pro/manifest.yml +19 -0
  199. data/templates/music-pro/objects/conductor.md +126 -0
  200. data/templates/music-pro/objects/sonic_pi.md +35 -0
  201. data/templates/music-pro/objects/voice_harmony.md +48 -0
  202. data/templates/music-pro/objects/voice_rhythm.md +43 -0
  203. data/templates/music-pro/objects/voice_texture.md +42 -0
  204. data/templates/music-pro/primitives/define_patch.rb +46 -0
  205. data/templates/music-pro/primitives/query_music_engine.rb +69 -0
  206. data/templates/music-pro/primitives/set_live_pattern.rb +70 -0
  207. data/templates/music-pro/primitives/set_tempo.rb +31 -0
  208. data/templates/music-pro/primitives/stop_voice.rb +31 -0
  209. data/templates/music-pro/primitives/support/music_protocol.rb +136 -0
  210. data/templates/music-pro/primitives/support/osc_bridge.rb +33 -0
  211. data/templates/music-pro/primitives/trigger_event.rb +44 -0
  212. data/templates/music-pro/vendor/osc-ruby-1.1.5/LICENSE +19 -0
  213. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/address_pattern.rb +58 -0
  214. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/broadcast_client.rb +24 -0
  215. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/bundle.rb +46 -0
  216. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/client.rb +13 -0
  217. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/core_ext/time.rb +6 -0
  218. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/em_server.rb +63 -0
  219. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/message.rb +46 -0
  220. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/network_packet.rb +42 -0
  221. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_argument.rb +26 -0
  222. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_packet.rb +140 -0
  223. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/osc_types.rb +53 -0
  224. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby/server.rb +91 -0
  225. data/templates/music-pro/vendor/osc-ruby-1.1.5/lib/osc-ruby.rb +18 -0
  226. data/templates/writer/objects/coordinator.md +14 -3
  227. data/templates/writer/objects/editor.md +1 -1
  228. data/templates/writer/objects/researcher.md +2 -2
  229. data/tools/thread-explorer.html +28 -1
  230. metadata +175 -65
  231. data/CLAUDE.md +0 -176
  232. data/Gemfile +0 -10
  233. data/Gemfile.lock +0 -233
  234. data/IMPLEMENTATION_PLAN.md +0 -1073
  235. data/Rakefile +0 -27
  236. data/design-doc-v2.md +0 -1232
  237. data/frontend/.gitignore +0 -3
  238. data/frontend/index.html +0 -17
  239. data/frontend/package-lock.json +0 -4540
  240. data/frontend/package.json +0 -36
  241. data/frontend/postcss.config.js +0 -6
  242. data/frontend/src/App.tsx +0 -103
  243. data/frontend/src/canvas/CanvasView.tsx +0 -113
  244. data/frontend/src/canvas/ForceLayout.ts +0 -115
  245. data/frontend/src/canvas/SceneManager.ts +0 -587
  246. data/frontend/src/canvas/canvasStore.ts +0 -47
  247. data/frontend/src/canvas/constants.ts +0 -95
  248. data/frontend/src/canvas/controls/CameraControls.ts +0 -98
  249. data/frontend/src/canvas/edges/MessageArc.ts +0 -149
  250. data/frontend/src/canvas/inspector/InspectorPanel.tsx +0 -31
  251. data/frontend/src/canvas/inspector/POInspector.tsx +0 -262
  252. data/frontend/src/canvas/inspector/ToolCallInspector.tsx +0 -67
  253. data/frontend/src/canvas/nodes/PONode.ts +0 -249
  254. data/frontend/src/canvas/nodes/ToolCallNode.ts +0 -116
  255. data/frontend/src/canvas/types.ts +0 -24
  256. data/frontend/src/components/ContextMenu.tsx +0 -68
  257. data/frontend/src/components/Inspector.tsx +0 -232
  258. data/frontend/src/components/MarkdownMessage.tsx +0 -155
  259. data/frontend/src/components/MethodList.tsx +0 -90
  260. data/frontend/src/components/ModelSelector.tsx +0 -115
  261. data/frontend/src/components/NotificationPanel.tsx +0 -130
  262. data/frontend/src/components/ObjectList.tsx +0 -78
  263. data/frontend/src/components/PaneSlot.tsx +0 -30
  264. data/frontend/src/components/SourcePane.tsx +0 -202
  265. data/frontend/src/components/SystemBar.tsx +0 -74
  266. data/frontend/src/components/Transcript.tsx +0 -76
  267. data/frontend/src/components/UsagePanel.tsx +0 -105
  268. data/frontend/src/components/Workspace.tsx +0 -260
  269. data/frontend/src/components/index.ts +0 -12
  270. data/frontend/src/hooks/useResize.ts +0 -55
  271. data/frontend/src/hooks/useWebSocket.ts +0 -517
  272. data/frontend/src/index.css +0 -103
  273. data/frontend/src/main.tsx +0 -10
  274. data/frontend/src/store/index.ts +0 -279
  275. data/frontend/src/types/index.ts +0 -165
  276. data/frontend/tailwind.config.js +0 -44
  277. data/frontend/tsconfig.json +0 -30
  278. data/frontend/vite.config.ts +0 -29
  279. data/lib/prompt_objects/server/public/assets/index-D1myxE0l.js +0 -4345
  280. data/lib/prompt_objects/server/public/assets/index-DdCcwC-Z.css +0 -1
  281. data/lib/prompt_objects/universal/add_primitive.rb +0 -118
  282. data/lib/prompt_objects/universal/ask_human.rb +0 -109
  283. data/lib/prompt_objects/universal/create_primitive.rb +0 -174
  284. data/lib/prompt_objects/universal/list_primitives.rb +0 -145
  285. data/lib/prompt_objects/universal/think.rb +0 -41
  286. data/prompt_objects.gemspec +0 -50
  287. data/templates/basic/.gitignore +0 -2
  288. data/templates/developer/.gitignore +0 -5
  289. data/templates/empty/.gitignore +0 -5
  290. data/templates/empty/objects/.gitkeep +0 -0
  291. data/templates/minimal/.gitignore +0 -5
  292. data/templates/writer/.gitignore +0 -5
@@ -10,7 +10,7 @@ module PromptObjects
10
10
  end
11
11
 
12
12
  def description
13
- "Add a capability to a prompt object, allowing it to use new tools. Can target self or another PO."
13
+ "Add an existing capability (a primitive tool or another prompt object) to a prompt object, allowing it to use that capability. Can target self or another PO. Use list_capabilities to discover what's available."
14
14
  end
15
15
 
16
16
  def parameters
@@ -13,7 +13,9 @@ module PromptObjects
13
13
  end
14
14
 
15
15
  def description
16
- "Create a new capability. Use type='prompt_object' for LLM-backed specialists, or type='primitive' for deterministic Ruby tools."
16
+ "Create a new capability. Use type='prompt_object' for LLM-backed specialists, or type='primitive' for deterministic Ruby tools. " \
17
+ "For prompt objects, capabilities are the exact callable tools/delegates the new object receives; an informational delegate " \
18
+ "does not grant access to that delegate's tools."
17
19
  end
18
20
 
19
21
  def parameters
@@ -37,7 +39,7 @@ module PromptObjects
37
39
  capabilities: {
38
40
  type: "array",
39
41
  items: { type: "string" },
40
- description: "(prompt_object only) List of capabilities this PO can use"
42
+ description: "(prompt_object only) Exact tools and delegates this PO may call. Grant direct action tools for every action it must perform; do not use a related PO as a proxy for tools it does not expose."
41
43
  },
42
44
  identity: {
43
45
  type: "string",
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ # Universal capability to delete a key from the shared environment data.
6
+ class DeleteEnvData < Primitive
7
+ execution_policy(
8
+ parallel_safe: true,
9
+ side_effect: :write,
10
+ resource_keys: ->(arguments, context, _capability) {
11
+ key = arguments[:key] || arguments["key"]
12
+ ["workspace:#{context.workspace_session_id}:env_data:#{key}"]
13
+ }
14
+ )
15
+
16
+ def name
17
+ "delete_env_data"
18
+ end
19
+
20
+ def description
21
+ "Delete a key from the shared environment data for this delegation chain."
22
+ end
23
+
24
+ def parameters
25
+ {
26
+ type: "object",
27
+ properties: {
28
+ key: {
29
+ type: "string",
30
+ description: "The key to delete"
31
+ }
32
+ },
33
+ required: ["key"]
34
+ }
35
+ end
36
+
37
+ def receive(message, context:)
38
+ key = message[:key] || message["key"]
39
+ return "Error: 'key' is required" unless key
40
+
41
+ root_thread_id = context.env_data_scope
42
+ return "Error: Could not resolve thread scope (no active session)" unless root_thread_id
43
+
44
+ store = context.env.session_store
45
+ return "Error: Session store not available" unless store
46
+
47
+ deleted = if context.env.respond_to?(:delete_environment_data)
48
+ context.env.delete_environment_data(key: key, context: context)
49
+ else
50
+ store.delete_env_data(root_thread_id: root_thread_id, key: key)
51
+ end
52
+
53
+ unless deleted
54
+ return "Key '#{key}' not found in environment data."
55
+ end
56
+
57
+ stored_by = context.calling_po || "unknown"
58
+
59
+ context.bus.publish(
60
+ from: stored_by,
61
+ to: "env_data",
62
+ message: { action: "delete", key: key }
63
+ )
64
+
65
+ unless context.env.respond_to?(:delete_environment_data)
66
+ context.env.notify_env_data_changed(
67
+ action: "delete",
68
+ root_thread_id: root_thread_id,
69
+ key: key,
70
+ stored_by: stored_by
71
+ )
72
+ end
73
+
74
+ "Deleted '#{key}' from environment data."
75
+ end
76
+ end
77
+ end
78
+ end
@@ -7,7 +7,7 @@ module PromptObjects
7
7
  # USE WITH CAUTION - this permanently deletes the primitive file.
8
8
  class DeletePrimitive < Primitive
9
9
  # Built-in primitives that cannot be deleted
10
- PROTECTED_PRIMITIVES = %w[read_file list_files write_file http_get].freeze
10
+ PROTECTED_PRIMITIVES = %w[read_file list_files write_file http_get think].freeze
11
11
 
12
12
  def name
13
13
  "delete_primitive"
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ # Enqueue independent PO work and return its durable identity immediately.
6
+ class DispatchPO < Primitive
7
+ execution_policy parallel_safe: true, side_effect: :write, resource_keys: ->(_arguments, _context, _capability) { [] }
8
+
9
+ def name = "dispatch_po"
10
+
11
+ def description
12
+ "Dispatch work to an allowed Prompt Object without waiting for its response. " \
13
+ "Returns run_id and thread_id; use get_run_status or join_runs when the result is needed later."
14
+ end
15
+
16
+ def parameters
17
+ {
18
+ type: "object",
19
+ properties: {
20
+ target_po: { type: "string", description: "Prompt Object listed in your capabilities" },
21
+ message: { type: "string", description: "Work to enqueue" },
22
+ thread_id: { type: "string", description: "Optional existing target thread" },
23
+ lifetime: {
24
+ type: "string", enum: %w[attached detached],
25
+ description: "attached cancels with the parent; detached may finish independently"
26
+ },
27
+ on_complete: {
28
+ type: "string",
29
+ description: "Optional follow-up instruction enqueued on your thread when the child finishes"
30
+ }
31
+ },
32
+ required: %w[target_po message]
33
+ }
34
+ end
35
+
36
+ def receive(message, context:)
37
+ target = message[:target_po] || message["target_po"]
38
+ content = message[:message] || message["message"]
39
+ raise Error, "target_po is required" if target.to_s.empty?
40
+ raise Error, "message is required" if content.to_s.empty?
41
+
42
+ result = context.env.dispatch_run(
43
+ target_po: target,
44
+ content: content,
45
+ context: context,
46
+ thread_id: message[:thread_id] || message["thread_id"],
47
+ lifetime: message[:lifetime] || message["lifetime"] || "attached",
48
+ on_complete: message[:on_complete] || message["on_complete"]
49
+ )
50
+ JSON.generate(result)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ # Universal capability to retrieve shared data by key from the current delegation chain.
6
+ class GetEnvData < Primitive
7
+ execution_policy parallel_safe: true, side_effect: :read
8
+
9
+ def name
10
+ "get_env_data"
11
+ end
12
+
13
+ def description
14
+ "Retrieve a specific key's full value from the shared environment data. " \
15
+ "Use list_env_data first to see what keys are available."
16
+ end
17
+
18
+ def parameters
19
+ {
20
+ type: "object",
21
+ properties: {
22
+ key: {
23
+ type: "string",
24
+ description: "The key to retrieve"
25
+ }
26
+ },
27
+ required: ["key"]
28
+ }
29
+ end
30
+
31
+ def receive(message, context:)
32
+ key = message[:key] || message["key"]
33
+ return "Error: 'key' is required" unless key
34
+
35
+ root_thread_id = context.env_data_scope
36
+ return "Error: Could not resolve thread scope (no active session)" unless root_thread_id
37
+
38
+ store = context.env.session_store
39
+ return "Error: Session store not available" unless store
40
+
41
+ entry = if context.env.respond_to?(:get_environment_data)
42
+ context.env.get_environment_data(key: key, context: context)
43
+ else
44
+ store.get_env_data(root_thread_id: root_thread_id, key: key)
45
+ end
46
+ return "Key '#{key}' not found in environment data." unless entry
47
+
48
+ context.bus.publish(
49
+ from: context.calling_po || "unknown",
50
+ to: "env_data",
51
+ message: { action: "get", key: key }
52
+ )
53
+
54
+ JSON.generate(entry[:value])
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ class GetRunStatus < Primitive
6
+ execution_policy parallel_safe: true, side_effect: :read
7
+
8
+ def name = "get_run_status"
9
+
10
+ def description
11
+ "Get the current durable status and result fields for a related dispatched run."
12
+ end
13
+
14
+ def parameters
15
+ {
16
+ type: "object",
17
+ properties: { run_id: { type: "string" } },
18
+ required: ["run_id"]
19
+ }
20
+ end
21
+
22
+ def receive(message, context:)
23
+ run_id = message[:run_id] || message["run_id"]
24
+ raise Error, "run_id is required" if run_id.to_s.empty?
25
+
26
+ JSON.generate(context.env.run_status(run_id, context: context))
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ class JoinRuns < Primitive
6
+ execution_policy parallel_safe: true, side_effect: :read
7
+
8
+ def name = "join_runs"
9
+
10
+ def description
11
+ "Wait for one or more related dispatched runs and return their terminal statuses/results in input order."
12
+ end
13
+
14
+ def parameters
15
+ {
16
+ type: "object",
17
+ properties: {
18
+ run_ids: { type: "array", items: { type: "string" } },
19
+ timeout: { type: "number", description: "Optional timeout in seconds" }
20
+ },
21
+ required: ["run_ids"]
22
+ }
23
+ end
24
+
25
+ def receive(message, context:)
26
+ run_ids = message[:run_ids] || message["run_ids"]
27
+ raise Error, "run_ids must not be empty" unless run_ids.is_a?(Array) && run_ids.any?
28
+
29
+ timeout = message[:timeout] || message["timeout"]
30
+ timeout = [[timeout.to_f, 0.1].max, 300].min if timeout
31
+ JSON.generate(context.env.join_runs(run_ids, context: context, timeout: timeout))
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ # Universal capability to list all shared environment data keys and descriptions.
6
+ # Returns a lightweight manifest without loading full values.
7
+ class ListEnvData < Primitive
8
+ execution_policy parallel_safe: true, side_effect: :read
9
+
10
+ def name
11
+ "list_env_data"
12
+ end
13
+
14
+ def description
15
+ "List all keys and descriptions in the shared environment data for this delegation chain. " \
16
+ "Returns keys and short descriptions only (no values). " \
17
+ "Use get_env_data to retrieve a specific key's full value."
18
+ end
19
+
20
+ def parameters
21
+ {
22
+ type: "object",
23
+ properties: {},
24
+ required: []
25
+ }
26
+ end
27
+
28
+ def receive(message, context:)
29
+ root_thread_id = context.env_data_scope
30
+ return "Error: Could not resolve thread scope (no active session)" unless root_thread_id
31
+
32
+ store = context.env.session_store
33
+ return "Error: Session store not available" unless store
34
+
35
+ entries = if context.env.respond_to?(:list_environment_data)
36
+ context.env.list_environment_data(context: context).map do |entry|
37
+ { key: entry[:key], short_description: entry[:short_description] }
38
+ end
39
+ else
40
+ store.list_env_data(root_thread_id: root_thread_id)
41
+ end
42
+
43
+ if entries.empty?
44
+ return "No environment data stored for this delegation chain."
45
+ end
46
+
47
+ context.bus.publish(
48
+ from: context.calling_po || "unknown",
49
+ to: "env_data",
50
+ message: { action: "list", count: entries.size }
51
+ )
52
+
53
+ JSON.generate(entries)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -8,7 +8,7 @@ module PromptObjects
8
8
  # Allows POs to fix or improve their primitives.
9
9
  class ModifyPrimitive < Primitive
10
10
  # Stdlib primitives cannot be modified
11
- STDLIB_PRIMITIVES = %w[read_file list_files write_file http_get].freeze
11
+ STDLIB_PRIMITIVES = %w[read_file list_files write_file http_get think].freeze
12
12
 
13
13
  def name
14
14
  "modify_primitive"
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ # Universal capability to render interactive HTML in the UI artifact panel.
6
+ # Artifacts are environment-wide — any PO can create or update any artifact.
7
+ #
8
+ # Modes:
9
+ # replace (default) — updates existing artifact with the same title in place
10
+ # version — always creates a new artifact entry
11
+ #
12
+ # The frontend renders artifacts in a sandboxed iframe with React 18,
13
+ # Tailwind CSS, and Babel (for JSX) available.
14
+ #
15
+ # Artifacts are bidirectional (BURP — Bidirectional UI Rendering Protocol):
16
+ # a PromptObjects.send(message) function is injected into every artifact.
17
+ # Calling it sends a natural-language message back to the PO that rendered
18
+ # the artifact (provenance "artifact:<title>"), so POs can build UIs the
19
+ # human interacts with instead of chatting.
20
+ class RenderArtifact < Primitive
21
+ execution_policy(
22
+ parallel_safe: true,
23
+ side_effect: :write,
24
+ resource_keys: ->(arguments, context, _capability) {
25
+ title = arguments[:title] || arguments["title"]
26
+ ["workspace:#{context.workspace_session_id}:artifact:#{title}"]
27
+ }
28
+ )
29
+
30
+ def name
31
+ "render_artifact"
32
+ end
33
+
34
+ def description
35
+ "Render an interactive HTML/JSX artifact in the UI panel. The sandboxed iframe ALREADY provides " \
36
+ "React 18, ReactDOM, Babel, and Tailwind, plus a <div id='root'> mount point. " \
37
+ "IMPORTANT: send ONLY your component markup — do NOT include <html>/<head>/<body> wrappers or your " \
38
+ "own <script src=...> CDN tags for React/Babel/Tailwind (the iframe provides them; your own copies " \
39
+ "conflict). Do NOT use `import` or `export` (it is not an ES module; those silently fail to render). " \
40
+ "Put JSX in <script type='text/babel'>, define a component, and you MUST mount it yourself with: " \
41
+ "ReactDOM.createRoot(document.getElementById('root')).render(<App />); " \
42
+ "BIDIRECTIONAL: PromptObjects.send('...') is available inside the artifact — wire it to " \
43
+ "buttons/forms/controls so the human can talk back to YOU through the UI instead of chatting " \
44
+ "(messages arrive from 'artifact:<title>'). Respond to them by re-rendering this artifact " \
45
+ "(mode 'replace') with the updated UI. A re-render resets the artifact's local JS state, so " \
46
+ "bake the current state into the HTML you render. " \
47
+ "Default mode is 'replace' — same title updates in place. Use mode 'version' for a new entry each time."
48
+ end
49
+
50
+ def parameters
51
+ {
52
+ type: "object",
53
+ properties: {
54
+ title: {
55
+ type: "string",
56
+ description: "Short title for the artifact tab. In replace mode, this is the unique identifier — same title overwrites the previous version."
57
+ },
58
+ html: {
59
+ type: "string",
60
+ description: "Your component markup only — NOT a full page. React 18/ReactDOM/Babel/Tailwind " \
61
+ "and a <div id='root'> are already provided by the iframe; do NOT add <html>/<head>/<body> " \
62
+ "or your own <script src=...> CDN tags. No `import`/`export`. Put JSX in <script type='text/babel'> " \
63
+ "and END with a mount, e.g.: function App(){return <div className='p-4'>…</div>} " \
64
+ "ReactDOM.createRoot(document.getElementById('root')).render(<App />); — without that mount nothing shows."
65
+ },
66
+ mode: {
67
+ type: "string",
68
+ enum: %w[replace version],
69
+ description: "replace (default): update existing artifact with same title. version: always create a new artifact entry."
70
+ }
71
+ },
72
+ required: %w[title html]
73
+ }
74
+ end
75
+
76
+ def receive(message, context:)
77
+ title = message[:title] || message["title"]
78
+ html = message[:html] || message["html"]
79
+ mode = message[:mode] || message["mode"] || "replace"
80
+
81
+ return "Error: 'title' is required" unless title
82
+ return "Error: 'html' is required" unless html
83
+
84
+ return "Error: artifact persistence is unavailable" unless context.env.respond_to?(:persist_artifact)
85
+
86
+ context.env.persist_artifact(title: title, html: html, mode: mode, context: context)
87
+ "Artifact '#{title}' rendered (#{mode}) in the UI."
88
+ end
89
+ end
90
+ end
91
+ end
@@ -3,7 +3,7 @@
3
3
  module PromptObjects
4
4
  module Universal
5
5
  # Universal capability to request a primitive from the human.
6
- # Similar to ask_human but specifically for requesting new tools.
6
+ # Requests explicit approval before installing a new tool implementation.
7
7
  # The human can approve, modify, or reject the request.
8
8
  class RequestPrimitive < Primitive
9
9
  def name
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ module Universal
5
+ # Universal capability to create or update shared data scoped to the current delegation chain.
6
+ # Any PO in the same delegation tree can read this data via get_env_data or list_env_data.
7
+ # Replaces the previous store_env_data and update_env_data (which were redundant).
8
+ class SetEnvData < Primitive
9
+ execution_policy(
10
+ parallel_safe: true,
11
+ side_effect: :write,
12
+ resource_keys: ->(arguments, context, _capability) {
13
+ key = arguments[:key] || arguments["key"]
14
+ ["workspace:#{context.workspace_session_id}:env_data:#{key}"]
15
+ }
16
+ )
17
+
18
+ def name
19
+ "set_env_data"
20
+ end
21
+
22
+ def description
23
+ "Create or update a key-value pair in the shared environment data. " \
24
+ "All POs in the same delegation tree can access this data. " \
25
+ "If the key already exists, it will be overwritten."
26
+ end
27
+
28
+ def parameters
29
+ {
30
+ type: "object",
31
+ properties: {
32
+ key: {
33
+ type: "string",
34
+ description: "Namespaced identifier for the data (e.g. 'arc_task', 'findings')"
35
+ },
36
+ short_description: {
37
+ type: "string",
38
+ description: "1-2 sentence summary of what this data contains (for discoverability via list_env_data)"
39
+ },
40
+ value: {
41
+ description: "The data to store (any JSON-serializable value: string, number, object, array)"
42
+ }
43
+ },
44
+ required: %w[key short_description value]
45
+ }
46
+ end
47
+
48
+ def receive(message, context:)
49
+ key = message[:key] || message["key"]
50
+ short_description = message[:short_description] || message["short_description"]
51
+ # Key-presence check, not `||`, so a literal `false` value isn't dropped.
52
+ value = message.key?(:value) ? message[:value] : message["value"]
53
+
54
+ return "Error: 'key' is required" unless key
55
+ return "Error: 'short_description' is required" unless short_description
56
+ return "Error: 'value' is required" if value.nil?
57
+
58
+ root_thread_id = context.env_data_scope
59
+ return "Error: Could not resolve thread scope (no active session)" unless root_thread_id
60
+
61
+ store = context.env.session_store
62
+ return "Error: Session store not available" unless store
63
+
64
+ stored_by = context.calling_po || "unknown"
65
+
66
+ if context.env.respond_to?(:set_environment_data)
67
+ context.env.set_environment_data(
68
+ key: key,
69
+ short_description: short_description,
70
+ value: value,
71
+ context: context
72
+ )
73
+ context.bus.publish(
74
+ from: stored_by,
75
+ to: "env_data",
76
+ message: { action: "set", key: key, short_description: short_description }
77
+ )
78
+ return "Stored '#{key}' in environment data."
79
+ end
80
+
81
+ store.store_env_data(
82
+ root_thread_id: root_thread_id,
83
+ key: key,
84
+ short_description: short_description,
85
+ value: value,
86
+ stored_by: stored_by
87
+ )
88
+
89
+ context.bus.publish(
90
+ from: stored_by,
91
+ to: "env_data",
92
+ message: { action: "set", key: key, short_description: short_description }
93
+ )
94
+
95
+ context.env.notify_env_data_changed(action: "set", root_thread_id: root_thread_id, key: key, stored_by: stored_by)
96
+
97
+ "Stored '#{key}' in environment data."
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PromptObjects
4
+ VERSION = "0.7.0"
5
+ end
@@ -4,6 +4,9 @@ require "openai"
4
4
  require "anthropic"
5
5
  require "front_matter_parser"
6
6
  require "json"
7
+ require "digest"
8
+
9
+ require_relative "prompt_objects/version"
7
10
 
8
11
  # PromptObjects: A framework where markdown files with LLM-backed behavior
9
12
  # act as first-class autonomous entities.
@@ -11,11 +14,12 @@ module PromptObjects
11
14
  class Error < StandardError; end
12
15
 
13
16
  # Universal capabilities available to all prompt objects (don't need to be declared)
14
- UNIVERSAL_CAPABILITIES = %w[ask_human think create_capability add_capability remove_capability list_capabilities list_primitives add_primitive create_primitive delete_primitive verify_primitive modify_primitive request_primitive modify_prompt].freeze
17
+ UNIVERSAL_CAPABILITIES = %w[create_capability add_capability remove_capability list_capabilities delete_primitive verify_primitive modify_primitive request_primitive modify_prompt set_env_data get_env_data list_env_data delete_env_data render_artifact dispatch_po get_run_status join_runs].freeze
15
18
  end
16
19
 
17
20
  require_relative "prompt_objects/capability"
18
21
  require_relative "prompt_objects/primitive"
22
+ require_relative "prompt_objects/service"
19
23
  require_relative "prompt_objects/registry"
20
24
  require_relative "prompt_objects/message_bus"
21
25
  require_relative "prompt_objects/human_queue"
@@ -26,7 +30,17 @@ require_relative "prompt_objects/llm/anthropic_adapter"
26
30
  require_relative "prompt_objects/llm/gemini_adapter"
27
31
  require_relative "prompt_objects/llm/factory"
28
32
  require_relative "prompt_objects/llm/pricing"
33
+ require_relative "prompt_objects/execution/contracts"
34
+ require_relative "prompt_objects/execution/context"
35
+ require_relative "prompt_objects/execution/blocking_executor"
36
+ require_relative "prompt_objects/execution/permit_pool"
37
+ require_relative "prompt_objects/execution/scheduler"
38
+ require_relative "prompt_objects/execution/policy"
39
+ require_relative "prompt_objects/execution/resource_lock_manager"
40
+ require_relative "prompt_objects/domain/records"
29
41
  require_relative "prompt_objects/prompt_object"
42
+ require_relative "prompt_objects/operations/diagnostics"
43
+ require_relative "prompt_objects/operations/retention"
30
44
 
31
45
  # Environment module (must be loaded before environment.rb which uses them)
32
46
  require_relative "prompt_objects/environment/manifest"
@@ -38,28 +52,44 @@ require_relative "prompt_objects/environment"
38
52
 
39
53
  # Session storage
40
54
  require_relative "prompt_objects/session/store"
55
+ require_relative "prompt_objects/repositories/base_repository"
56
+ require_relative "prompt_objects/repositories/workspace_session_repository"
57
+ require_relative "prompt_objects/repositories/thread_repository"
58
+ require_relative "prompt_objects/repositories/run_repository"
59
+ require_relative "prompt_objects/repositories/definition_repository"
60
+ require_relative "prompt_objects/repositories/message_repository"
61
+ require_relative "prompt_objects/repositories/event_repository"
62
+ require_relative "prompt_objects/repositories/tool_execution_repository"
63
+ require_relative "prompt_objects/repositories/artifact_repository"
64
+ require_relative "prompt_objects/repositories/env_data_repository"
65
+ require_relative "prompt_objects/operations/run_trace_builder"
66
+ require_relative "prompt_objects/execution/runner"
41
67
 
42
68
  # Built-in primitives
43
69
  require_relative "prompt_objects/primitives/read_file"
44
70
  require_relative "prompt_objects/primitives/list_files"
45
71
  require_relative "prompt_objects/primitives/write_file"
46
72
  require_relative "prompt_objects/primitives/http_get"
73
+ require_relative "prompt_objects/primitives/think"
47
74
 
48
75
  # Universal capabilities (available to all prompt objects)
49
- require_relative "prompt_objects/universal/ask_human"
50
- require_relative "prompt_objects/universal/think"
51
76
  require_relative "prompt_objects/universal/create_capability"
52
77
  require_relative "prompt_objects/universal/add_capability"
53
78
  require_relative "prompt_objects/universal/remove_capability"
54
79
  require_relative "prompt_objects/universal/list_capabilities"
55
- require_relative "prompt_objects/universal/list_primitives"
56
- require_relative "prompt_objects/universal/add_primitive"
57
- require_relative "prompt_objects/universal/create_primitive"
58
80
  require_relative "prompt_objects/universal/delete_primitive"
59
81
  require_relative "prompt_objects/universal/verify_primitive"
60
82
  require_relative "prompt_objects/universal/modify_primitive"
61
83
  require_relative "prompt_objects/universal/request_primitive"
62
84
  require_relative "prompt_objects/universal/modify_prompt"
85
+ require_relative "prompt_objects/universal/set_env_data"
86
+ require_relative "prompt_objects/universal/get_env_data"
87
+ require_relative "prompt_objects/universal/list_env_data"
88
+ require_relative "prompt_objects/universal/delete_env_data"
89
+ require_relative "prompt_objects/universal/render_artifact"
90
+ require_relative "prompt_objects/universal/dispatch_po"
91
+ require_relative "prompt_objects/universal/get_run_status"
92
+ require_relative "prompt_objects/universal/join_runs"
63
93
 
64
94
  # Connectors (different interfaces to environments)
65
95
  require_relative "prompt_objects/connectors/base"