@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,182 @@
1
+ import { Type } from "typebox";
2
+ import { openJson } from "@aicontainer/ragents/src/http/contracts";
3
+ import { defineChannel, defineOperation } from "@aicontainer/ragents/src/rpc/contract";
4
+
5
+ export const WORKSPACE_PLUGIN_ID = "ragents.workspace";
6
+
7
+ export const BROWSE_ROOTS = ["workspace", "files"] as const;
8
+ export type BrowseRoot = typeof BROWSE_ROOTS[number];
9
+
10
+ export const BROWSE_ENTRY_LIMIT = 500;
11
+ export const BROWSE_PREVIEW_LIMIT = 256 * 1024;
12
+
13
+ export interface BrowseEntry {
14
+ name: string;
15
+ kind: "directory" | "file";
16
+ size: number;
17
+ modifiedAt: string;
18
+ }
19
+
20
+ export interface BrowseListing {
21
+ root: BrowseRoot;
22
+ location: string;
23
+ path: string;
24
+ entries: BrowseEntry[];
25
+ truncated: boolean;
26
+ }
27
+
28
+ export type BrowsePreview =
29
+ | { root: BrowseRoot; path: string; size: number; previewable: true; content: string }
30
+ | { root: BrowseRoot; path: string; size: number; previewable: false; reason: string };
31
+
32
+ export const WORKSPACE_BINDING_OPTION_ID = "ragents.workspace.binding";
33
+
34
+ export const WORKSPACE_METADATA_ID = "ragents.workspace";
35
+
36
+ /** Wo der Arbeitsbereich eines Runs liegt; wird beim Start als Startoption ins Journal eingefroren. */
37
+ export type WorkspaceBinding =
38
+ | { kind: "fresh" }
39
+ | { kind: "path"; path: string }
40
+ | { kind: "client"; client: string; label: string; path: string };
41
+
42
+ export const WORKSPACE_BINDING_KINDS = ["fresh", "path", "client"] as const;
43
+
44
+ export const WORKSPACE_CLIENT_ID_PATTERN = /^[A-Za-z0-9_-]{8,64}$/;
45
+
46
+ /** Was ein Arbeitsplatz bei der Anmeldung über sich sagt. */
47
+ export interface WorkspaceClientDescription {
48
+ label: string;
49
+ hostname: string;
50
+ platform: string;
51
+ folders: string[];
52
+ }
53
+
54
+ export interface WorkspaceClientInfo extends WorkspaceClientDescription {
55
+ id: string;
56
+ }
57
+
58
+ export interface WorkspaceBindingPresentation {
59
+ kind: "workspace-binding";
60
+ clients: WorkspaceClientInfo[];
61
+ }
62
+
63
+ export interface WorkspaceSessionMetadata {
64
+ binding: WorkspaceBinding;
65
+ summary: string;
66
+ }
67
+
68
+ const clientId = Type.String({ pattern: "^[A-Za-z0-9_-]{8,64}$", description: "Stabile Kennung des Arbeitsplatzes" });
69
+
70
+ const executorVersion = Type.String({ minLength: 1, maxLength: 64, description: "Stand des Executors, den der Arbeitsplatz mitbringt" });
71
+
72
+ const clientDescription = {
73
+ label: Type.String({ minLength: 1, maxLength: 120 }),
74
+ hostname: Type.String({ minLength: 1 }),
75
+ platform: Type.String({ minLength: 1 }),
76
+ folders: Type.Array(Type.String({ minLength: 1 }), { maxItems: 32 }),
77
+ };
78
+
79
+ export const clientInfoSchema = Type.Object({
80
+ id: Type.String(),
81
+ ...clientDescription,
82
+ }, { additionalProperties: false });
83
+
84
+ const absolutePath = Type.String({ minLength: 1, description: "Absoluter Pfad im gebundenen Ordner" });
85
+
86
+ /** Die eine Operation, die der Server auf dem Arbeitsplatz ruft; Bash-Ausgabe meldet sie als Fortschritt mit { text }. */
87
+ export const workspaceClientContracts = {
88
+ execute: defineOperation({
89
+ id: "ragents.workspace.client.execute",
90
+ description: "Ein Arbeitsplatz-Werkzeug auf dem Arbeitsplatz ausführen; das Ergebnis ist der Wert des Werkzeugs, Ausgabe kommt als Fortschritt { text }.",
91
+ implementedBy: "client",
92
+ input: Type.Object({
93
+ runId: Type.String({ minLength: 1, maxLength: 64, description: "Kennung des Runs" }),
94
+ tool: Type.String({ minLength: 1, maxLength: 64, description: "Name des Werkzeugs, etwa read, bash oder roslyn_open" }),
95
+ toolCallId: Type.String({ minLength: 1, maxLength: 200 }),
96
+ cwd: absolutePath,
97
+ env: Type.Record(Type.String(), Type.String(), { description: "Was der Server beiträgt: Run-Marker und Git-Regeln der Sandbox" }),
98
+ input: Type.Unknown({ description: "Die Eingabe des Werkzeugs" }),
99
+ }, { additionalProperties: false }),
100
+ result: Type.Object({ value: Type.Unknown() }, { additionalProperties: false }),
101
+ }),
102
+ } as const;
103
+
104
+ export const workspaceClientProgressSchema = Type.Object({ text: Type.String() }, { additionalProperties: false });
105
+
106
+ const browseTarget = {
107
+ runId: Type.String({ minLength: 1, maxLength: 64, description: "Kennung des Runs" }),
108
+ root: Type.Union([Type.Literal("workspace"), Type.Literal("files")]),
109
+ path: Type.String({ description: "Pfad unterhalb der Wurzel; leer ist die Wurzel selbst" }),
110
+ };
111
+
112
+ /** Die Anmeldung eines Arbeitsplatzes bindet die aufrufende Verbindung; über sie ruft der Server zurück. */
113
+ export const workspaceContracts = {
114
+ browse: {
115
+ list: defineOperation({
116
+ id: "ragents.workspace.browse.list",
117
+ description: "Ein Verzeichnis im Arbeitsverzeichnis oder in der Dateiablage eines Runs auflisten.",
118
+ rights: ["runs.read", "runs.inspect"],
119
+ input: Type.Object(browseTarget, { additionalProperties: false }),
120
+ result: openJson<BrowseListing>("BrowseListing"),
121
+ }),
122
+ preview: defineOperation({
123
+ id: "ragents.workspace.browse.preview",
124
+ description: "Eine Datei als Text vorschauen; zu große und binäre Dateien nennen stattdessen den Grund.",
125
+ rights: ["runs.read", "runs.inspect"],
126
+ input: Type.Object(browseTarget, { additionalProperties: false }),
127
+ result: openJson<BrowsePreview>("BrowsePreview"),
128
+ }),
129
+ },
130
+ channels: {
131
+ browse: defineChannel({
132
+ id: "ragents.workspace.browse",
133
+ description: "Meldet jede Änderung unterhalb der beobachteten Wurzel eines Runs.",
134
+ rights: ["runs.read", "runs.inspect"],
135
+ params: Type.Object({ runId: browseTarget.runId, root: browseTarget.root }, { additionalProperties: false }),
136
+ message: Type.Object({ changed: Type.Literal(true) }, { additionalProperties: false }),
137
+ }),
138
+ },
139
+ clients: {
140
+ list: defineOperation({
141
+ id: "ragents.workspace.clients.list",
142
+ description: "Angemeldete Arbeitsplätze mit Verbindungsstand.",
143
+ rights: ["runs.read"],
144
+ input: Type.Object({}, { additionalProperties: false }),
145
+ result: Type.Array(clientInfoSchema),
146
+ }),
147
+ register: defineOperation({
148
+ id: "ragents.workspace.clients.register",
149
+ description: "Einen Arbeitsplatz anmelden oder seine Ordner erneuern; die Verbindung dieser Anfrage wird sein Rückweg und braucht einen Ereignisstrom.",
150
+ rights: ["runs.write"],
151
+ input: Type.Object({ id: clientId, ...clientDescription, executor: executorVersion }, { additionalProperties: false }),
152
+ result: clientInfoSchema,
153
+ }),
154
+ unregister: defineOperation({
155
+ id: "ragents.workspace.clients.unregister",
156
+ description: "Einen Arbeitsplatz abmelden; offene Aufträge scheitern.",
157
+ rights: ["runs.write"],
158
+ input: Type.Object({ id: clientId }, { additionalProperties: false }),
159
+ result: Type.Null(),
160
+ }),
161
+ },
162
+ } as const;
163
+
164
+ export const isWorkspaceBinding = (value: unknown): value is WorkspaceBinding => {
165
+ if (typeof value !== "object" || value === null) return false;
166
+ const raw = value as Record<string, unknown>;
167
+ if (raw.kind === "fresh") return true;
168
+ if (raw.kind === "path") return typeof raw.path === "string" && raw.path.length > 0;
169
+ if (raw.kind === "client") {
170
+ return typeof raw.client === "string" && WORKSPACE_CLIENT_ID_PATTERN.test(raw.client)
171
+ && typeof raw.label === "string" && typeof raw.path === "string" && raw.path.length > 0;
172
+ }
173
+ return false;
174
+ };
175
+
176
+ export const workspaceBindingSummary = (binding: WorkspaceBinding): string => {
177
+ switch (binding.kind) {
178
+ case "fresh": return "Leerer Ordner je Run";
179
+ case "path": return binding.path;
180
+ case "client": return `${binding.label}: ${binding.path}`;
181
+ }
182
+ };
@@ -0,0 +1,14 @@
1
+ # Working environment
2
+
3
+ Your working directory belongs to this conversation. A system note at the start says where it is:
4
+
5
+ - A private empty folder: no other conversation sees it, and it starts empty unless the profile has
6
+ prepared content in it.
7
+ - A project folder the user chose, on the server or on the user's own workplace: it is the user's
8
+ real project. Work inside it, keep its structure, and never delete or reorganize files unless asked.
9
+
10
+ Rules:
11
+
12
+ - Reads and writes are allowed only inside the working directory and the run's file store.
13
+ - Remote git operations (push, fetch, pull) and global git configuration are not allowed.
14
+ - No network access from `bash`; use only the tools explicitly provided.
@@ -0,0 +1,92 @@
1
+ import { statSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { Type } from "typebox";
4
+ import { DomainError, type JsonValue, type RunState, type StartOptionContribution } from "@aicontainer/ragents";
5
+ import { shellPlatformChapter } from "@aicontainer/server/plugin-support/shell-platform.js";
6
+ import { storedStartOption } from "@aicontainer/server/ragents/start-option-state.js";
7
+ import {
8
+ isWorkspaceBinding,
9
+ WORKSPACE_BINDING_OPTION_ID,
10
+ workspaceBindingSummary,
11
+ type WorkspaceBinding,
12
+ type WorkspaceBindingPresentation,
13
+ type WorkspaceSessionMetadata,
14
+ } from "../contract.js";
15
+ import type { WorkspaceClientRegistry } from "./clients.js";
16
+
17
+ const bindingSchema = Type.Union([
18
+ Type.Object({ kind: Type.Literal("fresh") }, { additionalProperties: false }),
19
+ Type.Object({ kind: Type.Literal("path"), path: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
20
+ Type.Object({
21
+ kind: Type.Literal("client"),
22
+ client: Type.String({ minLength: 8, maxLength: 64 }),
23
+ label: Type.String(),
24
+ path: Type.String({ minLength: 1 }),
25
+ }, { additionalProperties: false }),
26
+ ]);
27
+
28
+ const insideFolder = (folder: string, candidate: string): boolean => {
29
+ const separator = folder.includes("\\") ? "\\" : "/";
30
+ const root = folder.endsWith(separator) ? folder.slice(0, -separator.length) : folder;
31
+ return candidate === root || candidate.startsWith(root + separator);
32
+ };
33
+
34
+ export const bindingOf = (state: RunState | null): WorkspaceBinding => {
35
+ const stored = storedStartOption(state, WORKSPACE_BINDING_OPTION_ID);
36
+ if (stored === undefined) return { kind: "fresh" };
37
+ if (!isWorkspaceBinding(stored)) throw new Error(`Die gespeicherte Arbeitsbereich-Bindung ist ungültig: ${JSON.stringify(stored)}`);
38
+ return stored;
39
+ };
40
+
41
+ /** Der Ordner auf dem Serverrechner, an den der Run gebunden ist; `fresh` und `client` liegen nicht dort. */
42
+ export const boundServerDirectory = (state: RunState | null): string | null => {
43
+ const binding = bindingOf(state);
44
+ return binding.kind === "path" ? binding.path : null;
45
+ };
46
+
47
+ /** Ein vorhandener Ordner dieses Servers als Bindung; dieselbe Prüfung wie beim Wählen der Startoption. */
48
+ export const serverDirectoryBinding = (directory: string): Extract<WorkspaceBinding, { kind: "path" }> => {
49
+ if (!path.isAbsolute(directory)) throw new DomainError("workspace-path-relative", "Der Ordner muss ein absoluter Pfad sein.", 400);
50
+ const resolved = path.resolve(directory);
51
+ if (!statSync(resolved, { throwIfNoEntry: false })?.isDirectory()) {
52
+ throw new DomainError("workspace-path-missing", `Der Ordner ${resolved} existiert auf dem Server nicht.`, 400);
53
+ }
54
+ return { kind: "path", path: resolved };
55
+ };
56
+
57
+ /** Die Bash eines Runs läuft auf dem Executor seiner Bindung; der Prompt nennt deshalb dessen Plattform, nicht die des Servers. */
58
+ export const executorShellChapter = (registry: WorkspaceClientRegistry, binding: WorkspaceBinding): string => {
59
+ if (binding.kind !== "client") return shellPlatformChapter(process.platform);
60
+ const client = registry.info(binding.client);
61
+ return client
62
+ ? shellPlatformChapter(client.platform as NodeJS.Platform)
63
+ : `## Shell platform\n\nThe workstation ${binding.label} that holds this project is not registered right now, `
64
+ + "so the platform of its shell is unknown; the workspace tools fail until it connects again.";
65
+ };
66
+
67
+ export const sessionMetadataOf = (state: RunState | null): WorkspaceSessionMetadata => {
68
+ const binding = bindingOf(state);
69
+ return { binding, summary: workspaceBindingSummary(binding) };
70
+ };
71
+
72
+ export const workspaceBindingOption = (registry: WorkspaceClientRegistry): StartOptionContribution => ({
73
+ id: WORKSPACE_BINDING_OPTION_ID,
74
+ schema: bindingSchema,
75
+ selectable: () => true,
76
+ defaultValue: () => ({ kind: "fresh" }),
77
+ accept: (value) => {
78
+ if (!isWorkspaceBinding(value)) throw new DomainError("workspace-binding-invalid", "Die Arbeitsbereich-Bindung hat kein gültiges Format.", 400);
79
+ if (value.kind === "fresh") return { kind: "fresh" };
80
+ if (value.kind === "path") return serverDirectoryBinding(value.path);
81
+ const client = registry.info(value.client);
82
+ if (!client) throw new DomainError("workspace-client-disconnected", `Der Arbeitsplatz ${value.label || value.client} ist nicht verbunden.`, 409);
83
+ if (!client.folders.some((folder) => insideFolder(folder, value.path))) {
84
+ throw new DomainError("workspace-client-folder", `Der Arbeitsplatz ${client.label} bietet den Ordner ${value.path} nicht an.`, 400);
85
+ }
86
+ return { kind: "client", client: client.id, label: client.label, path: value.path };
87
+ },
88
+ describe: () => {
89
+ const presentation: WorkspaceBindingPresentation = { kind: "workspace-binding", clients: registry.list() };
90
+ return presentation as unknown as JsonValue;
91
+ },
92
+ });
@@ -0,0 +1,134 @@
1
+ import { watch } from "node:fs";
2
+ import { lstat, readdir, readFile, realpath } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import {
5
+ DomainError,
6
+ implement,
7
+ implementChannel,
8
+ type ChannelContribution,
9
+ type MethodContribution,
10
+ } from "@aicontainer/ragents";
11
+ import {
12
+ BROWSE_ENTRY_LIMIT,
13
+ BROWSE_PREVIEW_LIMIT,
14
+ workspaceContracts,
15
+ type BrowseEntry,
16
+ type BrowseListing,
17
+ type BrowsePreview,
18
+ type BrowseRoot,
19
+ } from "../contract.js";
20
+
21
+ const invalid = (message: string): DomainError => new DomainError("browse-path-invalid", message, 400);
22
+
23
+ const relativeOf = (value: string): string => {
24
+ const segments = value.split("/").filter((segment) => segment !== "");
25
+ if (value.includes("\0") || value.includes("\\") || path.isAbsolute(value)
26
+ || segments.some((segment) => segment === "." || segment === "..")) {
27
+ throw invalid("Ungültiger Pfad");
28
+ }
29
+ return segments.join("/");
30
+ };
31
+
32
+ const realOf = async (target: string, missing: string): Promise<string> => {
33
+ try {
34
+ return await realpath(target);
35
+ } catch {
36
+ throw new DomainError("browse-not-found", missing, 404);
37
+ }
38
+ };
39
+
40
+ const resolveInside = async (root: string, relative: string): Promise<string> => {
41
+ const rootReal = await realOf(root, "Der Lauf hat dieses Verzeichnis nicht");
42
+ const real = await realOf(
43
+ relative ? path.join(rootReal, relative) : rootReal,
44
+ `Nicht gefunden: ${relative || "."}`,
45
+ );
46
+ if (real !== rootReal && !real.startsWith(rootReal + path.sep)) throw invalid("Ungültiger Pfad");
47
+ return real;
48
+ };
49
+
50
+ const entryOf = async (directory: string, name: string, isDirectory: boolean): Promise<BrowseEntry> => {
51
+ const info = await lstat(path.join(directory, name));
52
+ return {
53
+ name,
54
+ kind: isDirectory ? "directory" : "file",
55
+ size: info.size,
56
+ modifiedAt: info.mtime.toISOString(),
57
+ };
58
+ };
59
+
60
+ const byKindThenName = (left: BrowseEntry, right: BrowseEntry): number =>
61
+ (left.kind === right.kind ? 0 : left.kind === "directory" ? -1 : 1)
62
+ || left.name.localeCompare(right.name, "de");
63
+
64
+ const listingOf = async (root: string, relative: string, kind: BrowseRoot): Promise<BrowseListing> => {
65
+ const directory = await resolveInside(root, relative);
66
+ if (!(await lstat(directory)).isDirectory()) throw invalid(`Kein Verzeichnis: ${relative || "."}`);
67
+ const found = await readdir(directory, { withFileTypes: true });
68
+ const entries = (await Promise.all(found.map((entry) => entryOf(directory, entry.name, entry.isDirectory()))))
69
+ .sort(byKindThenName);
70
+ return {
71
+ root: kind,
72
+ location: root,
73
+ path: relative,
74
+ entries: entries.slice(0, BROWSE_ENTRY_LIMIT),
75
+ truncated: entries.length > BROWSE_ENTRY_LIMIT,
76
+ };
77
+ };
78
+
79
+ const previewOf = async (root: string, relative: string, kind: BrowseRoot): Promise<BrowsePreview> => {
80
+ const file = await resolveInside(root, relative);
81
+ const info = await lstat(file);
82
+ if (!info.isFile()) throw invalid(`Keine Datei: ${relative || "."}`);
83
+ const described = { root: kind, path: relative, size: info.size };
84
+ if (info.size > BROWSE_PREVIEW_LIMIT) {
85
+ return {
86
+ ...described,
87
+ previewable: false,
88
+ reason: `Die Datei ist größer als ${BROWSE_PREVIEW_LIMIT / 1024} KB und wird nicht angezeigt`,
89
+ };
90
+ }
91
+ const content = await readFile(file);
92
+ if (content.includes(0)) return { ...described, previewable: false, reason: "Die Datei ist binär" };
93
+ return { ...described, previewable: true, content: content.toString("utf8") };
94
+ };
95
+
96
+ export interface BrowseOptions {
97
+ rootFor: (runId: string, root: BrowseRoot) => Promise<string>;
98
+ ensureSession: (runId: string) => void;
99
+ }
100
+
101
+ export const createBrowseMethods = (options: BrowseOptions): MethodContribution[] => [
102
+ implement(workspaceContracts.browse.list, async ({ runId, root, path: target }) => {
103
+ options.ensureSession(runId);
104
+ return listingOf(await options.rootFor(runId, root), relativeOf(target), root);
105
+ }),
106
+ implement(workspaceContracts.browse.preview, async ({ runId, root, path: target }) => {
107
+ options.ensureSession(runId);
108
+ return previewOf(await options.rootFor(runId, root), relativeOf(target), root);
109
+ }),
110
+ ];
111
+
112
+ export const createBrowseChannel = (options: BrowseOptions): ChannelContribution =>
113
+ implementChannel(workspaceContracts.channels.browse, async ({ runId, root }, emit) => {
114
+ options.ensureSession(runId);
115
+ const directory = await options.rootFor(runId, root);
116
+ let debounce: NodeJS.Timeout | undefined;
117
+ const changed = () => {
118
+ if (debounce) return;
119
+ debounce = setTimeout(() => {
120
+ debounce = undefined;
121
+ emit({ changed: true });
122
+ }, 150);
123
+ };
124
+ let watcher: ReturnType<typeof watch> | undefined;
125
+ try {
126
+ watcher = watch(directory, { recursive: true }, changed);
127
+ watcher.on("error", changed);
128
+ } catch {
129
+ }
130
+ return () => {
131
+ if (debounce) clearTimeout(debounce);
132
+ watcher?.close();
133
+ };
134
+ });
@@ -0,0 +1,161 @@
1
+ import { Value } from "typebox/value";
2
+ import {
3
+ DomainError,
4
+ RPC_ERROR_CODES,
5
+ RpcError,
6
+ implement,
7
+ type AccessContext,
8
+ type MethodConnection,
9
+ type MethodContribution,
10
+ } from "@aicontainer/ragents";
11
+ import {
12
+ WORKSPACE_EXECUTOR_VERSION,
13
+ WORKSPACE_STOP_OPERATION,
14
+ sandboxRunEnvironment,
15
+ type WorkspaceExecuteOptions,
16
+ type WorkspaceExecutor,
17
+ } from "@aicontainer/workspace-executor";
18
+ import {
19
+ workspaceClientContracts,
20
+ workspaceClientProgressSchema,
21
+ workspaceContracts,
22
+ type WorkspaceClientDescription,
23
+ type WorkspaceClientInfo,
24
+ } from "../contract.js";
25
+
26
+ interface ClientEntry {
27
+ info: WorkspaceClientInfo;
28
+ owner: string | null;
29
+ connection: MethodConnection;
30
+ release: () => void;
31
+ }
32
+
33
+ /** Die einzige Grenze gegen einen hängenden Arbeitsplatz; seine eigenen Zeitgrenzen hat der Executor. */
34
+ const CLIENT_TIMEOUT_MS = 15 * 60 * 1000;
35
+
36
+ export const ownerOf = (access: AccessContext): string | null => access.user?.id ?? null;
37
+
38
+ const progressOf = (label: string, value: unknown): string => {
39
+ if (!Value.Check(workspaceClientProgressSchema, value)) throw new Error(`Der Arbeitsplatz ${label} hat keine gültige Ausgabe geliefert`);
40
+ return value.text;
41
+ };
42
+
43
+ const timeoutFor = (input: unknown): number =>
44
+ CLIENT_TIMEOUT_MS + ((input as { timeout?: number } | null | undefined)?.timeout ?? 0) * 1000;
45
+
46
+ /** Bricht die Verbindung mitten im Aufruf, muss die Ursache den Arbeitsplatz nennen, nicht den Server. */
47
+ const withClientCause = (cause: unknown, label: string): unknown => {
48
+ if (!(cause instanceof RpcError)) return cause;
49
+ if (cause.code === RPC_ERROR_CODES.connectionClosed) {
50
+ return new DomainError("workspace-client-disconnected", `Der Arbeitsplatz ${label} hat die Verbindung verloren: ${cause.message}`, 409);
51
+ }
52
+ if (cause.code === RPC_ERROR_CODES.timeout) {
53
+ return new DomainError("workspace-client-timeout", `Der Arbeitsplatz ${label} hat nicht geantwortet: ${cause.message}`, 504);
54
+ }
55
+ return cause;
56
+ };
57
+
58
+ /** Kennt die angemeldeten Arbeitsplätze und hält je Client die Verbindung, über die der Server ihn zurückruft. */
59
+ export class WorkspaceClientRegistry {
60
+ readonly #clients = new Map<string, ClientEntry>();
61
+
62
+ async register(
63
+ id: string,
64
+ description: WorkspaceClientDescription,
65
+ executor: string,
66
+ connection: MethodConnection,
67
+ ): Promise<WorkspaceClientInfo> {
68
+ if (connection.streamless) {
69
+ throw new DomainError("stream-required", "Die Anmeldung eines Arbeitsplatzes braucht einen Ereignisstrom.", 409);
70
+ }
71
+ if (executor !== WORKSPACE_EXECUTOR_VERSION) {
72
+ throw new DomainError(
73
+ "workspace-executor-version",
74
+ `Der Arbeitsplatz ${description.label} bringt den Executor ${executor} mit, der Server verlangt ${WORKSPACE_EXECUTOR_VERSION}.`,
75
+ 409,
76
+ );
77
+ }
78
+ const owner = connection.userId;
79
+ const existing = this.#clients.get(id);
80
+ if (existing && existing.owner !== owner) {
81
+ throw new DomainError("workspace-client-foreign", `Der Arbeitsplatz ${id} gehört einem anderen Benutzer.`, 403);
82
+ }
83
+ existing?.release();
84
+ const info: WorkspaceClientInfo = { ...description, id };
85
+ const release = connection.onClose(() => this.#disconnected(id, connection));
86
+ this.#clients.set(id, { info, owner, connection, release });
87
+ return info;
88
+ }
89
+
90
+ /** Nach einer Trennung steht kein Eintrag mehr; eine Abmeldung ohne Eintrag ist deshalb kein Fehler. */
91
+ unregister(id: string, owner: string | null): void {
92
+ const entry = this.#clients.get(id);
93
+ if (!entry) return;
94
+ if (entry.owner !== owner) throw new DomainError("workspace-client-foreign", `Der Arbeitsplatz ${id} gehört einem anderen Benutzer.`, 403);
95
+ entry.release();
96
+ this.#clients.delete(id);
97
+ }
98
+
99
+ list(): WorkspaceClientInfo[] {
100
+ return [...this.#clients.values()].map((entry) => entry.info);
101
+ }
102
+
103
+ info(id: string): WorkspaceClientInfo | undefined {
104
+ return this.#clients.get(id)?.info;
105
+ }
106
+
107
+ /** Der Executor eines gebundenen Runs: dieselbe Schnittstelle wie im Server, nur über die Verbindung des Arbeitsplatzes. */
108
+ executorFor(id: string, label: string, cwd: string): WorkspaceExecutor {
109
+ const connection = (): MethodConnection => {
110
+ const entry = this.#clients.get(id);
111
+ if (!entry) throw new DomainError("workspace-client-disconnected", `Der Arbeitsplatz ${label} ist nicht verbunden.`, 409);
112
+ return entry.connection;
113
+ };
114
+ const call = async (runId: string, tool: string, input: unknown, options: WorkspaceExecuteOptions): Promise<unknown> => {
115
+ try {
116
+ const { value } = await connection().call(
117
+ workspaceClientContracts.execute,
118
+ { runId, tool, toolCallId: options.toolCallId ?? tool, cwd, env: sandboxRunEnvironment(runId), input },
119
+ {
120
+ ...(options.signal ? { signal: options.signal } : {}),
121
+ timeoutMs: timeoutFor(input),
122
+ ...(options.onProgress ? { onProgress: (progress: unknown) => options.onProgress!(progressOf(label, progress)) } : {}),
123
+ },
124
+ );
125
+ return value;
126
+ } catch (cause) {
127
+ throw withClientCause(cause, label);
128
+ }
129
+ };
130
+ return {
131
+ version: WORKSPACE_EXECUTOR_VERSION,
132
+ execute: (runId, tool, input, options = {}) => call(runId, tool, input, options),
133
+ stopRun: async (runId) => {
134
+ if (!this.#clients.has(id)) return;
135
+ await call(runId, WORKSPACE_STOP_OPERATION, null, {});
136
+ },
137
+ shutdown: async () => undefined,
138
+ };
139
+ }
140
+
141
+ shutdown(): void {
142
+ for (const entry of this.#clients.values()) entry.release();
143
+ this.#clients.clear();
144
+ }
145
+
146
+ /** Ein getrennter Arbeitsplatz verlässt die Registry; eine spätere Anmeldung über eine neue Verbindung bleibt stehen. */
147
+ #disconnected(id: string, connection: MethodConnection): void {
148
+ if (this.#clients.get(id)?.connection !== connection) return;
149
+ this.#clients.delete(id);
150
+ }
151
+ }
152
+
153
+ export const clientMethods = (registry: WorkspaceClientRegistry): MethodContribution[] => [
154
+ implement(workspaceContracts.clients.list, () => registry.list()),
155
+ implement(workspaceContracts.clients.register, ({ id, executor, ...description }, { connection }) =>
156
+ registry.register(id, description, executor, connection)),
157
+ implement(workspaceContracts.clients.unregister, ({ id }, { access }) => {
158
+ registry.unregister(id, ownerOf(access));
159
+ return null;
160
+ }),
161
+ ];
@@ -0,0 +1,91 @@
1
+ import path from "node:path";
2
+ import { DomainError, type JsonValue, type RAgentsPlugin, type RunState } from "@aicontainer/ragents";
3
+ import { documentStoreToken } from "@aicontainer/server/ragents/document-store.js";
4
+ import { workspaceResolverToken, workspaceRuntimeToken } from "@aicontainer/server/ragents/workspace-runtime.js";
5
+ import { sandboxServicesToken } from "@aicontainer/server/plugin-support/workspace-sandbox-host.js";
6
+ import {
7
+ runtimeProviderToken,
8
+ sessionGuardToken,
9
+ sessionWorkspaceProviderToken,
10
+ } from "@aicontainer/server/ragents/host-services.js";
11
+ import { pluginAssetPath } from "@aicontainer/server/plugin-support/asset-path.js";
12
+ import type { PluginModule } from "@aicontainer/server/plugin-support/plugin-module.js";
13
+ import { handlebarsPrompt } from "@aicontainer/server/plugin-support/prompt.js";
14
+ import { shellPlatformPrompt } from "@aicontainer/server/plugin-support/shell-platform.js";
15
+ import { startOptionScope } from "@aicontainer/server/ragents/start-option-state.js";
16
+ import { WORKSPACE_BINDING_OPTION_ID, WORKSPACE_METADATA_ID, type BrowseRoot } from "../contract.js";
17
+ import { bindingOf, executorShellChapter, sessionMetadataOf, workspaceBindingOption } from "./binding.js";
18
+ import { createBrowseChannel, createBrowseMethods } from "./browse-route.js";
19
+ import { clientMethods, WorkspaceClientRegistry } from "./clients.js";
20
+ import { RunWorkspaceRuntime } from "./runtime.js";
21
+
22
+ const promptFile = pluginAssetPath(import.meta.url, "../prompt.hbs");
23
+
24
+ const ragentsWorkspacePlugin = (skillPaths: () => Promise<readonly string[]>): RAgentsPlugin => ({
25
+ manifest: { id: "ragents.workspace" },
26
+ register: (host) => {
27
+ const sessionWorkspaceFor = host.service(sessionWorkspaceProviderToken);
28
+ const orchestration = host.service(runtimeProviderToken);
29
+ const runState = (runId: string): RunState | null => {
30
+ try {
31
+ return orchestration().state(runId);
32
+ } catch (error) {
33
+ if (error instanceof DomainError && error.code === "run-not-found") return null;
34
+ throw error;
35
+ }
36
+ };
37
+ const documentsFor = (runId: string): Promise<string | undefined> =>
38
+ host.optionalService(documentStoreToken)?.directoryFor(runId) ?? Promise.resolve(undefined);
39
+ const documentsRoot = async (runId: string): Promise<string> => {
40
+ const directory = await documentsFor(runId);
41
+ if (!directory) throw new Error("In diesem Profil gibt es keine Dateiablage; das Plugin ragents.documents fehlt");
42
+ return directory;
43
+ };
44
+ const clients = new WorkspaceClientRegistry();
45
+ const runtime = new RunWorkspaceRuntime({
46
+ clients,
47
+ globalDirectory: host.storage.root(),
48
+ sessionDirectory: (runId, ...segments) => host.storage.session(runId, ...segments),
49
+ sessionsDirectoryPattern: path.join(host.storage.sessionsRoot, "{runId}", "plugins", host.manifest.id),
50
+ sessionWorkspaceFor,
51
+ skillPaths,
52
+ resolver: () => host.optionalService(workspaceResolverToken),
53
+ runState,
54
+ storeBinding: (runId, binding) => {
55
+ const state = orchestration().state(runId);
56
+ orchestration().replacePluginState(
57
+ { actorId: state.ownerId, commandId: `workspace-binding:${runId}:${state.revision}` },
58
+ runId,
59
+ { pluginId: WORKSPACE_BINDING_OPTION_ID, scope: startOptionScope, state: binding as unknown as JsonValue },
60
+ );
61
+ },
62
+ });
63
+ host.provide(workspaceRuntimeToken, runtime);
64
+ host.provide(sandboxServicesToken, runtime.sandbox);
65
+ host.functions(runtime.sandbox.workspaceTools());
66
+ host.prompts(
67
+ handlebarsPrompt("ragents.workspace.prompt", 100, promptFile),
68
+ shellPlatformPrompt("ragents.workspace.shell.prompt", 102, (runId) => executorShellChapter(clients, bindingOf(runState(runId)))),
69
+ );
70
+ const browseOptions = {
71
+ ensureSession: host.service(sessionGuardToken),
72
+ rootFor: (runId: string, root: BrowseRoot) => root === "files"
73
+ ? documentsRoot(runId)
74
+ : sessionWorkspaceFor(runId).then((workspace) => workspace.currentRoot()),
75
+ };
76
+ host.methods(...createBrowseMethods(browseOptions), ...clientMethods(clients));
77
+ host.channels(createBrowseChannel(browseOptions));
78
+ host.startOptions(workspaceBindingOption(clients));
79
+ host.sessionMetadata({ id: WORKSPACE_METADATA_ID, describe: ({ runId }) => sessionMetadataOf(runState(runId)) });
80
+ host.lifecycle({
81
+ id: "ragents.workspace.lifecycle",
82
+ stopSession: ({ runId }) => runtime.stopSession(runId),
83
+ deleteSession: ({ runId }) => runtime.deleteSession(runId),
84
+ shutdown: () => runtime.shutdown(),
85
+ });
86
+ },
87
+ });
88
+
89
+ export const plugin: PluginModule = {
90
+ create: (host) => ragentsWorkspacePlugin(() => host.skills.global()),
91
+ };