@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,81 @@
1
+ import { useMemo } from "react";
2
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@aicontainer/web/ui";
3
+ import { thinkingLabel } from "@aicontainer/web/lib/labels";
4
+ import type { StartOptionControlContext } from "@aicontainer/web/PluginRegistry";
5
+
6
+ interface ModelPresentation {
7
+ provider: string;
8
+ options: readonly string[];
9
+ thinkingOptions: readonly string[];
10
+ }
11
+
12
+ interface ModelValue {
13
+ model: string;
14
+ thinking?: string;
15
+ }
16
+
17
+ const isStringList = (value: unknown): value is readonly string[] =>
18
+ Array.isArray(value) && value.every((entry) => typeof entry === "string");
19
+
20
+ const modelPresentationFrom = (presentation: unknown, optionId: string): ModelPresentation => {
21
+ const raw = presentation as Record<string, unknown> | null;
22
+ if (typeof raw !== "object" || raw === null || raw.kind !== "model"
23
+ || typeof raw.provider !== "string" || !isStringList(raw.options) || !isStringList(raw.thinkingOptions)) {
24
+ throw new Error(`Die Startoption ${optionId} liefert keine Modell-Darstellung`);
25
+ }
26
+ return { provider: raw.provider, options: raw.options, thinkingOptions: raw.thinkingOptions };
27
+ };
28
+
29
+ const modelValueFrom = (value: unknown, optionId: string): ModelValue => {
30
+ const raw = value as Record<string, unknown> | null;
31
+ if (typeof raw !== "object" || raw === null || typeof raw.model !== "string"
32
+ || (raw.thinking !== undefined && typeof raw.thinking !== "string")) {
33
+ throw new Error(`Der Wert der Startoption ${optionId} ist keine Modellwahl`);
34
+ }
35
+ return { model: raw.model, ...(typeof raw.thinking === "string" ? { thinking: raw.thinking } : {}) };
36
+ };
37
+
38
+ const modelLabel = (provider: string, model: string) => provider ? `${provider}/${model}` : model;
39
+
40
+ const messageOf = (cause: unknown): string => cause instanceof Error ? cause.message : String(cause);
41
+
42
+ const errorClass = "text-[0.75rem] text-destructive";
43
+
44
+ export function ModelControl({ disabled, error, option, setValue }: StartOptionControlContext) {
45
+ const parsed = useMemo(() => {
46
+ try {
47
+ return { presentation: modelPresentationFrom(option.presentation, option.id), value: modelValueFrom(option.value, option.id) };
48
+ } catch (cause) {
49
+ return { message: messageOf(cause) };
50
+ }
51
+ }, [option]);
52
+
53
+ if ("message" in parsed) return <p className={errorClass} role="alert">{parsed.message}</p>;
54
+ const { presentation, value } = parsed;
55
+
56
+ const chooseModel = (model: string) => {
57
+ void setValue({ model });
58
+ };
59
+
60
+ const chooseThinking = (thinking: string) => {
61
+ void setValue({ model: value.model, thinking });
62
+ };
63
+
64
+ const modelOptions = presentation.options.map((model) => ({ value: model, label: modelLabel(presentation.provider, model) }));
65
+ const thinkingOptions = presentation.thinkingOptions.map((level) => ({ value: level, label: thinkingLabel(level) }));
66
+ return (
67
+ <div className="grid flex-1 min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-1.5">
68
+ <Select disabled={disabled} items={modelOptions} value={value.model} onValueChange={(model) => { if (model !== null) chooseModel(model); }}>
69
+ <SelectTrigger aria-label="Modell" className="min-w-0 max-w-full" size="sm"><SelectValue /></SelectTrigger>
70
+ <SelectContent>{modelOptions.map((option) => <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>)}</SelectContent>
71
+ </Select>
72
+ {presentation.thinkingOptions.length > 0 && (
73
+ <Select disabled={disabled} items={thinkingOptions} value={value.thinking ?? ""} onValueChange={(thinking) => { if (thinking !== null) chooseThinking(thinking); }}>
74
+ <SelectTrigger aria-label="Reasoning" className="min-w-0 max-w-full" size="sm"><SelectValue /></SelectTrigger>
75
+ <SelectContent>{thinkingOptions.map((option) => <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>)}</SelectContent>
76
+ </Select>
77
+ )}
78
+ {error && <p className={`${errorClass} col-span-full`} role="alert">{error}</p>}
79
+ </div>
80
+ );
81
+ }
@@ -0,0 +1,131 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { useAccess } from "@aicontainer/web/AccessContext";
3
+ import { Alert, AlertAction, AlertDescription, Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@aicontainer/web/ui";
4
+ import { thinkingLabel } from "@aicontainer/web/lib/labels";
5
+ import type { ProductModelDraft, ProductModelSettings as Settings } from "../model-settings-contract";
6
+ import { modelDraftOf, requestProductModelSettings } from "./model-settings";
7
+ import { modelDefaultsChangedEvent } from "@aicontainer/web/model-settings-events";
8
+
9
+ const profileLabels: Record<string, { title: string; description: string }> = {
10
+ coordinator: { title: "Run-Koordinator", description: "Die Vorgabe beim Start einer neuen Unterhaltung." },
11
+ relay: { title: "Vermittler", description: "Agenten, die Nachrichten und Ergebnisse weitergeben." },
12
+ standard: { title: "Agenten", description: "Die Vorgabe für weitere Agenten im Run." },
13
+ reviewer: { title: "Prüfung", description: "Die Vorgabe für Agenten mit Prüfauftrag." },
14
+ };
15
+
16
+ type LoadState = { status: "loading" } | { status: "failed"; error: string }
17
+ | { status: "ready"; settings: Settings };
18
+ const messageOf = (cause: unknown) => cause instanceof Error ? cause.message : String(cause);
19
+
20
+ const noteClass = "text-[0.8rem] leading-[1.5] text-muted-foreground";
21
+ const triggerClass = "w-full min-w-0 max-w-full";
22
+
23
+ export function ProductModelSettings({ pluginId }: { pluginId: string }) {
24
+ const access = useAccess();
25
+ const readable = access.can("settings.read");
26
+ const writable = access.can("settings.write");
27
+ const [state, setState] = useState<LoadState>({ status: "loading" });
28
+ const [draft, setDraft] = useState<ProductModelDraft>();
29
+ const [pending, setPending] = useState(false);
30
+ const saving = useRef(false);
31
+ const [error, setError] = useState<string>();
32
+ const [notice, setNotice] = useState<string>();
33
+ const [retry, setRetry] = useState(0);
34
+ const dirty = state.status === "ready" && draft !== undefined
35
+ && JSON.stringify(draft) !== JSON.stringify(modelDraftOf(state.settings));
36
+ useEffect(() => {
37
+ const refresh = () => { if (!dirty && !saving.current) setRetry((value) => value + 1); };
38
+ window.addEventListener(modelDefaultsChangedEvent, refresh);
39
+ return () => window.removeEventListener(modelDefaultsChangedEvent, refresh);
40
+ }, [dirty]);
41
+ useEffect(() => {
42
+ if (!readable) return;
43
+ const controller = new AbortController();
44
+ void requestProductModelSettings(pluginId, { signal: controller.signal }).then((settings) => {
45
+ if (controller.signal.aborted) return;
46
+ setState({ status: "ready", settings });
47
+ setDraft(modelDraftOf(settings));
48
+ }).catch((cause: unknown) => {
49
+ if (!controller.signal.aborted) setState({ status: "failed", error: messageOf(cause) });
50
+ });
51
+ return () => controller.abort();
52
+ }, [pluginId, readable, retry]);
53
+
54
+ if (!readable) return null;
55
+ if (state.status === "failed") return <Alert variant="destructive">
56
+ <AlertDescription>{state.error}</AlertDescription>
57
+ <AlertAction><Button onClick={() => setRetry((value) => value + 1)} size="sm" variant="outline">Erneut laden</Button></AlertAction>
58
+ </Alert>;
59
+ if (state.status !== "ready" || !draft) return <p role="status">Modellvorgaben werden geladen ...</p>;
60
+ const { settings } = state;
61
+ const change = (name: string, model: string, thinking: ProductModelDraft["profiles"][number]["thinking"]) => {
62
+ setDraft({ profiles: draft.profiles.map((profile) => profile.name === name ? { ...profile, model, thinking } : profile) });
63
+ setError(undefined);
64
+ setNotice(undefined);
65
+ };
66
+ const save = async () => {
67
+ if (!writable || saving.current || !dirty) return;
68
+ saving.current = true;
69
+ setPending(true);
70
+ setError(undefined);
71
+ setNotice(undefined);
72
+ try {
73
+ const saved = await requestProductModelSettings(pluginId, { draft });
74
+ setState({ status: "ready", settings: saved });
75
+ setDraft(modelDraftOf(saved));
76
+ setNotice("Vorgaben gespeichert. Sie gelten für neue Actors und noch nicht gestartete Runs.");
77
+ window.dispatchEvent(new Event(modelDefaultsChangedEvent));
78
+ } catch (cause) { setError(messageOf(cause)); }
79
+ finally { saving.current = false; setPending(false); }
80
+ };
81
+ return <form className="grid min-w-0 gap-4.5" aria-label="Modellvorgaben für neue Runs und Agenten" onSubmit={(event) => {
82
+ event.preventDefault();
83
+ void save();
84
+ }}>
85
+ <p className={noteClass}>Für dieses Produktprofil gespeichert. Bereits angelegte Actors behalten ihr Modell.
86
+ Eine ausdrücklich gewählte Modellauswahl im Run hat Vorrang.</p>
87
+ {!writable && <p className={noteClass}>Du hast Lesezugriff auf diese Einstellungen.</p>}
88
+ <div className="grid gap-4">
89
+ {settings.profiles.map((profile) => {
90
+ const value = draft.profiles.find((entry) => entry.name === profile.name)!;
91
+ const metadata = settings.models.find((model) => model.provider === profile.provider && model.id === value.model)!;
92
+ const label = profileLabels[profile.name] ?? { title: profile.name, description: profile.description };
93
+ const modelOptions = settings.models.filter((model) => model.provider === profile.provider).map((model) => ({ value: model.id, label: model.label }));
94
+ const thinkingOptions = metadata.thinking.map((thinking) => ({ value: thinking, label: thinkingLabel(thinking) }));
95
+ return <fieldset className="min-w-0 border-t border-border-soft pt-4 first:border-t-0 first:pt-0" key={profile.name} disabled={!writable || pending}>
96
+ <legend className="float-left w-full text-[0.9rem] font-semibold">{label.title}</legend>
97
+ <p className="clear-both mt-0.5 mb-3 text-[0.8rem] text-muted-foreground">{label.description}</p>
98
+ <div className="grid grid-cols-[minmax(0,1fr)_minmax(125px,180px)] gap-3 max-sm:grid-cols-[minmax(0,1fr)]">
99
+ <Select disabled={!writable || pending} items={modelOptions} value={value.model}
100
+ onValueChange={(model) => {
101
+ if (model === null) return;
102
+ const next = settings.models.find((entry) => entry.id === model && entry.provider === profile.provider)!;
103
+ const thinking = next.thinking.includes(value.thinking) ? value.thinking : next.thinking[0]!;
104
+ change(profile.name, model, thinking);
105
+ if (thinking !== value.thinking) setNotice(`Für ${label.title} wurde die verfügbare Reasoning-Stufe ${thinkingLabel(thinking)} gewählt. Prüfe sie vor dem Speichern.`);
106
+ }}>
107
+ <SelectTrigger aria-label="Modell" className={triggerClass}><SelectValue /></SelectTrigger>
108
+ <SelectContent>{modelOptions.map((option) => <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>)}</SelectContent>
109
+ </Select>
110
+ <Select disabled={!writable || pending || metadata.thinking.length < 2} items={thinkingOptions} value={value.thinking}
111
+ onValueChange={(thinking) => {
112
+ const level = metadata.thinking.find((entry) => entry === thinking);
113
+ if (level) change(profile.name, value.model, level);
114
+ }}>
115
+ <SelectTrigger aria-label="Reasoning" className={triggerClass}><SelectValue /></SelectTrigger>
116
+ <SelectContent>{thinkingOptions.map((option) => <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>)}</SelectContent>
117
+ </Select>
118
+ </div>
119
+ </fieldset>;
120
+ })}
121
+ </div>
122
+ <div className="flex flex-wrap items-center gap-2.5">
123
+ <Button type="submit" disabled={!writable || pending || !dirty}>{pending ? "Wird gespeichert ..." : "Vorgaben speichern"}</Button>
124
+ {dirty && <Button disabled={pending} variant="outline" onClick={() => {
125
+ setDraft(modelDraftOf(settings)); setError(undefined); setNotice(undefined);
126
+ }}>Änderungen verwerfen</Button>}
127
+ <span className={`${noteClass} basis-full`} role="status">{notice ?? (dirty ? "Ungespeicherte Änderungen" : "")}</span>
128
+ </div>
129
+ {error && <Alert variant="destructive"><AlertDescription>{error}</AlertDescription></Alert>}
130
+ </form>;
131
+ }
@@ -0,0 +1,136 @@
1
+ import { Checkbox, Toggle } from "@aicontainer/web/ui";
2
+ import { ToolbarCopy, ToolbarItem, ToolbarLabel, ToolbarText } from "@aicontainer/web/Toolbar";
3
+ import { useMemo, useState } from "react";
4
+ import type { StartOptionBadgeContext, StartOptionControlContext } from "@aicontainer/web/PluginRegistry";
5
+
6
+ interface SystemPromptOption {
7
+ id: string;
8
+ label: string;
9
+ text: string;
10
+ }
11
+
12
+ interface SystemPromptPresentation {
13
+ options: readonly SystemPromptOption[];
14
+ }
15
+
16
+ interface SystemPromptValue {
17
+ promptIds: readonly string[];
18
+ shareWithAgents: boolean;
19
+ }
20
+
21
+ const isPromptOption = (value: unknown): value is SystemPromptOption =>
22
+ typeof value === "object" && value !== null
23
+ && typeof (value as SystemPromptOption).id === "string"
24
+ && typeof (value as SystemPromptOption).label === "string"
25
+ && typeof (value as SystemPromptOption).text === "string";
26
+
27
+ const presentationFrom = (presentation: unknown, optionId: string): SystemPromptPresentation => {
28
+ const raw = presentation as Record<string, unknown> | null;
29
+ if (typeof raw !== "object" || raw === null || raw.kind !== "system-prompt"
30
+ || !Array.isArray(raw.options) || !raw.options.every(isPromptOption)) {
31
+ throw new Error(`Die Startoption ${optionId} liefert keine Systemprompt-Darstellung`);
32
+ }
33
+ return { options: raw.options };
34
+ };
35
+
36
+ const valueFrom = (value: unknown, optionId: string): SystemPromptValue => {
37
+ const raw = value as Record<string, unknown> | null;
38
+ if (typeof raw !== "object" || raw === null
39
+ || !Array.isArray(raw.promptIds) || raw.promptIds.some((id) => typeof id !== "string")
40
+ || typeof raw.shareWithAgents !== "boolean") {
41
+ throw new Error(`Der Wert der Startoption ${optionId} ist keine Systemprompt-Auswahl`);
42
+ }
43
+ return { promptIds: raw.promptIds as string[], shareWithAgents: raw.shareWithAgents };
44
+ };
45
+
46
+ const messageOf = (cause: unknown): string => cause instanceof Error ? cause.message : String(cause);
47
+
48
+ const errorClass = "text-[0.75rem] text-destructive";
49
+
50
+ const parse = (option: StartOptionControlContext["option"]) => {
51
+ try {
52
+ return { presentation: presentationFrom(option.presentation, option.id), value: valueFrom(option.value, option.id) };
53
+ } catch (cause) {
54
+ return { message: messageOf(cause) };
55
+ }
56
+ };
57
+
58
+ export function SystemPromptControl({ disabled, error, option, setValue }: StartOptionControlContext) {
59
+ const [previewId, setPreviewId] = useState<string | undefined>(undefined);
60
+ const parsed = useMemo(() => parse(option), [option]);
61
+ if ("message" in parsed) return <p className={errorClass} role="alert">{parsed.message}</p>;
62
+ const { presentation, value } = parsed;
63
+ const preview = presentation.options.find((entry) => entry.id === previewId);
64
+
65
+ const toggle = (wanted: string) => {
66
+ const next = value.promptIds.includes(wanted)
67
+ ? value.promptIds.filter((id) => id !== wanted)
68
+ : presentation.options.map((entry) => entry.id).filter((id) => id === wanted || value.promptIds.includes(id));
69
+ void setValue({ promptIds: next, shareWithAgents: value.shareWithAgents });
70
+ };
71
+
72
+ const share = (shareWithAgents: boolean) => {
73
+ void setValue({ promptIds: value.promptIds, shareWithAgents });
74
+ };
75
+
76
+ return (
77
+ <div className="flex flex-col items-start gap-2" onMouseLeave={() => setPreviewId(undefined)}>
78
+ <span className="text-[0.72rem] font-semibold text-muted-foreground">Systemprompts</span>
79
+ <div className="relative flex justify-center">
80
+ <div aria-label="Systemprompts" className="flex flex-wrap justify-center gap-2" role="group">
81
+ {presentation.options.map((entry) => (
82
+ <Toggle
83
+ disabled={disabled}
84
+ key={entry.id}
85
+ onBlur={() => setPreviewId(undefined)}
86
+ onFocus={() => setPreviewId(entry.id)}
87
+ onMouseEnter={() => setPreviewId(entry.id)}
88
+ onPressedChange={() => toggle(entry.id)}
89
+ pressed={value.promptIds.includes(entry.id)}
90
+ size="sm"
91
+ variant="outline"
92
+ >
93
+ {entry.label}
94
+ </Toggle>
95
+ ))}
96
+ </div>
97
+ {preview && <div className="absolute top-[calc(100%+6px)] left-1/2 z-3 max-h-[44vh] w-max max-w-[min(620px,78vw)] -translate-x-1/2 overflow-y-auto whitespace-pre-wrap rounded-xl border border-border bg-background px-3.5 py-3 text-left text-sm leading-[1.5] text-foreground shadow-pop" role="tooltip">{preview.text}</div>}
98
+ </div>
99
+ <label className="flex max-w-[34rem] cursor-pointer items-start gap-2 text-sm">
100
+ <Checkbox
101
+ checked={value.shareWithAgents}
102
+ className="mt-0.5"
103
+ disabled={disabled}
104
+ onCheckedChange={(checked) => share(checked)}
105
+ />
106
+ <span>
107
+ Auch an die Agenten weiterreichen
108
+ <span className="block text-[0.72rem] text-muted-foreground">
109
+ {value.shareWithAgents
110
+ ? "Erzeugte Agenten bekommen die Prompts zusätzlich. Plain-LLMs mit tools: [] bleiben ausgenommen."
111
+ : "Die Prompts gelten nur für den Koordinator."}
112
+ </span>
113
+ </span>
114
+ </label>
115
+ {error && <p className={errorClass} role="alert">{error}</p>}
116
+ </div>
117
+ );
118
+ }
119
+
120
+ export function SystemPromptBadge({ option }: StartOptionBadgeContext) {
121
+ if (!option.selectable || !option.locked) return null;
122
+ const parsed = parse(option);
123
+ if ("message" in parsed) return <ToolbarItem title={parsed.message}><ToolbarText>Systemprompts unlesbar</ToolbarText></ToolbarItem>;
124
+ const { presentation, value } = parsed;
125
+ const labels = presentation.options
126
+ .filter((entry) => value.promptIds.includes(entry.id))
127
+ .map((entry) => entry.label);
128
+ if (labels.length === 0) return null;
129
+ const scopeLabel = value.shareWithAgents ? "Koordinator und Agenten" : "nur Koordinator";
130
+ const text = labels.join(" + ");
131
+ return (
132
+ <ToolbarItem title={`Systemprompts: ${text} (${scopeLabel})`}>
133
+ <ToolbarCopy><ToolbarLabel>Systemprompts</ToolbarLabel><ToolbarText>{value.shareWithAgents ? `${text} + Agenten` : text}</ToolbarText></ToolbarCopy>
134
+ </ToolbarItem>
135
+ );
136
+ }
@@ -0,0 +1,29 @@
1
+ import {
2
+ chatDisplayPolicyFrom,
3
+ type WebPlugin,
4
+ type WebPluginDescriptor,
5
+ } from "@aicontainer/web/PluginRegistry";
6
+ import { productStartOptions } from "./start-options";
7
+ import { ProductModelSettings } from "./ProductModelSettings";
8
+
9
+ const ModelSettings = () => <ProductModelSettings pluginId="ragents.product" />;
10
+
11
+ const basePlugin = (descriptor: WebPluginDescriptor): WebPlugin => ({
12
+ ...descriptor,
13
+ brand: {
14
+ title: "RAgents",
15
+ },
16
+ startOptions: productStartOptions,
17
+ settings: [{ id: "ragents.product.model-settings", label: "Neue Runs und Agenten", category: "models",
18
+ order: 20, readRight: "settings.read", Settings: ModelSettings }],
19
+ });
20
+
21
+ const descriptor: WebPluginDescriptor = { id: "ragents.product" };
22
+
23
+ export const webPlugin: WebPlugin = {
24
+ ...basePlugin(descriptor),
25
+ activate: (config) => ({
26
+ ...basePlugin(descriptor),
27
+ chatDisplayPolicy: chatDisplayPolicyFrom(descriptor.id, config),
28
+ }),
29
+ };
@@ -0,0 +1,39 @@
1
+ import { rpc } from "@aicontainer/web/rpc";
2
+ import { productModelSettingsContracts } from "@aicontainer/server/plugin-support/product-model-settings-contract";
3
+ import type { ProductModelDraft, ProductModelSettings } from "../model-settings-contract";
4
+
5
+ const record = (value: unknown): value is Record<string, unknown> =>
6
+ value !== null && typeof value === "object" && !Array.isArray(value);
7
+ const text = (value: unknown): value is string => typeof value === "string" && value.length > 0;
8
+
9
+ export const productModelSettingsFrom = (value: unknown): ProductModelSettings => {
10
+ if (!record(value) || !Array.isArray(value.models) || !Array.isArray(value.profiles)
11
+ || !value.models.length || !value.profiles.length
12
+ || !value.models.every((model) => record(model) && text(model.id) && text(model.provider)
13
+ && text(model.label) && Array.isArray(model.thinking) && model.thinking.length > 0 && model.thinking.every(text))
14
+ || !value.profiles.every((profile) => record(profile) && text(profile.name) && typeof profile.description === "string"
15
+ && text(profile.provider) && text(profile.model) && text(profile.thinking))) {
16
+ throw new Error("Der Server hat ungültige Modellvorgaben geliefert.");
17
+ }
18
+ const settings = value as unknown as ProductModelSettings;
19
+ const names = settings.profiles.map((profile) => profile.name);
20
+ if (new Set(names).size !== names.length || settings.profiles.some((profile) => !settings.models.some((model) =>
21
+ model.id === profile.model && model.provider === profile.provider && model.thinking.includes(profile.thinking)))) {
22
+ throw new Error("Die Modellvorgaben passen nicht zum verfügbaren Modellkatalog.");
23
+ }
24
+ return settings;
25
+ };
26
+
27
+ export const modelDraftOf = (settings: ProductModelSettings): ProductModelDraft => ({
28
+ profiles: settings.profiles.map(({ name, model, thinking }) => ({ name, model, thinking })),
29
+ });
30
+
31
+ export async function requestProductModelSettings(pluginId: string, options: {
32
+ draft?: ProductModelDraft; signal?: AbortSignal;
33
+ } = {}): Promise<ProductModelSettings> {
34
+ const contracts = productModelSettingsContracts(pluginId);
35
+ const result = options.draft
36
+ ? await rpc.call(contracts.save, { value: options.draft }, { signal: options.signal })
37
+ : await rpc.call(contracts.read, {}, { signal: options.signal });
38
+ return productModelSettingsFrom(result);
39
+ }
@@ -0,0 +1,12 @@
1
+ import type { StartOptionContribution } from "@aicontainer/web/PluginRegistry";
2
+ import {
3
+ modelStartOptionId,
4
+ systemPromptStartOptionId,
5
+ } from "@aicontainer/server/plugin-support/start-options-contract";
6
+ import { ModelControl } from "./ModelControl";
7
+ import { SystemPromptBadge, SystemPromptControl } from "./SystemPromptControl";
8
+
9
+ export const productStartOptions: StartOptionContribution[] = [
10
+ { id: systemPromptStartOptionId, Control: SystemPromptControl, Badge: SystemPromptBadge },
11
+ { id: modelStartOptionId, placement: "composer", Control: ModelControl },
12
+ ];
@@ -0,0 +1,38 @@
1
+ import { Type, type Static } from "typebox";
2
+ import { defineOperation } from "@aicontainer/ragents/src/rpc/contract";
3
+
4
+ const pluginEntry = Type.Object({
5
+ id: Type.String({ minLength: 1 }),
6
+ source: Type.Union([Type.Literal("host"), Type.Literal("archive")], {
7
+ description: "host: der Client nimmt das Plugin aus seinem Host-Checkout; archive: das Plugin liegt im Archiv",
8
+ }),
9
+ }, { additionalProperties: false });
10
+
11
+ /** Im Archiv liegt das für dieses Profil gebaute Web unter diesem Ordner; der Client baut es nicht selbst. */
12
+ export const CLIENT_WEB_FOLDER = "web";
13
+
14
+ const description = Type.Object({
15
+ profile: Type.String({ minLength: 1, description: "Profilname; die Datei heißt ragents.config.<profil>.ts" }),
16
+ version: Type.String({ minLength: 64, maxLength: 64, description: "Stand des Archivs als SHA-256" }),
17
+ hostVersion: Type.String({ minLength: 40, maxLength: 40, description: "Git-Commit des Hosts, den der Client exakt braucht" }),
18
+ packageVersion: Type.String({ minLength: 1, description: "Fassung des npm-Pakets, die diesen Commit trägt; damit findet der Client die passende Installation" }),
19
+ file: Type.String({ minLength: 1, description: "Pfad der Profildatei innerhalb des Archivs" }),
20
+ web: Type.String({ minLength: 1, description: "Ordner des gebauten Webs innerhalb des Archivs; der Client setzt WEB_DIST_DIR darauf" }),
21
+ size: Type.Integer({ minimum: 0, description: "Archivgröße in Byte" }),
22
+ archivePath: Type.String({ minLength: 1, description: "HTTP-Pfad des Archivs auf diesem Server" }),
23
+ plugins: Type.Array(pluginEntry),
24
+ }, { additionalProperties: false });
25
+
26
+ export type ClientProfileDescription = Static<typeof description>;
27
+
28
+ export const profileArchivePath = (version: string): string => `/profile/${version}.tar.gz`;
29
+
30
+ export const profileDistributionContracts = {
31
+ describe: defineOperation({
32
+ id: "ragents.profile.describe",
33
+ description: "Das Client-Profil dieses Servers: Name, Stand, verlangte Host- und Paketfassung, Plugins und Archiv. Recht: profile.fetch.",
34
+ rights: ["profile.fetch"],
35
+ input: Type.Object({}, { additionalProperties: false }),
36
+ result: description,
37
+ }),
38
+ };
@@ -0,0 +1,159 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readdirSync, statSync, lstatSync } from "node:fs";
3
+ import { copyFile, mkdir } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ import { create as createTar } from "tar";
7
+ import { hostConfigKeys } from "@aicontainer/server/config.js";
8
+ import { isEnvironmentReference, isProvisionedReference } from "@aicontainer/server/config-definition.js";
9
+ import { resolveAnonymousUser, resolveProfileUsers, SECRET_KEY_PATTERN } from "@aicontainer/server/config-file.js";
10
+ import { discoverPluginIds } from "@aicontainer/server/profile/plugin-discovery.js";
11
+ import { isPluginPath, PLUGIN_SERVER_FOLDER, pluginFolderFor, pluginIdOf, pluginsRoot } from "@aicontainer/server/plugin-support/plugins-root.js";
12
+ import { CLIENT_WEB_FOLDER } from "../contract.js";
13
+
14
+ export interface ClientProfilePlugin {
15
+ readonly id: string;
16
+ readonly source: "host" | "archive";
17
+ readonly folder: string;
18
+ }
19
+
20
+ export interface InspectedClientProfile {
21
+ readonly profile: string;
22
+ readonly source: string;
23
+ readonly root: string;
24
+ readonly file: string;
25
+ readonly plugins: readonly ClientProfilePlugin[];
26
+ }
27
+
28
+ export interface PackedClientProfile {
29
+ readonly archive: Buffer;
30
+ readonly version: string;
31
+ readonly entries: readonly string[];
32
+ }
33
+
34
+ const EXCLUDED_FOLDERS = new Set(["node_modules", "tests", ".git"]);
35
+ const PROFILE_FILE = /^ragents\.config\.([a-z0-9]+(?:-[a-z0-9]+)*)\.ts$/;
36
+
37
+ const hasServerEntry = (folder: string): boolean =>
38
+ ["index.ts", "index.js"].some((name) => statSync(path.join(folder, PLUGIN_SERVER_FOLDER, name), { throwIfNoEntry: false })?.isFile() === true);
39
+
40
+ const commonRoot = (first: string, others: readonly string[]): string => {
41
+ let root = first;
42
+ for (const folder of others) {
43
+ while (folder !== root && !folder.startsWith(root + path.sep)) {
44
+ const parent = path.dirname(root);
45
+ if (parent === root) throw new Error(`Profildatei und Plugin ${folder} haben keinen gemeinsamen Ordner`);
46
+ root = parent;
47
+ }
48
+ }
49
+ return root;
50
+ };
51
+
52
+ const posixRelative = (root: string, target: string): string => path.relative(root, target).split(path.sep).join("/");
53
+
54
+ // Jeder Name ist frei, damit ein Passwort- oder Token-Verweis auch ohne die Client-Umgebung prüfbar ist.
55
+ const placeholderEnvironment: Readonly<Record<string, string | undefined>> = new Proxy({}, { get: () => "client-placeholder-value" });
56
+
57
+ const checkSections = (source: string, raw: Record<string, unknown>, pluginIds: ReadonlySet<string>): void => {
58
+ for (const [section, value] of Object.entries(raw)) {
59
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${source}: die Sektion ${section} ist kein Objekt`);
60
+ if (section !== "host" && !pluginIds.has(section)) throw new Error(`${source}: die Sektion ${section} gehört zu keinem Plugin aus host.PLUGINS`);
61
+ for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {
62
+ if (section === "host" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} ist kein Host-Schlüssel`);
63
+ if (isEnvironmentReference(entry) || isProvisionedReference(entry)) continue;
64
+ if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} ist ein Secret und muss als env("...") stehen`);
65
+ const valid = typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean"
66
+ || (Array.isArray(entry) && entry.every((item) => typeof item === "string"));
67
+ if (!valid) throw new Error(`${source}: ${section}.${key} hat keinen gültigen Wert`);
68
+ if (typeof entry === "string" && /^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} verweist als Text auf die Umgebung; env("...") verwenden`);
69
+ }
70
+ }
71
+ };
72
+
73
+ /** Prüft die Client-Profildatei ohne ihre Umgebung und bestimmt, welche Plugins ins Archiv gehören. */
74
+ export const inspectClientProfile = async (source: string, root = pluginsRoot): Promise<InspectedClientProfile> => {
75
+ const name = PROFILE_FILE.exec(path.basename(source));
76
+ if (!name) throw new Error(`Die Client-Profildatei muss ragents.config.<profil>.ts heißen: ${source}`);
77
+ if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`Die Client-Profildatei ${source} fehlt`);
78
+ const profile = name[1]!;
79
+ const module = await import(pathToFileURL(source).href) as Record<string, unknown>;
80
+ const raw = module.config;
81
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${source} exportiert keine Konstante config`);
82
+ const host = (raw as Record<string, unknown>).host as Record<string, unknown> | undefined;
83
+ const entries = host?.PLUGINS;
84
+ if (!Array.isArray(entries) || entries.length === 0 || !entries.every((entry) => typeof entry === "string" && entry)) {
85
+ throw new Error(`${source}: host.PLUGINS muss eine nicht leere Liste sein`);
86
+ }
87
+ if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE muss ${profile} sein`);
88
+ const known = discoverPluginIds(root);
89
+ const directory = path.dirname(source);
90
+ const plugins = (entries as string[]).map((entry): ClientProfilePlugin => {
91
+ if (!isPluginPath(entry)) {
92
+ if (!known.includes(entry)) throw new Error(`${source}: das Plugin ${entry} ist im Host nicht bekannt (bekannt: ${known.join(", ")})`);
93
+ return { id: entry, source: "host", folder: path.join(root, entry) };
94
+ }
95
+ const folder = pluginFolderFor(entry, directory, root);
96
+ if (!statSync(folder, { throwIfNoEntry: false })?.isDirectory() || !hasServerEntry(folder)) {
97
+ throw new Error(`${source}: das Plugin ${entry} hat keinen Ordner ${folder} mit ${PLUGIN_SERVER_FOLDER}/index.ts`);
98
+ }
99
+ if (statSync(path.join(folder, "node_modules"), { throwIfNoEntry: false })) {
100
+ throw new Error(`${source}: das Plugin ${entry} bringt eigene node_modules mit; Abhängigkeiten müssen aus dem Host kommen`);
101
+ }
102
+ return { id: pluginIdOf(folder), source: "archive", folder };
103
+ });
104
+ const duplicate = plugins.find((plugin, index) => plugins.findIndex((other) => other.id === plugin.id) !== index);
105
+ if (duplicate) throw new Error(`${source}: das Plugin ${duplicate.id} steht mehrfach in host.PLUGINS`);
106
+ checkSections(source, raw as Record<string, unknown>, new Set([...known, ...plugins.map((plugin) => plugin.id)]));
107
+ const users = resolveProfileUsers(source, module.users, placeholderEnvironment);
108
+ const anonymous = resolveAnonymousUser(source, module.anonymousUser);
109
+ if (users && anonymous) throw new Error(`${source}: users und anonymousUser schließen einander aus`);
110
+ const archived = plugins.filter((plugin) => plugin.source === "archive").map((plugin) => plugin.folder);
111
+ const commonDirectory = commonRoot(directory, archived);
112
+ return { profile, source, root: commonDirectory, file: posixRelative(commonDirectory, source), plugins };
113
+ };
114
+
115
+ const collectFiles = (folder: string, root: string): string[] => {
116
+ const files: string[] = [];
117
+ for (const entry of readdirSync(folder, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name, "en"))) {
118
+ const absolute = path.join(folder, entry.name);
119
+ if (entry.isSymbolicLink()) throw new Error(`Das Client-Profil enthält einen symbolischen Link, den das Archiv nicht abbildet: ${absolute}`);
120
+ if (entry.isDirectory()) {
121
+ if (!EXCLUDED_FOLDERS.has(entry.name)) files.push(...collectFiles(absolute, root));
122
+ } else if (entry.isFile()) {
123
+ files.push(posixRelative(root, absolute));
124
+ }
125
+ }
126
+ return files;
127
+ };
128
+
129
+ const collectStaged = (folder: string, root: string): string[] =>
130
+ readdirSync(folder, { withFileTypes: true })
131
+ .sort((left, right) => left.name.localeCompare(right.name, "en"))
132
+ .flatMap((entry) => entry.isDirectory() ? collectStaged(path.join(folder, entry.name), root) : [posixRelative(root, path.join(folder, entry.name))]);
133
+
134
+ /** Kopiert Profildatei und Archiv-Plugins in den Staging-Ordner, in dem das gebaute Web schon unter web/ liegt. */
135
+ export const stageClientProfile = async (inspected: InspectedClientProfile, staging: string): Promise<readonly string[]> => {
136
+ const entries = [inspected.file, ...inspected.plugins.filter((plugin) => plugin.source === "archive").flatMap((plugin) => collectFiles(plugin.folder, inspected.root))];
137
+ for (const entry of entries) {
138
+ if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`Der Archiveintrag ${entry} ist keine Datei`);
139
+ if (entry === CLIENT_WEB_FOLDER || entry.startsWith(`${CLIENT_WEB_FOLDER}/`)) {
140
+ throw new Error(`Der Archiveintrag ${entry} kollidiert mit ${CLIENT_WEB_FOLDER}/, dem Ordner des gebauten Webs`);
141
+ }
142
+ const target = path.join(staging, ...entry.split("/"));
143
+ await mkdir(path.dirname(target), { recursive: true });
144
+ await copyFile(path.join(inspected.root, entry), target);
145
+ }
146
+ return entries;
147
+ };
148
+
149
+ /** Packt den Staging-Ordner deterministisch; der Stand ist der SHA-256 des Archivs. */
150
+ export const packClientProfile = async (inspected: InspectedClientProfile, staging: string): Promise<PackedClientProfile> => {
151
+ await stageClientProfile(inspected, staging);
152
+ const entries = collectStaged(staging, staging);
153
+ const chunks: Buffer[] = [];
154
+ for await (const chunk of createTar({ gzip: { level: 9 }, cwd: staging, portable: true, noMtime: true }, entries)) {
155
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
156
+ }
157
+ const archive = Buffer.concat(chunks);
158
+ return { archive, version: createHash("sha256").update(archive).digest("hex"), entries };
159
+ };