@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,79 @@
1
+ ## Actor programs
2
+
3
+ Inspect types with `typescript_api`; call `context.functions` in `typescript_eval` or an actor
4
+ program. Use snippets for one-time work, programs for persistent state, later inputs or views.
5
+
6
+ Actors can own TypeScript functions, journaled state and React views. An LLM actor still uses
7
+ its model for ActorInputs; a TypeScript actor can handle them with `onInput`. Calling a function
8
+ from a view executes that function directly and does not start a model turn.
9
+
10
+ 1. Create the closest template with `actor_program_create`; read and reuse its package, contract,
11
+ implementation, view and tests under `@actors/<name>/`. Language servers use that alias;
12
+ Bash uses `$RAGENTS_ACTORS_DIR/<name>/`.
13
+ 2. Edit with ordinary file tools; preserve imports and structure. Changed errors arrive before
14
+ model requests; `actor_program_diagnostics` returns the full last check.
15
+ 3. Adapt meaningful `node:test` cases in `tests/**/*.test.ts`. Query `actor_program_controls`
16
+ for unclear props. Templates demonstrate controls; pure views need no server function.
17
+ 4. `actor_program_activate` typechecks, builds, tests and activates. Fix errors and reactivate.
18
+ List, removal and visibility have separate functions.
19
+
20
+ Published functions enter the shared API in the same turn. Inspect with `typescript_api`, call
21
+ `context.functions.<name>(input)`. Reactivation updates the contract; removal withdraws it.
22
+ Native tool exposure is optional and explicit.
23
+
24
+ Use `actor: "self"` or `actor: "@handle"` to bind to an existing actor. Without a binding, a
25
+ backend creates a TypeScript actor with the program name; a pure view uses the calling actor.
26
+ Reactivation preserves the existing binding. Do not create a dummy actor for a pure view.
27
+ An LLM actor cannot receive an `onInput` backend; its inputs remain model work. Each actor owns
28
+ one active program package; add further functions and views to that package.
29
+
30
+ `package.json` contains `name`, `private: true`, `type: "module"` and `ragents` metadata:
31
+ `title`, optional `description`, optional `backend`, and optional `views`. Each view has an
32
+ `id`, `client`, optional `title`, `styles`, `width` and `height`. At least a backend or a view
33
+ is required. The host supplies the HTML root and fixed local dependencies.
34
+
35
+ Import `defineActor` from `@ragents/server` and `Type` from `typebox`. Its contract contains
36
+ `state`, `functions` and optional `input: { capabilities }`. Each function declares `label`,
37
+ `input`, `output` and optional `capabilities`; `tool: { name, targets?, card? }` exposes the same
38
+ function in the shared API. Omitted targets mean all active executable actors; `self` means the owner.
39
+ Export `defineActor(contract, { functions: { ... }, onInput? })` as default. Callbacks receive
40
+ `(input, context)`; returned values are results. Only `context.state.replace` changes actor state.
41
+ The state schema must accept the initial `{}`. `context.actor` identifies the owning actor.
42
+ Server code calls run functions through `context.functions`; declared `capabilities` select the
43
+ functions it needs. An `onInput` acts as its actor. A function owns that actor's state but calls
44
+ run functions as its caller. A subscription therefore belongs to the caller; initialize an
45
+ actor's own event handling through its `onInput`. Snippets act as their caller.
46
+
47
+ Import React and `createRoot` normally. Import `context` and `useAppState` from `@ragents/client`
48
+ and controls from `@ragents/client/ui`: shadcn/ui components (`Button`, `Select`, `Tabs`, `Dialog`,
49
+ `Badge`, `Input`, `Table`, ...) with their usual props, plus `Form`, `DataTable`, `FilePicker`,
50
+ `AppLayout`, `Stack`, `Grid` and chat. Icons: `lucide-react`; Tailwind works.
51
+ The hook reads actor state; `context.capabilities.call`
52
+ calls its declared functions. Local drafts remain React state. A real chat binds to the owning
53
+ actor through `context.actor.handle`; sending a chat message deliberately starts its next turn.
54
+ Use `AppLayout` for title, description, content and actions, `Stack` for spacing or rows,
55
+ and `Grid` for columns responsive to frame width. `AppLayout fill` needs a height-constrained
56
+ parent: content scrolls while header and actions remain visible. Mount in the supplied `#root`.
57
+ The host supplies fonts, box sizing, page size, scrolling and outer padding. Do not reset
58
+ `html`, `body` or `#root`, or add outer padding; style only content.
59
+ Use `Form` for labeled inputs and interview steps, `type: "textarea"` for long answers.
60
+ It handles layout, validation and async `onSubmit`. Keep progression in app state; avoid fixed
61
+ field heights and absolute form layouts. Where Form does not fit, use `Input`, `Textarea`,
62
+ `Field` and `Label`. Do not duplicate control colors, borders or fonts.
63
+ Share steps, prompts and freedoms via `defineWorkflow` from `@ragents/workflow`.
64
+ Compose prompts with `workflowInstructions` and server-only `readPrompt` from
65
+ `@ragents/workflow/prompts`. Render `UI.WorkflowDiagram` with definition, state and label;
66
+ The actor enforces completion and extensions; see learning-afternoon.
67
+ Use `FlowDiagram` for other graphs (star layout, fit, actions). Keep local IDs stable.
68
+ See `controls`. For custom SVG use `SvgEdge`, Tailwind utilities, responsive `viewBox` and
69
+ accessible descriptions.
70
+ Address view visibility with `package-name/view-key`, `@handle/view-key` or a unique title;
71
+ canvas nodes and lines use the same names with the `app:` prefix.
72
+ The host controls resizing, collapse and full view. Views appear on the canvas; owner cards
73
+ start hidden but remain in the Actors list. Personal actor visibility is separate from
74
+ `actor_view_set_visibility` and cannot be changed by layouts.
75
+
76
+ Tests call `program.functions.<name>(input, context)` or `program.onInput(input, context)`.
77
+ `createTestContext` from `@ragents/server/testing` supplies state and explicit typed `functions` mocks.
78
+ Inspect results and `context.state.read()` separately. Subscription delivery is an ActorInput;
79
+ `onInput` uses the same state and function API as the actor's functions.
@@ -0,0 +1,31 @@
1
+ import { ToolRegistry, type RunFunction, type ExecutableActor, type PluginHost } from "@aicontainer/ragents";
2
+ import { runtimeProviderToken, sessionWorkspaceProviderToken } from "@aicontainer/server/ragents/host-services.js";
3
+
4
+ export const agentToolsFrom = (host: PluginHost) =>
5
+ async (runId: string, actorId: string, provisional?: ExecutableActor): Promise<readonly RunFunction[]> => {
6
+ const runtime = host.service(runtimeProviderToken)();
7
+ const view = runtime.view(runId);
8
+ const actor = provisional ?? view.actors.find((candidate) => candidate.id === actorId);
9
+ if (!actor || actor.kind === "human" || actor.lifecycle.kind === "stopped") {
10
+ throw new Error(`${actorId} bezeichnet keinen aktiven Agenten in diesem Run.`);
11
+ }
12
+ const registry = new ToolRegistry();
13
+ host.tools.entries().forEach((contributor) => registry.register(contributor));
14
+ const workspace = await host.service(sessionWorkspaceProviderToken)(runId);
15
+ const tools = await registry.resolve({
16
+ runId,
17
+ actorId,
18
+ turnId: null,
19
+ actor,
20
+ view: provisional ? {...view,actors:[...view.actors,provisional]} : view,
21
+ workspace: workspace.cwd,
22
+ });
23
+ if (actor.toolNames === null) return tools;
24
+ const availableNames = new Set(tools.map((tool) => tool.name));
25
+ const unknown = actor.toolNames.filter((name) => !availableNames.has(name));
26
+ if (unknown.length > 0) {
27
+ throw new Error(`Actor ${actorId} verlangt unbekannte Werkzeuge: ${unknown.join(", ")}.`);
28
+ }
29
+ const selected = new Set(actor.toolNames);
30
+ return tools.filter((tool) => selected.has(tool.name));
31
+ };
@@ -0,0 +1,284 @@
1
+ import { createRequire } from "node:module";
2
+ import { fileURLToPath } from "node:url";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { mkdir, readFile, readdir, realpath, symlink, writeFile } from "node:fs/promises";
5
+ import path from "node:path";
6
+ import { build } from "esbuild";
7
+ import ts from "typescript";
8
+ import { Type, type Static } from "typebox";
9
+ import { Value } from "typebox/value";
10
+ import { canonicalHash, typeScriptTypesFromSchema, type NativeTypeScriptExecutor, type RunCapabilityDescriptor, scriptStdDeclarations } from "@aicontainer/ragents";
11
+ import { runtimeLibraries, webRuntimeLibraries } from "./runtime-libraries.js";
12
+
13
+ const webRequire = createRequire(new URL("../../../apps/web/package.json", import.meta.url));
14
+ const rootRequire = createRequire(new URL("../../../package.json", import.meta.url));
15
+ const serverRequire = createRequire(new URL("../../../apps/server/package.json", import.meta.url));
16
+ const serverTypeRoot = fileURLToPath(new URL("../../../apps/server/node_modules/@types", import.meta.url));
17
+ const libraryDirectory = (name: string): string => {
18
+ const resolver = (webRuntimeLibraries as readonly string[]).includes(name) ? webRequire
19
+ : name === "@types/node" || name === "tsx" ? serverRequire : rootRequire;
20
+ try { return path.dirname(resolver.resolve(`${name}/package.json`)); }
21
+ catch (error) {
22
+ if ((error as NodeJS.ErrnoException).code !== "ERR_PACKAGE_PATH_NOT_EXPORTED") throw error;
23
+ let directory = path.dirname(resolver.resolve(name));
24
+ while (directory !== path.dirname(directory)) {
25
+ const file = path.join(directory, "package.json");
26
+ if (existsSync(file) && (JSON.parse(readFileSync(file, "utf8")) as { name?: string }).name === name) return directory;
27
+ directory = path.dirname(directory);
28
+ }
29
+ throw new Error(`Das installierte Paket ${name} besitzt keine Paketmetadaten.`);
30
+ }
31
+ };
32
+ const json = (value: unknown): string => `${JSON.stringify(value, null, 2)}\n`;
33
+ const link = async (source: string, target: string): Promise<void> => {
34
+ await mkdir(path.dirname(target), { recursive: true });
35
+ await symlink(source, target).catch(async (error: NodeJS.ErrnoException) => {
36
+ if (error.code !== "EEXIST") throw error;
37
+ if (await realpath(target) !== await realpath(source)) throw new Error(`Die vorbereitete Bibliothek ${target} hat einen anderen Ursprung.`);
38
+ });
39
+ };
40
+ export const prepareAppDependencies = async (directory: string): Promise<void> => {
41
+ await mkdir(directory, { recursive: true });
42
+ for (const name of runtimeLibraries) await link(libraryDirectory(name), path.join(directory, "node_modules", name));
43
+ for (const [name, library, executable] of [["tsc", "typescript", "bin/tsc"], ["tsx", "tsx", "dist/cli.mjs"], ["esbuild", "esbuild", "bin/esbuild"]])
44
+ await link(path.join(libraryDirectory(library!), executable!), path.join(directory, "node_modules/.bin", name!));
45
+ };
46
+
47
+ export const prepareAppWorkspace = async (directory: string): Promise<string> => {
48
+ await prepareAppDependencies(directory);
49
+ const dependencies = Object.fromEntries(runtimeLibraries.map((name) => [name, `link:${libraryDirectory(name)}`]));
50
+ await writeFile(path.join(directory, "package.json"), json({ name: "run-actor-workspace", private: true, type: "module", dependencies }));
51
+ await writeFile(path.join(directory, "pnpm-workspace.yaml"), "packages:\n - actors/*\n");
52
+ await mkdir(path.join(directory, "actors"), { recursive: true });
53
+ const apps = await readdir(path.join(directory, "actors"), { withFileTypes: true });
54
+ const importers = {
55
+ ".": { dependencies: Object.fromEntries(Object.entries(dependencies).map(([name, specifier]) => [name, { specifier, version: specifier }])) },
56
+ ...Object.fromEntries(apps.filter((entry) => entry.isDirectory()).map((entry) => [`actors/${entry.name}`, {}])),
57
+ };
58
+ await writeFile(path.join(directory, "pnpm-lock.yaml"), json({ lockfileVersion: "9.0", settings: { autoInstallPeers: true, excludeLinksFromLockfile: false }, importers }));
59
+ await writeFile(path.join(directory, "tsconfig.json"), json({ files: [], references: [] }));
60
+ return path.join(directory, "actors");
61
+ };
62
+
63
+ const schema = Type.Record(Type.String(), Type.Any());
64
+ const actionSchema = Type.Object({
65
+ label: Type.String({ minLength: 1 }), description: Type.Optional(Type.String()),
66
+ input: schema, output: schema,
67
+ capabilities: Type.Optional(Type.Array(Type.String(), { uniqueItems: true })),
68
+ confirmation: Type.Optional(Type.String()),
69
+ tool: Type.Optional(Type.Object({ name: Type.String(), targets: Type.Optional(Type.Array(Type.String(), { minItems: 1 })), card: Type.Optional(Type.Boolean()) }, { additionalProperties: false })),
70
+ }, { additionalProperties: false });
71
+ export const appContractSchema = Type.Object({
72
+ state: schema, functions: Type.Record(Type.String(), actionSchema),
73
+ input: Type.Optional(Type.Object({ capabilities: Type.Optional(Type.Array(Type.String(), { uniqueItems: true })) }, { additionalProperties: false })),
74
+ }, { additionalProperties: false });
75
+ export type AppContract = Static<typeof appContractSchema>;
76
+ export const appPackageSchema = Type.Object({
77
+ title: Type.String({ minLength: 1 }), description: Type.Optional(Type.String()), backend: Type.Optional(Type.String({ minLength: 1 })),
78
+ views: Type.Optional(Type.Array(Type.Object({
79
+ id: Type.String({ pattern: "^[a-z][a-z0-9-]{0,63}$" }), title: Type.Optional(Type.String({ minLength: 1 })),
80
+ client: Type.String({ minLength: 1 }), styles: Type.Optional(Type.String()),
81
+ width: Type.Optional(Type.Integer({ minimum: 280, maximum: 960 })),
82
+ height: Type.Optional(Type.Integer({ minimum: 180, maximum: 720 })),
83
+ }, { additionalProperties: false }))),
84
+ }, { additionalProperties: false });
85
+ export type AppPackage = Static<typeof appPackageSchema>;
86
+
87
+ const sdkRuntime = `export const defineActor = (contract, implementation) => ({ contract, ...implementation });\n`;
88
+ let testingBundle: Promise<string> | undefined;
89
+ const testingRuntime = (): Promise<string> => testingBundle ??= build({
90
+ stdin: {contents: `
91
+ import {createRunContext} from ${JSON.stringify(fileURLToPath(new URL("../../../packages/ragents/src/typescript/run-context.ts",import.meta.url)))};
92
+ import {assertJsonValue} from ${JSON.stringify(fileURLToPath(new URL("../../../packages/ragents/src/domain/json.ts",import.meta.url)))};
93
+ import {createScriptStd} from ${JSON.stringify(fileURLToPath(new URL("../../../packages/ragents/src/script/std.ts",import.meta.url)))};
94
+ import {Value} from "typebox/value";
95
+ export function createTestContextWithContracts(options, contracts) {
96
+ let state = structuredClone(options.state);
97
+ const controller = new AbortController();
98
+ const statePort = {read:()=>structuredClone(state),replace:value=>{state=structuredClone(value);}};
99
+ const declared = new Map(contracts.map(contract=>[contract.id,contract]));
100
+ for (const name of Object.keys(options.functions ?? {})) if (!declared.has(name)) throw new Error("Unbekannte Testfunktion "+name);
101
+ const capabilities = {descriptors:()=>contracts,call:async(name,input)=>{
102
+ const contract=declared.get(name);
103
+ const call=options.functions?.[name];
104
+ if(!call)throw new Error("Im Test fehlt die Funktion "+name);
105
+ if(!Value.Check(contract.schema,input))throw new Error("Testeingabe verletzt den Vertrag von "+name);
106
+ const result=await call(input);
107
+ assertJsonValue(result,"Testantwort von "+name);
108
+ if(!Value.Check(contract.resultSchema,result))throw new Error("Testantwort verletzt den Vertrag von "+name);
109
+ return result;
110
+ }};
111
+ return {...createRunContext({runId:"test",invocationId:"test",invocationKind:"tool",principal:{id:"test",kind:"service"},state:statePort,capabilities,log:()=>{},signal:controller.signal}),
112
+ actor:{id:"test-actor",handle:"test"},std:createScriptStd({turnStartedAt:"2026-01-01T00:00:00.000Z",idPrefix:"test",state:statePort,capabilities})};
113
+ }`, resolveDir:process.cwd(),sourcefile:"actor-testing.ts",loader:"ts"},
114
+ bundle:true,platform:"node",format:"esm",target:"node22",packages:"external",write:false,
115
+ }).then(result=>result.outputFiles![0]!.text);
116
+
117
+ export const serverApiDeclarations = (capabilities: readonly RunCapabilityDescriptor[] = []): string => {
118
+ const declarations: string[] = [];
119
+ const entries = capabilities.map((capability, index) => {
120
+ const input = typeScriptTypesFromSchema(capability.schema, `RAgentsCapability${index}Input`);
121
+ const output = typeScriptTypesFromSchema(capability.resultSchema, `RAgentsCapability${index}Output`);
122
+ declarations.push(...input.declarations, ...output.declarations);
123
+ return `${JSON.stringify(capability.id)}: { input: ${input.type}; output: ${output.type} };`;
124
+ }).join("\n");
125
+ return `import type { Static, TSchema } from 'typebox';
126
+ ${declarations.length > 0 ? `${declarations.join("\n")}\n` : ""}export interface CapabilityContracts { ${entries} }
127
+ export interface RunContext<State> {
128
+ readonly run: { readonly id: string };
129
+ readonly actor: {readonly id: string; readonly handle: string};
130
+ readonly std: RAgentsStd;
131
+ readonly invocation: { readonly id: string; readonly kind: string };
132
+ readonly principal: { readonly id: string; readonly kind: string };
133
+ readonly signal: AbortSignal;
134
+ readonly state: { read(): Readonly<State>; replace(value: State): void };
135
+ readonly functions: {readonly [Name in keyof CapabilityContracts]: (...args: {} extends CapabilityContracts[Name]['input'] ? [input?: CapabilityContracts[Name]['input']] : [input: CapabilityContracts[Name]['input']]) => Promise<CapabilityContracts[Name]['output']>};
136
+ log(value: unknown): void;
137
+ throwIfAborted(): void;
138
+ }
139
+ ${scriptStdDeclarations}
140
+ export interface ActorInput {
141
+ readonly id: string; readonly content: string; readonly artifactIds: readonly string[];
142
+ readonly sourceEventIds: readonly string[]; readonly subscriptionId: string | null;
143
+ readonly event: { readonly type: string; readonly eventId: string; readonly sequence: number; readonly occurredAt: string;
144
+ readonly sourceActorId: string | null; readonly sourceActorHandle: string | null; readonly payload: {readonly text?:string; readonly [key:string]:unknown} } | null;
145
+ }
146
+ export interface ActorFunction { label: string; description?: string; input: TSchema; output: TSchema; capabilities?: readonly string[]; confirmation?: string; tool?: { name: string; targets?: readonly string[]; card?: boolean } }
147
+ export interface ActorContract { state: TSchema; functions: Readonly<Record<string, ActorFunction>>; input?: {capabilities?: readonly string[]} }
148
+ export type ActorFunctions<C extends ActorContract> = { [K in keyof C['functions']]: (input: Static<C['functions'][K]['input']>, context: RunContext<Static<C['state']>>) => Static<C['functions'][K]['output']> | Promise<Static<C['functions'][K]['output']>> };
149
+ export type ActorImplementation<C extends ActorContract> = {functions: ActorFunctions<C>} & (C extends {input: unknown} ? {onInput: (input: ActorInput, context: RunContext<Static<C['state']>>) => void | Promise<void>} : {onInput?: never});
150
+ export declare function defineActor<const C extends ActorContract>(contract: C, implementation: ActorImplementation<C>): {contract:C} & ActorImplementation<C>;
151
+ `;
152
+ };
153
+
154
+ let workflowSdk: Promise<{ javaScript: string; declarations: string; promptReader: string; promptDeclarations: string }> | undefined;
155
+ const workflowSource = fileURLToPath(new URL("../workflow/index.ts", import.meta.url));
156
+ const workflowSdkFiles = () => workflowSdk ??= (async () => {
157
+ let declarations = "";
158
+ let promptDeclarations = "";
159
+ const promptSource = fileURLToPath(new URL("../workflow/prompt-reader.ts", import.meta.url));
160
+ const program = ts.createProgram([workflowSource, promptSource], {
161
+ target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.ESNext, moduleResolution: ts.ModuleResolutionKind.Bundler,
162
+ strict: true, skipLibCheck: true, types: ["node"], typeRoots: [serverTypeRoot], declaration: true, emitDeclarationOnly: true,
163
+ });
164
+ const diagnostics = ts.getPreEmitDiagnostics(program);
165
+ if (diagnostics.length) throw new Error(diagnostics.map(diagnostic => ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")).join("\n"));
166
+ const emitted = program.emit(undefined, (name, content) => { if (name.endsWith("index.d.ts")) declarations = content; if (name.endsWith("prompt-reader.d.ts")) promptDeclarations = content; });
167
+ if (emitted.emitSkipped || !declarations) throw new Error("Workflow-SDK-Deklarationen konnten nicht erzeugt werden.");
168
+ const runtime = await build({ entryPoints: [workflowSource], bundle: true, write: false, platform: "neutral", format: "esm", target: "es2022", logLevel: "silent" });
169
+ const promptRuntime = await build({ entryPoints: [promptSource], bundle: true, write: false, platform: "node", format: "esm", target: "es2022", logLevel: "silent" });
170
+ return { javaScript: runtime.outputFiles[0]!.text, declarations, promptReader: promptRuntime.outputFiles[0]!.text, promptDeclarations };
171
+ })();
172
+
173
+ export const installWorkflowSdk = async (directory: string): Promise<void> => {
174
+ const target = path.join(directory, "node_modules/@ragents/workflow");
175
+ const files = await workflowSdkFiles();
176
+ await mkdir(target, { recursive: true });
177
+ await writeFile(path.join(target, "package.json"), json({ name: "@ragents/workflow", private: true, type: "module", exports: { ".": { types: "./index.d.ts", default: "./index.js" }, "./prompts": { types: "./prompts.d.ts", default: "./prompts.js" } } }));
178
+ await writeFile(path.join(target, "index.d.ts"), files.declarations);
179
+ await writeFile(path.join(target, "index.js"), files.javaScript);
180
+ await writeFile(path.join(target, "prompt-reader.d.ts"), files.promptDeclarations);
181
+ await writeFile(path.join(target, "prompt-reader.js"), files.promptReader);
182
+ await writeFile(path.join(target, "prompts.d.ts"), 'import { createPromptReader } from "./prompt-reader.js";\nexport declare const readPrompt: ReturnType<typeof createPromptReader>;\n');
183
+ await writeFile(path.join(target, "prompts.js"), `import { createPromptReader } from "./prompt-reader.js";\nexport const readPrompt = createPromptReader(${JSON.stringify(directory)});\n`);
184
+ };
185
+
186
+ export const installServerSdk = async (directory: string, capabilities: readonly RunCapabilityDescriptor[] = []): Promise<void> => {
187
+ await installWorkflowSdk(directory);
188
+ const sdk = path.join(directory, "node_modules/@ragents/server");
189
+ await mkdir(sdk, { recursive: true });
190
+ const declarations = serverApiDeclarations(capabilities);
191
+ await writeFile(path.join(sdk, "package.json"), json({ name: "@ragents/server", private: true, type: "module", exports: {
192
+ ".": { types: "./index.d.ts", default: "./index.js" }, "./testing": { types: "./testing.d.ts", default: "./testing.js" },
193
+ } }));
194
+ await writeFile(path.join(sdk, "index.js"), sdkRuntime);
195
+ await writeFile(path.join(sdk, "index.d.ts"), declarations);
196
+ await writeFile(path.join(sdk, "testing.js"), (await testingRuntime()) + `\nexport function createTestContext(options) { return createTestContextWithContracts(options, ${JSON.stringify(capabilities)}); }\n`);
197
+ await writeFile(path.join(sdk, "testing.d.ts"), "import type { RunContext, CapabilityContracts } from './index.js';\ntype Mocks = {[Name in keyof CapabilityContracts]?: (input: CapabilityContracts[Name]['input']) => CapabilityContracts[Name]['output'] | Promise<CapabilityContracts[Name]['output']>};\nexport declare function createTestContext<State>(options: {state: State; functions?: Mocks}): RunContext<State>;\n");
198
+ };
199
+
200
+ export const prepareAppProject = async (directory: string): Promise<void> => {
201
+ await prepareAppDependencies(directory);
202
+ await installServerSdk(directory);
203
+ const pkg = await readAppPackage(directory);
204
+ const writeConfig = async (name: string, value: unknown): Promise<void> => {
205
+ await writeFile(path.join(directory, name), json(value), { flag: "wx" }).catch((error: NodeJS.ErrnoException) => {
206
+ if (error.code !== "EEXIST") throw error;
207
+ });
208
+ };
209
+ await writeConfig("tsconfig.client.json", { extends: "./node_modules/@ragents/client/tsconfig.json", include: (pkg.views ?? []).map(view => view.client) });
210
+ await writeConfig("tsconfig.server.json", { compilerOptions: {
211
+ target: "ES2022", module: "ESNext", moduleResolution: "Bundler", strict: true, noEmit: true,
212
+ skipLibCheck: true, types: ["node"], lib: ["ES2022"], allowImportingTsExtensions: true,
213
+ }, include: [...(pkg.backend ? [pkg.backend] : []), "tests/**/*.ts"] });
214
+ await writeConfig("tsconfig.json", { files: [], references: [{ path: "./tsconfig.client.json" }, { path: "./tsconfig.server.json" }] });
215
+ };
216
+
217
+ export const readAppPackage = async (directory: string): Promise<AppPackage> => {
218
+ const pkg = JSON.parse(await readFile(path.join(directory, "package.json"), "utf8")) as Record<string, unknown>;
219
+ if (!Value.Check(appPackageSchema, pkg.ragents)) throw new Error("package.json.ragents braucht title und gültige backend/views-Angaben.");
220
+ if (!pkg.ragents.backend && !pkg.ragents.views?.length) throw new Error("Ein Actor-Paket braucht ein Backend oder mindestens eine Ansicht.");
221
+ const views = pkg.ragents.views ?? [];
222
+ if (new Set(views.map((view) => view.id)).size !== views.length) throw new Error("Ansichtsnamen müssen eindeutig sein.");
223
+ return pkg.ragents;
224
+ };
225
+
226
+ export const projectSourceFiles = async (directory: string): Promise<{ path: string; content: string }[]> => {
227
+ const files: { path: string; content: string }[] = [];
228
+ const walk = async (relative: string): Promise<void> => {
229
+ for (const entry of await readdir(path.join(directory, relative), { withFileTypes: true })) {
230
+ if (["node_modules", ".build", "dist", ".git"].includes(entry.name)) continue;
231
+ const name = path.join(relative, entry.name);
232
+ if (entry.isSymbolicLink()) throw new Error(`App-Quelldateien dürfen keine Symlinks enthalten: ${name}`);
233
+ if (entry.isDirectory()) await walk(name);
234
+ else if (entry.isFile()) files.push({ path: name, content: await readFile(path.join(directory, name), "utf8") });
235
+ }
236
+ };
237
+ await walk("");
238
+ return files.sort((left, right) => left.path.localeCompare(right.path));
239
+ };
240
+
241
+ export const typecheckServerProject = (directory: string, backend?: string): string[] => {
242
+ const configPath = path.join(directory, "tsconfig.server.json");
243
+ const config = ts.readConfigFile(configPath, ts.sys.readFile);
244
+ const parsed = ts.parseJsonConfigFileContent(config.config, ts.sys, directory, { noEmit: true }, configPath);
245
+ const rootNames = [...new Set([...parsed.fileNames, ...(backend ? [path.resolve(directory, backend)] : [])])];
246
+ const program = ts.createProgram(rootNames, parsed.options);
247
+ const configErrors = parsed.errors.filter((diagnostic) => !(backend && diagnostic.code === 18003));
248
+ return [...(config.error ? [config.error] : []), ...configErrors, ...ts.getPreEmitDiagnostics(program)].map((diagnostic) => {
249
+ const start = diagnostic.file && diagnostic.start !== undefined ? diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start) : undefined;
250
+ return `${diagnostic.file ? path.relative(directory, diagnostic.file.fileName) : "tsconfig.server.json"}${start ? `:${start.line + 1}:${start.character + 1}` : ""} TS${diagnostic.code}: ${ts.flattenDiagnosticMessageText(diagnostic.messageText, " ")}`;
251
+ });
252
+ };
253
+
254
+ export const compileAppBackend = async (options: {
255
+ directory: string; backend: string; runId: string; executor: NativeTypeScriptExecutor; signal?: AbortSignal;
256
+ }): Promise<{ contract: AppContract; javaScript: string; hash: string }> => {
257
+ const signal = AbortSignal.any([...(options.signal ? [options.signal] : []), AbortSignal.timeout(15_000)]);
258
+ const entry = path.resolve(options.directory, options.backend);
259
+ if (!entry.startsWith(`${options.directory}${path.sep}`)) throw new Error("Der Backend-Einstieg liegt außerhalb der App.");
260
+ const result = await build({
261
+ stdin: { contents: `import actor from ${JSON.stringify(`./${options.backend}`)};
262
+ export const describe = () => {
263
+ for (const name of Object.keys(actor.contract.functions ?? {})) if (typeof actor.functions?.[name] !== 'function') throw new Error('Fehlende Funktion ' + name);
264
+ if (Boolean(actor.contract.input) !== (typeof actor.onInput === 'function')) throw new Error('input und onInput müssen gemeinsam vorhanden sein.');
265
+ return JSON.parse(JSON.stringify(actor.contract));
266
+ };
267
+ export const handle = (request, context) => {
268
+ if (request.kind === 'input') { if (!actor.onInput) throw new Error('Dieser Actor verarbeitet keine Eingaben.'); return actor.onInput(request.input, context); }
269
+ const handler = actor.functions[request.functionId];
270
+ if (typeof handler !== 'function') throw new Error('Unbekannte Actor-Funktion ' + request.functionId);
271
+ return handler(request.input, context);
272
+ };`, resolveDir: options.directory, sourcefile: "actor-entry.ts", loader: "ts" },
273
+ absWorkingDir: options.directory, platform: "node", format: "esm", target: "node22", bundle: true, packages: "external", write: false,
274
+ });
275
+ options.signal?.throwIfAborted();
276
+ const javaScript = result.outputFiles![0]!.text;
277
+ const described = await options.executor.execute({
278
+ program: { entry: "server.mjs", files: [{ fileName: "server.mjs", text: javaScript }], exportName: "describe" },
279
+ input: {}, state: {}, cwd: options.directory,
280
+ context: { runId: options.runId, invocationId: "app-contract", invocationKind: "tool", principal: { id: "app-build", kind: "service" }, capabilities: [] },
281
+ }, { signal, call: async () => { throw new Error("Beim Laden des App-Vertrags sind Run-Aufrufe nicht verfügbar."); }, log: () => undefined });
282
+ if (!Value.Check(appContractSchema, described.result)) throw new Error("Der Backend-Export braucht defineActor({state, functions, input?}, {functions, onInput?}) mit gültigen Aktionsverträgen.");
283
+ return { contract: described.result, javaScript, hash: canonicalHash({ javaScript }) };
284
+ };
@@ -0,0 +1,10 @@
1
+ import { appContractSchema, appPackageSchema } from "./app-project.js";
2
+ import { clientApiDeclarations } from "./client-compiler.js";
3
+ import { readClientUiExportContracts } from "./client-contracts.js";
4
+
5
+ export const actorProgramAuthoringContracts = () => ({
6
+ package: appPackageSchema,
7
+ backend: appContractSchema,
8
+ client: clientApiDeclarations(),
9
+ clientTypes: readClientUiExportContracts("ChatConnection"),
10
+ });
@@ -0,0 +1,174 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, readFile, realpath, writeFile } from "node:fs/promises";
3
+ import { createRequire } from "node:module";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { build, type Message } from "esbuild";
7
+ import ts from "typescript";
8
+ import { canonicalTypeScriptBuildContract, typeScriptTypeFromSchema, type VirtualTypeScriptDiagnostic } from "@aicontainer/ragents";
9
+ import { installWorkflowSdk } from "./app-project.js";
10
+ import { readClientUiContractFiles } from "./client-contracts.js";
11
+
12
+ export interface ClientActionContract {
13
+ id: string;
14
+ inputSchema: object;
15
+ resultSchema: object;
16
+ }
17
+
18
+ export interface ClientContracts {
19
+ stateSchema: object;
20
+ actions: readonly ClientActionContract[];
21
+ }
22
+
23
+ export interface ClientProjectRequest extends ClientContracts {
24
+ directory: string;
25
+ entryPoint: string;
26
+ }
27
+
28
+ const webRequire = createRequire(new URL("../../../apps/web/package.json", import.meta.url));
29
+ const packageRoot = (id: string): string => path.dirname(webRequire.resolve(`${id}/package.json`));
30
+ const uiSource = fileURLToPath(new URL("../client-ui/index.tsx", import.meta.url));
31
+
32
+ const actionMap = (actions: readonly ClientActionContract[]): string => {
33
+ const seen = new Set<string>();
34
+ const fields = [...actions]
35
+ .sort((left, right) => left.id.localeCompare(right.id))
36
+ .map((action) => {
37
+ if (seen.has(action.id)) throw new Error(`App-Aktion ${action.id} ist doppelt deklariert.`);
38
+ seen.add(action.id);
39
+ return [
40
+ ` readonly ${JSON.stringify(action.id)}: {`,
41
+ ` readonly input: ${typeScriptTypeFromSchema(action.inputSchema)};`,
42
+ ` readonly output: ${typeScriptTypeFromSchema(action.resultSchema)};`,
43
+ " };",
44
+ ].join("\n");
45
+ });
46
+ return fields.length > 0 ? `{\n${fields.join("\n")}\n}` : "{}";
47
+ };
48
+
49
+ const clientTypeDeclarations = (stateType: string, actionsType: string): string => `
50
+ import type { ChatConnection } from "./ui";
51
+ export type AppState = ${stateType};
52
+ export type AppActions = ${actionsType};
53
+ export interface AppCapabilities<Actions> {
54
+ list(): ReadonlyArray<keyof Actions & string>;
55
+ call<Name extends keyof Actions & string>(
56
+ name: Name,
57
+ input: Actions[Name] extends { readonly input: infer Input } ? Input : never,
58
+ ): Promise<Actions[Name] extends { readonly output: infer Output } ? Output : never>;
59
+ }
60
+ export interface AppStateView<State> {
61
+ read(): Readonly<State>;
62
+ subscribe(listener: (state: Readonly<State>) => void): () => void;
63
+ }
64
+ export interface AppContext<State, Actions> {
65
+ readonly ready: Promise<void>;
66
+ readonly run: { readonly id: string };
67
+ readonly actor: { readonly id: string; readonly handle: string };
68
+ readonly principal: { readonly id: string; readonly kind: "operator" };
69
+ readonly state: AppStateView<State>;
70
+ readonly chat: ChatConnection;
71
+ readonly capabilities: AppCapabilities<Actions>;
72
+ }
73
+ export declare const context: AppContext<AppState, AppActions>;
74
+ export declare function useAppState(): Readonly<AppState>;
75
+ `.trimStart();
76
+
77
+ export const clientDeclarations = (request: ClientContracts): string =>
78
+ clientTypeDeclarations(typeScriptTypeFromSchema(request.stateSchema), actionMap(request.actions));
79
+
80
+ export const clientApiDeclarations = (): string => clientTypeDeclarations("Record<string, unknown>", "{}");
81
+
82
+ export const clientSdkSource = `import { useSyncExternalStore } from "react";
83
+ export const context = globalThis.__ragentsAppContext;
84
+ if (!context) throw new Error("Die Host-Bridge der Actor-Ansicht fehlt.");
85
+ export const useAppState = () => useSyncExternalStore(context.state.subscribe, context.state.read, context.state.read);
86
+ `;
87
+
88
+ export const clientCompilerConfig = {
89
+ compilerOptions: {
90
+ target: "ES2022", module: "ESNext", moduleResolution: "Bundler", jsx: "react-jsx",
91
+ lib: ["ES2022", "DOM", "DOM.Iterable"], strict: true, skipLibCheck: true,
92
+ esModuleInterop: true, exactOptionalPropertyTypes: true, noUncheckedIndexedAccess: true, types: [], noEmit: true,
93
+ },
94
+ };
95
+
96
+ export const installClientSdk = async (directory: string, contracts: ClientContracts): Promise<void> => {
97
+ await installWorkflowSdk(directory);
98
+ const target = path.join(directory, "node_modules/@ragents/client");
99
+ const files: Record<string, string> = {
100
+ "package.json": JSON.stringify({ name: "@ragents/client", version: "0.0.0", type: "module",
101
+ exports: { ".": { types: "./index.d.ts", default: "./index.js" }, "./ui": { types: "./ui.d.ts", default: "./ui.js" } } }, null, 2),
102
+ "tsconfig.json": JSON.stringify(clientCompilerConfig, null, 2),
103
+ "index.d.ts": clientDeclarations(contracts),
104
+ "index.js": clientSdkSource,
105
+ "ui.d.ts": 'export * from "./contracts/plugins/ragents.actor-programs/client-ui/contracts";\n',
106
+ "ui.js": `export * from ${JSON.stringify(uiSource)};\n`,
107
+ ...Object.fromEntries(Object.entries(readClientUiContractFiles()).map(([name, text]) => [`contracts/${name}`, text])),
108
+ };
109
+ await Promise.all(Object.entries(files).map(async ([name, text]) => {
110
+ const filename = path.join(target, name);
111
+ await mkdir(path.dirname(filename), { recursive: true });
112
+ await writeFile(filename, text);
113
+ }));
114
+ };
115
+
116
+ const diagnosticFrom = (diagnostic: ts.Diagnostic, directory: string): VirtualTypeScriptDiagnostic => {
117
+ const result: VirtualTypeScriptDiagnostic = {
118
+ code: diagnostic.code,
119
+ category: diagnostic.category === ts.DiagnosticCategory.Error ? "error" : diagnostic.category === ts.DiagnosticCategory.Warning ? "warning" : "message",
120
+ message: ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"),
121
+ ...(diagnostic.file ? { fileName: path.relative(directory, diagnostic.file.fileName).replaceAll(path.sep, "/") } : {}),
122
+ };
123
+ if (!diagnostic.file || diagnostic.start === undefined) return result;
124
+ const start = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
125
+ const end = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start + (diagnostic.length ?? 0));
126
+ return { ...result, start: { line: start.line + 1, column: start.character + 1 }, end: { line: end.line + 1, column: end.character + 1 } };
127
+ };
128
+
129
+ const buildDiagnostic = (message: Message): VirtualTypeScriptDiagnostic => ({
130
+ code: 0, category: "error", message: message.text,
131
+ ...(message.location ? { fileName: message.location.file, start: { line: message.location.line, column: message.location.column + 1 } } : {}),
132
+ });
133
+
134
+ export const compileClientProject = async (request: ClientProjectRequest, signal?: AbortSignal) => {
135
+ signal?.throwIfAborted();
136
+ const directory = await realpath(request.directory);
137
+ const declarations = clientDeclarations(request);
138
+ const installed = await readFile(path.join(directory, "node_modules/@ragents/client/index.d.ts"), "utf8");
139
+ if (installed !== declarations) throw new Error("Die Client-SDK-Typen sind nicht aktuell. Das Actor-Projekt muss neu vorbereitet werden.");
140
+ const configPath = path.join(directory, "tsconfig.client.json");
141
+ const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
142
+ if (configFile.error) throw new Error(ts.flattenDiagnosticMessageText(configFile.error.messageText, "\n"));
143
+ const config = ts.parseJsonConfigFileContent(configFile.config, ts.sys, directory, {}, configPath);
144
+ const program = ts.createProgram({ rootNames: [...new Set([path.resolve(directory, request.entryPoint), ...config.fileNames])], options: config.options });
145
+ const diagnostics = [...config.errors, ...ts.getPreEmitDiagnostics(program)]
146
+ .map((diagnostic) => diagnosticFrom(diagnostic, directory));
147
+ signal?.throwIfAborted();
148
+ let javaScript = "";
149
+ if (!diagnostics.some((diagnostic) => diagnostic.category === "error")) {
150
+ try {
151
+ const result = await build({
152
+ absWorkingDir: directory, entryPoints: [request.entryPoint], bundle: true, write: false,
153
+ platform: "browser", format: "esm", target: "es2022", jsx: "automatic", tsconfig: configPath,
154
+ alias: { react: packageRoot("react"), "react-dom": packageRoot("react-dom") },
155
+ define: { "process.env.NODE_ENV": '"production"' }, legalComments: "none", logLevel: "silent",
156
+ minify: true,
157
+ });
158
+ const output = result.outputFiles.find((file) => file.path.endsWith(".js") || file.path === "<stdout>");
159
+ if (!output) throw new Error("Der Client-Build hat kein JavaScript erzeugt.");
160
+ javaScript = output.text;
161
+ } catch (cause) {
162
+ if (cause && typeof cause === "object" && "errors" in cause && Array.isArray(cause.errors)) {
163
+ diagnostics.push(...(cause.errors as Message[]).map(buildDiagnostic));
164
+ } else throw cause;
165
+ }
166
+ }
167
+ signal?.throwIfAborted();
168
+ const compilationHash = createHash("sha256").update(canonicalTypeScriptBuildContract({
169
+ stateSchema: request.stateSchema, actions: request.actions, declarations, javaScript,
170
+ typescript: ts.version, config: { ...config.options, configFilePath: undefined },
171
+ sources: program.getSourceFiles().map((file) => ({ path: path.relative(directory, file.fileName), text: file.text })),
172
+ })).digest("hex");
173
+ return { valid: !diagnostics.some((diagnostic) => diagnostic.category === "error"), diagnostics, declarations, javaScript, compilationHash };
174
+ };