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,36 +0,0 @@
1
- {
2
- "name": "prompt-objects-frontend",
3
- "private": true,
4
- "version": "0.1.0",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "tsc && vite build",
9
- "preview": "vite preview",
10
- "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0"
11
- },
12
- "dependencies": {
13
- "@types/react-syntax-highlighter": "^15.5.13",
14
- "clsx": "^2.1.1",
15
- "d3-force": "^3.0.0",
16
- "react": "^18.3.1",
17
- "react-dom": "^18.3.1",
18
- "react-markdown": "^10.1.0",
19
- "react-syntax-highlighter": "^16.1.0",
20
- "remark-gfm": "^4.0.1",
21
- "three": "^0.182.0",
22
- "zustand": "^5.0.0"
23
- },
24
- "devDependencies": {
25
- "@types/d3-force": "^3.0.10",
26
- "@types/react": "^18.3.12",
27
- "@types/react-dom": "^18.3.1",
28
- "@types/three": "^0.182.0",
29
- "@vitejs/plugin-react": "^4.3.4",
30
- "autoprefixer": "^10.4.20",
31
- "postcss": "^8.4.49",
32
- "tailwindcss": "^3.4.16",
33
- "typescript": "^5.6.3",
34
- "vite": "^6.0.3"
35
- }
36
- }
@@ -1,6 +0,0 @@
1
- export default {
2
- plugins: {
3
- tailwindcss: {},
4
- autoprefixer: {},
5
- },
6
- }
data/frontend/src/App.tsx DELETED
@@ -1,103 +0,0 @@
1
- import { useWebSocket } from './hooks/useWebSocket'
2
- import { useStore, useSelectedPO } from './store'
3
- import { useResize } from './hooks/useResize'
4
- import { SystemBar } from './components/SystemBar'
5
- import { ObjectList } from './components/ObjectList'
6
- import { Inspector } from './components/Inspector'
7
- import { Transcript } from './components/Transcript'
8
- import { NotificationPanel } from './components/NotificationPanel'
9
- import { UsagePanel } from './components/UsagePanel'
10
- import { CanvasView } from './canvas/CanvasView'
11
-
12
- export default function App() {
13
- const { sendMessage, respondToNotification, createSession, switchSession, switchLLM, createThread, updatePrompt, requestUsage, exportThread } =
14
- useWebSocket()
15
- const { selectedPO, busOpen, notifications, usageData, clearUsageData, currentView } = useStore()
16
- const selectedPOData = useSelectedPO()
17
-
18
- const objectListResize = useResize({
19
- direction: 'horizontal',
20
- initialSize: 192,
21
- minSize: 120,
22
- maxSize: 320,
23
- })
24
-
25
- const transcriptResize = useResize({
26
- direction: 'vertical',
27
- initialSize: 180,
28
- minSize: 80,
29
- maxSize: 400,
30
- inverted: true,
31
- })
32
-
33
- return (
34
- <div className="h-screen flex flex-col bg-po-bg">
35
- <SystemBar switchLLM={switchLLM} />
36
-
37
- <div className="flex-1 flex flex-col overflow-hidden">
38
- {/* Main view area */}
39
- <div className="flex-1 flex overflow-hidden">
40
- {currentView === 'canvas' ? (
41
- <CanvasView />
42
- ) : (
43
- <>
44
- {/* Object List - resizable */}
45
- <div style={{ width: objectListResize.size }} className="flex-shrink-0">
46
- <ObjectList />
47
- </div>
48
-
49
- {/* Resize handle */}
50
- <div
51
- className="resize-handle"
52
- onMouseDown={objectListResize.onMouseDown}
53
- />
54
-
55
- {/* Main content */}
56
- <main className="flex-1 overflow-hidden flex flex-col">
57
- {selectedPO && selectedPOData ? (
58
- <Inspector
59
- po={selectedPOData}
60
- sendMessage={sendMessage}
61
- createSession={createSession}
62
- switchSession={switchSession}
63
- createThread={createThread}
64
- updatePrompt={updatePrompt}
65
- requestUsage={requestUsage}
66
- exportThread={exportThread}
67
- />
68
- ) : (
69
- <div className="h-full flex items-center justify-center text-po-text-ghost">
70
- <span className="font-mono text-xs">Select an object</span>
71
- </div>
72
- )}
73
- </main>
74
- </>
75
- )}
76
- </div>
77
-
78
- {/* Transcript - resizable bottom pane, visible in both views */}
79
- {busOpen && (
80
- <>
81
- <div
82
- className="resize-handle-h"
83
- onMouseDown={transcriptResize.onMouseDown}
84
- />
85
- <div style={{ height: transcriptResize.size }} className="flex-shrink-0">
86
- <Transcript />
87
- </div>
88
- </>
89
- )}
90
- </div>
91
-
92
- {/* Notification panel - floating */}
93
- {notifications.length > 0 && (
94
- <NotificationPanel respondToNotification={respondToNotification} />
95
- )}
96
-
97
- {/* Usage panel modal */}
98
- {usageData && (
99
- <UsagePanel usage={usageData as any} onClose={clearUsageData} />
100
- )}
101
- </div>
102
- )
103
- }
@@ -1,113 +0,0 @@
1
- import { useEffect, useRef, useCallback } from 'react'
2
- import { useStore } from '../store'
3
- import { useCanvasStore } from './canvasStore'
4
- import { SceneManager } from './SceneManager'
5
- import { InspectorPanel } from './inspector/InspectorPanel'
6
-
7
- export function CanvasView() {
8
- const containerRef = useRef<HTMLDivElement>(null)
9
- const sceneRef = useRef<SceneManager | null>(null)
10
- const syncScheduled = useRef(false)
11
-
12
- // Schedule a throttled sync via requestAnimationFrame
13
- const scheduleSync = useCallback(() => {
14
- if (syncScheduled.current) return
15
- syncScheduled.current = true
16
- requestAnimationFrame(() => {
17
- syncScheduled.current = false
18
- const scene = sceneRef.current
19
- if (!scene) return
20
- const state = useStore.getState()
21
- scene.syncPromptObjects(state.promptObjects)
22
- scene.syncBusMessages(state.busMessages)
23
- scene.syncNotifications(state.notifications)
24
- })
25
- }, [])
26
-
27
- // Mount/unmount SceneManager
28
- useEffect(() => {
29
- const container = containerRef.current
30
- if (!container) return
31
-
32
- const scene = new SceneManager(container)
33
- sceneRef.current = scene
34
-
35
- // Initial sync
36
- const state = useStore.getState()
37
- scene.syncPromptObjects(state.promptObjects)
38
- scene.syncBusMessages(state.busMessages)
39
- scene.syncNotifications(state.notifications)
40
- scene.start()
41
-
42
- // Fit all after a short delay to let force layout settle
43
- const fitTimer = setTimeout(() => scene.fitAll(), 500)
44
-
45
- return () => {
46
- clearTimeout(fitTimer)
47
- scene.dispose()
48
- sceneRef.current = null
49
- }
50
- }, [])
51
-
52
- // Subscribe to store changes (non-React API to avoid re-renders)
53
- useEffect(() => {
54
- const unsub = useStore.subscribe(scheduleSync)
55
- return unsub
56
- }, [scheduleSync])
57
-
58
- // Keyboard shortcuts
59
- useEffect(() => {
60
- const handler = (e: KeyboardEvent) => {
61
- if (e.key === 'f' && !e.ctrlKey && !e.metaKey) {
62
- // Don't intercept when typing in an input
63
- if ((e.target as HTMLElement).tagName === 'INPUT' || (e.target as HTMLElement).tagName === 'TEXTAREA') return
64
- sceneRef.current?.fitAll()
65
- }
66
- if (e.key === 'Escape') {
67
- useCanvasStore.getState().selectNode(null)
68
- }
69
- }
70
- window.addEventListener('keydown', handler)
71
- return () => window.removeEventListener('keydown', handler)
72
- }, [])
73
-
74
- const showLabels = useCanvasStore((s) => s.showLabels)
75
- const toggleLabels = useCanvasStore((s) => s.toggleLabels)
76
-
77
- return (
78
- <div className="flex-1 flex overflow-hidden relative">
79
- {/* Three.js container */}
80
- <div ref={containerRef} className="flex-1 relative" />
81
-
82
- {/* Toolbar overlay */}
83
- <div className="absolute top-3 left-3 flex gap-2 z-10">
84
- <button
85
- onClick={() => sceneRef.current?.fitAll()}
86
- className="px-2.5 py-1 text-xs bg-po-surface-2/80 backdrop-blur border border-po-border rounded hover:border-po-accent transition-colors duration-150 text-po-text-secondary hover:text-po-text-primary"
87
- title="Fit all nodes (F)"
88
- >
89
- Fit All
90
- </button>
91
- <button
92
- onClick={toggleLabels}
93
- className={`px-2.5 py-1 text-xs backdrop-blur border rounded transition-colors duration-150 ${
94
- showLabels
95
- ? 'bg-po-accent-wash border-po-accent text-po-accent'
96
- : 'bg-po-surface-2/80 border-po-border text-po-text-secondary hover:text-po-text-primary'
97
- }`}
98
- title="Toggle labels"
99
- >
100
- Labels
101
- </button>
102
- </div>
103
-
104
- {/* Help hint */}
105
- <div className="absolute bottom-3 left-3 text-2xs text-po-text-ghost z-10 font-mono">
106
- Scroll to zoom · Shift+drag to pan · F to fit · Click node to inspect
107
- </div>
108
-
109
- {/* Inspector panel */}
110
- <InspectorPanel />
111
- </div>
112
- )
113
- }
@@ -1,115 +0,0 @@
1
- import {
2
- forceSimulation,
3
- forceManyBody,
4
- forceCenter,
5
- forceCollide,
6
- forceLink,
7
- type Simulation,
8
- type SimulationNodeDatum,
9
- type SimulationLinkDatum,
10
- } from 'd3-force'
11
- import { FORCE } from './constants'
12
-
13
- export interface ForceNode extends SimulationNodeDatum {
14
- id: string
15
- type: 'po' | 'toolcall'
16
- }
17
-
18
- export interface ForceLink extends SimulationLinkDatum<ForceNode> {
19
- id: string
20
- }
21
-
22
- export class ForceLayout {
23
- private simulation: Simulation<ForceNode, ForceLink>
24
- private nodes: ForceNode[] = []
25
- private links: ForceLink[] = []
26
- private dirty = false
27
-
28
- constructor() {
29
- this.simulation = forceSimulation<ForceNode, ForceLink>()
30
- .alphaDecay(FORCE.alphaDecay)
31
- .velocityDecay(FORCE.velocityDecay)
32
- .force('charge', forceManyBody<ForceNode>().strength(FORCE.chargeStrength))
33
- .force('center', forceCenter<ForceNode>(0, 0).strength(FORCE.centerStrength))
34
- .force(
35
- 'collision',
36
- forceCollide<ForceNode>().radius(FORCE.collisionRadius)
37
- )
38
- .force(
39
- 'link',
40
- forceLink<ForceNode, ForceLink>()
41
- .id((d) => d.id)
42
- .distance(FORCE.linkDistance)
43
- )
44
- .stop() // Manual tick mode — we call tick() from animation loop
45
- }
46
-
47
- addNode(id: string, type: 'po' | 'toolcall'): void {
48
- if (this.nodes.find((n) => n.id === id)) return
49
- this.nodes.push({ id, type })
50
- this.dirty = true
51
- }
52
-
53
- removeNode(id: string): void {
54
- const idx = this.nodes.findIndex((n) => n.id === id)
55
- if (idx === -1) return
56
- this.nodes.splice(idx, 1)
57
- // Also remove any links referencing this node
58
- this.links = this.links.filter((l) => {
59
- const src = typeof l.source === 'object' ? (l.source as ForceNode).id : l.source
60
- const tgt = typeof l.target === 'object' ? (l.target as ForceNode).id : l.target
61
- return src !== id && tgt !== id
62
- })
63
- this.dirty = true
64
- }
65
-
66
- addLink(id: string, sourceId: string, targetId: string): void {
67
- if (this.links.find((l) => l.id === id)) return
68
- this.links.push({ id, source: sourceId, target: targetId })
69
- this.dirty = true
70
- }
71
-
72
- removeLink(id: string): void {
73
- const idx = this.links.findIndex((l) => l.id === id)
74
- if (idx === -1) return
75
- this.links.splice(idx, 1)
76
- this.dirty = true
77
- }
78
-
79
- tick(): void {
80
- if (this.dirty) {
81
- this.rebuild()
82
- this.dirty = false
83
- }
84
- this.simulation.tick()
85
- }
86
-
87
- getPositions(): Map<string, { x: number; y: number }> {
88
- const positions = new Map<string, { x: number; y: number }>()
89
- for (const node of this.nodes) {
90
- positions.set(node.id, { x: node.x ?? 0, y: node.y ?? 0 })
91
- }
92
- return positions
93
- }
94
-
95
- reheat(): void {
96
- this.simulation.alpha(0.8).restart().stop()
97
- }
98
-
99
- private rebuild(): void {
100
- this.simulation.nodes(this.nodes)
101
- const linkForce = this.simulation.force('link') as ReturnType<
102
- typeof forceLink<ForceNode, ForceLink>
103
- >
104
- if (linkForce) {
105
- linkForce.links(this.links)
106
- }
107
- this.reheat()
108
- }
109
-
110
- dispose(): void {
111
- this.simulation.stop()
112
- this.nodes = []
113
- this.links = []
114
- }
115
- }