@schlenkr/ragents 0.1.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 (788) hide show
  1. package/LICENSE +166 -0
  2. package/README.md +88 -0
  3. package/apps/server/agent-home/settings.json +3 -0
  4. package/apps/server/package.json +29 -0
  5. package/apps/server/src/access-projection.ts +97 -0
  6. package/apps/server/src/access-service.ts +22 -0
  7. package/apps/server/src/access-session.ts +204 -0
  8. package/apps/server/src/api/contracts.ts +203 -0
  9. package/apps/server/src/api/core-methods.ts +163 -0
  10. package/apps/server/src/api/delivery.ts +40 -0
  11. package/apps/server/src/api/reference.ts +146 -0
  12. package/apps/server/src/api/rights.ts +26 -0
  13. package/apps/server/src/chat-attachments.ts +52 -0
  14. package/apps/server/src/chat-context.ts +6 -0
  15. package/apps/server/src/chat-events.ts +185 -0
  16. package/apps/server/src/chat-handler.ts +37 -0
  17. package/apps/server/src/config-definition.ts +80 -0
  18. package/apps/server/src/config-file.ts +324 -0
  19. package/apps/server/src/config.ts +46 -0
  20. package/apps/server/src/data-directory.ts +42 -0
  21. package/apps/server/src/external-access.ts +40 -0
  22. package/apps/server/src/help-files.ts +63 -0
  23. package/apps/server/src/host-resolution-hooks.mjs +31 -0
  24. package/apps/server/src/host-resolution.ts +3 -0
  25. package/apps/server/src/host-version.ts +74 -0
  26. package/apps/server/src/layout.ts +36 -0
  27. package/apps/server/src/main.ts +54 -0
  28. package/apps/server/src/plugin-support/actor-programs/capability-resolver.ts +107 -0
  29. package/apps/server/src/plugin-support/actor-programs/limits.ts +33 -0
  30. package/apps/server/src/plugin-support/actor-programs/operations.ts +19 -0
  31. package/apps/server/src/plugin-support/actor-programs/service.ts +16 -0
  32. package/apps/server/src/plugin-support/agent-tool.ts +60 -0
  33. package/apps/server/src/plugin-support/asset-path.ts +4 -0
  34. package/apps/server/src/plugin-support/await-with-signal.ts +18 -0
  35. package/apps/server/src/plugin-support/chat-display-contract.ts +7 -0
  36. package/apps/server/src/plugin-support/chat-display-policy.ts +55 -0
  37. package/apps/server/src/plugin-support/front-matter.ts +44 -0
  38. package/apps/server/src/plugin-support/http.ts +93 -0
  39. package/apps/server/src/plugin-support/language-server/contract.ts +18 -0
  40. package/apps/server/src/plugin-support/language-server/plugin.ts +32 -0
  41. package/apps/server/src/plugin-support/language-server/snapshot-method.ts +17 -0
  42. package/apps/server/src/plugin-support/language-server/tools.ts +73 -0
  43. package/apps/server/src/plugin-support/model-choice.ts +109 -0
  44. package/apps/server/src/plugin-support/model-upstreams.ts +12 -0
  45. package/apps/server/src/plugin-support/native-typescript-child.ts +78 -0
  46. package/apps/server/src/plugin-support/native-typescript-executor.ts +260 -0
  47. package/apps/server/src/plugin-support/plugin-config.ts +48 -0
  48. package/apps/server/src/plugin-support/plugin-folder.ts +81 -0
  49. package/apps/server/src/plugin-support/plugin-module.ts +14 -0
  50. package/apps/server/src/plugin-support/plugins-root.ts +41 -0
  51. package/apps/server/src/plugin-support/product-model-settings-contract.ts +24 -0
  52. package/apps/server/src/plugin-support/product-model-settings.ts +120 -0
  53. package/apps/server/src/plugin-support/product-start-options.ts +104 -0
  54. package/apps/server/src/plugin-support/prompt.ts +68 -0
  55. package/apps/server/src/plugin-support/provision.ts +85 -0
  56. package/apps/server/src/plugin-support/run-scripts.ts +88 -0
  57. package/apps/server/src/plugin-support/shell-platform.ts +21 -0
  58. package/apps/server/src/plugin-support/skills.ts +97 -0
  59. package/apps/server/src/plugin-support/start-entries-contract.ts +71 -0
  60. package/apps/server/src/plugin-support/start-options-contract.ts +65 -0
  61. package/apps/server/src/plugin-support/system-prompts.ts +138 -0
  62. package/apps/server/src/plugin-support/thinking-level.ts +8 -0
  63. package/apps/server/src/plugin-support/tool-availability.ts +20 -0
  64. package/apps/server/src/plugin-support/workspace-ownership.ts +36 -0
  65. package/apps/server/src/plugin-support/workspace-sandbox-host.ts +213 -0
  66. package/apps/server/src/plugin-support/workspace-tool-naming.ts +11 -0
  67. package/apps/server/src/plugin-support/zip.ts +69 -0
  68. package/apps/server/src/profile/compose.ts +69 -0
  69. package/apps/server/src/profile/plugin-discovery.ts +112 -0
  70. package/apps/server/src/profile/plugin-list.ts +19 -0
  71. package/apps/server/src/profile/provisioning.ts +81 -0
  72. package/apps/server/src/protocol.ts +106 -0
  73. package/apps/server/src/provider.ts +817 -0
  74. package/apps/server/src/ragents/actor-chat-history.ts +111 -0
  75. package/apps/server/src/ragents/chat-projection.ts +55 -0
  76. package/apps/server/src/ragents/chat-text-positions.ts +43 -0
  77. package/apps/server/src/ragents/coordinator.ts +5 -0
  78. package/apps/server/src/ragents/document-store.ts +12 -0
  79. package/apps/server/src/ragents/engine.ts +417 -0
  80. package/apps/server/src/ragents/global-chat.ts +40 -0
  81. package/apps/server/src/ragents/host-services.ts +26 -0
  82. package/apps/server/src/ragents/journal-chat-events.ts +52 -0
  83. package/apps/server/src/ragents/product-runtime.ts +31 -0
  84. package/apps/server/src/ragents/runtime-bridge.ts +7 -0
  85. package/apps/server/src/ragents/session.ts +859 -0
  86. package/apps/server/src/ragents/start-option-state.ts +37 -0
  87. package/apps/server/src/ragents/typescript-tools.ts +182 -0
  88. package/apps/server/src/ragents/workspace-runtime.ts +64 -0
  89. package/apps/server/src/rpc/dispatcher.ts +178 -0
  90. package/apps/server/src/rpc/http-transport.ts +178 -0
  91. package/apps/server/src/rpc/stdio-transport.ts +44 -0
  92. package/apps/server/src/run-preparation-contract.ts +20 -0
  93. package/apps/server/src/run-preparation-input.ts +16 -0
  94. package/apps/server/src/run-preparation.ts +147 -0
  95. package/apps/server/src/run-transfer.ts +264 -0
  96. package/apps/server/src/server.ts +312 -0
  97. package/apps/server/src/settings.ts +209 -0
  98. package/apps/server/src/startup.ts +13 -0
  99. package/apps/server/src/title-compactor.ts +131 -0
  100. package/apps/server/src/title-settings-contract.ts +9 -0
  101. package/apps/server/src/title-settings.ts +67 -0
  102. package/apps/web/package.json +41 -0
  103. package/apps/web/src/AccessContext.tsx +125 -0
  104. package/apps/web/src/App.tsx +315 -0
  105. package/apps/web/src/CanvasShortcuts.tsx +60 -0
  106. package/apps/web/src/DiffCode.tsx +89 -0
  107. package/apps/web/src/HelpDialog.tsx +87 -0
  108. package/apps/web/src/MaterialSettings.tsx +40 -0
  109. package/apps/web/src/Overview.tsx +201 -0
  110. package/apps/web/src/PluginActivation.ts +41 -0
  111. package/apps/web/src/PluginChat.tsx +552 -0
  112. package/apps/web/src/PluginRegistry.tsx +689 -0
  113. package/apps/web/src/RunPreparationChat.tsx +111 -0
  114. package/apps/web/src/RunStore.ts +86 -0
  115. package/apps/web/src/SessionList.tsx +148 -0
  116. package/apps/web/src/SettingsModal.tsx +949 -0
  117. package/apps/web/src/SourceCode.tsx +49 -0
  118. package/apps/web/src/StartOptions.tsx +231 -0
  119. package/apps/web/src/StartSurface.tsx +161 -0
  120. package/apps/web/src/StatusGroup.tsx +18 -0
  121. package/apps/web/src/ThemeSettings.tsx +46 -0
  122. package/apps/web/src/TitleModelSettings.tsx +100 -0
  123. package/apps/web/src/Toolbar.tsx +28 -0
  124. package/apps/web/src/WorkspacePanel.tsx +309 -0
  125. package/apps/web/src/access-session.ts +27 -0
  126. package/apps/web/src/access-token.ts +31 -0
  127. package/apps/web/src/api.ts +368 -0
  128. package/apps/web/src/chat/ChatInputToolbar.tsx +488 -0
  129. package/apps/web/src/chat/ChatMessages.tsx +666 -0
  130. package/apps/web/src/chat/ChatPanel.tsx +61 -0
  131. package/apps/web/src/chat/DetailModeSwitch.tsx +58 -0
  132. package/apps/web/src/chat/Markdown.tsx +104 -0
  133. package/apps/web/src/chat/QuestionCard.tsx +107 -0
  134. package/apps/web/src/chat/StepPopover.tsx +82 -0
  135. package/apps/web/src/chat/WorkingScenes.tsx +235 -0
  136. package/apps/web/src/chat/attachments.ts +53 -0
  137. package/apps/web/src/chat/chat-scroll.ts +41 -0
  138. package/apps/web/src/chat/chat-target.ts +21 -0
  139. package/apps/web/src/chat/requests.ts +23 -0
  140. package/apps/web/src/chat/texts.ts +61 -0
  141. package/apps/web/src/chat/types.ts +26 -0
  142. package/apps/web/src/chat/useAttachmentCapabilities.ts +35 -0
  143. package/apps/web/src/chat/useChat.ts +46 -0
  144. package/apps/web/src/chat/user-location.ts +22 -0
  145. package/apps/web/src/column/ColumnApp.tsx +158 -0
  146. package/apps/web/src/column/ColumnMenu.tsx +37 -0
  147. package/apps/web/src/column/ColumnRunHeader.tsx +43 -0
  148. package/apps/web/src/column/column-location.ts +30 -0
  149. package/apps/web/src/column/host-contract.ts +83 -0
  150. package/apps/web/src/column/host.ts +101 -0
  151. package/apps/web/src/column/use-session-list.ts +42 -0
  152. package/apps/web/src/column.tsx +43 -0
  153. package/apps/web/src/diff-view.css +38 -0
  154. package/apps/web/src/help-samples.ts +11 -0
  155. package/apps/web/src/highlighting.css +74 -0
  156. package/apps/web/src/highlighting.ts +262 -0
  157. package/apps/web/src/lib/format.ts +5 -0
  158. package/apps/web/src/lib/guards.ts +8 -0
  159. package/apps/web/src/lib/http.ts +9 -0
  160. package/apps/web/src/lib/labels.ts +11 -0
  161. package/apps/web/src/lib/local-storage-setting.ts +39 -0
  162. package/apps/web/src/main.tsx +30 -0
  163. package/apps/web/src/material-settings.ts +104 -0
  164. package/apps/web/src/model-settings-events.ts +1 -0
  165. package/apps/web/src/page-opener.tsx +14 -0
  166. package/apps/web/src/panel/LoginForm.tsx +31 -0
  167. package/apps/web/src/panel/OverviewPage.tsx +90 -0
  168. package/apps/web/src/panel/PanelPage.tsx +9 -0
  169. package/apps/web/src/panel/SettingsPage.tsx +102 -0
  170. package/apps/web/src/panel/contract.ts +101 -0
  171. package/apps/web/src/panel/target-state.ts +53 -0
  172. package/apps/web/src/panel.tsx +30 -0
  173. package/apps/web/src/plugin-bootstrap.ts +90 -0
  174. package/apps/web/src/plugin-discovery.ts +5 -0
  175. package/apps/web/src/rpc/client.ts +301 -0
  176. package/apps/web/src/rpc.ts +4 -0
  177. package/apps/web/src/run-overview.ts +34 -0
  178. package/apps/web/src/run-preparation.ts +16 -0
  179. package/apps/web/src/run-read-state.ts +33 -0
  180. package/apps/web/src/settings-contributions.ts +274 -0
  181. package/apps/web/src/theme.ts +135 -0
  182. package/apps/web/src/title-model-settings.ts +51 -0
  183. package/apps/web/src/toolLine.ts +67 -0
  184. package/apps/web/src/ui/ListDetail.tsx +149 -0
  185. package/apps/web/src/ui/SectionLabel.tsx +7 -0
  186. package/apps/web/src/ui/SvgEdge.tsx +39 -0
  187. package/apps/web/src/ui/alert.tsx +75 -0
  188. package/apps/web/src/ui/badge.tsx +51 -0
  189. package/apps/web/src/ui/button.tsx +57 -0
  190. package/apps/web/src/ui/card.tsx +102 -0
  191. package/apps/web/src/ui/checkbox.tsx +26 -0
  192. package/apps/web/src/ui/dialog.tsx +250 -0
  193. package/apps/web/src/ui/dropdown-menu.tsx +265 -0
  194. package/apps/web/src/ui/empty.tsx +103 -0
  195. package/apps/web/src/ui/field.tsx +236 -0
  196. package/apps/web/src/ui/frame.css +4 -0
  197. package/apps/web/src/ui/index.ts +43 -0
  198. package/apps/web/src/ui/input.tsx +19 -0
  199. package/apps/web/src/ui/label.tsx +17 -0
  200. package/apps/web/src/ui/modal-controller.ts +70 -0
  201. package/apps/web/src/ui/modal.tsx +62 -0
  202. package/apps/web/src/ui/popover.tsx +102 -0
  203. package/apps/web/src/ui/progress.tsx +80 -0
  204. package/apps/web/src/ui/radio-group.tsx +35 -0
  205. package/apps/web/src/ui/select.tsx +198 -0
  206. package/apps/web/src/ui/separator.tsx +22 -0
  207. package/apps/web/src/ui/skeleton.tsx +13 -0
  208. package/apps/web/src/ui/spinner.tsx +10 -0
  209. package/apps/web/src/ui/switch.tsx +29 -0
  210. package/apps/web/src/ui/table.tsx +113 -0
  211. package/apps/web/src/ui/tabs.tsx +79 -0
  212. package/apps/web/src/ui/tailwind.css +21 -0
  213. package/apps/web/src/ui/textarea.tsx +17 -0
  214. package/apps/web/src/ui/theme.css +300 -0
  215. package/apps/web/src/ui/toggle-group.tsx +87 -0
  216. package/apps/web/src/ui/toggle.tsx +42 -0
  217. package/apps/web/src/ui/tooltip.tsx +63 -0
  218. package/apps/web/src/ui/useFileInput.ts +50 -0
  219. package/apps/web/src/virtual-plugins.d.ts +3 -0
  220. package/apps/web/src/vite-env.d.ts +1 -0
  221. package/package.json +82 -0
  222. package/packages/agent/package.json +64 -0
  223. package/packages/agent/src/config.ts +161 -0
  224. package/packages/agent/src/core/agent-session-runtime.ts +548 -0
  225. package/packages/agent/src/core/agent-session-services.ts +224 -0
  226. package/packages/agent/src/core/agent-session.ts +3357 -0
  227. package/packages/agent/src/core/auth-guidance.ts +18 -0
  228. package/packages/agent/src/core/auth-storage.ts +271 -0
  229. package/packages/agent/src/core/bash-executor.ts +156 -0
  230. package/packages/agent/src/core/compaction/branch-summarization.ts +372 -0
  231. package/packages/agent/src/core/compaction/compaction.ts +875 -0
  232. package/packages/agent/src/core/compaction/index.ts +7 -0
  233. package/packages/agent/src/core/compaction/utils.ts +174 -0
  234. package/packages/agent/src/core/defaults.ts +3 -0
  235. package/packages/agent/src/core/diagnostics.ts +15 -0
  236. package/packages/agent/src/core/event-bus.ts +33 -0
  237. package/packages/agent/src/core/exec.ts +107 -0
  238. package/packages/agent/src/core/experimental.ts +3 -0
  239. package/packages/agent/src/core/extensions/index.ts +149 -0
  240. package/packages/agent/src/core/extensions/loader.ts +709 -0
  241. package/packages/agent/src/core/extensions/runner.ts +1132 -0
  242. package/packages/agent/src/core/extensions/types.ts +1460 -0
  243. package/packages/agent/src/core/extensions/wrapper.ts +45 -0
  244. package/packages/agent/src/core/footer-data-provider.ts +388 -0
  245. package/packages/agent/src/core/http-dispatcher.ts +106 -0
  246. package/packages/agent/src/core/index.ts +78 -0
  247. package/packages/agent/src/core/messages.ts +195 -0
  248. package/packages/agent/src/core/model-config.ts +287 -0
  249. package/packages/agent/src/core/model-registry.ts +126 -0
  250. package/packages/agent/src/core/model-resolver.ts +675 -0
  251. package/packages/agent/src/core/model-runtime.ts +517 -0
  252. package/packages/agent/src/core/output-guard.ts +108 -0
  253. package/packages/agent/src/core/package-manager.ts +2441 -0
  254. package/packages/agent/src/core/prompt-templates.ts +284 -0
  255. package/packages/agent/src/core/provider-composer.ts +549 -0
  256. package/packages/agent/src/core/resolve-config-value.ts +287 -0
  257. package/packages/agent/src/core/resource-loader.ts +946 -0
  258. package/packages/agent/src/core/runtime-credentials.ts +48 -0
  259. package/packages/agent/src/core/sdk.ts +358 -0
  260. package/packages/agent/src/core/session-cwd.ts +59 -0
  261. package/packages/agent/src/core/session-manager.ts +1623 -0
  262. package/packages/agent/src/core/settings-manager.ts +1212 -0
  263. package/packages/agent/src/core/skills.ts +487 -0
  264. package/packages/agent/src/core/slash-commands.ts +41 -0
  265. package/packages/agent/src/core/source-info.ts +40 -0
  266. package/packages/agent/src/core/system-prompt.ts +147 -0
  267. package/packages/agent/src/core/timings.ts +50 -0
  268. package/packages/agent/src/core/tools/bash.ts +314 -0
  269. package/packages/agent/src/core/tools/edit-diff.ts +704 -0
  270. package/packages/agent/src/core/tools/edit.ts +222 -0
  271. package/packages/agent/src/core/tools/file-mutation-queue.ts +61 -0
  272. package/packages/agent/src/core/tools/index.ts +130 -0
  273. package/packages/agent/src/core/tools/output-accumulator.ts +222 -0
  274. package/packages/agent/src/core/tools/path-utils.ts +118 -0
  275. package/packages/agent/src/core/tools/read.ts +195 -0
  276. package/packages/agent/src/core/tools/tool-definition-wrapper.ts +45 -0
  277. package/packages/agent/src/core/tools/truncate.ts +276 -0
  278. package/packages/agent/src/core/tools/write.ts +90 -0
  279. package/packages/agent/src/core/trust-manager.ts +244 -0
  280. package/packages/agent/src/index.ts +287 -0
  281. package/packages/agent/src/utils/ansi.ts +60 -0
  282. package/packages/agent/src/utils/child-process.ts +137 -0
  283. package/packages/agent/src/utils/exif-orientation.ts +183 -0
  284. package/packages/agent/src/utils/frontmatter.ts +39 -0
  285. package/packages/agent/src/utils/fs-watch.ts +30 -0
  286. package/packages/agent/src/utils/git.ts +226 -0
  287. package/packages/agent/src/utils/image-convert.ts +49 -0
  288. package/packages/agent/src/utils/image-process.ts +119 -0
  289. package/packages/agent/src/utils/image-resize-core.ts +164 -0
  290. package/packages/agent/src/utils/image-resize-worker.ts +42 -0
  291. package/packages/agent/src/utils/image-resize.ts +123 -0
  292. package/packages/agent/src/utils/json.ts +6 -0
  293. package/packages/agent/src/utils/mime.ts +116 -0
  294. package/packages/agent/src/utils/paths.ts +118 -0
  295. package/packages/agent/src/utils/photon.ts +139 -0
  296. package/packages/agent/src/utils/shell.ts +225 -0
  297. package/packages/agent/src/utils/sleep.ts +18 -0
  298. package/packages/agent/src/utils/tools-manager.ts +63 -0
  299. package/packages/agent-core/package.json +32 -0
  300. package/packages/agent-core/src/agent-loop.ts +877 -0
  301. package/packages/agent-core/src/agent.ts +598 -0
  302. package/packages/agent-core/src/index.ts +4 -0
  303. package/packages/agent-core/src/types.ts +455 -0
  304. package/packages/agent-core/src/uuid.ts +54 -0
  305. package/packages/ai/package.json +46 -0
  306. package/packages/ai/src/api/ai-sdk-messages.ts +102 -0
  307. package/packages/ai/src/api/ai-sdk-transport.ts +53 -0
  308. package/packages/ai/src/api/ai-sdk.lazy.ts +4 -0
  309. package/packages/ai/src/api/ai-sdk.ts +273 -0
  310. package/packages/ai/src/api/lazy.ts +75 -0
  311. package/packages/ai/src/api/openrouter-images.lazy.ts +10 -0
  312. package/packages/ai/src/api/openrouter-images.ts +98 -0
  313. package/packages/ai/src/api/simple-options.ts +77 -0
  314. package/packages/ai/src/api/transform-messages.ts +185 -0
  315. package/packages/ai/src/api-registry.ts +226 -0
  316. package/packages/ai/src/auth/context.ts +45 -0
  317. package/packages/ai/src/auth/credential-store.ts +51 -0
  318. package/packages/ai/src/auth/helpers.ts +47 -0
  319. package/packages/ai/src/auth/resolve.ts +139 -0
  320. package/packages/ai/src/auth/types.ts +220 -0
  321. package/packages/ai/src/compat/extension-oauth-types.ts +45 -0
  322. package/packages/ai/src/env-api-keys.ts +24 -0
  323. package/packages/ai/src/image-models.generated.ts +533 -0
  324. package/packages/ai/src/images-models.ts +274 -0
  325. package/packages/ai/src/index.ts +33 -0
  326. package/packages/ai/src/models-store.ts +38 -0
  327. package/packages/ai/src/models.generated.ts +6 -0
  328. package/packages/ai/src/models.ts +705 -0
  329. package/packages/ai/src/oauth.ts +10 -0
  330. package/packages/ai/src/providers/all.ts +64 -0
  331. package/packages/ai/src/providers/faux.ts +539 -0
  332. package/packages/ai/src/providers/openrouter-images.ts +14 -0
  333. package/packages/ai/src/providers/openrouter.models.ts +6050 -0
  334. package/packages/ai/src/providers/openrouter.ts +15 -0
  335. package/packages/ai/src/session-resources.ts +24 -0
  336. package/packages/ai/src/types.ts +692 -0
  337. package/packages/ai/src/utils/abort-signals.ts +41 -0
  338. package/packages/ai/src/utils/deferred-tools.ts +39 -0
  339. package/packages/ai/src/utils/diagnostics.ts +45 -0
  340. package/packages/ai/src/utils/error-body.ts +129 -0
  341. package/packages/ai/src/utils/estimate.ts +146 -0
  342. package/packages/ai/src/utils/event-stream.ts +88 -0
  343. package/packages/ai/src/utils/hash.ts +13 -0
  344. package/packages/ai/src/utils/headers.ts +18 -0
  345. package/packages/ai/src/utils/json-parse.ts +124 -0
  346. package/packages/ai/src/utils/node-http-proxy.ts +112 -0
  347. package/packages/ai/src/utils/overflow.ts +165 -0
  348. package/packages/ai/src/utils/provider-env.ts +52 -0
  349. package/packages/ai/src/utils/retry.ts +101 -0
  350. package/packages/ai/src/utils/sanitize-unicode.ts +25 -0
  351. package/packages/ai/src/utils/typebox-helpers.ts +24 -0
  352. package/packages/ai/src/utils/validation.ts +383 -0
  353. package/packages/ragents/package.json +31 -0
  354. package/packages/ragents/src/access.ts +54 -0
  355. package/packages/ragents/src/agents/actor-input.ts +191 -0
  356. package/packages/ragents/src/agents/catalog.ts +220 -0
  357. package/packages/ragents/src/agents/delivery.ts +187 -0
  358. package/packages/ragents/src/agents/live.ts +71 -0
  359. package/packages/ragents/src/agents/plugins.ts +130 -0
  360. package/packages/ragents/src/agents/scheduler.ts +1048 -0
  361. package/packages/ragents/src/agents/schemas.ts +64 -0
  362. package/packages/ragents/src/agents/tool-orientation.ts +12 -0
  363. package/packages/ragents/src/agents/tools.ts +709 -0
  364. package/packages/ragents/src/agents/toolset.ts +324 -0
  365. package/packages/ragents/src/agents/turn.ts +65 -0
  366. package/packages/ragents/src/agents/workspace-tools.ts +11 -0
  367. package/packages/ragents/src/agents/workspaces.ts +15 -0
  368. package/packages/ragents/src/domain/draft.ts +11 -0
  369. package/packages/ragents/src/domain/driver.ts +56 -0
  370. package/packages/ragents/src/domain/event-semantics.ts +668 -0
  371. package/packages/ragents/src/domain/event-validation.ts +620 -0
  372. package/packages/ragents/src/domain/events.ts +236 -0
  373. package/packages/ragents/src/domain/json-patch.ts +77 -0
  374. package/packages/ragents/src/domain/json.ts +86 -0
  375. package/packages/ragents/src/domain/model.ts +267 -0
  376. package/packages/ragents/src/domain/plugin-state.ts +33 -0
  377. package/packages/ragents/src/domain/portable-id.ts +9 -0
  378. package/packages/ragents/src/domain/projection.ts +506 -0
  379. package/packages/ragents/src/domain/schema-errors.ts +56 -0
  380. package/packages/ragents/src/domain/vocabulary.ts +37 -0
  381. package/packages/ragents/src/drivers/agent-runtime.ts +1503 -0
  382. package/packages/ragents/src/drivers/agent.ts +108 -0
  383. package/packages/ragents/src/drivers/attachments.ts +56 -0
  384. package/packages/ragents/src/drivers/skill-preload.ts +205 -0
  385. package/packages/ragents/src/drivers/types.ts +77 -0
  386. package/packages/ragents/src/http/contracts.ts +80 -0
  387. package/packages/ragents/src/http/methods.ts +150 -0
  388. package/packages/ragents/src/index.ts +161 -0
  389. package/packages/ragents/src/plugin-host.ts +1184 -0
  390. package/packages/ragents/src/plugin-types.ts +373 -0
  391. package/packages/ragents/src/rpc/contract.ts +76 -0
  392. package/packages/ragents/src/rpc/contribution.ts +67 -0
  393. package/packages/ragents/src/rpc/peer.ts +208 -0
  394. package/packages/ragents/src/rpc/protocol.ts +129 -0
  395. package/packages/ragents/src/runtime/artifacts.ts +95 -0
  396. package/packages/ragents/src/runtime/canonical-hash.ts +5 -0
  397. package/packages/ragents/src/runtime/canonical-json.ts +41 -0
  398. package/packages/ragents/src/runtime/command.ts +35 -0
  399. package/packages/ragents/src/runtime/decisions/actions.ts +77 -0
  400. package/packages/ragents/src/runtime/decisions/actors.ts +283 -0
  401. package/packages/ragents/src/runtime/decisions/artifacts.ts +28 -0
  402. package/packages/ragents/src/runtime/decisions/inputs.ts +79 -0
  403. package/packages/ragents/src/runtime/decisions/subscriptions.ts +135 -0
  404. package/packages/ragents/src/runtime/decisions/turns.ts +166 -0
  405. package/packages/ragents/src/runtime/domain-error.ts +10 -0
  406. package/packages/ragents/src/runtime/durable-fs.ts +13 -0
  407. package/packages/ragents/src/runtime/failures.ts +18 -0
  408. package/packages/ragents/src/runtime/guards.ts +196 -0
  409. package/packages/ragents/src/runtime/journal-storage.ts +228 -0
  410. package/packages/ragents/src/runtime/journal.ts +952 -0
  411. package/packages/ragents/src/runtime/orchestration.ts +711 -0
  412. package/packages/ragents/src/runtime/serial-queue.ts +13 -0
  413. package/packages/ragents/src/runtime/services.ts +15 -0
  414. package/packages/ragents/src/runtime/stop.ts +186 -0
  415. package/packages/ragents/src/script/driver.ts +18 -0
  416. package/packages/ragents/src/script/mediators.ts +386 -0
  417. package/packages/ragents/src/script/programs.ts +10 -0
  418. package/packages/ragents/src/script/std.ts +27 -0
  419. package/packages/ragents/src/script/types.ts +6 -0
  420. package/packages/ragents/src/typescript/async-compiler.ts +322 -0
  421. package/packages/ragents/src/typescript/build-contract.ts +14 -0
  422. package/packages/ragents/src/typescript/compiler-worker.ts +52 -0
  423. package/packages/ragents/src/typescript/compiler.ts +304 -0
  424. package/packages/ragents/src/typescript/index.ts +48 -0
  425. package/packages/ragents/src/typescript/native-executor.ts +40 -0
  426. package/packages/ragents/src/typescript/native-program.ts +5 -0
  427. package/packages/ragents/src/typescript/run-context.ts +199 -0
  428. package/packages/ragents/src/typescript/schema.ts +176 -0
  429. package/packages/ragents/src/typescript/snippet.ts +121 -0
  430. package/packages/workspace-executor/package.json +25 -0
  431. package/packages/workspace-executor/src/context.ts +123 -0
  432. package/packages/workspace-executor/src/executor.ts +134 -0
  433. package/packages/workspace-executor/src/git-config-environment.ts +10 -0
  434. package/packages/workspace-executor/src/index.ts +52 -0
  435. package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +59 -0
  436. package/packages/workspace-executor/src/language-server/adapters/index.ts +7 -0
  437. package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +54 -0
  438. package/packages/workspace-executor/src/language-server/adapters/typescript.ts +46 -0
  439. package/packages/workspace-executor/src/language-server/contract.ts +23 -0
  440. package/packages/workspace-executor/src/language-server/diagnostics.ts +62 -0
  441. package/packages/workspace-executor/src/language-server/host.ts +409 -0
  442. package/packages/workspace-executor/src/language-server/json-rpc.ts +103 -0
  443. package/packages/workspace-executor/src/language-server/roots.ts +29 -0
  444. package/packages/workspace-executor/src/language-server/session.ts +442 -0
  445. package/packages/workspace-executor/src/language-server/solution.ts +13 -0
  446. package/packages/workspace-executor/src/managed-process.ts +329 -0
  447. package/packages/workspace-executor/src/paths.ts +43 -0
  448. package/packages/workspace-executor/src/run-marker.ts +6 -0
  449. package/packages/workspace-executor/src/safe-environment.ts +47 -0
  450. package/packages/workspace-executor/src/sandbox-tools.ts +258 -0
  451. package/packages/workspace-executor/src/session-ident.ts +37 -0
  452. package/packages/workspace-executor/src/shell-platform.ts +11 -0
  453. package/packages/workspace-executor/src/tools.ts +28 -0
  454. package/plugins/package.json +8 -0
  455. package/plugins/ragents.activity/server/index.ts +9 -0
  456. package/plugins/ragents.activity/web/ActivityHeader.tsx +58 -0
  457. package/plugins/ragents.activity/web/activity.ts +144 -0
  458. package/plugins/ragents.activity/web/index.tsx +13 -0
  459. package/plugins/ragents.actor-programs/client-ui/DataTable.tsx +100 -0
  460. package/plugins/ragents.actor-programs/client-ui/FilePicker.tsx +65 -0
  461. package/plugins/ragents.actor-programs/client-ui/FlowDiagram.tsx +234 -0
  462. package/plugins/ragents.actor-programs/client-ui/FlowDiagramRenderer.tsx +85 -0
  463. package/plugins/ragents.actor-programs/client-ui/Form.tsx +126 -0
  464. package/plugins/ragents.actor-programs/client-ui/Layout.tsx +27 -0
  465. package/plugins/ragents.actor-programs/client-ui/MessageList.tsx +30 -0
  466. package/plugins/ragents.actor-programs/client-ui/Viewers.tsx +41 -0
  467. package/plugins/ragents.actor-programs/client-ui/WorkflowDiagram.tsx +14 -0
  468. package/plugins/ragents.actor-programs/client-ui/contracts.d.ts +84 -0
  469. package/plugins/ragents.actor-programs/client-ui/file-contracts.d.ts +19 -0
  470. package/plugins/ragents.actor-programs/client-ui/file-selection.ts +24 -0
  471. package/plugins/ragents.actor-programs/client-ui/flow-diagram-contracts.d.ts +27 -0
  472. package/plugins/ragents.actor-programs/client-ui/flow-diagram.css +23 -0
  473. package/plugins/ragents.actor-programs/client-ui/form-contracts.d.ts +38 -0
  474. package/plugins/ragents.actor-programs/client-ui/frame-layout.ts +4 -0
  475. package/plugins/ragents.actor-programs/client-ui/index.tsx +81 -0
  476. package/plugins/ragents.actor-programs/client-ui/layout-contracts.d.ts +33 -0
  477. package/plugins/ragents.actor-programs/client-ui/message-list-contracts.d.ts +33 -0
  478. package/plugins/ragents.actor-programs/client-ui/table-contracts.d.ts +35 -0
  479. package/plugins/ragents.actor-programs/client-ui/viewer-contracts.d.ts +37 -0
  480. package/plugins/ragents.actor-programs/client-ui/workflow-diagram-contracts.d.ts +10 -0
  481. package/plugins/ragents.actor-programs/contract.ts +180 -0
  482. package/plugins/ragents.actor-programs/parameter-types.ts +3 -0
  483. package/plugins/ragents.actor-programs/prompt.hbs +79 -0
  484. package/plugins/ragents.actor-programs/server/agent-tools.ts +31 -0
  485. package/plugins/ragents.actor-programs/server/app-project.ts +284 -0
  486. package/plugins/ragents.actor-programs/server/authoring-contracts.ts +10 -0
  487. package/plugins/ragents.actor-programs/server/client-compiler.ts +174 -0
  488. package/plugins/ragents.actor-programs/server/client-contracts.ts +187 -0
  489. package/plugins/ragents.actor-programs/server/client-runtime.ts +16 -0
  490. package/plugins/ragents.actor-programs/server/controls-template.ts +118 -0
  491. package/plugins/ragents.actor-programs/server/controls-tool.ts +48 -0
  492. package/plugins/ragents.actor-programs/server/index.ts +51 -0
  493. package/plugins/ragents.actor-programs/server/methods.ts +72 -0
  494. package/plugins/ragents.actor-programs/server/project-diagnostics.ts +138 -0
  495. package/plugins/ragents.actor-programs/server/prompts.ts +21 -0
  496. package/plugins/ragents.actor-programs/server/routes.ts +235 -0
  497. package/plugins/ragents.actor-programs/server/runtime-libraries.ts +4 -0
  498. package/plugins/ragents.actor-programs/server/runtime.ts +721 -0
  499. package/plugins/ragents.actor-programs/server/tailwind.ts +22 -0
  500. package/plugins/ragents.actor-programs/server/templates.ts +400 -0
  501. package/plugins/ragents.actor-programs/server/tool-contributor.ts +29 -0
  502. package/plugins/ragents.actor-programs/summary.hbs +17 -0
  503. package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +463 -0
  504. package/plugins/ragents.actor-programs/web/AppsPanel.tsx +436 -0
  505. package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +116 -0
  506. package/plugins/ragents.actor-programs/web/ExpandIcon.tsx +5 -0
  507. package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +31 -0
  508. package/plugins/ragents.actor-programs/web/FunctionForm.tsx +102 -0
  509. package/plugins/ragents.actor-programs/web/ProgramSource.tsx +81 -0
  510. package/plugins/ragents.actor-programs/web/api.ts +353 -0
  511. package/plugins/ragents.actor-programs/web/bridge.ts +122 -0
  512. package/plugins/ragents.actor-programs/web/chat-state.ts +37 -0
  513. package/plugins/ragents.actor-programs/web/context.ts +30 -0
  514. package/plugins/ragents.actor-programs/web/function-call.ts +28 -0
  515. package/plugins/ragents.actor-programs/web/function-input.ts +40 -0
  516. package/plugins/ragents.actor-programs/web/index.tsx +96 -0
  517. package/plugins/ragents.actor-programs/web/invocations.ts +43 -0
  518. package/plugins/ragents.actor-programs/web/program-state.ts +68 -0
  519. package/plugins/ragents.actor-programs/web/state-revision.ts +16 -0
  520. package/plugins/ragents.actor-programs/workflow/index.ts +202 -0
  521. package/plugins/ragents.actor-programs/workflow/prompt-reader.ts +15 -0
  522. package/plugins/ragents.ask/ask.hbs +4 -0
  523. package/plugins/ragents.ask/contract.ts +17 -0
  524. package/plugins/ragents.ask/server/answer-method.ts +15 -0
  525. package/plugins/ragents.ask/server/ask-service.ts +152 -0
  526. package/plugins/ragents.ask/server/ask-tool.ts +39 -0
  527. package/plugins/ragents.ask/server/contract.ts +22 -0
  528. package/plugins/ragents.ask/server/index.ts +26 -0
  529. package/plugins/ragents.ask/server/tool-contributor.ts +11 -0
  530. package/plugins/ragents.ask/web/QuestionSection.tsx +47 -0
  531. package/plugins/ragents.ask/web/api.ts +6 -0
  532. package/plugins/ragents.ask/web/constants.ts +1 -0
  533. package/plugins/ragents.ask/web/index.tsx +50 -0
  534. package/plugins/ragents.browser/provision.ts +48 -0
  535. package/plugins/ragents.browser/server/browser.ts +393 -0
  536. package/plugins/ragents.browser/server/contract.ts +36 -0
  537. package/plugins/ragents.browser/server/index.ts +35 -0
  538. package/plugins/ragents.browser/server/tools.ts +197 -0
  539. package/plugins/ragents.browser/skills/browser-testing/SKILL.md +36 -0
  540. package/plugins/ragents.documents/contract.ts +33 -0
  541. package/plugins/ragents.documents/prompt.hbs +18 -0
  542. package/plugins/ragents.documents/server/config.ts +14 -0
  543. package/plugins/ragents.documents/server/document-write-tool.ts +45 -0
  544. package/plugins/ragents.documents/server/files-route.ts +137 -0
  545. package/plugins/ragents.documents/server/index.ts +38 -0
  546. package/plugins/ragents.documents/server/show-document-tool.ts +73 -0
  547. package/plugins/ragents.documents/server/store.ts +35 -0
  548. package/plugins/ragents.documents/server/tool-contributor.ts +16 -0
  549. package/plugins/ragents.documents/web/DocumentViewer.tsx +450 -0
  550. package/plugins/ragents.documents/web/api.ts +8 -0
  551. package/plugins/ragents.documents/web/index.tsx +279 -0
  552. package/plugins/ragents.lsp-fsharp/provision.ts +74 -0
  553. package/plugins/ragents.lsp-fsharp/server/index.ts +16 -0
  554. package/plugins/ragents.lsp-fsharp/web/index.tsx +7 -0
  555. package/plugins/ragents.lsp-roslyn/provision.ts +54 -0
  556. package/plugins/ragents.lsp-roslyn/server/index.ts +15 -0
  557. package/plugins/ragents.lsp-roslyn/web/api.ts +10 -0
  558. package/plugins/ragents.lsp-roslyn/web/index.tsx +7 -0
  559. package/plugins/ragents.lsp-roslyn/web/language-server-plugin.tsx +236 -0
  560. package/plugins/ragents.lsp-typescript/server/index.ts +7 -0
  561. package/plugins/ragents.lsp-typescript/web/index.tsx +7 -0
  562. package/plugins/ragents.model-relay/server/config.ts +37 -0
  563. package/plugins/ragents.model-relay/server/index.ts +31 -0
  564. package/plugins/ragents.model-relay/server/relay.ts +213 -0
  565. package/plugins/ragents.orchestration/canvas.hbs +50 -0
  566. package/plugins/ragents.orchestration/contract.ts +322 -0
  567. package/plugins/ragents.orchestration/orchestration.hbs +105 -0
  568. package/plugins/ragents.orchestration/server/canvas-tool.ts +248 -0
  569. package/plugins/ragents.orchestration/server/index.ts +64 -0
  570. package/plugins/ragents.orchestration/server/run-stop-tool.ts +30 -0
  571. package/plugins/ragents.orchestration/tiled-layout.ts +47 -0
  572. package/plugins/ragents.orchestration/web/ActorCanvasControls.tsx +159 -0
  573. package/plugins/ragents.orchestration/web/ActorChat.tsx +56 -0
  574. package/plugins/ragents.orchestration/web/ActorChatControls.tsx +64 -0
  575. package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +36 -0
  576. package/plugins/ragents.orchestration/web/ActorNet.tsx +607 -0
  577. package/plugins/ragents.orchestration/web/ActorPopout.tsx +36 -0
  578. package/plugins/ragents.orchestration/web/ActorShortcut.tsx +76 -0
  579. package/plugins/ragents.orchestration/web/ActorTile.tsx +22 -0
  580. package/plugins/ragents.orchestration/web/CanvasStartup.tsx +14 -0
  581. package/plugins/ragents.orchestration/web/CanvasTiles.tsx +47 -0
  582. package/plugins/ragents.orchestration/web/CardSizeSettings.tsx +42 -0
  583. package/plugins/ragents.orchestration/web/Center.tsx +576 -0
  584. package/plugins/ragents.orchestration/web/DocumentsSection.tsx +37 -0
  585. package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +109 -0
  586. package/plugins/ragents.orchestration/web/FlowInspector.tsx +932 -0
  587. package/plugins/ragents.orchestration/web/JournalStatus.tsx +87 -0
  588. package/plugins/ragents.orchestration/web/MaterialBody.tsx +104 -0
  589. package/plugins/ragents.orchestration/web/ScriptActorCard.tsx +56 -0
  590. package/plugins/ragents.orchestration/web/StopRunButton.tsx +52 -0
  591. package/plugins/ragents.orchestration/web/TiledCanvas.tsx +281 -0
  592. package/plugins/ragents.orchestration/web/ZoomSettings.tsx +38 -0
  593. package/plugins/ragents.orchestration/web/actor-conversation.ts +64 -0
  594. package/plugins/ragents.orchestration/web/actor-header-settings.ts +41 -0
  595. package/plugins/ragents.orchestration/web/api.ts +33 -0
  596. package/plugins/ragents.orchestration/web/canvas-layout-storage.ts +39 -0
  597. package/plugins/ragents.orchestration/web/canvas-layout.ts +326 -0
  598. package/plugins/ragents.orchestration/web/canvas-scene.ts +311 -0
  599. package/plugins/ragents.orchestration/web/canvas-stage.ts +21 -0
  600. package/plugins/ragents.orchestration/web/canvas-startup.ts +36 -0
  601. package/plugins/ragents.orchestration/web/canvas-view-settings.ts +48 -0
  602. package/plugins/ragents.orchestration/web/card-size-settings.ts +36 -0
  603. package/plugins/ragents.orchestration/web/column/AddresseeControl.tsx +116 -0
  604. package/plugins/ragents.orchestration/web/column/ColumnSettings.tsx +50 -0
  605. package/plugins/ragents.orchestration/web/column/RunColumn.tsx +370 -0
  606. package/plugins/ragents.orchestration/web/column/column-actors.ts +38 -0
  607. package/plugins/ragents.orchestration/web/column/column-settings.ts +47 -0
  608. package/plugins/ragents.orchestration/web/column/column-state.ts +59 -0
  609. package/plugins/ragents.orchestration/web/column/sheet-status.ts +30 -0
  610. package/plugins/ragents.orchestration/web/constants.ts +10 -0
  611. package/plugins/ragents.orchestration/web/contract.ts +25 -0
  612. package/plugins/ragents.orchestration/web/executions.ts +124 -0
  613. package/plugins/ragents.orchestration/web/format.ts +4 -0
  614. package/plugins/ragents.orchestration/web/index.tsx +182 -0
  615. package/plugins/ragents.orchestration/web/keyboard-navigation.ts +55 -0
  616. package/plugins/ragents.orchestration/web/material-layout.ts +14 -0
  617. package/plugins/ragents.orchestration/web/run-view.ts +199 -0
  618. package/plugins/ragents.orchestration/web/tile-docking.ts +99 -0
  619. package/plugins/ragents.orchestration/web/tiled-view-settings.ts +76 -0
  620. package/plugins/ragents.orchestration/web/useCanvasMeasurements.ts +78 -0
  621. package/plugins/ragents.orchestration/web/zoom-settings.ts +28 -0
  622. package/plugins/ragents.overseer/contract.ts +165 -0
  623. package/plugins/ragents.overseer/server/api.ts +82 -0
  624. package/plugins/ragents.overseer/server/coordinator-prompt.ts +13 -0
  625. package/plugins/ragents.overseer/server/index.ts +71 -0
  626. package/plugins/ragents.overseer/server/orientation.ts +33 -0
  627. package/plugins/ragents.overseer/server/quick-answer.ts +54 -0
  628. package/plugins/ragents.overseer/server/reset-method.ts +5 -0
  629. package/plugins/ragents.overseer/server/run-directory.ts +49 -0
  630. package/plugins/ragents.overseer/server/settings-method.ts +8 -0
  631. package/plugins/ragents.overseer/server/settings.ts +83 -0
  632. package/plugins/ragents.overseer/server/user-location.ts +96 -0
  633. package/plugins/ragents.overseer/web/ModelSettings.tsx +70 -0
  634. package/plugins/ragents.overseer/web/chat-display.ts +10 -0
  635. package/plugins/ragents.overseer/web/index.tsx +208 -0
  636. package/plugins/ragents.overseer/web/model-settings.ts +61 -0
  637. package/plugins/ragents.overseer/web/quick-answers.ts +64 -0
  638. package/plugins/ragents.processes/contract.ts +61 -0
  639. package/plugins/ragents.processes/server/index.ts +36 -0
  640. package/plugins/ragents.processes/server/methods.ts +39 -0
  641. package/plugins/ragents.processes/server/observer.ts +179 -0
  642. package/plugins/ragents.processes/server/process-table.ts +395 -0
  643. package/plugins/ragents.processes/server/snapshot.ts +63 -0
  644. package/plugins/ragents.processes/server/terminator.ts +164 -0
  645. package/plugins/ragents.processes/web/ProcessHeader.tsx +157 -0
  646. package/plugins/ragents.processes/web/index.tsx +23 -0
  647. package/plugins/ragents.processes/web/processes.ts +75 -0
  648. package/plugins/ragents.product/model-settings-contract.ts +10 -0
  649. package/plugins/ragents.product/preamble.hbs +9 -0
  650. package/plugins/ragents.product/server/config.ts +73 -0
  651. package/plugins/ragents.product/server/index.ts +117 -0
  652. package/plugins/ragents.product/server/relay.ts +118 -0
  653. package/plugins/ragents.product/server/runtime.ts +30 -0
  654. package/plugins/ragents.product/web/ModelControl.tsx +81 -0
  655. package/plugins/ragents.product/web/ProductModelSettings.tsx +131 -0
  656. package/plugins/ragents.product/web/SystemPromptControl.tsx +136 -0
  657. package/plugins/ragents.product/web/index.tsx +29 -0
  658. package/plugins/ragents.product/web/model-settings.ts +39 -0
  659. package/plugins/ragents.product/web/start-options.tsx +12 -0
  660. package/plugins/ragents.profile-distribution/contract.ts +38 -0
  661. package/plugins/ragents.profile-distribution/server/archive.ts +159 -0
  662. package/plugins/ragents.profile-distribution/server/config.ts +27 -0
  663. package/plugins/ragents.profile-distribution/server/index.ts +93 -0
  664. package/plugins/ragents.profile-distribution/server/web.ts +48 -0
  665. package/plugins/ragents.reference/examples.ts +33 -0
  666. package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +27 -0
  667. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +10 -0
  668. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +80 -0
  669. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +82 -0
  670. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +154 -0
  671. package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +9 -0
  672. package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +32 -0
  673. package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +59 -0
  674. package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +14 -0
  675. package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +9 -0
  676. package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +87 -0
  677. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +26 -0
  678. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +32 -0
  679. package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +24 -0
  680. package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +10 -0
  681. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -0
  682. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +5 -0
  683. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -0
  684. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +27 -0
  685. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +127 -0
  686. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/state.ts +38 -0
  687. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +42 -0
  688. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +38 -0
  689. package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +223 -0
  690. package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +12 -0
  691. package/plugins/ragents.reference/run-scripts/moderated-round/package.json +9 -0
  692. package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +60 -0
  693. package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +26 -0
  694. package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +24 -0
  695. package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +18 -0
  696. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +16 -0
  697. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +39 -0
  698. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +15 -0
  699. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/server.ts +14 -0
  700. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +13 -0
  701. package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +9 -0
  702. package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +65 -0
  703. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +26 -0
  704. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +42 -0
  705. package/plugins/ragents.reference/run-scripts/word-game/RUN.md +25 -0
  706. package/plugins/ragents.reference/run-scripts/word-game/package.json +11 -0
  707. package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +27 -0
  708. package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +23 -0
  709. package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +106 -0
  710. package/plugins/ragents.reference/run-scripts/word-game/src/state.ts +22 -0
  711. package/plugins/ragents.reference/run-scripts/word-game/src/view.tsx +54 -0
  712. package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +253 -0
  713. package/plugins/ragents.reference/server/index.ts +12 -0
  714. package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +12 -0
  715. package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +12 -0
  716. package/plugins/ragents.reference/skills/120-canvas-conversation-circle/SKILL.md +12 -0
  717. package/plugins/ragents.reference/skills/130-canvas-pipeline-with-approval/SKILL.md +12 -0
  718. package/plugins/ragents.reference/skills/140-canvas-team-tree-and-topic-grid/SKILL.md +12 -0
  719. package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +12 -0
  720. package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +12 -0
  721. package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +12 -0
  722. package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +12 -0
  723. package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +12 -0
  724. package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +12 -0
  725. package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +12 -0
  726. package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +12 -0
  727. package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +12 -0
  728. package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +12 -0
  729. package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +12 -0
  730. package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +12 -0
  731. package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +12 -0
  732. package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +12 -0
  733. package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +12 -0
  734. package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +12 -0
  735. package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +12 -0
  736. package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +12 -0
  737. package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +12 -0
  738. package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +12 -0
  739. package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +12 -0
  740. package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +12 -0
  741. package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +12 -0
  742. package/plugins/ragents.reference/skills/decision-brief/SKILL.md +33 -0
  743. package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +33 -0
  744. package/plugins/ragents.reference/walkthroughs.ts +219 -0
  745. package/plugins/ragents.reference/web/StartGuides.tsx +89 -0
  746. package/plugins/ragents.reference/web/index.tsx +10 -0
  747. package/plugins/ragents.todo/contract.ts +60 -0
  748. package/plugins/ragents.todo/server/index.ts +10 -0
  749. package/plugins/ragents.todo/server/todo-tool.ts +70 -0
  750. package/plugins/ragents.todo/server/tool-contributor.ts +9 -0
  751. package/plugins/ragents.todo/web/TodoSection.tsx +47 -0
  752. package/plugins/ragents.todo/web/index.ts +12 -0
  753. package/plugins/ragents.transcript/server/index.ts +20 -0
  754. package/plugins/ragents.transcript/server/transcript.ts +78 -0
  755. package/plugins/ragents.watch/contract.ts +48 -0
  756. package/plugins/ragents.watch/server/condition.ts +56 -0
  757. package/plugins/ragents.watch/server/contract.ts +4 -0
  758. package/plugins/ragents.watch/server/functions.ts +62 -0
  759. package/plugins/ragents.watch/server/index.ts +39 -0
  760. package/plugins/ragents.watch/server/observation.ts +69 -0
  761. package/plugins/ragents.watch/server/service.ts +294 -0
  762. package/plugins/ragents.workspace/client/transport.ts +13 -0
  763. package/plugins/ragents.workspace/client/workspace-client.ts +247 -0
  764. package/plugins/ragents.workspace/contract.ts +182 -0
  765. package/plugins/ragents.workspace/prompt.hbs +14 -0
  766. package/plugins/ragents.workspace/server/binding.ts +92 -0
  767. package/plugins/ragents.workspace/server/browse-route.ts +134 -0
  768. package/plugins/ragents.workspace/server/clients.ts +161 -0
  769. package/plugins/ragents.workspace/server/index.ts +91 -0
  770. package/plugins/ragents.workspace/server/runtime.ts +170 -0
  771. package/plugins/ragents.workspace/web/FileBrowser.tsx +271 -0
  772. package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +216 -0
  773. package/plugins/ragents.workspace/web/api.ts +8 -0
  774. package/plugins/ragents.workspace/web/file-icons.tsx +94 -0
  775. package/plugins/ragents.workspace/web/index.tsx +37 -0
  776. package/ragents.config.core.ts +65 -0
  777. package/ragents.config.developer.ts +46 -0
  778. package/scripts/agent/agent-cli.ts +461 -0
  779. package/scripts/agent/journal.ts +125 -0
  780. package/scripts/package/build-package.ts +249 -0
  781. package/scripts/package/host-links.d.mts +1 -0
  782. package/scripts/package/host-links.mjs +39 -0
  783. package/scripts/package/publish-package.ts +129 -0
  784. package/scripts/package/ragents.mjs +59 -0
  785. package/scripts/provision/run-provision.ts +72 -0
  786. package/scripts/remote/connect.ts +265 -0
  787. package/scripts/remote/start.ts +91 -0
  788. package/scripts/workspace-client/run-workspace-client.ts +112 -0
