@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,185 @@
1
+ export type Role = "user" | "assistant" | "thinking" | "tool" | "system" | "question";
2
+
3
+ export interface ChatAttachmentInput {
4
+ name: string;
5
+ mediaType: string;
6
+ data: string;
7
+ }
8
+
9
+ export interface ChatAttachment {
10
+ name: string;
11
+ mediaType: string;
12
+ size: number;
13
+ url: string;
14
+ }
15
+
16
+ export interface ChatAttachmentCapabilities {
17
+ input: readonly string[];
18
+ model: string;
19
+ }
20
+
21
+ export interface ToolInfo {
22
+ id: string;
23
+ name: string;
24
+ arguments: string;
25
+ result?: string;
26
+ isError?: boolean;
27
+ }
28
+
29
+ export interface ChatTextCursor {
30
+ conversationId: string;
31
+ sequence: number;
32
+ /** Accumulated non-whitespace UTF-16 units in the turn anchored by sequence. */
33
+ offset: number;
34
+ }
35
+
36
+ export interface ChatJournalCursor {
37
+ conversationId: string;
38
+ eventId: string;
39
+ sequence: number;
40
+ }
41
+
42
+ /** Eine Rückfrage des Assistenten. `answer` gesetzt heißt: beantwortet, die Karte ist nur noch Beleg. */
43
+ export interface Question {
44
+ callId: string;
45
+ options: string[];
46
+ multi?: boolean;
47
+ answer?: string;
48
+ }
49
+
50
+ export interface Message {
51
+ key: string;
52
+ role: Role;
53
+ /** Absenderkennung für die Darstellung; unabhängig von Rolle und Sprechblasenlabel. */
54
+ sender?: string;
55
+ text: string;
56
+ textCursor?: ChatTextCursor;
57
+ closed?: boolean;
58
+ attachments?: ChatAttachment[];
59
+ tool?: ToolInfo;
60
+ question?: Question;
61
+ /** ISO-Zeitpunkt der Nachricht; Anzeige optional (ChatMessages showTimestamps). */
62
+ at?: string;
63
+ /** Farbige Sprechblase statt Fliesstext, z.B. fuer Mehrparteien-Gespraeche. */
64
+ bubble?: { color: string; side: "start" | "end"; label?: string };
65
+ }
66
+
67
+ export interface ChatStartupStatus {
68
+ status: "preparing" | "failed";
69
+ message: string;
70
+ }
71
+
72
+ export type ChatEvent =
73
+ | { kind: "reset"; reason?: "conversation-reset"; conversationId: string | null }
74
+ | { kind: "replay-end"; conversationId: string | null }
75
+ | { kind: "user"; text: string; at?: string; attachments?: ChatAttachment[] }
76
+ | { kind: "text"; delta: string; at?: string; cursor: ChatTextCursor }
77
+ | { kind: "thinking"; delta: string; at?: string }
78
+ | { kind: "tool"; id: string; name: string; arguments: string; label?: string; at?: string }
79
+ | { kind: "tool-result"; id: string; result: string; isError?: boolean }
80
+ | { kind: "question"; callId: string; text: string; options: string[]; multi?: boolean; at?: string }
81
+ | { kind: "question-answered"; callId: string; answer: string }
82
+ | { kind: "system"; text: string; at?: string }
83
+ | { kind: "status"; running: boolean; startup?: ChatStartupStatus }
84
+ | { kind: "turn-done" }
85
+ | { kind: "extension"; pluginId: string; type: string; payload?: unknown; at?: string; journal?: ChatJournalCursor };
86
+
87
+ function openMessageIndex(messages: Message[]): number {
88
+ for (let index = messages.length - 1; index >= 0; index--) {
89
+ const message = messages[index];
90
+ if (!message.closed && (message.role === "assistant" || message.role === "thinking")) return index;
91
+ }
92
+ return -1;
93
+ }
94
+
95
+ function closeOpen(messages: Message[]): Message[] {
96
+ const index = openMessageIndex(messages);
97
+ if (index === -1) {
98
+ return messages;
99
+ }
100
+ return messages.map((message, position) => position === index ? { ...message, closed: true } : message);
101
+ }
102
+
103
+ function appendDelta(messages: Message[], role: Role, delta: string, at?: string, textCursor?: ChatTextCursor): Message[] {
104
+ const index = openMessageIndex(messages);
105
+ const current = messages[index];
106
+ if (current && current.role === role
107
+ && current.textCursor?.conversationId === textCursor?.conversationId
108
+ && current.textCursor?.sequence === textCursor?.sequence) {
109
+ return messages.map((message, position) => position === index
110
+ ? { ...message, text: message.text + delta, ...(textCursor ? { textCursor } : {}) }
111
+ : message);
112
+ }
113
+ return [...closeOpen(messages), { key: crypto.randomUUID(), role, text: delta, at, ...(textCursor ? { textCursor } : {}) }];
114
+ }
115
+
116
+ /** Eingehende Nachrichten lassen den laufenden Ausgabeblock offen. */
117
+ export function applyEvent(messages: Message[], event: ChatEvent): Message[] {
118
+ switch (event.kind) {
119
+ case "reset":
120
+ return [];
121
+ case "user":
122
+ return [...messages, { key: crypto.randomUUID(), role: "user", text: event.text, closed: true, at: event.at,
123
+ ...(event.attachments?.length ? { attachments: event.attachments } : {}) }];
124
+ case "text":
125
+ return appendDelta(messages, "assistant", event.delta, event.at, event.cursor);
126
+ case "thinking":
127
+ return appendDelta(messages, "thinking", event.delta, event.at);
128
+ case "tool":
129
+ return [
130
+ ...closeOpen(messages),
131
+ {
132
+ key: crypto.randomUUID(),
133
+ role: "tool",
134
+ text: event.label ?? event.name,
135
+ closed: true,
136
+ tool: { id: event.id, name: event.name, arguments: event.arguments },
137
+ at: event.at,
138
+ },
139
+ ];
140
+ case "tool-result":
141
+ return messages.map((message) =>
142
+ message.tool?.id === event.id
143
+ ? { ...message, tool: { ...message.tool, result: event.result, isError: event.isError } }
144
+ : message,
145
+ );
146
+ case "question":
147
+ return [
148
+ ...closeOpen(messages),
149
+ {
150
+ key: crypto.randomUUID(),
151
+ role: "question",
152
+ text: event.text,
153
+ closed: true,
154
+ question: { callId: event.callId, options: event.options, multi: event.multi },
155
+ at: event.at,
156
+ },
157
+ ];
158
+ case "question-answered":
159
+ return messages.map((message) =>
160
+ message.question?.callId === event.callId
161
+ ? { ...message, question: { ...message.question, answer: event.answer } }
162
+ : message,
163
+ );
164
+ case "system":
165
+ return [...closeOpen(messages), { key: crypto.randomUUID(), role: "system", text: event.text, closed: true, at: event.at }];
166
+ case "turn-done":
167
+ return closeOpen(messages);
168
+ default:
169
+ return messages;
170
+ }
171
+ }
172
+
173
+ export function prettyJson(value: string): string {
174
+ try {
175
+ return JSON.stringify(JSON.parse(value), null, 2);
176
+ } catch {
177
+ return value;
178
+ }
179
+ }
180
+
181
+ export function compactToolLine(tool: ToolInfo): string {
182
+ const args = tool.arguments.replace(/\s+/g, " ").trim();
183
+ const line = args && args !== "{}" ? `${tool.name} ${args}` : tool.name;
184
+ return line.length > 160 ? `${line.slice(0, 160)} ...` : line;
185
+ }
@@ -0,0 +1,37 @@
1
+ /** Die Verträge der Unterhaltungen, gegen die Kernmethoden und Auslieferung arbeiten. */
2
+ import type { ChatAttachment, ChatAttachmentInput, ChatEvent } from "./chat-events.js";
3
+ import type { ActorConversations } from "./ragents/actor-chat-history.js";
4
+
5
+ export interface SessionInfo {
6
+ id: string;
7
+ title: string;
8
+ createdAt?: number;
9
+ updatedAt: number;
10
+ revision?: number;
11
+ }
12
+
13
+ export interface ChatUser {
14
+ id: string;
15
+ label: string;
16
+ }
17
+
18
+ /** Was der HTTP-Adapter von einer Unterhaltung braucht. */
19
+ export interface ChatSessionLike {
20
+ readonly running: boolean;
21
+ subscribe(listener: (event: ChatEvent) => void): () => void;
22
+ send(text: string, attachments?: ChatAttachmentInput[], userLocation?: unknown, user?: ChatUser): void | Promise<void>;
23
+ sendToActor?(actorId: string, text: string, attachments?: ChatAttachmentInput[]): Promise<void>;
24
+ actorConversations?(): ActorConversations;
25
+ capabilities?(actor?: string): Promise<{ input: string[]; model: string }>;
26
+ attachment?(artifactId: string): { attachment: ChatAttachment; content: Uint8Array };
27
+ start(entryId: string, input: unknown, user?: ChatUser): void;
28
+ stop(): void | Promise<void>;
29
+ }
30
+
31
+ export interface ChatSessionProvider {
32
+ get(id: string): Promise<ChatSessionLike>;
33
+ hasRun?(id: string): boolean;
34
+ list(): Promise<SessionInfo[]>;
35
+ subscribeList?(listener: () => void): () => void;
36
+ delete(id: string): Promise<void>;
37
+ }
@@ -0,0 +1,80 @@
1
+ import type { hostConfigDescriptors } from "./config.js";
2
+
3
+ export interface EnvironmentReference {
4
+ readonly kind: "environment";
5
+ readonly name: string;
6
+ }
7
+
8
+ const ENVIRONMENT_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
9
+
10
+ export const env = (name: string): EnvironmentReference => {
11
+ if (!ENVIRONMENT_NAME.test(name)) {
12
+ throw new Error(`env("${name}") nennt keinen gültigen Namen einer Umgebungsvariablen`);
13
+ }
14
+ return { kind: "environment", name };
15
+ };
16
+
17
+ export const isEnvironmentReference = (value: unknown): value is EnvironmentReference =>
18
+ typeof value === "object" && value !== null && (value as EnvironmentReference).kind === "environment";
19
+
20
+ export interface ProvisionedReference {
21
+ readonly kind: "provisioned";
22
+ readonly plugin: string;
23
+ readonly path: string;
24
+ }
25
+
26
+ const PLUGIN_ID = /^[a-z0-9]+(?:[.-][a-z0-9]+)*$/;
27
+
28
+ /** Eine Datei im Werkzeugordner eines Plugins; beim Laden der Profildatei wird daraus ein absoluter Pfad. */
29
+ export const provisioned = (plugin: string, file: string): ProvisionedReference => {
30
+ if (!PLUGIN_ID.test(plugin)) {
31
+ throw new Error(`provisioned("${plugin}", ...) nennt keine gültige Plugin-Kennung`);
32
+ }
33
+ if (!file || file.split("/").some((segment) => segment === "" || segment === "." || segment === "..")) {
34
+ throw new Error(`provisioned("${plugin}", "${file}") braucht einen relativen Pfad im Werkzeugordner`);
35
+ }
36
+ return { kind: "provisioned", plugin, path: file };
37
+ };
38
+
39
+ export const isProvisionedReference = (value: unknown): value is ProvisionedReference =>
40
+ typeof value === "object" && value !== null && (value as ProvisionedReference).kind === "provisioned";
41
+
42
+ export interface ProfileAnonymousUser {
43
+ readonly id: string;
44
+ readonly label?: string;
45
+ readonly rights: readonly string[];
46
+ readonly startEntries?: readonly string[];
47
+ }
48
+
49
+ export interface ProfileUser extends ProfileAnonymousUser {
50
+ readonly password: string | EnvironmentReference;
51
+ /** Dauerhafter Bearer-Token für Clients ohne Anmeldedialog; nur als env(...), nie im Klartext. */
52
+ readonly token?: EnvironmentReference;
53
+ }
54
+
55
+ export type ConfigValue = string | number | boolean | readonly string[] | EnvironmentReference | ProvisionedReference;
56
+
57
+ type Descriptors = readonly { readonly key: string }[];
58
+
59
+ type SecretKeyOf<T extends Descriptors> = T[number] extends infer Descriptor
60
+ ? Descriptor extends { readonly secret: true; readonly key: infer Key } ? Key : never
61
+ : never;
62
+
63
+ type Section<T extends Descriptors> = {
64
+ readonly [Key in T[number]["key"]]?: Key extends SecretKeyOf<T> ? EnvironmentReference : ConfigValue;
65
+ };
66
+
67
+ // Der Kern kennt keine Plugin-IDs: welche Sektion und welcher Schlüssel gültig ist, entscheidet die
68
+ // Laufzeitprüfung gegen die Deklarationen der geladenen Plugins.
69
+ export type PluginSection = {
70
+ readonly [key: `${string}_PAT`]: EnvironmentReference | undefined;
71
+ readonly [key: `${string}_KEY`]: EnvironmentReference | undefined;
72
+ readonly [key: `${string}_TOKEN`]: EnvironmentReference | undefined;
73
+ readonly [key: `${string}_SECRET`]: EnvironmentReference | undefined;
74
+ readonly [key: `${string}_PASSWORD`]: EnvironmentReference | undefined;
75
+ readonly [key: string]: ConfigValue | undefined;
76
+ };
77
+
78
+ export type RAgentsConfig =
79
+ & { readonly host?: Section<typeof hostConfigDescriptors> }
80
+ & { readonly [pluginId: string]: PluginSection | undefined };
@@ -0,0 +1,324 @@
1
+ import { statSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { pluginToolsDirectory } from "@aicontainer/workspace-executor/src/tools.ts";
5
+ import { isAccessRight, type AccessUser } from "../../../packages/ragents/src/access.js";
6
+ import {
7
+ isEnvironmentReference,
8
+ isProvisionedReference,
9
+ type ConfigValue,
10
+ type EnvironmentReference,
11
+ type ProvisionedReference,
12
+ type RAgentsConfig,
13
+ } from "./config-definition.js";
14
+ import { defaultDataDirectory } from "./data-directory.js";
15
+ import { isPluginPath, pluginFolderFor } from "./plugin-support/plugins-root.js";
16
+
17
+ const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../..");
18
+
19
+ export const SECRET_KEY_PATTERN = /(_PAT|_KEY|_TOKEN|_SECRET|_PASSWORD)$/;
20
+ const ENVIRONMENT_PLACEHOLDER = /^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/;
21
+
22
+ interface ConfigFileEntry {
23
+ section: string;
24
+ key: string;
25
+ value: string;
26
+ viaReference: boolean;
27
+ overriddenByEnvironment: boolean;
28
+ }
29
+
30
+ interface LoadedConfigFile {
31
+ path: string;
32
+ entries: readonly ConfigFileEntry[];
33
+ users: readonly ResolvedProfileUser[] | undefined;
34
+ anonymousUser: AccessUser | undefined;
35
+ }
36
+
37
+ export interface ResolvedProfileUser extends AccessUser {
38
+ readonly password: string;
39
+ readonly token?: string;
40
+ }
41
+
42
+ const MIN_TOKEN_LENGTH = 16;
43
+ const MAX_TOKEN_LENGTH = 512;
44
+
45
+ const resolveUserToken = (
46
+ location: string,
47
+ raw: unknown,
48
+ environment: Readonly<Record<string, string | undefined>>,
49
+ ): string | undefined => {
50
+ if (raw === undefined) return undefined;
51
+ if (!isEnvironmentReference(raw) || typeof raw.name !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(raw.name)) {
52
+ throw new Error(`${location}.token braucht env("ENV_NAME"); ein Token steht nie im Klartext in der Profildatei`);
53
+ }
54
+ const token = environment[raw.name];
55
+ if (!token) throw new Error(`${location}.token verweist auf die nicht gesetzte oder leere Umgebungsvariable ${raw.name}`);
56
+ // $ und ! sind tabu, weil der Verbraucher den Token als API-Schlüssel mit Vorlagen- und Befehlssyntax auswertet.
57
+ if (token.length < MIN_TOKEN_LENGTH || token.length > MAX_TOKEN_LENGTH || !/^[\x21-\x7e]+$/.test(token) || /[$!]/.test(token)) {
58
+ throw new Error(`${location}.token (${raw.name}) braucht ${MIN_TOKEN_LENGTH} bis ${MAX_TOKEN_LENGTH} druckbare ASCII-Zeichen ohne Leerzeichen, $ und !`);
59
+ }
60
+ return token;
61
+ };
62
+
63
+ const resolveIdentity = (location: string, entry: Record<string, unknown>): AccessUser => {
64
+ if (typeof entry.id !== "string" || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/.test(entry.id)) {
65
+ throw new Error(`${location}.id braucht 1 bis 64 Zeichen: Buchstaben, Ziffern, Punkt, Unterstrich oder Bindestrich`);
66
+ }
67
+ if (entry.label !== undefined && (typeof entry.label !== "string" || !entry.label.trim() || entry.label.length > 120)) {
68
+ throw new Error(`${location}.label braucht 1 bis 120 Zeichen`);
69
+ }
70
+ if (!Array.isArray(entry.rights) || !entry.rights.every(isAccessRight)) {
71
+ throw new Error(`${location}.rights braucht gültige Rechte als Strings oder "*" für alle Rechte`);
72
+ }
73
+ if (new Set(entry.rights).size !== entry.rights.length) throw new Error(`${location}.rights enthält doppelte Rechte`);
74
+ if (entry.startEntries !== undefined && (!Array.isArray(entry.startEntries)
75
+ || !entry.startEntries.every((id) => typeof id === "string" && /^[a-zA-Z0-9][a-zA-Z0-9._:-]*$/.test(id))
76
+ || new Set(entry.startEntries).size !== entry.startEntries.length)) {
77
+ throw new Error(`${location}.startEntries braucht eindeutige Einstiegkennungen als Strings`);
78
+ }
79
+ return Object.freeze({
80
+ id: entry.id,
81
+ label: entry.label?.trim() ?? entry.id,
82
+ rights: Object.freeze([...entry.rights]),
83
+ ...(entry.startEntries ? { startEntries: Object.freeze([...entry.startEntries as string[]]) } : {}),
84
+ });
85
+ };
86
+
87
+ export const resolveAnonymousUser = (source: string, raw: unknown): AccessUser | undefined => {
88
+ if (raw === undefined) return undefined;
89
+ const location = `${source}: anonymousUser`;
90
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${location} ist kein Benutzer`);
91
+ const entry = raw as Record<string, unknown>;
92
+ if (Object.keys(entry).some((key) => !["id", "label", "rights", "startEntries"].includes(key))) {
93
+ throw new Error(`${location} erlaubt nur id, label, rights und startEntries`);
94
+ }
95
+ return resolveIdentity(location, entry);
96
+ };
97
+
98
+ export const resolveProfileUsers = (
99
+ source: string,
100
+ raw: unknown,
101
+ environment: Readonly<Record<string, string | undefined>> = process.env,
102
+ ): readonly ResolvedProfileUser[] | undefined => {
103
+ if (raw === undefined) return undefined;
104
+ if (!Array.isArray(raw) || raw.length === 0) {
105
+ throw new Error(`${source}: users muss eine nicht leere Liste sein; ohne users ist die Anmeldung ausgeschaltet`);
106
+ }
107
+ const ids = new Set<string>();
108
+ const tokens = new Map<string, string>();
109
+ return raw.map((value: unknown, index: number) => {
110
+ const location = `${source}: users[${index}]`;
111
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${location} ist kein Benutzer`);
112
+ const entry = value as Record<string, unknown>;
113
+ if (Object.keys(entry).some((key) => !["id", "label", "password", "token", "rights", "startEntries"].includes(key))) {
114
+ throw new Error(`${location} erlaubt nur id, label, password, token, rights und startEntries`);
115
+ }
116
+ const user = resolveIdentity(location, entry);
117
+ if (ids.has(user.id)) throw new Error(`${location}.id ist doppelt: ${user.id}`);
118
+ ids.add(user.id);
119
+ if (typeof entry.password !== "string" && (!isEnvironmentReference(entry.password)
120
+ || typeof entry.password.name !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(entry.password.name))) {
121
+ throw new Error(`${location}.password braucht einen Text oder env("ENV_NAME")`);
122
+ }
123
+ const password = typeof entry.password === "string" ? entry.password : environment[entry.password.name];
124
+ if (!password || password.length > 2048) throw new Error(`${location}.password fehlt, ist leer oder länger als 2048 Zeichen`);
125
+ const token = resolveUserToken(location, entry.token, environment);
126
+ if (token !== undefined) {
127
+ const other = tokens.get(token);
128
+ if (other) throw new Error(`${location}.token ist derselbe wie bei Benutzer ${other}; jeder Token gehört genau einem Benutzer`);
129
+ tokens.set(token, user.id);
130
+ }
131
+ return Object.freeze({ ...user, password, ...(token !== undefined ? { token } : {}) });
132
+ });
133
+ };
134
+
135
+ export const listFromEnvironmentValue = (value: string): readonly string[] | undefined => {
136
+ if (!value.startsWith("[")) return undefined;
137
+ const parsed = JSON.parse(value) as unknown;
138
+ if (!Array.isArray(parsed) || parsed.some((entry) => typeof entry !== "string")) {
139
+ throw new Error(`Der Wert ${value} sieht aus wie eine Liste, ist aber keine Liste von Strings`);
140
+ }
141
+ return parsed as string[];
142
+ };
143
+
144
+ const materialize = (value: Exclude<ConfigValue, EnvironmentReference | ProvisionedReference>): string => {
145
+ if (typeof value === "string") return value;
146
+ if (typeof value === "number") return String(value);
147
+ if (typeof value === "boolean") return value ? "1" : "0";
148
+ return JSON.stringify(value);
149
+ };
150
+
151
+ /** Der Datenordner des Hosts, in dessen tools/ die Provisionierung ihre Werkzeuge legt. */
152
+ const dataDirectoryOf = (source: string, raw: RAgentsConfig): string => {
153
+ const configured = raw.host?.DATA_DIR;
154
+ if (isEnvironmentReference(configured) && process.env[configured.name] === undefined) {
155
+ throw new Error(`${source}: host.DATA_DIR verweist auf die nicht gesetzte Umgebungsvariable ${configured.name}`);
156
+ }
157
+ const fromFile = isEnvironmentReference(configured) ? process.env[configured.name] : typeof configured === "string" ? configured : undefined;
158
+ const profile = process.env.PRODUCT_PROFILE;
159
+ if (!profile) throw new Error(`${source}: ohne PRODUCT_PROFILE gibt es keinen Datenordner und damit keinen Werkzeugordner`);
160
+ return path.resolve(process.env.DATA_DIR ?? fromFile ?? defaultDataDirectory(profile));
161
+ };
162
+
163
+ const entryFor = (source: string, section: string, key: string, value: ConfigValue, dataDirectory: () => string): ConfigFileEntry => {
164
+ const overriddenByEnvironment = process.env[key] !== undefined;
165
+ if (isProvisionedReference(value)) {
166
+ const file = path.join(pluginToolsDirectory(dataDirectory(), value.plugin), ...value.path.split("/"));
167
+ return { section, key, value: file, viaReference: false, overriddenByEnvironment };
168
+ }
169
+ if (isEnvironmentReference(value)) {
170
+ const resolved = process.env[value.name];
171
+ if (resolved === undefined) {
172
+ throw new Error(
173
+ `${source}: ${section}.${key} verweist mit env("${value.name}") auf eine Umgebungsvariable, `
174
+ + `die in dieser Shell nicht gesetzt ist. Setze sie vor dem Start (export ${value.name}=...) oder `
175
+ + "hinterlege sie in der Startdatei Deiner Shell; Secrets stehen nie in der Konfigurationsdatei.");
176
+ }
177
+ return { section, key, value: resolved, viaReference: true, overriddenByEnvironment };
178
+ }
179
+ if (typeof value === "string" && ENVIRONMENT_PLACEHOLDER.test(value)) {
180
+ throw new Error(
181
+ `${source}: ${section}.${key} steht als Text "${value}" in der Konfiguration; `
182
+ + `eine Referenz auf die Umgebung wird als env("...") geschrieben`);
183
+ }
184
+ if (SECRET_KEY_PATTERN.test(key)) {
185
+ throw new Error(
186
+ `${source}: ${section}.${key} ist ein Secret und darf nicht im Klartext in der Konfiguration stehen; `
187
+ + `per Umgebungsvariable setzen oder als env("ENV_NAME") referenzieren`);
188
+ }
189
+ return { section, key, value: materialize(value), viaReference: false, overriddenByEnvironment };
190
+ };
191
+
192
+ const parseEntries = (source: string, raw: RAgentsConfig): readonly ConfigFileEntry[] => {
193
+ const sections = Object.entries(raw) as readonly [string, Readonly<Record<string, ConfigValue>>][];
194
+ let resolved: string | undefined;
195
+ const dataDirectory = (): string => resolved ??= dataDirectoryOf(source, raw);
196
+ const entries: ConfigFileEntry[] = [];
197
+ for (const [section, sectionValue] of sections) {
198
+ for (const [key, value] of Object.entries(sectionValue)) {
199
+ entries.push(entryFor(source, section, key, value, dataDirectory));
200
+ }
201
+ }
202
+ const byKey = new Map<string, ConfigFileEntry>();
203
+ for (const entry of entries) {
204
+ const existing = byKey.get(entry.key);
205
+ if (existing && existing.value !== entry.value) {
206
+ throw new Error(
207
+ `${source}: ${entry.key} steht in ${existing.section} und ${entry.section} mit unterschiedlichen Werten`);
208
+ }
209
+ byKey.set(entry.key, entry);
210
+ }
211
+ return entries;
212
+ };
213
+
214
+ const PROFILE_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
215
+
216
+ export const profileFileName = (profile: string): string => `ragents.config.${profile}.ts`;
217
+
218
+ /** The profile file lives in the repository root or wherever PRODUCT_PROFILE_FILE points; its name carries the profile. */
219
+ export const profileFilePath = (root: string, environment: Readonly<Record<string, string | undefined>> = process.env): string | undefined => {
220
+ const profile = environment.PRODUCT_PROFILE;
221
+ if (!profile) return undefined;
222
+ if (!PROFILE_NAME.test(profile)) throw new Error(`PRODUCT_PROFILE ist kein gültiger Profilname: ${profile}`);
223
+ const file = environment.PRODUCT_PROFILE_FILE;
224
+ if (!file) return path.join(root, profileFileName(profile));
225
+ const source = path.resolve(file);
226
+ if (path.basename(source) !== profileFileName(profile)) {
227
+ throw new Error(`PRODUCT_PROFILE_FILE ${source} passt nicht zum Profil ${profile}; erwartet wird ${profileFileName(profile)}`);
228
+ }
229
+ if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`Die Profildatei ${source} fehlt`);
230
+ return source;
231
+ };
232
+
233
+ const withPluginPaths = (source: string, raw: RAgentsConfig): RAgentsConfig => {
234
+ const plugins = raw.host?.PLUGINS;
235
+ if (!Array.isArray(plugins)) return raw;
236
+ const resolved = plugins.map((entry) => isPluginPath(entry) ? pluginFolderFor(entry, path.dirname(source)) : entry);
237
+ return { ...raw, host: { ...raw.host, PLUGINS: resolved } };
238
+ };
239
+
240
+ const readProfileConfiguration = async (root: string): Promise<LoadedConfigFile | undefined> => {
241
+ const source = profileFilePath(root);
242
+ if (!source || !statSync(source, { throwIfNoEntry: false })?.isFile()) return undefined;
243
+ const module = await import(pathToFileURL(source).href) as Record<string, unknown>;
244
+ const loadedConfig = module.config;
245
+ if (typeof loadedConfig !== "object" || loadedConfig === null) {
246
+ throw new Error(`${source} exportiert keine Konstante config mit den Konfigurationssektionen`);
247
+ }
248
+ const raw = withPluginPaths(source, loadedConfig as RAgentsConfig);
249
+ const users = resolveProfileUsers(source, module.users);
250
+ const anonymousUser = resolveAnonymousUser(source, module.anonymousUser);
251
+ if (users && anonymousUser) throw new Error(`${source}: users und anonymousUser schließen einander aus`);
252
+ return { path: source, entries: parseEntries(source, raw), users, anonymousUser };
253
+ };
254
+
255
+ let loadedConfigFile: LoadedConfigFile | undefined;
256
+ let loadCompleted = false;
257
+
258
+ export const loadConfigFile = async (root = rootDir): Promise<void> => {
259
+ if (loadCompleted) throw new Error("Die Konfiguration wurde bereits geladen");
260
+ loadedConfigFile = await readProfileConfiguration(root);
261
+ loadCompleted = true;
262
+ if (!loadedConfigFile) return;
263
+ let applied = 0;
264
+ for (const entry of loadedConfigFile.entries) {
265
+ if (entry.overriddenByEnvironment) continue;
266
+ process.env[entry.key] = entry.value;
267
+ applied++;
268
+ }
269
+ const overridden = loadedConfigFile.entries.length - applied;
270
+ console.log(`Konfiguration ${loadedConfigFile.path} geladen `
271
+ + `(${applied} Werte übernommen, ${overridden} durch Umgebung überstimmt)`);
272
+ };
273
+
274
+ export const configFilePath = (): string | null => loadedConfigFile?.path ?? null;
275
+
276
+ export const configuredUsers = (): readonly ResolvedProfileUser[] | undefined => loadedConfigFile?.users;
277
+
278
+ export const configuredAnonymousUser = (): AccessUser | undefined => loadedConfigFile?.anonymousUser;
279
+
280
+ export interface ConfigFileValidationContext {
281
+ hostKeys: readonly string[];
282
+ knownPluginIds: readonly string[];
283
+ activePluginIds: readonly string[];
284
+ declaredKeysFor: (pluginId: string) => readonly string[];
285
+ secretKeys: readonly string[];
286
+ }
287
+
288
+ export const validateConfigFileSections = (context: ConfigFileValidationContext): void => {
289
+ if (!loadCompleted) throw new Error("Die Konfiguration muss vor ihrer Prüfung geladen werden");
290
+ if (!loadedConfigFile) return;
291
+ const source = loadedConfigFile.path;
292
+ const known = new Set(context.knownPluginIds);
293
+ const active = new Set(context.activePluginIds);
294
+ const secret = new Set(context.secretKeys);
295
+ for (const section of new Set(loadedConfigFile.entries.map((entry) => entry.section))) {
296
+ if (section === "host") continue;
297
+ if (!known.has(section)) {
298
+ throw new Error(`${source}: unbekannte Sektion ${section}; bekannt sind host, ${[...known].join(", ")}`);
299
+ }
300
+ if (!active.has(section)) {
301
+ console.log(`Konfiguration: Sektion ${section} gehört zu einem inaktiven Plugin und wird ignoriert`);
302
+ }
303
+ }
304
+ for (const entry of loadedConfigFile.entries) {
305
+ if (secret.has(entry.key) && !entry.viaReference) {
306
+ throw new Error(
307
+ `${source}: ${entry.section}.${entry.key} ist als Secret deklariert und darf nicht im Klartext `
308
+ + `in der Konfiguration stehen; per Umgebungsvariable setzen oder als env("ENV_NAME") referenzieren`);
309
+ }
310
+ if (entry.section === "host") {
311
+ if (!context.hostKeys.includes(entry.key)) {
312
+ throw new Error(`${source}: host.${entry.key} ist kein Host-Schlüssel; erlaubt sind ${context.hostKeys.join(", ")}`);
313
+ }
314
+ continue;
315
+ }
316
+ if (!active.has(entry.section)) continue;
317
+ const declared = context.declaredKeysFor(entry.section);
318
+ if (!declared.includes(entry.key)) {
319
+ throw new Error(
320
+ `${source}: ${entry.section}.${entry.key} ist für dieses Plugin nicht deklariert; `
321
+ + (declared.length > 0 ? `deklariert sind ${declared.join(", ")}` : "das Plugin deklariert keine Schlüssel"));
322
+ }
323
+ }
324
+ };
@@ -0,0 +1,46 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { declaredEnvironment } from "./plugin-support/plugin-config.js";
4
+ import { defaultDataDirectory } from "./data-directory.js";
5
+
6
+ const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../..");
7
+
8
+ export const hostConfigDescriptors = [
9
+ { key: "PORT", source: "environment" },
10
+ { key: "DATA_DIR", source: "environment" },
11
+ { key: "WEB_DIST_DIR", source: "environment" },
12
+ { key: "AGENT_THINKING", source: "environment" },
13
+ { key: "AGENT_HOME_DIR", source: "environment" },
14
+ { key: "COMPACTION_PROVIDER", source: "environment" },
15
+ { key: "COMPACTION_MODEL", source: "environment" },
16
+ { key: "PRODUCT_PROFILE", source: "environment" },
17
+ { key: "PLUGINS", source: "environment" },
18
+ { key: "PRODUCT_ID", source: "environment" },
19
+ { key: "PRODUCT_TITLE", source: "environment" },
20
+ { key: "RAGENTS_BASH_TIMEOUT_SECONDS", source: "environment" },
21
+ { key: "ACCESS_TOKEN", source: "environment", secret: true },
22
+ ] as const;
23
+
24
+ export const hostConfigKeys: readonly string[] = hostConfigDescriptors.map((descriptor) => descriptor.key);
25
+
26
+ export const HOST_SECRET_ENV_NAMES: readonly string[] = hostConfigDescriptors
27
+ .filter((descriptor) => "secret" in descriptor && descriptor.secret)
28
+ .map((descriptor) => descriptor.key);
29
+
30
+ const env = declaredEnvironment(hostConfigDescriptors);
31
+
32
+ export const config = Object.freeze({
33
+ port: Number(env.value("PORT", "4710")),
34
+ dataDir: path.resolve(env.value("DATA_DIR", defaultDataDirectory(env.required("PRODUCT_PROFILE")))),
35
+ webDistDir: path.resolve(env.value("WEB_DIST_DIR", path.join(rootDir, "apps/web/dist", env.required("PRODUCT_PROFILE")))),
36
+ agentThinking: env.value("AGENT_THINKING", "high"),
37
+ agentHomeDir: path.resolve(env.value("AGENT_HOME_DIR", path.join(rootDir, "apps/server/agent-home"))),
38
+ compactionProvider: env.value("COMPACTION_PROVIDER", "openrouter"),
39
+ compactionModel: env.value("COMPACTION_MODEL", ""),
40
+ productProfile: env.required("PRODUCT_PROFILE"),
41
+ productId: env.required("PRODUCT_ID"),
42
+ productTitle: env.required("PRODUCT_TITLE"),
43
+ plugins: env.list("PLUGINS"),
44
+ });
45
+
46
+ export type Config = typeof config;