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
@@ -1,279 +0,0 @@
1
- import { create } from 'zustand'
2
- import { useShallow } from 'zustand/react/shallow'
3
- import type {
4
- PromptObject,
5
- BusMessage,
6
- Notification,
7
- Environment,
8
- Message,
9
- LLMConfig,
10
- } from '../types'
11
-
12
- interface Store {
13
- // Connection state
14
- connected: boolean
15
- setConnected: (connected: boolean) => void
16
- resetOnDisconnect: () => void
17
-
18
- // Environment
19
- environment: Environment | null
20
- setEnvironment: (env: Environment) => void
21
-
22
- // Prompt Objects
23
- promptObjects: Record<string, PromptObject>
24
- setPromptObject: (name: string, state: Partial<PromptObject>) => void
25
- removePromptObject: (name: string) => void
26
- updatePromptObjectStatus: (name: string, status: PromptObject['status']) => void
27
- addMessageToPO: (poName: string, message: Message) => void
28
- updateSessionMessages: (poName: string, sessionId: string, messages: Message[]) => void
29
- switchPOSession: (poName: string, sessionId: string) => void
30
-
31
- // Navigation
32
- selectedPO: string | null
33
- selectPO: (name: string | null) => void
34
- activeTab: 'chat' | 'sessions' | 'capabilities' | 'prompt'
35
- setActiveTab: (tab: Store['activeTab']) => void
36
- currentView: 'dashboard' | 'canvas'
37
- setCurrentView: (view: Store['currentView']) => void
38
-
39
- // Message Bus
40
- busMessages: BusMessage[]
41
- addBusMessage: (message: BusMessage) => void
42
- busOpen: boolean
43
- toggleBus: () => void
44
- topPaneCollapsed: boolean
45
- toggleTopPane: () => void
46
-
47
- // Notifications
48
- notifications: Notification[]
49
- addNotification: (notification: Notification) => void
50
- removeNotification: (id: string) => void
51
-
52
- // Streaming
53
- streamingContent: Record<string, string>
54
- appendStreamChunk: (poName: string, chunk: string) => void
55
- clearStream: (poName: string) => void
56
-
57
- // Response handling
58
- pendingResponse: Record<string, string>
59
- setPendingResponse: (poName: string, content: string) => void
60
- clearPendingResponse: (poName: string) => void
61
-
62
- // LLM Config
63
- llmConfig: LLMConfig | null
64
- setLLMConfig: (config: LLMConfig) => void
65
- updateCurrentLLM: (provider: string, model: string) => void
66
-
67
- // Usage data (for modal display)
68
- usageData: Record<string, unknown> | null
69
- setUsageData: (data: Record<string, unknown>) => void
70
- clearUsageData: () => void
71
- }
72
-
73
- export const useStore = create<Store>((set) => ({
74
- // Connection
75
- connected: false,
76
- setConnected: (connected) => set({ connected }),
77
- resetOnDisconnect: () =>
78
- set((s) => {
79
- // Reset all PO statuses to idle (server will re-send correct status on reconnect)
80
- const resetPOs: Record<string, PromptObject> = {}
81
- for (const [name, po] of Object.entries(s.promptObjects)) {
82
- resetPOs[name] = po.status !== 'idle' ? { ...po, status: 'idle' } : po
83
- }
84
- return {
85
- connected: false,
86
- promptObjects: resetPOs,
87
- streamingContent: {}, // Clear broken streams
88
- pendingResponse: {}, // Clear stale pending responses
89
- }
90
- }),
91
-
92
- // Environment
93
- environment: null,
94
- setEnvironment: (environment) => set({ environment }),
95
-
96
- // Prompt Objects
97
- promptObjects: {},
98
- setPromptObject: (name, state) =>
99
- set((s) => ({
100
- promptObjects: {
101
- ...s.promptObjects,
102
- [name]: {
103
- ...s.promptObjects[name],
104
- ...state,
105
- name, // Ensure name is always set
106
- } as PromptObject,
107
- },
108
- })),
109
- removePromptObject: (name) =>
110
- set((s) => {
111
- const { [name]: _, ...rest } = s.promptObjects
112
- // If we're viewing this PO, deselect it
113
- const selectedPO = s.selectedPO === name ? null : s.selectedPO
114
- return { promptObjects: rest, selectedPO }
115
- }),
116
- updatePromptObjectStatus: (name, status) =>
117
- set((s) => ({
118
- promptObjects: {
119
- ...s.promptObjects,
120
- [name]: {
121
- ...s.promptObjects[name],
122
- status,
123
- },
124
- },
125
- })),
126
- addMessageToPO: (poName, message) =>
127
- set((s) => {
128
- const po = s.promptObjects[poName]
129
- if (!po) return s
130
-
131
- // Handle case where current_session doesn't exist yet (new POs)
132
- const currentMessages = po.current_session?.messages || []
133
- return {
134
- promptObjects: {
135
- ...s.promptObjects,
136
- [poName]: {
137
- ...po,
138
- current_session: {
139
- id: po.current_session?.id || 'pending',
140
- messages: [...currentMessages, message],
141
- },
142
- },
143
- },
144
- }
145
- }),
146
- updateSessionMessages: (poName, sessionId, messages) =>
147
- set((s) => {
148
- const po = s.promptObjects[poName]
149
- if (!po) return s
150
-
151
- // Update current_session if it matches the sessionId, OR if current_session is null
152
- // (handles newly created POs that didn't have session info yet)
153
- if (po.current_session?.id === sessionId || !po.current_session) {
154
- return {
155
- promptObjects: {
156
- ...s.promptObjects,
157
- [poName]: {
158
- ...po,
159
- current_session: {
160
- id: sessionId,
161
- messages,
162
- },
163
- },
164
- },
165
- }
166
- }
167
-
168
- // Otherwise, just update the session in the sessions list (message count)
169
- // The full messages will be loaded when the user switches to that session
170
- return s
171
- }),
172
- switchPOSession: (poName, sessionId) =>
173
- set((s) => {
174
- const po = s.promptObjects[poName]
175
- if (!po) return s
176
-
177
- // Switch to a new session - clear messages until session_updated arrives
178
- return {
179
- promptObjects: {
180
- ...s.promptObjects,
181
- [poName]: {
182
- ...po,
183
- current_session: {
184
- id: sessionId,
185
- messages: [], // Will be populated by session_updated
186
- },
187
- },
188
- },
189
- }
190
- }),
191
-
192
- // Navigation
193
- selectedPO: null,
194
- selectPO: (name) => set({ selectedPO: name, activeTab: 'chat' }),
195
- activeTab: 'chat',
196
- setActiveTab: (activeTab) => set({ activeTab }),
197
- currentView: 'dashboard',
198
- setCurrentView: (currentView) => set({ currentView }),
199
-
200
- // Message Bus
201
- busMessages: [],
202
- addBusMessage: (message) =>
203
- set((s) => ({
204
- busMessages: [...s.busMessages.slice(-99), message], // Keep last 100
205
- })),
206
- busOpen: false,
207
- toggleBus: () => set((s) => ({ busOpen: !s.busOpen })),
208
- topPaneCollapsed: false,
209
- toggleTopPane: () => set((s) => ({ topPaneCollapsed: !s.topPaneCollapsed })),
210
-
211
- // Notifications
212
- notifications: [],
213
- addNotification: (notification) =>
214
- set((s) => ({
215
- notifications: [...s.notifications, notification],
216
- })),
217
- removeNotification: (id) =>
218
- set((s) => ({
219
- notifications: s.notifications.filter((n) => n.id !== id),
220
- })),
221
-
222
- // Streaming
223
- streamingContent: {},
224
- appendStreamChunk: (poName, chunk) =>
225
- set((s) => ({
226
- streamingContent: {
227
- ...s.streamingContent,
228
- [poName]: (s.streamingContent[poName] || '') + chunk,
229
- },
230
- })),
231
- clearStream: (poName) =>
232
- set((s) => {
233
- const { [poName]: _, ...rest } = s.streamingContent
234
- return { streamingContent: rest }
235
- }),
236
-
237
- // Response handling
238
- pendingResponse: {},
239
- setPendingResponse: (poName, content) =>
240
- set((s) => ({
241
- pendingResponse: {
242
- ...s.pendingResponse,
243
- [poName]: content,
244
- },
245
- })),
246
- clearPendingResponse: (poName) =>
247
- set((s) => {
248
- const { [poName]: _, ...rest } = s.pendingResponse
249
- return { pendingResponse: rest }
250
- }),
251
-
252
- // LLM Config
253
- llmConfig: null,
254
- setLLMConfig: (config) => set({ llmConfig: config }),
255
- updateCurrentLLM: (provider, model) =>
256
- set((s) => ({
257
- llmConfig: s.llmConfig
258
- ? { ...s.llmConfig, current_provider: provider, current_model: model }
259
- : null,
260
- })),
261
-
262
- // Usage data
263
- usageData: null,
264
- setUsageData: (data) => set({ usageData: data }),
265
- clearUsageData: () => set({ usageData: null }),
266
- }))
267
-
268
- // Selectors - use useShallow to prevent infinite re-renders with derived arrays
269
- export const usePromptObjects = () =>
270
- useStore(useShallow((s) => Object.values(s.promptObjects)))
271
-
272
- export const useSelectedPO = () =>
273
- useStore((s) => (s.selectedPO ? s.promptObjects[s.selectedPO] : null))
274
-
275
- export const useNotificationCount = () =>
276
- useStore((s) => s.notifications.length)
277
-
278
- export const usePONotifications = (poName: string) =>
279
- useStore(useShallow((s) => s.notifications.filter((n) => n.po_name === poName)))
@@ -1,165 +0,0 @@
1
- // Core types for PromptObjects frontend
2
-
3
- export interface Message {
4
- role: 'user' | 'assistant' | 'tool'
5
- content: string | null
6
- from?: string
7
- tool_calls?: ToolCall[]
8
- results?: ToolResult[]
9
- }
10
-
11
- export interface ToolCall {
12
- id: string
13
- name: string
14
- arguments: Record<string, unknown>
15
- }
16
-
17
- export interface ToolResult {
18
- tool_call_id: string
19
- name?: string // Name of the tool that was called
20
- content: string
21
- }
22
-
23
- export type ThreadType = 'root' | 'continuation' | 'delegation' | 'fork'
24
-
25
- export interface Session {
26
- id: string
27
- name: string | null
28
- message_count: number
29
- updated_at?: string
30
- // Thread fields
31
- parent_session_id?: string
32
- parent_po?: string
33
- thread_type: ThreadType
34
- }
35
-
36
- export interface ThreadTree {
37
- session: Session
38
- children: ThreadTree[]
39
- }
40
-
41
- export interface CurrentSession {
42
- id: string
43
- messages: Message[]
44
- }
45
-
46
- export interface CapabilityInfo {
47
- name: string
48
- description: string
49
- parameters?: Record<string, unknown>
50
- }
51
-
52
- // Alias for backwards compatibility
53
- export type UniversalCapability = CapabilityInfo
54
-
55
- export interface PromptObject {
56
- name: string
57
- description: string
58
- status: 'idle' | 'thinking' | 'calling_tool'
59
- capabilities: CapabilityInfo[]
60
- universal_capabilities?: CapabilityInfo[]
61
- current_session: CurrentSession | null
62
- sessions: Session[]
63
- prompt?: string // The markdown body/prompt
64
- config?: Record<string, unknown> // The YAML frontmatter config
65
- delegated_by?: string | null // Name of the PO that called this one (set by delegation events)
66
- }
67
-
68
- export interface BusMessage {
69
- from: string
70
- to: string
71
- content: string | Record<string, unknown>
72
- summary?: string
73
- timestamp: string
74
- }
75
-
76
- export interface Notification {
77
- id: string
78
- po_name: string
79
- type: string
80
- message: string
81
- options: string[]
82
- }
83
-
84
- export interface Environment {
85
- name: string
86
- path: string
87
- po_count: number
88
- primitive_count: number
89
- }
90
-
91
- // LLM Provider configuration
92
- export interface LLMProvider {
93
- name: string
94
- models: string[]
95
- default_model: string
96
- available: boolean
97
- }
98
-
99
- export interface LLMConfig {
100
- current_provider: string
101
- current_model: string
102
- providers: LLMProvider[]
103
- }
104
-
105
- // WebSocket message types
106
- export type WSMessageType =
107
- | 'environment'
108
- | 'po_state'
109
- | 'po_response'
110
- | 'po_added'
111
- | 'po_modified'
112
- | 'po_removed'
113
- | 'po_delegation_started'
114
- | 'po_delegation_completed'
115
- | 'stream'
116
- | 'stream_end'
117
- | 'bus_message'
118
- | 'notification'
119
- | 'notification_resolved'
120
- | 'session_created'
121
- | 'session_switched'
122
- | 'session_updated'
123
- | 'thread_created'
124
- | 'thread_tree'
125
- | 'llm_config'
126
- | 'llm_switched'
127
- | 'session_usage'
128
- | 'thread_export'
129
- | 'prompt_updated'
130
- | 'llm_error'
131
- | 'error'
132
- | 'pong'
133
-
134
- export interface WSMessage<T = unknown> {
135
- type: WSMessageType
136
- payload: T
137
- }
138
-
139
- // Client -> Server message types
140
- export interface SendMessagePayload {
141
- target: string
142
- content: string
143
- new_thread?: boolean // If true, create a new thread before sending
144
- }
145
-
146
- export interface RespondToNotificationPayload {
147
- id: string
148
- response: string
149
- }
150
-
151
- export interface CreateSessionPayload {
152
- target: string
153
- name?: string
154
- }
155
-
156
- export interface SwitchSessionPayload {
157
- target: string
158
- session_id: string
159
- }
160
-
161
- export interface CreateThreadPayload {
162
- target: string
163
- name?: string
164
- thread_type?: ThreadType
165
- }
@@ -1,44 +0,0 @@
1
- /** @type {import('tailwindcss').Config} */
2
- export default {
3
- content: [
4
- "./index.html",
5
- "./src/**/*.{js,ts,jsx,tsx}",
6
- ],
7
- theme: {
8
- extend: {
9
- colors: {
10
- po: {
11
- bg: '#1a1918',
12
- surface: '#222120',
13
- 'surface-2': '#2c2a28',
14
- 'surface-3': '#363432',
15
- border: '#3d3a37',
16
- 'border-focus': '#5c5752',
17
- accent: '#d4952a',
18
- 'accent-muted': '#9a6d20',
19
- 'accent-wash': 'rgba(212,149,42,0.08)',
20
- 'text-primary': '#e8e2da',
21
- 'text-secondary': '#a8a29a',
22
- 'text-tertiary': '#78726a',
23
- 'text-ghost': '#524e48',
24
- 'status-idle': '#78726a',
25
- 'status-active': '#d4952a',
26
- 'status-calling': '#3b9a6e',
27
- 'status-error': '#c45c4a',
28
- 'status-delegated': '#5a8fc2',
29
- success: '#3b9a6e',
30
- warning: '#d4952a',
31
- error: '#c45c4a',
32
- },
33
- },
34
- fontFamily: {
35
- ui: ['Geist', 'system-ui', 'sans-serif'],
36
- mono: ['"Geist Mono"', '"IBM Plex Mono"', 'monospace'],
37
- },
38
- fontSize: {
39
- '2xs': ['11px', { lineHeight: '15px' }],
40
- },
41
- },
42
- },
43
- plugins: [],
44
- }
@@ -1,30 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "useDefineForClassFields": true,
5
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
- "module": "ESNext",
7
- "skipLibCheck": true,
8
-
9
- /* Bundler mode */
10
- "moduleResolution": "bundler",
11
- "allowImportingTsExtensions": true,
12
- "isolatedModules": true,
13
- "moduleDetection": "force",
14
- "noEmit": true,
15
- "jsx": "react-jsx",
16
-
17
- /* Linting */
18
- "strict": true,
19
- "noUnusedLocals": true,
20
- "noUnusedParameters": true,
21
- "noFallthroughCasesInSwitch": true,
22
-
23
- /* Paths */
24
- "baseUrl": ".",
25
- "paths": {
26
- "@/*": ["src/*"]
27
- }
28
- },
29
- "include": ["src"]
30
- }
@@ -1,29 +0,0 @@
1
- import { defineConfig } from 'vite'
2
- import react from '@vitejs/plugin-react'
3
-
4
- // https://vite.dev/config/
5
- export default defineConfig({
6
- plugins: [react()],
7
-
8
- // Output to Ruby server's public directory for production
9
- build: {
10
- outDir: '../lib/prompt_objects/server/public',
11
- emptyOutDir: true,
12
- },
13
-
14
- // Development proxy to Ruby server
15
- server: {
16
- port: 5173,
17
- proxy: {
18
- '/api': {
19
- target: 'http://localhost:3000',
20
- changeOrigin: true,
21
- },
22
- // WebSocket proxy
23
- '/ws': {
24
- target: 'ws://localhost:3000',
25
- ws: true,
26
- },
27
- },
28
- },
29
- })