@@ -0,0 +1,322 @@
1
+ import { canvasTileNodeOf } from "./tiled-layout.js";
2
+
3
+ export const ORCHESTRATION_PLUGIN_ID = "ragents.orchestration";
4
+
5
+ export const CANVAS_GROUP_KINDS = ["h", "v", "wrap-h", "wrap-v", "grid", "circle", "tree"] as const;
6
+ export type CanvasGroupKind = typeof CANVAS_GROUP_KINDS[number];
7
+
8
+ export const CANVAS_TREE_DIRECTIONS = ["right", "down"] as const;
9
+ export type CanvasTreeDirection = typeof CANVAS_TREE_DIRECTIONS[number];
10
+
11
+ export const CANVAS_SHAPE_KINDS = ["circle", "diamond"] as const;
12
+ export type CanvasShapeKind = typeof CANVAS_SHAPE_KINDS[number];
13
+
14
+ export const CANVAS_ARROWS = ["none", "end", "both"] as const;
15
+ export type CanvasArrow = typeof CANVAS_ARROWS[number];
16
+
17
+ export const CANVAS_LINE_STYLES = ["solid", "dashed"] as const;
18
+ export type CanvasLineStyle = typeof CANVAS_LINE_STYLES[number];
19
+
20
+ /** Default sizes of the shapes in px; a circle is measured by its diameter, a diamond by its width. */
21
+ export const CANVAS_SHAPE_DEFAULT_SIZE: Record<CanvasShapeKind, number> = { circle: 120, diamond: 150 };
22
+ const DIAMOND_ASPECT = 0.62;
23
+
24
+ export type CanvasEntity =
25
+ | { kind: "actor"; handle: string }
26
+ | { kind: "shape"; id: string }
27
+ | { kind: "app"; id: string };
28
+
29
+ type CanvasGroupBase = {
30
+ id: string;
31
+ parent?: string;
32
+ label?: string;
33
+ gap?: number;
34
+ frame: boolean;
35
+ };
36
+
37
+ /** The model sends one flat object per node; internally each group kind carries exactly its own parameters. */
38
+ export type CanvasGroupNode =
39
+ | (CanvasGroupBase & { group: "h" | "v" | "circle" })
40
+ | (CanvasGroupBase & { group: "wrap-h"; width: number })
41
+ | (CanvasGroupBase & { group: "wrap-v"; height: number })
42
+ | (CanvasGroupBase & { group: "grid"; columns: number })
43
+ | (CanvasGroupBase & { group: "tree"; root: string; direction: CanvasTreeDirection });
44
+
45
+ export type CanvasItemNode = {
46
+ entity: string;
47
+ parent?: string;
48
+ chatInput?: boolean;
49
+ };
50
+
51
+ export type CanvasLayoutNode = CanvasGroupNode | CanvasItemNode;
52
+
53
+ export type CanvasShape = {
54
+ id: string;
55
+ kind: CanvasShapeKind;
56
+ text: string;
57
+ size: number;
58
+ };
59
+
60
+ export type CanvasLine = {
61
+ from: string;
62
+ to: string;
63
+ label?: string;
64
+ arrow: CanvasArrow;
65
+ style: CanvasLineStyle;
66
+ };
67
+
68
+ export type CanvasTileNode =
69
+ | { entity: string }
70
+ | { direction: "horizontal" | "vertical"; weights: [number, number]; children: [CanvasTileNode, CanvasTileNode] };
71
+
72
+ export type CanvasLayout = {
73
+ mode?: "free" | "tiled";
74
+ root?: CanvasTileNode | null;
75
+ nodes: CanvasLayoutNode[];
76
+ shapes: CanvasShape[];
77
+ lines: CanvasLine[];
78
+ };
79
+
80
+ export const isCanvasGroupNode = (node: CanvasLayoutNode): node is CanvasGroupNode => "group" in node;
81
+
82
+ const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null && !Array.isArray(value);
83
+
84
+ const isAbsent = (value: unknown) => value === undefined || value === null;
85
+
86
+ const normalizedHandle = (value: string) => value.trim().replace(/^@/, "").toLowerCase();
87
+
88
+ export const canvasEntityOf = (text: string): CanvasEntity => {
89
+ const trimmed = text.trim();
90
+ if (trimmed.startsWith("@")) {
91
+ const handle = normalizedHandle(trimmed);
92
+ if (!handle || /\s/.test(handle)) throw new Error(`Entität ${JSON.stringify(text)}: nach dem @ fehlt ein Handle`);
93
+ return { kind: "actor", handle };
94
+ }
95
+ const match = /^(shape|app):(.+)$/s.exec(trimmed);
96
+ if (!match) {
97
+ throw new Error(`Entität ${JSON.stringify(text)}: erwartet @handle, shape:<id> oder app:<id>`);
98
+ }
99
+ const id = match[2].trim();
100
+ if (!id) throw new Error(`Entität ${JSON.stringify(text)}: die ID nach dem Doppelpunkt ist leer`);
101
+ return match[1] === "shape" ? { kind: "shape", id } : { kind: "app", id };
102
+ };
103
+
104
+ export const canvasEntityKey = (entity: CanvasEntity): string =>
105
+ entity.kind === "actor" ? `@${entity.handle}` : `${entity.kind}:${entity.id}`;
106
+
107
+ export const canvasShapeSize = (shape: CanvasShape): { width: number; height: number } =>
108
+ shape.kind === "circle"
109
+ ? { width: shape.size, height: shape.size }
110
+ : { width: shape.size, height: Math.round(shape.size * DIAMOND_ASPECT) };
111
+
112
+ const oneOf = <T extends string>(allowed: readonly T[], value: unknown, where: string): T => {
113
+ if (typeof value !== "string" || !allowed.includes(value as T)) {
114
+ throw new Error(`${where}: ${JSON.stringify(value)} ist unbekannt, erlaubt sind ${allowed.join(", ")}`);
115
+ }
116
+ return value as T;
117
+ };
118
+
119
+ const optionalText = (value: unknown, where: string): string | undefined => {
120
+ if (isAbsent(value)) return undefined;
121
+ if (typeof value !== "string") throw new Error(`${where} muss ein Text sein`);
122
+ return value.trim() || undefined;
123
+ };
124
+
125
+ const requiredText = (value: unknown, where: string): string => {
126
+ if (typeof value !== "string" || !value.trim()) throw new Error(`${where} fehlt oder ist leer`);
127
+ return value.trim();
128
+ };
129
+
130
+ const positiveNumber = (value: unknown, where: string): number => {
131
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) throw new Error(`${where} muss eine positive Zahl sein`);
132
+ return value;
133
+ };
134
+
135
+ const optionalGap = (value: unknown, where: string): number | undefined => {
136
+ if (isAbsent(value)) return undefined;
137
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) throw new Error(`${where} darf nicht negativ sein`);
138
+ return value;
139
+ };
140
+
141
+ const withoutUndefined = <T extends object>(value: T): T =>
142
+ Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;
143
+
144
+ const GROUP_PARAMETERS: Record<CanvasGroupKind, readonly string[]> = {
145
+ "h": [],
146
+ "v": [],
147
+ "circle": [],
148
+ "wrap-h": ["width"],
149
+ "wrap-v": ["height"],
150
+ "grid": ["columns"],
151
+ "tree": ["direction", "root"],
152
+ };
153
+
154
+ const groupNodeOf = (value: Record<string, unknown>, index: number): CanvasGroupNode => {
155
+ const where = `nodes[${index}]`;
156
+ const group = oneOf(CANVAS_GROUP_KINDS, value.group, `${where}.group`);
157
+ const id = requiredText(value.id, `${where}.id (jede Gruppe braucht eine ID)`);
158
+ if (!isAbsent(value.entity)) {
159
+ throw new Error(`${where}: Gruppe ${id} darf kein entity tragen; Elemente sind eigene Knoten mit parent ${JSON.stringify(id)}`);
160
+ }
161
+ for (const parameter of ["width", "height", "columns", "direction", "root"]) {
162
+ if (!isAbsent(value[parameter]) && !GROUP_PARAMETERS[group].includes(parameter)) {
163
+ throw new Error(`${where}: Gruppe ${id} (${group}) kennt keinen Parameter ${parameter}`
164
+ + (parameter === "width" ? "; für Umbruch wrap-h nehmen" : parameter === "height" ? "; für Umbruch wrap-v nehmen" : ""));
165
+ }
166
+ }
167
+ if (!isAbsent(value.frame) && typeof value.frame !== "boolean") throw new Error(`${where}.frame muss true oder false sein`);
168
+ const base: CanvasGroupBase = withoutUndefined({
169
+ id,
170
+ parent: optionalText(value.parent, `${where}.parent`),
171
+ label: optionalText(value.label, `${where}.label`),
172
+ gap: optionalGap(value.gap, `${where}.gap`),
173
+ frame: value.frame === true,
174
+ });
175
+ switch (group) {
176
+ case "h":
177
+ case "v":
178
+ case "circle":
179
+ return { ...base, group };
180
+ case "wrap-h":
181
+ return { ...base, group, width: positiveNumber(value.width, `${where}.width (wrap-h braucht die Zeilenbreite)`) };
182
+ case "wrap-v":
183
+ return { ...base, group, height: positiveNumber(value.height, `${where}.height (wrap-v braucht die Spaltenhöhe)`) };
184
+ case "grid": {
185
+ const columns = value.columns;
186
+ if (typeof columns !== "number" || !Number.isInteger(columns) || columns < 1) {
187
+ throw new Error(`${where}.columns (grid braucht eine ganze Spaltenzahl ab 1)`);
188
+ }
189
+ return { ...base, group, columns };
190
+ }
191
+ case "tree": {
192
+ const entity = canvasEntityOf(requiredText(value.root, `${where}.root (tree braucht den @handle des Wurzel-Actors)`));
193
+ if (entity.kind !== "actor") throw new Error(`${where}.root: die Wurzel eines Baums ist ein Actor (@handle)`);
194
+ return {
195
+ ...base,
196
+ group,
197
+ root: canvasEntityKey(entity),
198
+ direction: isAbsent(value.direction) ? "right" : oneOf(CANVAS_TREE_DIRECTIONS, value.direction, `${where}.direction`),
199
+ };
200
+ }
201
+ }
202
+ };
203
+
204
+ const itemNodeOf = (value: Record<string, unknown>, index: number): CanvasItemNode => {
205
+ const where = `nodes[${index}]`;
206
+ if (typeof value.entity !== "string") {
207
+ throw new Error(`${where}: ein Knoten ist entweder eine Gruppe (group + id) oder ein Element (entity)`);
208
+ }
209
+ const entity = canvasEntityOf(value.entity);
210
+ if (value.chatInput !== undefined && (entity.kind !== "actor" || typeof value.chatInput !== "boolean")) {
211
+ throw new Error(`${where}.chatInput ist nur für Actors als Wahrheitswert erlaubt`);
212
+ }
213
+ return withoutUndefined({
214
+ entity: canvasEntityKey(entity),
215
+ parent: optionalText(value.parent, `${where}.parent`),
216
+ chatInput: value.chatInput as boolean | undefined,
217
+ });
218
+ };
219
+
220
+ const shapeOf = (value: unknown, index: number): CanvasShape => {
221
+ const where = `shapes[${index}]`;
222
+ if (!isRecord(value)) throw new Error(`${where} muss ein Objekt sein`);
223
+ const kind = oneOf(CANVAS_SHAPE_KINDS, value.kind, `${where}.kind`);
224
+ return {
225
+ id: requiredText(value.id, `${where}.id`),
226
+ kind,
227
+ text: requiredText(value.text, `${where}.text (jede Form trägt einen Text)`),
228
+ size: isAbsent(value.size) ? CANVAS_SHAPE_DEFAULT_SIZE[kind] : positiveNumber(value.size, `${where}.size`),
229
+ };
230
+ };
231
+
232
+ const lineOf = (value: unknown, index: number): CanvasLine => {
233
+ const where = `lines[${index}]`;
234
+ if (!isRecord(value)) throw new Error(`${where} muss ein Objekt sein`);
235
+ const from = canvasEntityKey(canvasEntityOf(requiredText(value.from, `${where}.from`)));
236
+ const to = canvasEntityKey(canvasEntityOf(requiredText(value.to, `${where}.to`)));
237
+ if (from === to) throw new Error(`${where}: eine Linie führt von einer Entität zu einer ANDEREN, nicht von ${from} zu sich selbst`);
238
+ return withoutUndefined({
239
+ from,
240
+ to,
241
+ label: optionalText(value.label, `${where}.label`),
242
+ arrow: isAbsent(value.arrow) ? "none" : oneOf(CANVAS_ARROWS, value.arrow, `${where}.arrow`),
243
+ style: isAbsent(value.style) ? "solid" : oneOf(CANVAS_LINE_STYLES, value.style, `${where}.style`),
244
+ });
245
+ };
246
+
247
+ const assertNoCycle = (groups: Map<string, CanvasGroupNode>) => {
248
+ for (const start of groups.values()) {
249
+ const seen = new Set<string>([start.id]);
250
+ let current = start;
251
+ while (current.parent) {
252
+ const next = groups.get(current.parent);
253
+ if (!next) throw new Error(`Gruppe ${current.id}: parent ${JSON.stringify(current.parent)} ist keine bekannte Gruppe`);
254
+ if (seen.has(next.id)) throw new Error(`Gruppe ${start.id} liegt über parent in sich selbst`);
255
+ seen.add(next.id);
256
+ current = next;
257
+ }
258
+ }
259
+ };
260
+
261
+ /** Parses and validates a canvas layout; throws a German error naming the first violation. */
262
+ export const canvasLayoutOf = (value: unknown): CanvasLayout => {
263
+ if (!isRecord(value)) throw new Error("Das Layout muss ein Objekt mit nodes, shapes und lines sein");
264
+ if (!Array.isArray(value.nodes)) throw new Error("nodes fehlt oder ist keine Liste");
265
+ const rawShapes = value.shapes ?? [];
266
+ const rawLines = value.lines ?? [];
267
+ if (!Array.isArray(rawShapes)) throw new Error("shapes muss eine Liste sein");
268
+ if (!Array.isArray(rawLines)) throw new Error("lines muss eine Liste sein");
269
+
270
+ const nodes = value.nodes.map((entry, index): CanvasLayoutNode => {
271
+ if (!isRecord(entry)) throw new Error(`nodes[${index}] muss ein Objekt sein`);
272
+ if (!isAbsent(entry.group) && entry.chatInput !== undefined) throw new Error(`nodes[${index}].chatInput ist nur für Actors erlaubt`);
273
+ return isAbsent(entry.group) ? itemNodeOf(entry, index) : groupNodeOf(entry, index);
274
+ });
275
+ const shapes = rawShapes.map(shapeOf);
276
+ const lines = rawLines.map(lineOf);
277
+
278
+ const groups = new Map<string, CanvasGroupNode>();
279
+ for (const node of nodes.filter(isCanvasGroupNode)) {
280
+ if (groups.has(node.id)) throw new Error(`Gruppen-ID ${JSON.stringify(node.id)} kommt mehrfach vor`);
281
+ groups.set(node.id, node);
282
+ }
283
+ assertNoCycle(groups);
284
+ for (const node of nodes) {
285
+ if (!node.parent) continue;
286
+ const parent = groups.get(node.parent);
287
+ if (!parent) throw new Error(`parent ${JSON.stringify(node.parent)} ist keine bekannte Gruppe`);
288
+ if (parent.group === "tree") {
289
+ throw new Error(`Gruppe ${parent.id} ist ein Baum und füllt sich aus der Abstammung von ${parent.root}; sie nimmt keine eigenen Kinder auf`);
290
+ }
291
+ }
292
+
293
+ const shapeIds = new Set<string>();
294
+ for (const shape of shapes) {
295
+ if (shapeIds.has(shape.id)) throw new Error(`Form-ID ${JSON.stringify(shape.id)} kommt mehrfach vor`);
296
+ shapeIds.add(shape.id);
297
+ }
298
+ const placed = new Set<string>();
299
+ for (const node of nodes) {
300
+ if (isCanvasGroupNode(node)) continue;
301
+ if (placed.has(node.entity)) throw new Error(`${node.entity} ist mehr als einmal platziert`);
302
+ placed.add(node.entity);
303
+ }
304
+ const assertKnownShape = (reference: string, where: string) => {
305
+ const entity = canvasEntityOf(reference);
306
+ if (entity.kind === "shape" && !shapeIds.has(entity.id)) {
307
+ throw new Error(`${where}: Form ${JSON.stringify(entity.id)} ist nicht in shapes definiert`);
308
+ }
309
+ };
310
+ for (const reference of placed) assertKnownShape(reference, "nodes");
311
+ for (const shape of shapes) {
312
+ if (!placed.has(`shape:${shape.id}`)) throw new Error(`Form ${JSON.stringify(shape.id)} ist nirgends platziert; jede Form braucht einen Knoten mit entity shape:${shape.id}`);
313
+ }
314
+ lines.forEach((line, index) => {
315
+ assertKnownShape(line.from, `lines[${index}].from`);
316
+ assertKnownShape(line.to, `lines[${index}].to`);
317
+ });
318
+
319
+ const mode = value.mode === undefined ? undefined : oneOf(["free", "tiled"] as const, value.mode, "mode");
320
+ const root = value.root === undefined ? undefined : value.root === null ? null : canvasTileNodeOf(value.root);
321
+ return withoutUndefined({ nodes, shapes, lines, mode, root });
322
+ };
@@ -0,0 +1,105 @@
1
+ # Orchestration through TypeScript
2
+
3
+ You coordinate this conversation and carry out the user's requested work. The user describes
4
+ an outcome; discover the available functions and choose the implementation yourself. A task
5
+ or skill start prompt need not prescribe actors, subscriptions, packages or a technical workflow.
6
+
7
+ ## The shared API
8
+
9
+ Use `typescript_api` to discover the available functions and obtain their exact input and
10
+ result types. Use `typescript_eval` to run a small TypeScript snippet: `code` is the body of an
11
+ async function with `context` and an optional `return`; `path` executes an existing source file
12
+ through the same path. Call registered functions as `context.functions.<name>(input)`.
13
+ Keep dependent calls and returned references together in code. Do not retype IDs or infer
14
+ result shapes from event names. Type errors identify a disagreement with the contract; fix
15
+ the assumption instead of hiding it with `any` or a double assertion.
16
+
17
+ A snippet can inspect data, call extension functions, create participants and arrange a run.
18
+ It needs no actor package, persistent setup actor or invented tests. Local variables end with
19
+ that execution. Use an actor program when later messages, events, persistent state or a view
20
+ are needed. Snippets and actor programs use the same registered functions and contracts.
21
+ Use the registered file functions for editing sources; Bash uses `$RAGENTS_ACTORS_DIR` instead
22
+ of copied physical paths.
23
+
24
+ A snippet acts as its caller. A TypeScript actor's `onInput` acts as that actor. An actor
25
+ function owns its actor's state but invokes run functions as its caller: calling another
26
+ actor's function does not become that actor. In particular, `event_subscribe` subscribes the
27
+ acting caller. To let a persistent actor receive later events, arrange its subscription in
28
+ its own `onInput`; send it an ordinary input to begin that work.
29
+
30
+ Already completed function calls are not rolled back if a later call fails. Before retrying,
31
+ inspect the existing actors, programs and subscriptions and resume the missing work. A failed
32
+ snippet is not evidence that its earlier operations had no effect.
33
+
34
+ ## Actors and messages
35
+
36
+ A run contains actors, inputs, turns, events, subscriptions and artifacts. Actors are the user,
37
+ LLM agents or TypeScript actors. `actor_input` delivers ordinary text and explicitly attached
38
+ artifacts. The recipient does not receive your context.
39
+ Only LLM agents interpret arbitrary natural-language tasks. A TypeScript actor executes its
40
+ programmed input protocol; inspect its program or documented functions before addressing it.
41
+ Prefer its published functions for actions. A primary actor can be a TypeScript program;
42
+ primary does not mean conversational. Enqueueing confirms delivery to the queue, not processing
43
+ or task completion. Unknown program commands must fail explicitly instead of returning silently.
44
+
45
+ Use `actor_list` before creating participants. A prepared run or another actor may already
46
+ have created the required roles. Reuse suitable active actors even when they are not your
47
+ children. Reusing a name in `agent_spawn` creates another actor with a suffix; it does not
48
+ select the existing one. Inspect an unclear role before deciding to create another.
49
+
50
+ Do the work yourself unless a separate role, context or independent task has a concrete
51
+ benefit, or the user requests participants. Multiple files, languages or steps alone do not
52
+ require more actors. Pure deterministic forwarding and persistent bookkeeping belong in
53
+ TypeScript; `context.std.mediators.route` supports existing routing patterns. Use model
54
+ judgment where the task needs it, not for unchanged message forwarding.
55
+
56
+ Read `model_list` before the first spawn and select an actual profile or model from its
57
+ result. A new agent does not inherit your model. Pass its profile or model explicitly and
58
+ choose `tools` explicitly: `[]` for plain conversation, a named function selection for a
59
+ bounded task, or `null` for the full available function inventory. Tools are not a role label:
60
+ a critic who must inspect files needs the corresponding access; a plain advisor may need none.
61
+ Agents inherit the engine capabilities you may pass on. Use `withoutCapabilities` only when
62
+ an ability must deliberately be absent from a whole subtree.
63
+
64
+ `agent_spawn` creates an idle actor. Its prompt describes the lasting role and output rules;
65
+ its concrete assignment is an `actor_input`. Prepare participants, required programs, views
66
+ and subscriptions before sending the first assignments. Subscribe to a needed reply before
67
+ requesting it. Never assume a failed creation produced an actor.
68
+
69
+ ## Events and turn boundaries
70
+
71
+ Ordinary model output, reasoning and function calls are journaled automatically. A subscription
72
+ observes matching new events and delivers each as a later ActorInput to its subscriber.
73
+ Inputs arriving during a turn wait for the next turn. A consumed input is not automatically
74
+ repeated after interruption. An actor program receives the structured source in `input.event`;
75
+ the event's `type` belongs to the event itself, not its payload.
76
+
77
+ Once subscriptions and assignments are in place, end the turn. Do not poll `event_query`, run
78
+ sleep loops or keep a snippet alive waiting for future model answers. A new matching input
79
+ starts the next turn. Use `event_query` for intentional history inspection or recovery, with
80
+ focused filters and a small limit. `event_subscription_list` lists subscriptions;
81
+ `event_unsubscribe` removes those no longer needed.
82
+
83
+ Subscribe to `model.output.completed` for answer text, or `turn.finished` when completion
84
+ status is sufficient. Subscribe to failures, interruption and stops only where the flow
85
+ needs an independent reaction. Combining answer and finish events routinely produces two
86
+ inputs for one result; when both are necessary, correlate by turn and act only once.
87
+ Keep `includeSelf` off unless an intentional self-trigger requires it.
88
+
89
+ LLM event inputs show a readable header and text, plus active subscription information.
90
+ TypeScript programs receive structured events. An actor remains addressable after a turn;
91
+ `actor_stop` stops it and the actors it spawned.
92
+ The primary actor can use `run_stop` to stop all work in its own run, including tools and plugin services. Use it immediately when the user requests a complete stop. It also interrupts the calling turn; no final reply is required. The conversation and files remain available.
93
+
94
+ ## Results for the user
95
+
96
+ Verify the actual outcome against the user's requirements. A successful typecheck or tests
97
+ written alongside the implementation do not prove the requested behavior. Keep meaningful
98
+ checks of output, state and effects; fix implementation errors rather than changing an
99
+ expectation merely to obtain a passing test.
100
+
101
+ Your model answer is already the user chat. Report concrete results and meaningful phase
102
+ changes; do not add a filler waiting message after assigning work. State only what happened,
103
+ never describe an unperformed step as done. Respect prescribed output formats. Use meaningful
104
+ actor names and keep the run's task list current when useful. Technical IDs and environment
105
+ variables belong in code, not in explanations to the user.
@@ -0,0 +1,248 @@
1
+ import { Type } from "typebox";
2
+ import {
3
+ DomainError,
4
+ defineRunFunction,
5
+ defineToolAvailability,
6
+ eventResultSchema,
7
+ holdsUsable,
8
+ type RunFunction,
9
+ type RunView,
10
+ type ToolContributor,
11
+ } from "@aicontainer/ragents";
12
+ import { toolDescriptorFrom } from "@aicontainer/server/plugin-support/agent-tool.js";
13
+ import { ACTOR_PROGRAMS_STATE_ID, resolveActorView, type ActorProgramState } from "@aicontainer/plugins/ragents.actor-programs/contract.js";
14
+ import {
15
+ CANVAS_ARROWS,
16
+ CANVAS_GROUP_KINDS,
17
+ CANVAS_LINE_STYLES,
18
+ CANVAS_SHAPE_KINDS,
19
+ CANVAS_TREE_DIRECTIONS,
20
+ ORCHESTRATION_PLUGIN_ID,
21
+ canvasEntityOf,
22
+ canvasLayoutOf,
23
+ isCanvasGroupNode,
24
+ type CanvasLayout,
25
+ } from "../contract.js";
26
+ import { canvasTileEntities, mapCanvasTileEntities } from "../tiled-layout.js";
27
+
28
+ const ENTITY = "@handle names an actor, shape:<id> one of the shapes of this call, "
29
+ + "app:@handle/view-key or app:program-name/view-key an activated actor view. "
30
+ + "Use the actor handle or program name and view key you chose; the server resolves the view ID";
31
+
32
+ export const canvasToolMetadata = {
33
+ name: "canvas_layout_replace",
34
+ label: "Replace Canvas Layout",
35
+ description: "Arrange actors and mini-apps on the free canvas or in a viewport-filling tiled layout with nested, weighted splits.",
36
+ longDescription: "Free mode is the default. Set mode: 'tiled' and root to a recursive tree: "
37
+ + "{entity:'@helper'} or {direction:'horizontal',weights:[2,1],children:[{entity:'app:@workspace/main'},{entity:'@helper'}]}. "
38
+ + "horizontal means left/right; vertical means top/bottom. Weights [1,1] split equally. "
39
+ + "Every split has two children, which may themselves be splits. Tiled mode has draggable dividers and no canvas pan or zoom. "
40
+ + "Mode/root-only calls preserve the free layout; mode:'free' restores it. Personal user arrangements take precedence until reset. "
41
+ + "In free mode the canvas draws NO lines by itself; "
42
+ + "a relation is visible only when you add a line here. Actors you do not place appear below your "
43
+ + "layout as lineage trees. Approximate sizes in px for planning wrap widths: an actor card is 150 to "
44
+ + "320 wide and 44 high without card sections, with sections (documents, to-dos, tools) 360 to 640 wide "
45
+ + "and 100 to 300 high; an actor view uses its declared canvas placement (280 to 960 by 180 to 720); "
46
+ + "a circle shape is 120 wide, a diamond 150 by 94 by default.",
47
+ } as const;
48
+
49
+ export const canDesignCanvas = defineToolAvailability({
50
+ availability: "conditional",
51
+ availabilityDetail: "Nur für Agenten und Script-Actors mit der Capability plugin.state.write.",
52
+ requiredCapabilities: ["plugin.state.write"],
53
+ }, (actor) => actor.kind !== "human" && holdsUsable(actor, "plugin.state.write"));
54
+
55
+ const literals = <T extends string>(values: readonly T[]) => values.map((value) => Type.Literal(value));
56
+
57
+ const tileSchema = Type.Cyclic({
58
+ CanvasTile: Type.Union([
59
+ Type.Object({ entity: Type.String({ minLength: 1, description: "Actor @handle or activated mini-app app:@handle/view-key; no shapes" }) }, { additionalProperties: false }),
60
+ Type.Object({
61
+ direction: Type.Union([Type.Literal("horizontal"), Type.Literal("vertical")]),
62
+ weights: Type.Tuple([Type.Number({ exclusiveMinimum: 0 }), Type.Number({ exclusiveMinimum: 0 })]),
63
+ children: Type.Tuple([Type.Ref("CanvasTile"), Type.Ref("CanvasTile")]),
64
+ }, { additionalProperties: false }),
65
+ ]),
66
+ }, "CanvasTile");
67
+
68
+ const canvasLayoutSchema = Type.Object({
69
+ mode: Type.Optional(Type.Union([Type.Literal("free"), Type.Literal("tiled")], { description: "free is the default; tiled fills the viewport, disables pan/zoom and uses root" })),
70
+ root: Type.Optional(Type.Union([tileSchema, Type.Null()], { description: "Tiled layout: an actor/app leaf or a binary split. Maximum 64 unique leaves and 16 nested splits. null clears the tiles; omitted preserves them" })),
71
+ nodes: Type.Optional(Type.Array(Type.Object({
72
+ id: Type.Optional(Type.String({ minLength: 1, description: "Groups only: an id you choose; member nodes name it in parent" })),
73
+ group: Type.Optional(Type.Union(literals(CANVAS_GROUP_KINDS), {
74
+ description: "Makes the node a group. h = row, v = column, wrap-h = row wrapping at width, "
75
+ + "wrap-v = column wrapping at height, grid = columns by rows, circle = members on a ring "
76
+ + "(actors talking to each other), tree = the root actor and everything it spawned",
77
+ })),
78
+ entity: Type.Optional(Type.String({ minLength: 1, description: `Items only: ${ENTITY}` })),
79
+ chatInput: Type.Optional(Type.Boolean({ description: "Actor items only: false hides the chat composer on free canvas and tiles; default true. Does not change permissions or the inspector" })),
80
+ parent: Type.Optional(Type.String({ minLength: 1, description: "Id of the enclosing group; omitted = top level (top-level nodes stack vertically)" })),
81
+ label: Type.Optional(Type.String({ description: "Groups: caption above the members, shown with or without frame" })),
82
+ frame: Type.Optional(Type.Boolean({ description: "Groups: true draws a dashed outline around the members; default false, no outline" })),
83
+ gap: Type.Optional(Type.Number({ minimum: 0, description: "Groups: minimum distance between members in px, default 44; labelled connections may increase it to leave room for their text" })),
84
+ width: Type.Optional(Type.Number({ exclusiveMinimum: 0, description: "wrap-h only and required there: row width in px before wrapping" })),
85
+ height: Type.Optional(Type.Number({ exclusiveMinimum: 0, description: "wrap-v only and required there: column height in px before wrapping" })),
86
+ columns: Type.Optional(Type.Integer({ minimum: 1, description: "grid only and required there" })),
87
+ direction: Type.Optional(Type.Union(literals(CANVAS_TREE_DIRECTIONS), { description: "tree only: where the children go, default right" })),
88
+ root: Type.Optional(Type.String({ minLength: 1, description: "tree only and required there: @handle of the root actor" })),
89
+ }))),
90
+ shapes: Type.Optional(Type.Array(Type.Object({
91
+ id: Type.String({ minLength: 1, description: "Your id; place the shape as an item with entity shape:<id>" }),
92
+ kind: Type.Union(literals(CANVAS_SHAPE_KINDS)),
93
+ text: Type.String({ minLength: 1, description: "Text inside the shape; keep it to a few words" }),
94
+ size: Type.Optional(Type.Number({ exclusiveMinimum: 0, description: "Diameter of a circle or width of a diamond in px; default 120 and 150" })),
95
+ }))),
96
+ lines: Type.Optional(Type.Array(Type.Object({
97
+ from: Type.String({ minLength: 1, description: ENTITY }),
98
+ to: Type.String({ minLength: 1, description: `${ENTITY}; must differ from from` }),
99
+ label: Type.Optional(Type.String({ description: "Short caption on the line" })),
100
+ arrow: Type.Optional(Type.Union(literals(CANVAS_ARROWS), { description: "none = plain line (default), end = arrow at to, both = arrows at both ends" })),
101
+ style: Type.Optional(Type.Union(literals(CANVAS_LINE_STYLES), { description: "solid (default) or dashed" })),
102
+ }))),
103
+ });
104
+
105
+ const invalid = (message: string) => new DomainError("invalid-canvas-layout", message, 400);
106
+
107
+ const parsedLayout = (input: unknown): CanvasLayout => {
108
+ try {
109
+ return canvasLayoutOf(input);
110
+ } catch (caught) {
111
+ throw invalid(caught instanceof Error ? caught.message : String(caught));
112
+ }
113
+ };
114
+
115
+ const isStopped = (actor: RunView["actors"][number]) => actor.kind !== "human" && actor.lifecycle.kind === "stopped";
116
+
117
+ const actorByHandle = (view: RunView, reference: string, where: string) => {
118
+ const entity = canvasEntityOf(reference);
119
+ if (entity.kind !== "actor") throw invalid(`${where}: ${reference} ist kein Actor`);
120
+ const handle = entity.handle;
121
+ const sharing = view.actors.filter((actor) => actor.handle === handle);
122
+ const found = sharing.find((actor) => actor.kind === "human" || !isStopped(actor)) ?? sharing.at(-1);
123
+ if (!found) {
124
+ const known = view.actors.filter((actor) => actor.kind !== "human").map((actor) => `@${actor.handle}`);
125
+ throw invalid(`${where}: @${handle} ist kein Actor dieses Laufs. Vorhanden: ${known.join(", ") || "keine"}`);
126
+ }
127
+ if (found.kind === "human") {
128
+ throw invalid(`${where}: @${handle} ist der Mensch im Chat; der Chat liegt fest links neben der Fläche`);
129
+ }
130
+ return found;
131
+ };
132
+
133
+ const descendantsOf = (view: RunView, actorId: string): string[] => {
134
+ const result: string[] = [];
135
+ const queue = [actorId];
136
+ while (queue.length > 0) {
137
+ const current = queue.shift()!;
138
+ for (const actor of view.actors) {
139
+ if (actor.kind !== "human" && actor.createdBy === current && !result.includes(actor.id)) {
140
+ result.push(actor.id);
141
+ queue.push(actor.id);
142
+ }
143
+ }
144
+ }
145
+ return result;
146
+ };
147
+
148
+ const isActorReference = (reference: string) => canvasEntityOf(reference).kind === "actor";
149
+
150
+ const resolveAppReferences = (view: RunView, layout: CanvasLayout): CanvasLayout => {
151
+ const programs = view.pluginStates.flatMap((entry) => {
152
+ if (entry.pluginId !== ACTOR_PROGRAMS_STATE_ID || entry.scope.kind !== "actor") return [];
153
+ const actorId = entry.scope.actorId;
154
+ const actor = view.actors.find((candidate) => candidate.id === actorId);
155
+ if (!actor || actor.kind === "human" || isStopped(actor)) return [];
156
+ const { program } = entry.state as unknown as ActorProgramState;
157
+ return program ? [program] : [];
158
+ });
159
+ const resolve = (reference: string, where: string): string => {
160
+ const entity = canvasEntityOf(reference);
161
+ if (entity.kind !== "app") return reference;
162
+ try {
163
+ return `app:${resolveActorView(programs, entity.id).view.id}`;
164
+ } catch (error) {
165
+ throw invalid(`${where}: ${reference}: ${error instanceof Error ? error.message : String(error)} Canvas-Entitäten erhalten das Präfix app:.`);
166
+ }
167
+ };
168
+ return parsedLayout({
169
+ ...layout,
170
+ ...(layout.root ? { root: mapCanvasTileEntities(layout.root, (entity) => resolve(entity, "root")) } : {}),
171
+ nodes: layout.nodes.map((node, index) => isCanvasGroupNode(node)
172
+ ? node : { ...node, entity: resolve(node.entity, `nodes[${index}].entity`) }),
173
+ lines: layout.lines.map((line, index) => ({
174
+ ...line,
175
+ from: resolve(line.from, `lines[${index}].from`),
176
+ to: resolve(line.to, `lines[${index}].to`),
177
+ })),
178
+ });
179
+ };
180
+
181
+ /** Resolve app names and validate entities and actor ancestry before any layout is stored. */
182
+ export const checkLayoutAgainstRun = (view: RunView, input: CanvasLayout): CanvasLayout => {
183
+ const layout = resolveAppReferences(view, input);
184
+ for (const reference of canvasTileEntities(layout.root)) {
185
+ if (isActorReference(reference)) actorByHandle(view, reference, "root");
186
+ }
187
+ const placed = new Map<string, string>();
188
+ layout.nodes.forEach((node, index) => {
189
+ if (isCanvasGroupNode(node) || !isActorReference(node.entity)) return;
190
+ const actor = actorByHandle(view, node.entity, `nodes[${index}]`);
191
+ placed.set(actor.id, node.entity);
192
+ });
193
+ const trees = layout.nodes.flatMap((node, index) =>
194
+ isCanvasGroupNode(node) && node.group === "tree"
195
+ ? [{ node, root: actorByHandle(view, node.root, `nodes[${index}].root`) }]
196
+ : []);
197
+ for (const { node, root } of trees) {
198
+ if (placed.has(root.id)) {
199
+ throw invalid(`Baum ${node.id}: die Wurzel ${node.root} ist zusätzlich einzeln platziert`);
200
+ }
201
+ for (const id of descendantsOf(view, root.id)) {
202
+ const reference = placed.get(id);
203
+ if (reference) throw invalid(`Baum ${node.id}: ${reference} gehört zur Abstammung von ${node.root} und ist zusätzlich einzeln platziert`);
204
+ const other = trees.find((tree) => tree.root.id === id);
205
+ if (other) throw invalid(`Baum ${other.node.id}: ${other.node.root} liegt schon im Baum ${node.id} von ${node.root}`);
206
+ }
207
+ }
208
+ layout.lines.forEach((line, index) => {
209
+ if (isActorReference(line.from)) actorByHandle(view, line.from, `lines[${index}].from`);
210
+ if (isActorReference(line.to)) actorByHandle(view, line.to, `lines[${index}].to`);
211
+ });
212
+ return layout;
213
+ };
214
+
215
+ export const createCanvasTool = (): RunFunction =>
216
+ defineRunFunction({
217
+ ...canvasToolMetadata,
218
+ schema: canvasLayoutSchema,
219
+ resultSchema: eventResultSchema,
220
+ available: canDesignCanvas,
221
+ run: ({ runtime, caller, context, eventsFor }, toolCallId, input) => {
222
+ const view = runtime.view(caller.runId);
223
+ if (input.nodes === undefined && input.mode === undefined && input.root === undefined) throw invalid("nodes oder mode/root muss angegeben werden");
224
+ if (input.nodes === undefined && (input.shapes !== undefined || input.lines !== undefined)) throw invalid("shapes und lines ersetzen den freien Canvas zusammen mit nodes");
225
+ const currentState = view.pluginStates.find((entry) => entry.pluginId === ORCHESTRATION_PLUGIN_ID && entry.scope.kind === "run");
226
+ const current = currentState ? parsedLayout(currentState.state) : { nodes: [], shapes: [], lines: [] };
227
+ const checked = checkLayoutAgainstRun(view, parsedLayout({ ...input, nodes: input.nodes ?? [] }));
228
+ const layout: CanvasLayout = {
229
+ ...current,
230
+ ...checked,
231
+ ...(input.nodes === undefined ? { nodes: current.nodes, shapes: current.shapes, lines: current.lines } : {}),
232
+ ...(input.mode !== undefined || input.root !== undefined || current.mode !== undefined
233
+ ? { mode: input.mode ?? (input.root !== undefined ? "tiled" : "free") } : {}),
234
+ };
235
+ runtime.replacePluginState(context(toolCallId), caller.runId, {
236
+ pluginId: ORCHESTRATION_PLUGIN_ID,
237
+ scope: { kind: "run" },
238
+ state: layout,
239
+ });
240
+ return eventsFor(toolCallId);
241
+ },
242
+ });
243
+
244
+ export const createCanvasToolContributor = (): ToolContributor => ({
245
+ name: "ragents.orchestration.canvas",
246
+ descriptors: [toolDescriptorFrom(canvasToolMetadata, canDesignCanvas)],
247
+ tools: () => [createCanvasTool()],
248
+ });