@schlenkr/ragents 0.1.5 → 0.1.6

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 (1052) hide show
  1. package/README.md +18 -11
  2. package/apps/server/package.json +8 -6
  3. package/apps/server/src/access-projection.ts +3 -3
  4. package/apps/server/src/access-service.ts +19 -8
  5. package/apps/server/src/access-session.ts +6 -2
  6. package/apps/server/src/api/contracts.ts +19 -18
  7. package/apps/server/src/api/core-methods.ts +45 -26
  8. package/apps/server/src/api/delivery.ts +4 -4
  9. package/apps/server/src/api/reference.ts +1 -1
  10. package/apps/server/src/api/rights.ts +86 -7
  11. package/apps/server/src/chat-context.ts +1 -1
  12. package/apps/server/src/chat-handler.ts +14 -7
  13. package/apps/server/src/config-file.ts +25 -6
  14. package/apps/server/src/config.ts +4 -4
  15. package/apps/server/src/data-directory.ts +1 -1
  16. package/apps/server/src/folder-install.ts +115 -0
  17. package/apps/server/src/host-api.json +1256 -0
  18. package/apps/server/src/host-api.ts +190 -0
  19. package/apps/server/src/host-resolution-hooks.mjs +50 -1
  20. package/apps/server/src/host-resolution.ts +26 -1
  21. package/apps/server/src/host-version.ts +41 -0
  22. package/apps/server/src/host-web.ts +59 -0
  23. package/apps/server/src/layout.ts +1 -1
  24. package/apps/server/src/main.ts +3 -2
  25. package/apps/server/src/missing-environment.ts +47 -0
  26. package/apps/server/src/parent-watch.ts +37 -0
  27. package/apps/server/src/plugin-build/build.ts +650 -0
  28. package/apps/server/src/plugin-build/host-api-names.ts +185 -0
  29. package/apps/server/src/plugin-build/plugin-description.ts +118 -0
  30. package/apps/server/src/plugin-build/typecheck.ts +66 -0
  31. package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/app-project.ts +16 -15
  32. package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/client-compiler.ts +4 -4
  33. package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/client-contracts.ts +4 -4
  34. package/apps/server/src/plugin-support/actor-programs/client-runtime.ts +27 -0
  35. package/{plugins/ragents.actor-programs → apps/server/src/plugin-support/actor-programs}/contract.ts +3 -3
  36. package/apps/server/src/plugin-support/actor-programs/service.ts +1 -1
  37. package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/tailwind.ts +2 -3
  38. package/{plugins/ragents.actor-programs → apps/server/src/plugin-support/actor-programs}/workflow/index.ts +48 -48
  39. package/apps/server/src/plugin-support/agent-tool.ts +10 -5
  40. package/apps/server/src/plugin-support/http.ts +1 -1
  41. package/apps/server/src/plugin-support/language-server/contract.ts +37 -6
  42. package/apps/server/src/plugin-support/language-server/plugin.ts +18 -8
  43. package/apps/server/src/plugin-support/language-server/snapshot-method.ts +32 -7
  44. package/apps/server/src/plugin-support/language-server/tools.ts +59 -15
  45. package/apps/server/src/plugin-support/model-aliases.ts +77 -0
  46. package/apps/server/src/plugin-support/model-choice.ts +17 -7
  47. package/apps/server/src/plugin-support/model-completion.ts +58 -0
  48. package/apps/server/src/plugin-support/model-upstreams.ts +2 -2
  49. package/apps/server/src/plugin-support/native-typescript-executor.ts +10 -7
  50. package/apps/server/src/plugin-support/plugin-config.ts +1 -1
  51. package/apps/server/src/plugin-support/plugin-folder.ts +4 -1
  52. package/apps/server/src/plugin-support/plugin-module.ts +1 -1
  53. package/apps/server/src/plugin-support/plugins-root.ts +6 -10
  54. package/apps/server/src/plugin-support/process-sandbox.ts +312 -0
  55. package/apps/server/src/plugin-support/product-model-settings-contract.ts +14 -5
  56. package/apps/server/src/plugin-support/product-model-settings.ts +10 -9
  57. package/{plugins/ragents.product/server/relay.ts → apps/server/src/plugin-support/product-relay.ts} +2 -2
  58. package/apps/server/src/plugin-support/product-start-options.ts +8 -3
  59. package/apps/server/src/plugin-support/prompt.ts +1 -1
  60. package/apps/server/src/plugin-support/provision.ts +6 -0
  61. package/apps/server/src/plugin-support/run-scripts.ts +16 -2
  62. package/apps/server/src/plugin-support/skills.ts +32 -16
  63. package/apps/server/src/plugin-support/start-entries-contract.ts +12 -3
  64. package/apps/server/src/plugin-support/start-options-contract.ts +5 -1
  65. package/apps/server/src/plugin-support/thinking-level.ts +6 -1
  66. package/apps/server/src/plugin-support/tool-availability.ts +1 -7
  67. package/apps/server/src/plugin-support/workspace-ownership.ts +12 -6
  68. package/apps/server/src/plugin-support/workspace-sandbox-host.ts +184 -37
  69. package/apps/server/src/profile/bundle-manifest.ts +183 -0
  70. package/apps/server/src/profile/compose.ts +19 -10
  71. package/apps/server/src/profile/plugin-discovery.ts +98 -46
  72. package/apps/server/src/profile/provisioning.ts +30 -26
  73. package/apps/server/src/profile-target.ts +3 -0
  74. package/apps/server/src/provider.ts +182 -99
  75. package/apps/server/src/ragents/actor-chat-history.ts +23 -22
  76. package/apps/server/src/ragents/chat-projection.ts +25 -14
  77. package/apps/server/src/ragents/chat-text-positions.ts +4 -4
  78. package/apps/server/src/ragents/coordinator.ts +27 -1
  79. package/apps/server/src/ragents/document-store.ts +1 -1
  80. package/apps/server/src/ragents/engine.ts +69 -36
  81. package/apps/server/src/ragents/global-chat.ts +26 -13
  82. package/apps/server/src/ragents/host-services.ts +15 -6
  83. package/apps/server/src/ragents/journal-chat-events.ts +31 -15
  84. package/apps/server/src/ragents/product-runtime.ts +1 -1
  85. package/apps/server/src/ragents/run-owner.ts +17 -0
  86. package/apps/server/src/ragents/runtime-bridge.ts +1 -1
  87. package/apps/server/src/ragents/session.ts +181 -82
  88. package/apps/server/src/ragents/start-option-state.ts +1 -1
  89. package/apps/server/src/ragents/typescript-tools.ts +35 -27
  90. package/apps/server/src/ragents/workspace-runtime.ts +74 -8
  91. package/apps/server/src/rpc/dispatcher.ts +17 -8
  92. package/apps/server/src/rpc/http-transport.ts +1 -3
  93. package/apps/server/src/rpc/stdio-transport.ts +1 -1
  94. package/apps/server/src/run-preparation-contract.ts +1 -1
  95. package/apps/server/src/run-preparation-input.ts +1 -1
  96. package/apps/server/src/run-preparation.ts +13 -20
  97. package/apps/server/src/run-transfer.ts +2 -2
  98. package/apps/server/src/server.ts +112 -33
  99. package/apps/server/src/settings.ts +7 -8
  100. package/apps/server/src/title-compactor.ts +5 -8
  101. package/apps/server/src/title-settings.ts +3 -3
  102. package/apps/server/src/web-bundles.ts +79 -0
  103. package/apps/server/src/web-stylesheet.ts +85 -0
  104. package/apps/server/tsconfig.json +4 -4
  105. package/apps/server/tsconfig.plugin.json +58 -0
  106. package/apps/web/dist/assets/highlighted-body-KPVGNVTW-B9qYBARS.js +1 -0
  107. package/apps/web/dist/assets/main-BCjvD2Hh.js +6 -0
  108. package/apps/web/dist/assets/mermaid-HWGCJPDP-BPn4aV2r.css +1 -0
  109. package/apps/web/dist/assets/mermaid-HWGCJPDP-CvYYFK_n.js +478 -0
  110. package/apps/web/dist/assets/runPanel-CG7kRMJh.js +21 -0
  111. package/apps/web/dist/help/guide-access.html +199 -0
  112. package/apps/web/dist/help/guide-access.md +84 -0
  113. package/apps/web/dist/help/guide-clients.html +421 -0
  114. package/apps/web/dist/help/guide-clients.md +336 -0
  115. package/apps/web/dist/help/guide-distributed.html +320 -0
  116. package/apps/web/dist/help/guide-distributed.md +225 -0
  117. package/apps/web/dist/help/guide-functions.html +231 -0
  118. package/apps/web/dist/help/guide-functions.md +127 -0
  119. package/apps/web/dist/help/guide-getting-started.html +230 -0
  120. package/apps/web/dist/help/guide-getting-started.md +123 -0
  121. package/apps/web/dist/help/guide-ideas.html +183 -0
  122. package/apps/web/dist/help/guide-ideas.md +71 -0
  123. package/apps/web/dist/help/guide-plugins.html +450 -0
  124. package/apps/web/dist/help/guide-plugins.md +341 -0
  125. package/apps/web/dist/help/guide-programs.html +359 -0
  126. package/apps/web/dist/help/guide-programs.md +271 -0
  127. package/apps/web/dist/help/guide-runtime.html +338 -0
  128. package/apps/web/dist/help/guide-runtime.md +225 -0
  129. package/apps/web/dist/help/guide.html +133 -0
  130. package/apps/web/dist/help/guide.md +13 -0
  131. package/apps/web/dist/help/homepage-bullets.js +12 -0
  132. package/apps/web/dist/help/homepage-distributed.js +261 -0
  133. package/apps/web/dist/help/homepage-plugins.js +30 -0
  134. package/apps/web/dist/help/homepage-scenes.js +368 -0
  135. package/apps/web/dist/help/homepage-stickers.js +69 -0
  136. package/apps/web/dist/help/homepage-story-nav.js +11 -0
  137. package/apps/web/dist/help/homepage-subnav.js +61 -0
  138. package/apps/web/dist/help/homepage.css +833 -0
  139. package/apps/web/dist/help/index.html +1167 -0
  140. package/apps/web/dist/help/mini-app.css +7056 -0
  141. package/apps/web/dist/help/mini-app.html +15 -0
  142. package/apps/web/dist/help/mini-app.js +131 -0
  143. package/apps/web/dist/help/screenshots/release-checklist-vscode.png +0 -0
  144. package/apps/web/dist/help/screenshots/release-checklist-web.png +0 -0
  145. package/apps/web/dist/help/scroll-vendor.js +73 -0
  146. package/apps/web/dist/help/site.css +63 -0
  147. package/apps/web/dist/help/site.js +103 -0
  148. package/apps/web/dist/host-web.json +143 -0
  149. package/apps/web/dist/index.html +15 -0
  150. package/apps/web/dist/run-panel.html +15 -0
  151. package/apps/web/package.json +2 -2
  152. package/apps/web/src/App.tsx +8 -6
  153. package/apps/web/src/Overview.tsx +5 -5
  154. package/apps/web/src/PluginActivation.ts +25 -5
  155. package/apps/web/src/PluginChat.tsx +163 -129
  156. package/apps/web/src/PluginFailureNotice.tsx +15 -0
  157. package/apps/web/src/PluginRegistry.tsx +106 -68
  158. package/apps/web/src/RunPreparationChat.tsx +40 -28
  159. package/apps/web/src/RunStore.ts +2 -2
  160. package/apps/web/src/SettingsModal.tsx +37 -37
  161. package/apps/web/src/StartOptions.tsx +81 -26
  162. package/apps/web/src/StartSelection.tsx +111 -0
  163. package/apps/web/src/StartTiles.tsx +73 -0
  164. package/apps/web/src/{CanvasShortcuts.tsx → SurfaceShortcuts.tsx} +2 -2
  165. package/apps/web/src/ThemeSettings.tsx +1 -1
  166. package/apps/web/src/WorkspacePanel.tsx +4 -4
  167. package/apps/web/src/access-session.ts +4 -1
  168. package/{plugins/ragents.orchestration/web → apps/web/src}/actor-conversation.ts +3 -3
  169. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/DataTable.tsx +9 -9
  170. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/FilePicker.tsx +4 -4
  171. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/FlowDiagram.tsx +16 -14
  172. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/FlowDiagramRenderer.tsx +3 -3
  173. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/Form.tsx +12 -12
  174. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/Layout.tsx +1 -1
  175. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/MessageList.tsx +5 -5
  176. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/Viewers.tsx +8 -7
  177. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/WorkflowDiagram.tsx +1 -1
  178. package/apps/web/src/actor-programs/client-ui/chat-contracts.d.ts +64 -0
  179. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/contracts.d.ts +2 -2
  180. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/file-selection.ts +5 -5
  181. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/index.tsx +22 -16
  182. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/layout-contracts.d.ts +1 -1
  183. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/message-list-contracts.d.ts +2 -2
  184. package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/workflow-diagram-contracts.d.ts +1 -1
  185. package/apps/web/src/api.ts +43 -22
  186. package/apps/web/src/chat/QuasselHost.tsx +12 -0
  187. package/apps/web/src/chat/StoppedActorNotice.tsx +39 -0
  188. package/apps/web/src/chat/chat-target.ts +14 -5
  189. package/apps/web/src/chat/requests.ts +13 -5
  190. package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
  191. package/apps/web/src/chat/useChat.ts +8 -7
  192. package/apps/web/src/chat/user-location.ts +1 -1
  193. package/apps/web/src/chat-view-settings.tsx +49 -0
  194. package/apps/web/src/host-modules.ts +90 -0
  195. package/apps/web/src/language-server/api.ts +24 -0
  196. package/{plugins/ragents.lsp-roslyn/web → apps/web/src/language-server}/language-server-plugin.tsx +133 -6
  197. package/apps/web/src/main.tsx +4 -2
  198. package/apps/web/src/offered-machines.ts +11 -0
  199. package/apps/web/src/panel/ConnectionsPage.tsx +117 -0
  200. package/apps/web/src/panel/LoginForm.tsx +9 -9
  201. package/apps/web/src/panel/PanelDialogs.tsx +44 -27
  202. package/apps/web/src/panel/PanelHeader.tsx +11 -0
  203. package/apps/web/src/panel/PanelPage.tsx +8 -5
  204. package/apps/web/src/panel/RunLine.tsx +48 -0
  205. package/apps/web/src/panel/RunsPage.tsx +84 -0
  206. package/apps/web/src/panel/StartPage.tsx +163 -0
  207. package/apps/web/src/panel/connection-state.ts +40 -0
  208. package/apps/web/src/panel/contract.ts +64 -21
  209. package/apps/web/src/panel/page-props.ts +6 -0
  210. package/apps/web/src/plugin-bootstrap.ts +60 -31
  211. package/{plugins/ragents.product/web → apps/web/src/product}/ModelControl.tsx +3 -3
  212. package/{plugins/ragents.product/web → apps/web/src/product}/ProductModelSettings.tsx +7 -7
  213. package/{plugins/ragents.product/web → apps/web/src/product}/SystemPromptControl.tsx +3 -3
  214. package/{plugins/ragents.product/web → apps/web/src/product}/model-settings.ts +3 -3
  215. package/{plugins/ragents.product/web → apps/web/src/product}/start-options.tsx +2 -2
  216. package/apps/web/src/rpc/client.ts +28 -6
  217. package/apps/web/src/run-panel/RunPanelApp.tsx +334 -0
  218. package/apps/web/src/{column/ColumnRunHeader.tsx → run-panel/RunPanelHeader.tsx} +2 -2
  219. package/apps/web/src/{column/ColumnMenu.tsx → run-panel/RunPanelMenu.tsx} +4 -4
  220. package/apps/web/src/run-panel/RunPanelRail.tsx +38 -0
  221. package/apps/web/src/run-panel/RunPanelWorkspace.tsx +55 -0
  222. package/apps/web/src/{column → run-panel}/clipboard.ts +21 -10
  223. package/apps/web/src/run-panel/host-contract.ts +123 -0
  224. package/apps/web/src/{column → run-panel}/host.ts +31 -23
  225. package/apps/web/src/run-panel/input-bridge.ts +75 -0
  226. package/apps/web/src/run-panel/keyboard.ts +53 -0
  227. package/apps/web/src/run-panel/run-panel-location.ts +35 -0
  228. package/apps/web/src/{column → run-panel}/use-session-list.ts +3 -3
  229. package/apps/web/src/run-panel/workspace-state.ts +43 -0
  230. package/apps/web/src/{column.tsx → run-panel.tsx} +20 -13
  231. package/apps/web/src/run-preparation.ts +1 -1
  232. package/{plugins/ragents.orchestration/web → apps/web/src}/run-view.ts +25 -7
  233. package/apps/web/src/settings-contributions.ts +16 -18
  234. package/apps/web/src/title-model-settings.ts +1 -1
  235. package/apps/web/src/toolLine.ts +1 -1
  236. package/apps/web/src/ui/ListDetail.tsx +1 -1
  237. package/apps/web/src/ui/dialog.tsx +5 -5
  238. package/apps/web/src/ui/frame.css +1 -0
  239. package/apps/web/src/ui/index.ts +5 -0
  240. package/apps/web/src/ui/popover.tsx +2 -2
  241. package/apps/web/src/ui/quassel.css +41 -0
  242. package/apps/web/src/ui/relative-time.ts +36 -0
  243. package/apps/web/src/ui/startup-notice.tsx +22 -0
  244. package/apps/web/src/ui/state-icon.tsx +60 -0
  245. package/apps/web/src/ui/state-vocabulary.ts +31 -0
  246. package/apps/web/src/ui/stop-button.tsx +22 -0
  247. package/apps/web/src/ui/tailwind.css +2 -3
  248. package/apps/web/src/ui/theme.css +19 -19
  249. package/apps/web/tsconfig.json +4 -5
  250. package/apps/web/tsconfig.plugin.json +44 -0
  251. package/bundles/ragents.activity/ragents-bundle.json +38 -0
  252. package/bundles/ragents.activity/server/index.js +14 -0
  253. package/bundles/ragents.activity/server/index.js.map +7 -0
  254. package/bundles/ragents.activity/web/classes.json +1 -0
  255. package/bundles/ragents.activity/web/index.js +2 -0
  256. package/bundles/ragents.activity/web/index.js.map +7 -0
  257. package/bundles/ragents.actor-programs/prompt.hbs +80 -0
  258. package/bundles/ragents.actor-programs/ragents-bundle.json +214 -0
  259. package/bundles/ragents.actor-programs/server/index.js +2071 -0
  260. package/bundles/ragents.actor-programs/server/index.js.map +7 -0
  261. package/bundles/ragents.actor-programs/summary.hbs +17 -0
  262. package/bundles/ragents.actor-programs/web/classes.json +1 -0
  263. package/bundles/ragents.actor-programs/web/index.js +27 -0
  264. package/bundles/ragents.actor-programs/web/index.js.map +7 -0
  265. package/bundles/ragents.ask/ask.hbs +4 -0
  266. package/bundles/ragents.ask/ragents-bundle.json +97 -0
  267. package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js +13 -0
  268. package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +7 -0
  269. package/bundles/ragents.ask/server/exports/server/contract.js +11 -0
  270. package/bundles/ragents.ask/server/exports/server/contract.js.map +7 -0
  271. package/bundles/ragents.ask/server/index.js +279 -0
  272. package/bundles/ragents.ask/server/index.js.map +7 -0
  273. package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +2 -0
  274. package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +7 -0
  275. package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js +2 -0
  276. package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js.map +7 -0
  277. package/bundles/ragents.ask/web/chunks/chunk-V7W3QDVS.js +25 -0
  278. package/bundles/ragents.ask/web/chunks/chunk-V7W3QDVS.js.map +7 -0
  279. package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +2 -0
  280. package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +7 -0
  281. package/bundles/ragents.ask/web/classes.json +1 -0
  282. package/bundles/ragents.ask/web/exports/ask-payload.js +2 -0
  283. package/bundles/ragents.ask/web/exports/ask-payload.js.map +7 -0
  284. package/bundles/ragents.ask/web/exports/web/QuestionCard.js +2 -0
  285. package/bundles/ragents.ask/web/exports/web/QuestionCard.js.map +7 -0
  286. package/bundles/ragents.ask/web/exports/web/api.js +2 -0
  287. package/bundles/ragents.ask/web/exports/web/api.js.map +7 -0
  288. package/bundles/ragents.ask/web/index.js +2 -0
  289. package/bundles/ragents.ask/web/index.js.map +7 -0
  290. package/bundles/ragents.browser/ragents-bundle.json +53 -0
  291. package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js +11 -0
  292. package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js.map +7 -0
  293. package/bundles/ragents.browser/server/exports/server/contract.js +9 -0
  294. package/bundles/ragents.browser/server/exports/server/contract.js.map +7 -0
  295. package/bundles/ragents.browser/server/index.js +479 -0
  296. package/bundles/ragents.browser/server/index.js.map +7 -0
  297. package/bundles/ragents.browser/skills/browser-testing/SKILL.md +38 -0
  298. package/bundles/ragents.documents/prompt.hbs +18 -0
  299. package/bundles/ragents.documents/ragents-bundle.json +120 -0
  300. package/bundles/ragents.documents/server/chunks/chunk-QIECRZ7C.js +37 -0
  301. package/bundles/ragents.documents/server/chunks/chunk-QIECRZ7C.js.map +7 -0
  302. package/bundles/ragents.documents/server/exports/contract.js +11 -0
  303. package/bundles/ragents.documents/server/exports/contract.js.map +7 -0
  304. package/bundles/ragents.documents/server/index.js +290 -0
  305. package/bundles/ragents.documents/server/index.js.map +7 -0
  306. package/bundles/ragents.documents/web/classes.json +1 -0
  307. package/bundles/ragents.documents/web/index.js +26 -0
  308. package/bundles/ragents.documents/web/index.js.map +7 -0
  309. package/bundles/ragents.lsp-fsharp/ragents-bundle.json +49 -0
  310. package/bundles/ragents.lsp-fsharp/server/index.js +82 -0
  311. package/bundles/ragents.lsp-fsharp/server/index.js.map +7 -0
  312. package/bundles/ragents.lsp-fsharp/web/classes.json +1 -0
  313. package/bundles/ragents.lsp-fsharp/web/index.js +2 -0
  314. package/bundles/ragents.lsp-fsharp/web/index.js.map +7 -0
  315. package/bundles/ragents.lsp-roslyn/ragents-bundle.json +61 -0
  316. package/bundles/ragents.lsp-roslyn/server/index.js +208 -0
  317. package/bundles/ragents.lsp-roslyn/server/index.js.map +7 -0
  318. package/bundles/ragents.lsp-roslyn/web/classes.json +1 -0
  319. package/bundles/ragents.lsp-roslyn/web/index.js +2 -0
  320. package/bundles/ragents.lsp-roslyn/web/index.js.map +7 -0
  321. package/bundles/ragents.lsp-typescript/ragents-bundle.json +36 -0
  322. package/bundles/ragents.lsp-typescript/server/index.js +13 -0
  323. package/bundles/ragents.lsp-typescript/server/index.js.map +7 -0
  324. package/bundles/ragents.lsp-typescript/web/classes.json +1 -0
  325. package/bundles/ragents.lsp-typescript/web/index.js +2 -0
  326. package/bundles/ragents.lsp-typescript/web/index.js.map +7 -0
  327. package/bundles/ragents.model-relay/ragents-bundle.json +33 -0
  328. package/bundles/ragents.model-relay/server/index.js +230 -0
  329. package/bundles/ragents.model-relay/server/index.js.map +7 -0
  330. package/bundles/ragents.orchestration/orchestration.hbs +106 -0
  331. package/bundles/ragents.orchestration/ragents-bundle.json +194 -0
  332. package/bundles/ragents.orchestration/server/index.js +277 -0
  333. package/bundles/ragents.orchestration/server/index.js.map +7 -0
  334. package/bundles/ragents.orchestration/web/chunks/chunk-ODMMQGX2.js +2 -0
  335. package/bundles/ragents.orchestration/web/chunks/chunk-ODMMQGX2.js.map +7 -0
  336. package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +2 -0
  337. package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js.map +7 -0
  338. package/bundles/ragents.orchestration/web/chunks/chunk-OSKPH6SZ.js +2 -0
  339. package/bundles/ragents.orchestration/web/chunks/chunk-OSKPH6SZ.js.map +7 -0
  340. package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js +2 -0
  341. package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js.map +7 -0
  342. package/bundles/ragents.orchestration/web/classes.json +1 -0
  343. package/bundles/ragents.orchestration/web/exports/web/program-slot.js +2 -0
  344. package/bundles/ragents.orchestration/web/exports/web/program-slot.js.map +7 -0
  345. package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +2 -0
  346. package/bundles/ragents.orchestration/web/exports/web/surface-entities.js.map +7 -0
  347. package/bundles/ragents.orchestration/web/exports/web/tile-docking.js +2 -0
  348. package/bundles/ragents.orchestration/web/exports/web/tile-docking.js.map +7 -0
  349. package/bundles/ragents.orchestration/web/index.js +51 -0
  350. package/bundles/ragents.orchestration/web/index.js.map +7 -0
  351. package/bundles/ragents.overseer/ragents-bundle.json +144 -0
  352. package/bundles/ragents.overseer/server/index.js +652 -0
  353. package/bundles/ragents.overseer/server/index.js.map +7 -0
  354. package/bundles/ragents.overseer/web/classes.json +1 -0
  355. package/bundles/ragents.overseer/web/index.js +25 -0
  356. package/bundles/ragents.overseer/web/index.js.map +7 -0
  357. package/bundles/ragents.processes/ragents-bundle.json +93 -0
  358. package/bundles/ragents.processes/server/index.js +204 -0
  359. package/bundles/ragents.processes/server/index.js.map +7 -0
  360. package/bundles/ragents.processes/web/classes.json +1 -0
  361. package/bundles/ragents.processes/web/index.js +4 -0
  362. package/bundles/ragents.processes/web/index.js.map +7 -0
  363. package/bundles/ragents.product/preamble.hbs +9 -0
  364. package/bundles/ragents.product/ragents-bundle.json +93 -0
  365. package/bundles/ragents.product/server/index.js +208 -0
  366. package/bundles/ragents.product/server/index.js.map +7 -0
  367. package/bundles/ragents.product/web/classes.json +1 -0
  368. package/bundles/ragents.product/web/index.js +2 -0
  369. package/bundles/ragents.product/web/index.js.map +7 -0
  370. package/bundles/ragents.profile-distribution/ragents-bundle.json +64 -0
  371. package/bundles/ragents.profile-distribution/server/index.js +241 -0
  372. package/bundles/ragents.profile-distribution/server/index.js.map +7 -0
  373. package/bundles/ragents.reference/ragents-bundle.json +39 -0
  374. package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +27 -0
  375. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +10 -0
  376. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +80 -0
  377. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +82 -0
  378. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +154 -0
  379. package/bundles/ragents.reference/run-scripts/balcony-wizard/package.json +9 -0
  380. package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +32 -0
  381. package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +59 -0
  382. package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +13 -0
  383. package/bundles/ragents.reference/run-scripts/conversation-circle/package.json +9 -0
  384. package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +81 -0
  385. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +26 -0
  386. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +34 -0
  387. package/bundles/ragents.reference/run-scripts/learning-afternoon/RUN.md +24 -0
  388. package/bundles/ragents.reference/run-scripts/learning-afternoon/package.json +10 -0
  389. package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -0
  390. package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +5 -0
  391. package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -0
  392. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +27 -0
  393. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +137 -0
  394. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/state.ts +38 -0
  395. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +42 -0
  396. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +38 -0
  397. package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +218 -0
  398. package/bundles/ragents.reference/run-scripts/moderated-round/RUN.md +12 -0
  399. package/bundles/ragents.reference/run-scripts/moderated-round/package.json +9 -0
  400. package/bundles/ragents.reference/run-scripts/moderated-round/src/server.ts +60 -0
  401. package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +26 -0
  402. package/bundles/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +24 -0
  403. package/bundles/ragents.reference/run-scripts/shared-actor-list/RUN.md +18 -0
  404. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +16 -0
  405. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +39 -0
  406. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +15 -0
  407. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/server.ts +14 -0
  408. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +13 -0
  409. package/bundles/ragents.reference/run-scripts/shared-actor-list/package.json +9 -0
  410. package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +65 -0
  411. package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +26 -0
  412. package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +42 -0
  413. package/bundles/ragents.reference/run-scripts/word-game/RUN.md +25 -0
  414. package/bundles/ragents.reference/run-scripts/word-game/package.json +11 -0
  415. package/bundles/ragents.reference/run-scripts/word-game/src/client.tsx +27 -0
  416. package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +23 -0
  417. package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +105 -0
  418. package/bundles/ragents.reference/run-scripts/word-game/src/state.ts +22 -0
  419. package/bundles/ragents.reference/run-scripts/word-game/src/view.tsx +54 -0
  420. package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +252 -0
  421. package/bundles/ragents.reference/server/index.js +16 -0
  422. package/bundles/ragents.reference/server/index.js.map +7 -0
  423. package/bundles/ragents.reference/skills/100-shared-actor-list/SKILL.md +12 -0
  424. package/bundles/ragents.reference/skills/110-all-card-slots/SKILL.md +12 -0
  425. package/bundles/ragents.reference/skills/150-editorial-workbench/SKILL.md +12 -0
  426. package/bundles/ragents.reference/skills/160-learning-companion/SKILL.md +12 -0
  427. package/bundles/ragents.reference/skills/170-photo-collection/SKILL.md +12 -0
  428. package/bundles/ragents.reference/skills/180-decision-workbench/SKILL.md +12 -0
  429. package/bundles/ragents.reference/skills/190-review-queue/SKILL.md +12 -0
  430. package/bundles/ragents.reference/skills/20-circle-of-four/SKILL.md +12 -0
  431. package/bundles/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +12 -0
  432. package/bundles/ragents.reference/skills/210-moderator-handover/SKILL.md +12 -0
  433. package/bundles/ragents.reference/skills/220-actor-approval-list/SKILL.md +12 -0
  434. package/bundles/ragents.reference/skills/230-shared-state-views/SKILL.md +12 -0
  435. package/bundles/ragents.reference/skills/240-live-result-list/SKILL.md +12 -0
  436. package/bundles/ragents.reference/skills/250-balcony-wizard/SKILL.md +12 -0
  437. package/bundles/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +12 -0
  438. package/bundles/ragents.reference/skills/35-actor-input-fifo/SKILL.md +12 -0
  439. package/bundles/ragents.reference/skills/40-subscription-matrix/SKILL.md +12 -0
  440. package/bundles/ragents.reference/skills/50-subscription-removal/SKILL.md +12 -0
  441. package/bundles/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +12 -0
  442. package/bundles/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +12 -0
  443. package/bundles/ragents.reference/skills/70-headless-counter/SKILL.md +12 -0
  444. package/bundles/ragents.reference/skills/75-lsp-demo/SKILL.md +12 -0
  445. package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +12 -0
  446. package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +12 -0
  447. package/bundles/ragents.reference/skills/95-hello-world/SKILL.md +12 -0
  448. package/bundles/ragents.reference/skills/decision-brief/SKILL.md +33 -0
  449. package/bundles/ragents.reference/skills/learning-sprint/SKILL.md +33 -0
  450. package/bundles/ragents.reference/web/classes.json +1 -0
  451. package/bundles/ragents.reference/web/index.js +2 -0
  452. package/bundles/ragents.reference/web/index.js.map +7 -0
  453. package/bundles/ragents.todo/ragents-bundle.json +48 -0
  454. package/bundles/ragents.todo/server/index.js +108 -0
  455. package/bundles/ragents.todo/server/index.js.map +7 -0
  456. package/bundles/ragents.todo/web/classes.json +1 -0
  457. package/bundles/ragents.todo/web/index.js +2 -0
  458. package/bundles/ragents.todo/web/index.js.map +7 -0
  459. package/bundles/ragents.transcript/ragents-bundle.json +34 -0
  460. package/bundles/ragents.transcript/server/index.js +102 -0
  461. package/bundles/ragents.transcript/server/index.js.map +7 -0
  462. package/bundles/ragents.watch/ragents-bundle.json +39 -0
  463. package/bundles/ragents.watch/server/chunks/chunk-FHAM6OML.js +11 -0
  464. package/bundles/ragents.watch/server/chunks/chunk-FHAM6OML.js.map +7 -0
  465. package/bundles/ragents.watch/server/chunks/chunk-RPBX3J4P.js +10 -0
  466. package/bundles/ragents.watch/server/chunks/chunk-RPBX3J4P.js.map +7 -0
  467. package/bundles/ragents.watch/server/exports/contract.js +9 -0
  468. package/bundles/ragents.watch/server/exports/contract.js.map +7 -0
  469. package/bundles/ragents.watch/server/exports/server/contract.js +9 -0
  470. package/bundles/ragents.watch/server/exports/server/contract.js.map +7 -0
  471. package/bundles/ragents.watch/server/index.js +482 -0
  472. package/bundles/ragents.watch/server/index.js.map +7 -0
  473. package/bundles/ragents.workspace/prompt.hbs +7 -0
  474. package/bundles/ragents.workspace/ragents-bundle.json +148 -0
  475. package/bundles/ragents.workspace/server/index.js +1049 -0
  476. package/bundles/ragents.workspace/server/index.js.map +7 -0
  477. package/bundles/ragents.workspace/web/classes.json +1 -0
  478. package/bundles/ragents.workspace/web/index.js +39 -0
  479. package/bundles/ragents.workspace/web/index.js.map +7 -0
  480. package/package.json +4 -15
  481. package/packages/agent/dist/core/agent-session-runtime.d.ts +33 -0
  482. package/packages/agent/dist/core/agent-session-services.d.ts +35 -0
  483. package/packages/agent/dist/core/agent-session.d.ts +234 -0
  484. package/packages/agent/dist/core/agent-settings.d.ts +27 -0
  485. package/packages/agent/dist/core/auth-guidance.d.ts +4 -0
  486. package/packages/agent/dist/core/compaction/compaction.d.ts +116 -0
  487. package/packages/agent/dist/core/compaction/index.d.ts +6 -0
  488. package/packages/agent/dist/core/compaction/utils.d.ts +39 -0
  489. package/packages/agent/dist/core/defaults.d.ts +3 -0
  490. package/packages/agent/dist/core/extensions/index.d.ts +11 -0
  491. package/packages/agent/dist/core/extensions/loader.d.ts +12 -0
  492. package/packages/agent/dist/core/extensions/runner.d.ts +39 -0
  493. package/packages/agent/dist/core/extensions/types.d.ts +156 -0
  494. package/packages/agent/dist/core/extensions/wrapper.d.ts +12 -0
  495. package/packages/agent/dist/core/messages.d.ts +37 -0
  496. package/packages/agent/dist/core/model-runtime.d.ts +32 -0
  497. package/packages/agent/dist/core/provider-composer.d.ts +25 -0
  498. package/packages/agent/dist/core/resource-loader.d.ts +39 -0
  499. package/packages/agent/dist/core/sdk.d.ts +38 -0
  500. package/packages/agent/dist/core/session-manager.d.ts +189 -0
  501. package/packages/agent/dist/core/skills.d.ts +20 -0
  502. package/packages/agent/dist/core/source-info.d.ts +16 -0
  503. package/packages/agent/dist/core/system-prompt.d.ts +21 -0
  504. package/packages/agent/dist/core/tools/bash.d.ts +63 -0
  505. package/packages/agent/dist/core/tools/edit-diff.d.ts +98 -0
  506. package/packages/agent/dist/core/tools/edit.d.ts +41 -0
  507. package/packages/agent/dist/core/tools/file-mutation-queue.d.ts +6 -0
  508. package/packages/agent/dist/core/tools/index.d.ts +5 -0
  509. package/packages/agent/dist/core/tools/output-accumulator.d.ts +58 -0
  510. package/packages/agent/dist/core/tools/path-utils.d.ts +8 -0
  511. package/packages/agent/dist/core/tools/read.d.ts +33 -0
  512. package/packages/agent/dist/core/tools/truncate.d.ts +61 -0
  513. package/packages/agent/dist/core/tools/write.d.ts +23 -0
  514. package/packages/agent/dist/index.d.ts +13 -0
  515. package/packages/agent/dist/loop/agent-loop.d.ts +13 -0
  516. package/packages/agent/dist/loop/agent.d.ts +103 -0
  517. package/packages/agent/dist/loop/index.d.ts +5 -0
  518. package/packages/agent/dist/loop/types.d.ts +333 -0
  519. package/packages/agent/dist/loop/uuid.d.ts +2 -0
  520. package/packages/agent/dist/utils/child-process.d.ts +17 -0
  521. package/packages/agent/dist/utils/exif-orientation.d.ts +5 -0
  522. package/packages/agent/dist/utils/frontmatter.d.ts +8 -0
  523. package/packages/agent/dist/utils/image-convert.d.ts +2 -0
  524. package/packages/agent/dist/utils/image-process.d.ts +18 -0
  525. package/packages/agent/dist/utils/image-resize-core.d.ts +30 -0
  526. package/packages/agent/dist/utils/image-resize-worker.d.ts +2 -0
  527. package/packages/agent/dist/utils/image-resize.d.ts +16 -0
  528. package/packages/agent/dist/utils/mime.d.ts +3 -0
  529. package/packages/agent/dist/utils/paths.d.ts +15 -0
  530. package/packages/agent/dist/utils/photon.d.ts +21 -0
  531. package/packages/agent/dist/utils/shell.d.ts +17 -0
  532. package/packages/agent/dist/utils/sleep.d.ts +5 -0
  533. package/packages/agent/package.json +3 -32
  534. package/packages/agent/src/core/agent-session-runtime.ts +15 -469
  535. package/packages/agent/src/core/agent-session-services.ts +17 -167
  536. package/packages/agent/src/core/agent-session.ts +154 -2403
  537. package/packages/agent/src/core/agent-settings.ts +20 -0
  538. package/packages/agent/src/core/auth-guidance.ts +0 -4
  539. package/packages/agent/src/core/compaction/compaction.ts +4 -33
  540. package/packages/agent/src/core/compaction/index.ts +0 -1
  541. package/packages/agent/src/core/compaction/utils.ts +2 -2
  542. package/packages/agent/src/core/defaults.ts +1 -1
  543. package/packages/agent/src/core/extensions/index.ts +6 -117
  544. package/packages/agent/src/core/extensions/loader.ts +21 -605
  545. package/packages/agent/src/core/extensions/runner.ts +48 -969
  546. package/packages/agent/src/core/extensions/types.ts +35 -1298
  547. package/packages/agent/src/core/extensions/wrapper.ts +13 -34
  548. package/packages/agent/src/core/messages.ts +5 -109
  549. package/packages/agent/src/core/model-runtime.ts +109 -467
  550. package/packages/agent/src/core/provider-composer.ts +21 -451
  551. package/packages/agent/src/core/resource-loader.ts +18 -822
  552. package/packages/agent/src/core/sdk.ts +46 -281
  553. package/packages/agent/src/core/session-manager.ts +11 -891
  554. package/packages/agent/src/core/skills.ts +8 -440
  555. package/packages/agent/src/core/source-info.ts +0 -12
  556. package/packages/agent/src/core/system-prompt.ts +2 -41
  557. package/packages/agent/src/core/tools/bash.ts +20 -32
  558. package/packages/agent/src/core/tools/edit-diff.ts +0 -60
  559. package/packages/agent/src/core/tools/edit.ts +2 -18
  560. package/packages/agent/src/core/tools/index.ts +4 -130
  561. package/packages/agent/src/core/tools/output-accumulator.ts +33 -5
  562. package/packages/agent/src/core/tools/path-utils.ts +2 -49
  563. package/packages/agent/src/core/tools/read.ts +4 -12
  564. package/packages/agent/src/core/tools/truncate.ts +0 -15
  565. package/packages/agent/src/core/tools/write.ts +1 -8
  566. package/packages/agent/src/index.ts +11 -272
  567. package/packages/{agent-core/src → agent/src/loop}/agent-loop.ts +127 -273
  568. package/packages/{agent-core/src → agent/src/loop}/agent.ts +12 -164
  569. package/packages/{agent-core/src → agent/src/loop}/types.ts +6 -105
  570. package/packages/agent/src/utils/child-process.ts +0 -13
  571. package/packages/agent/src/utils/image-convert.ts +0 -25
  572. package/packages/agent/src/utils/paths.ts +1 -71
  573. package/packages/agent/src/utils/shell.ts +13 -156
  574. package/packages/ai/dist/api/ai-sdk-messages.d.ts +9 -0
  575. package/packages/ai/dist/api/ai-sdk-transport.d.ts +13 -0
  576. package/packages/ai/dist/api/ai-sdk.d.ts +13 -0
  577. package/packages/ai/dist/api/ai-sdk.lazy.d.ts +3 -0
  578. package/packages/ai/dist/api/lazy.d.ts +15 -0
  579. package/packages/ai/dist/api/simple-options.d.ts +4 -0
  580. package/packages/ai/dist/api/transform-messages.d.ts +8 -0
  581. package/packages/ai/dist/api-registry.d.ts +25 -0
  582. package/packages/ai/dist/auth/context.d.ts +4 -0
  583. package/packages/ai/dist/auth/helpers.d.ts +4 -0
  584. package/packages/ai/dist/auth/resolve.d.ts +19 -0
  585. package/packages/ai/dist/auth/types.d.ts +51 -0
  586. package/packages/ai/dist/env-api-keys.d.ts +8 -0
  587. package/packages/ai/dist/index.d.ts +19 -0
  588. package/packages/ai/dist/models.d.ts +71 -0
  589. package/packages/ai/dist/models.generated.d.ts +8021 -0
  590. package/packages/ai/dist/providers/all.d.ts +15 -0
  591. package/packages/ai/dist/providers/faux.d.ts +97 -0
  592. package/packages/ai/dist/providers/openrouter.d.ts +3 -0
  593. package/packages/ai/dist/providers/openrouter.models.d.ts +8019 -0
  594. package/packages/ai/dist/types.d.ts +541 -0
  595. package/packages/ai/dist/utils/diagnostics.d.ts +13 -0
  596. package/packages/ai/dist/utils/error-body.d.ts +25 -0
  597. package/packages/ai/dist/utils/estimate.d.ts +17 -0
  598. package/packages/ai/dist/utils/event-stream.d.ts +21 -0
  599. package/packages/ai/dist/utils/headers.d.ts +2 -0
  600. package/packages/ai/dist/utils/json-parse.d.ts +16 -0
  601. package/packages/ai/dist/utils/overflow.d.ts +54 -0
  602. package/packages/ai/dist/utils/provider-env.d.ts +7 -0
  603. package/packages/ai/dist/utils/retry.d.ts +12 -0
  604. package/packages/ai/dist/utils/sanitize-unicode.d.ts +22 -0
  605. package/packages/ai/dist/utils/typebox-helpers.d.ts +17 -0
  606. package/packages/ai/dist/utils/validation.d.ts +10 -0
  607. package/packages/ai/package.json +2 -6
  608. package/packages/ai/src/api/ai-sdk-transport.ts +2 -2
  609. package/packages/ai/src/api/simple-options.ts +0 -34
  610. package/packages/ai/src/api-registry.ts +1 -12
  611. package/packages/ai/src/auth/context.ts +1 -30
  612. package/packages/ai/src/auth/helpers.ts +3 -34
  613. package/packages/ai/src/auth/resolve.ts +10 -108
  614. package/packages/ai/src/auth/types.ts +9 -176
  615. package/packages/ai/src/index.ts +1 -13
  616. package/packages/ai/src/models.ts +41 -407
  617. package/packages/ai/src/providers/all.ts +3 -31
  618. package/packages/ai/src/providers/openrouter.models.ts +14 -0
  619. package/packages/ai/src/types.ts +0 -104
  620. package/packages/ai/src/utils/diagnostics.ts +0 -32
  621. package/packages/ai/src/utils/headers.ts +0 -11
  622. package/packages/ai/src/utils/overflow.ts +0 -7
  623. package/packages/ai/src/utils/validation.ts +0 -15
  624. package/packages/ragents/package.json +3 -6
  625. package/packages/ragents/src/access.ts +2 -1
  626. package/packages/ragents/src/agents/actor-input.ts +14 -18
  627. package/packages/ragents/src/agents/catalog.ts +3 -3
  628. package/packages/ragents/src/agents/plugins.ts +0 -4
  629. package/packages/ragents/src/agents/scheduler.ts +232 -78
  630. package/packages/ragents/src/agents/schemas.ts +1 -36
  631. package/packages/ragents/src/agents/tool-orientation.ts +1 -1
  632. package/packages/ragents/src/agents/tools.ts +72 -73
  633. package/packages/ragents/src/agents/toolset.ts +5 -5
  634. package/packages/ragents/src/agents/turn.ts +2 -14
  635. package/packages/ragents/src/agents/workspaces.ts +18 -0
  636. package/packages/ragents/src/domain/actor-reference.ts +22 -0
  637. package/packages/ragents/src/domain/driver.ts +0 -9
  638. package/packages/ragents/src/domain/event-semantics.ts +62 -74
  639. package/packages/ragents/src/domain/event-validation.ts +22 -21
  640. package/packages/ragents/src/domain/events.ts +19 -7
  641. package/packages/ragents/src/domain/json.ts +2 -0
  642. package/packages/ragents/src/domain/model.ts +40 -18
  643. package/packages/ragents/src/domain/projection.ts +43 -15
  644. package/packages/ragents/src/domain/schema-errors.ts +3 -3
  645. package/packages/ragents/src/drivers/agent-hooks.ts +40 -0
  646. package/packages/ragents/src/drivers/agent-runtime.ts +118 -186
  647. package/packages/ragents/src/drivers/agent.ts +5 -20
  648. package/packages/ragents/src/drivers/attachments.ts +4 -24
  649. package/packages/ragents/src/drivers/skill-preload.ts +4 -16
  650. package/packages/ragents/src/drivers/types.ts +20 -3
  651. package/packages/ragents/src/http/contracts.ts +16 -3
  652. package/packages/ragents/src/http/methods.ts +32 -33
  653. package/packages/ragents/src/index.ts +5 -15
  654. package/packages/ragents/src/plugin-host.ts +151 -105
  655. package/packages/ragents/src/plugin-types.ts +86 -23
  656. package/packages/ragents/src/rpc/peer.ts +6 -0
  657. package/packages/ragents/src/runtime/decisions/actions.ts +40 -37
  658. package/packages/ragents/src/runtime/decisions/actors.ts +90 -51
  659. package/packages/ragents/src/runtime/decisions/artifacts.ts +2 -2
  660. package/packages/ragents/src/runtime/decisions/inputs.ts +3 -3
  661. package/packages/ragents/src/runtime/decisions/subscriptions.ts +9 -7
  662. package/packages/ragents/src/runtime/decisions/turns.ts +37 -4
  663. package/packages/ragents/src/runtime/guards.ts +12 -21
  664. package/packages/ragents/src/runtime/journal-storage.ts +4 -2
  665. package/packages/ragents/src/runtime/journal.ts +1 -1
  666. package/packages/ragents/src/runtime/orchestration.ts +31 -14
  667. package/packages/ragents/src/runtime/serial-queue.ts +24 -0
  668. package/packages/ragents/src/runtime/stop.ts +19 -44
  669. package/packages/ragents/src/script/mediators.ts +4 -5
  670. package/packages/ragents/src/typescript/index.ts +2 -0
  671. package/packages/ragents/src/typescript/run-context.ts +10 -8
  672. package/packages/ragents/src/typescript/snippet.ts +7 -6
  673. package/packages/workspace-executor/package.json +2 -2
  674. package/packages/workspace-executor/src/bash-launch.ts +45 -0
  675. package/packages/workspace-executor/src/browser/contract.ts +71 -0
  676. package/packages/workspace-executor/src/browser/module.ts +74 -0
  677. package/packages/workspace-executor/src/browser/pages.ts +298 -0
  678. package/packages/workspace-executor/src/browser/playwright.ts +52 -0
  679. package/packages/workspace-executor/src/commands.ts +170 -0
  680. package/packages/workspace-executor/src/context.ts +34 -6
  681. package/packages/workspace-executor/src/errors.ts +12 -0
  682. package/packages/workspace-executor/src/executor.ts +62 -104
  683. package/packages/workspace-executor/src/files.ts +287 -0
  684. package/packages/workspace-executor/src/index.ts +82 -18
  685. package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +1 -0
  686. package/packages/workspace-executor/src/language-server/contract.ts +14 -0
  687. package/packages/workspace-executor/src/language-server/host.ts +82 -26
  688. package/packages/workspace-executor/src/language-server/module.ts +107 -0
  689. package/packages/workspace-executor/src/language-server/workspace-solutions.ts +90 -0
  690. package/packages/workspace-executor/src/managed-process.ts +1 -1
  691. package/packages/workspace-executor/src/module.ts +35 -0
  692. package/packages/workspace-executor/src/modules.ts +25 -0
  693. package/packages/workspace-executor/src/paths.ts +57 -5
  694. package/packages/workspace-executor/src/process-sandbox.ts +16 -0
  695. package/packages/workspace-executor/src/processes/module.ts +48 -0
  696. package/{plugins/ragents.processes/server → packages/workspace-executor/src/processes}/process-table.ts +80 -57
  697. package/packages/workspace-executor/src/processes/scanner.ts +106 -0
  698. package/{plugins/ragents.processes/server → packages/workspace-executor/src/processes}/snapshot.ts +23 -11
  699. package/{plugins/ragents.processes/server → packages/workspace-executor/src/processes}/terminator.ts +19 -20
  700. package/packages/workspace-executor/src/run-folders.ts +33 -0
  701. package/packages/workspace-executor/src/safe-environment.ts +14 -0
  702. package/packages/workspace-executor/src/sandbox-tools.ts +206 -36
  703. package/packages/workspace-executor/src/shell-platform.ts +2 -2
  704. package/plugins/package.json +1 -1
  705. package/plugins/ragents.activity/ragents-plugin.json +3 -0
  706. package/plugins/ragents.activity/server/index.ts +2 -2
  707. package/plugins/ragents.activity/web/ActivityHeader.tsx +2 -2
  708. package/plugins/ragents.activity/web/activity.ts +1 -1
  709. package/plugins/ragents.activity/web/index.tsx +1 -1
  710. package/plugins/ragents.actor-programs/prompt.hbs +8 -7
  711. package/plugins/ragents.actor-programs/ragents-plugin.json +3 -0
  712. package/plugins/ragents.actor-programs/server/agent-tools.ts +3 -3
  713. package/{apps/server/src/plugin-support/actor-programs → plugins/ragents.actor-programs/server}/capability-resolver.ts +1 -16
  714. package/plugins/ragents.actor-programs/server/controls-template.ts +5 -18
  715. package/plugins/ragents.actor-programs/server/controls-tool.ts +8 -11
  716. package/plugins/ragents.actor-programs/server/index.ts +10 -10
  717. package/{apps/server/src/plugin-support/actor-programs → plugins/ragents.actor-programs/server}/limits.ts +4 -4
  718. package/plugins/ragents.actor-programs/server/methods.ts +2 -2
  719. package/{apps/server/src/plugin-support/actor-programs → plugins/ragents.actor-programs/server}/operations.ts +2 -4
  720. package/plugins/ragents.actor-programs/server/project-diagnostics.ts +65 -70
  721. package/plugins/ragents.actor-programs/server/prompts.ts +4 -4
  722. package/plugins/ragents.actor-programs/server/routes.ts +14 -8
  723. package/plugins/ragents.actor-programs/server/runtime.ts +132 -55
  724. package/plugins/ragents.actor-programs/server/templates.ts +35 -80
  725. package/plugins/ragents.actor-programs/server/test-report.ts +106 -0
  726. package/plugins/ragents.actor-programs/server/tool-contributor.ts +4 -4
  727. package/plugins/ragents.actor-programs/summary.hbs +1 -1
  728. package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +15 -10
  729. package/plugins/ragents.actor-programs/web/AppsPanel.tsx +47 -30
  730. package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +15 -17
  731. package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +3 -3
  732. package/plugins/ragents.actor-programs/web/FunctionForm.tsx +3 -3
  733. package/plugins/ragents.actor-programs/web/ProgramSource.tsx +12 -3
  734. package/plugins/ragents.actor-programs/web/api.ts +5 -5
  735. package/plugins/ragents.actor-programs/web/bridge.ts +2 -3
  736. package/plugins/ragents.actor-programs/web/chat-state.ts +9 -8
  737. package/plugins/ragents.actor-programs/web/index.tsx +7 -17
  738. package/plugins/ragents.actor-programs/web/program-state.ts +3 -3
  739. package/plugins/ragents.actor-programs/web/state-revision.ts +2 -2
  740. package/plugins/ragents.ask/ask-payload.ts +25 -0
  741. package/plugins/ragents.ask/contract.ts +2 -2
  742. package/plugins/ragents.ask/ragents-plugin.json +7 -0
  743. package/plugins/ragents.ask/server/answer-method.ts +1 -1
  744. package/plugins/ragents.ask/server/ask-service.ts +43 -19
  745. package/plugins/ragents.ask/server/ask-tool.ts +2 -2
  746. package/plugins/ragents.ask/server/contract.ts +9 -1
  747. package/plugins/ragents.ask/server/index.ts +8 -10
  748. package/plugins/ragents.ask/server/tool-contributor.ts +3 -3
  749. package/plugins/ragents.ask/web/AskActionView.tsx +36 -0
  750. package/{apps/web/src/chat → plugins/ragents.ask/web}/QuestionCard.tsx +7 -5
  751. package/plugins/ragents.ask/web/QuestionSection.tsx +22 -21
  752. package/plugins/ragents.ask/web/api.ts +1 -1
  753. package/plugins/ragents.ask/web/index.tsx +11 -8
  754. package/plugins/ragents.browser/provision.ts +9 -8
  755. package/plugins/ragents.browser/ragents-plugin.json +6 -0
  756. package/plugins/ragents.browser/server/browser.ts +165 -286
  757. package/plugins/ragents.browser/server/contract.ts +8 -19
  758. package/plugins/ragents.browser/server/index.ts +8 -7
  759. package/plugins/ragents.browser/server/tools.ts +29 -37
  760. package/plugins/ragents.browser/skills/browser-testing/SKILL.md +3 -1
  761. package/plugins/ragents.documents/contract.ts +4 -2
  762. package/plugins/ragents.documents/ragents-plugin.json +6 -0
  763. package/plugins/ragents.documents/server/config.ts +1 -1
  764. package/plugins/ragents.documents/server/document-write-tool.ts +2 -2
  765. package/plugins/ragents.documents/server/files-route.ts +2 -3
  766. package/plugins/ragents.documents/server/index.ts +10 -11
  767. package/plugins/ragents.documents/server/show-document-tool.ts +2 -2
  768. package/plugins/ragents.documents/server/store.ts +3 -3
  769. package/plugins/ragents.documents/server/tool-contributor.ts +3 -3
  770. package/plugins/ragents.documents/web/DocumentViewer.tsx +5 -6
  771. package/plugins/ragents.documents/web/api.ts +1 -1
  772. package/plugins/ragents.documents/web/index.tsx +4 -4
  773. package/plugins/ragents.lsp-fsharp/provision.ts +2 -2
  774. package/plugins/ragents.lsp-fsharp/ragents-plugin.json +3 -0
  775. package/plugins/ragents.lsp-fsharp/server/index.ts +3 -3
  776. package/plugins/ragents.lsp-fsharp/web/index.tsx +1 -1
  777. package/plugins/ragents.lsp-roslyn/provision.ts +2 -2
  778. package/plugins/ragents.lsp-roslyn/ragents-plugin.json +3 -0
  779. package/plugins/ragents.lsp-roslyn/server/index.ts +47 -8
  780. package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +145 -0
  781. package/plugins/ragents.lsp-roslyn/web/index.tsx +1 -1
  782. package/plugins/ragents.lsp-typescript/ragents-plugin.json +3 -0
  783. package/plugins/ragents.lsp-typescript/server/index.ts +3 -3
  784. package/plugins/ragents.lsp-typescript/web/index.tsx +1 -1
  785. package/plugins/ragents.model-relay/ragents-plugin.json +3 -0
  786. package/plugins/ragents.model-relay/server/config.ts +5 -31
  787. package/plugins/ragents.model-relay/server/index.ts +5 -6
  788. package/plugins/ragents.model-relay/server/relay.ts +8 -9
  789. package/plugins/ragents.orchestration/contract.ts +13 -14
  790. package/plugins/ragents.orchestration/orchestration.hbs +4 -3
  791. package/plugins/ragents.orchestration/ragents-plugin.json +6 -0
  792. package/plugins/ragents.orchestration/server/index.ts +13 -16
  793. package/plugins/ragents.orchestration/server/run-stop-tool.ts +4 -4
  794. package/plugins/ragents.orchestration/server/{canvas-tool.ts → surface-tool.ts} +42 -43
  795. package/plugins/ragents.orchestration/surface.hbs +34 -0
  796. package/plugins/ragents.orchestration/tiled-layout.ts +16 -16
  797. package/plugins/ragents.orchestration/web/ActorChat.tsx +16 -14
  798. package/plugins/ragents.orchestration/web/ActorChatControls.tsx +23 -26
  799. package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +5 -6
  800. package/plugins/ragents.orchestration/web/ActorPopout.tsx +7 -5
  801. package/plugins/ragents.orchestration/web/ActorShortcut.tsx +16 -16
  802. package/plugins/ragents.orchestration/web/{ActorCanvasControls.tsx → ActorSurfaceControls.tsx} +23 -28
  803. package/plugins/ragents.orchestration/web/ActorTile.tsx +2 -2
  804. package/plugins/ragents.orchestration/web/Center.tsx +47 -55
  805. package/plugins/ragents.orchestration/web/DocumentsSection.tsx +4 -4
  806. package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +7 -7
  807. package/plugins/ragents.orchestration/web/FlowInspector.tsx +24 -42
  808. package/plugins/ragents.orchestration/web/JournalStatus.tsx +8 -8
  809. package/plugins/ragents.orchestration/web/MaterialBody.tsx +5 -5
  810. package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
  811. package/plugins/ragents.orchestration/web/SurfaceStartup.tsx +8 -0
  812. package/plugins/ragents.orchestration/web/{CanvasTiles.tsx → SurfaceTiles.tsx} +18 -18
  813. package/plugins/ragents.orchestration/web/{TiledCanvas.tsx → TiledSurface.tsx} +22 -22
  814. package/plugins/ragents.orchestration/web/actor-header-settings.ts +2 -2
  815. package/plugins/ragents.orchestration/web/api.ts +4 -10
  816. package/plugins/ragents.orchestration/web/constants.ts +0 -1
  817. package/plugins/ragents.orchestration/web/executions.ts +3 -3
  818. package/plugins/ragents.orchestration/web/index.tsx +19 -124
  819. package/plugins/ragents.orchestration/web/program-slot.ts +14 -0
  820. package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +95 -0
  821. package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +109 -0
  822. package/plugins/ragents.orchestration/web/{column/RunColumn.tsx → run-panel/RunPanel.tsx} +211 -83
  823. package/plugins/ragents.orchestration/web/{column/ColumnSettings.tsx → run-panel/RunPanelSettings.tsx} +13 -13
  824. package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +165 -0
  825. package/plugins/ragents.orchestration/web/{column/column-actors.ts → run-panel/run-panel-actors.ts} +14 -13
  826. package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +47 -0
  827. package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +30 -0
  828. package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +71 -0
  829. package/plugins/ragents.orchestration/web/{column → run-panel}/sheet-status.ts +4 -4
  830. package/plugins/ragents.orchestration/web/{canvas-stage.ts → surface-entities.ts} +2 -2
  831. package/plugins/ragents.orchestration/web/{canvas-startup.ts → surface-startup.ts} +7 -10
  832. package/plugins/ragents.orchestration/web/surface-view-settings.ts +42 -0
  833. package/plugins/ragents.orchestration/web/tile-docking.ts +14 -14
  834. package/plugins/ragents.orchestration/web/tiled-view-settings.ts +26 -26
  835. package/plugins/ragents.overseer/contract.ts +20 -14
  836. package/plugins/ragents.overseer/ragents-plugin.json +3 -0
  837. package/plugins/ragents.overseer/server/api.ts +34 -23
  838. package/plugins/ragents.overseer/server/coordinator-prompt.ts +3 -3
  839. package/plugins/ragents.overseer/server/coordinator.ts +19 -0
  840. package/plugins/ragents.overseer/server/index.ts +39 -27
  841. package/plugins/ragents.overseer/server/orientation.ts +4 -5
  842. package/plugins/ragents.overseer/server/quick-answer.ts +5 -4
  843. package/plugins/ragents.overseer/server/reset-method.ts +4 -3
  844. package/plugins/ragents.overseer/server/run-directory.ts +5 -5
  845. package/plugins/ragents.overseer/server/settings-method.ts +1 -1
  846. package/plugins/ragents.overseer/server/settings.ts +6 -6
  847. package/plugins/ragents.overseer/server/user-location.ts +20 -19
  848. package/plugins/ragents.overseer/web/ModelSettings.tsx +4 -4
  849. package/plugins/ragents.overseer/web/chat-display.ts +1 -1
  850. package/plugins/ragents.overseer/web/index.tsx +51 -26
  851. package/plugins/ragents.overseer/web/model-settings.ts +1 -1
  852. package/plugins/ragents.overseer/web/quick-answers.ts +2 -2
  853. package/plugins/ragents.processes/contract.ts +5 -5
  854. package/plugins/ragents.processes/ragents-plugin.json +3 -0
  855. package/plugins/ragents.processes/server/index.ts +13 -19
  856. package/plugins/ragents.processes/server/methods.ts +18 -20
  857. package/plugins/ragents.processes/server/observer.ts +64 -104
  858. package/plugins/ragents.processes/server/run-processes.ts +24 -0
  859. package/plugins/ragents.processes/web/ProcessHeader.tsx +13 -16
  860. package/plugins/ragents.processes/web/index.tsx +2 -1
  861. package/plugins/ragents.processes/web/processes.ts +1 -1
  862. package/plugins/ragents.product/ragents-plugin.json +3 -0
  863. package/plugins/ragents.product/server/config.ts +12 -13
  864. package/plugins/ragents.product/server/index.ts +15 -16
  865. package/plugins/ragents.product/server/runtime.ts +2 -2
  866. package/plugins/ragents.product/web/index.tsx +3 -3
  867. package/plugins/ragents.profile-distribution/contract.ts +6 -9
  868. package/plugins/ragents.profile-distribution/ragents-plugin.json +3 -0
  869. package/plugins/ragents.profile-distribution/server/archive.ts +26 -51
  870. package/plugins/ragents.profile-distribution/server/config.ts +2 -2
  871. package/plugins/ragents.profile-distribution/server/index.ts +9 -16
  872. package/plugins/ragents.reference/examples.ts +1 -1
  873. package/plugins/ragents.reference/ragents-plugin.json +3 -0
  874. package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +2 -2
  875. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +1 -1
  876. package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +1 -1
  877. package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +4 -4
  878. package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +1 -1
  879. package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +1 -1
  880. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
  881. package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +2 -2
  882. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +1 -1
  883. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +1 -1
  884. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/state.ts +2 -2
  885. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +11 -11
  886. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +15 -15
  887. package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +3 -8
  888. package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +1 -1
  889. package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
  890. package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +2 -2
  891. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +6 -6
  892. package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +3 -3
  893. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
  894. package/plugins/ragents.reference/run-scripts/word-game/RUN.md +1 -1
  895. package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
  896. package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +1 -2
  897. package/plugins/ragents.reference/run-scripts/word-game/src/state.ts +6 -6
  898. package/plugins/ragents.reference/run-scripts/word-game/src/view.tsx +14 -14
  899. package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +4 -5
  900. package/plugins/ragents.reference/server/index.ts +2 -2
  901. package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +1 -1
  902. package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +1 -1
  903. package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +1 -1
  904. package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +1 -1
  905. package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +2 -2
  906. package/plugins/ragents.reference/skills/decision-brief/SKILL.md +2 -2
  907. package/plugins/ragents.reference/walkthroughs.ts +19 -19
  908. package/plugins/ragents.reference/web/StartGuides.tsx +2 -2
  909. package/plugins/ragents.reference/web/index.tsx +1 -1
  910. package/plugins/ragents.todo/ragents-plugin.json +3 -0
  911. package/plugins/ragents.todo/server/index.ts +2 -2
  912. package/plugins/ragents.todo/server/todo-tool.ts +4 -5
  913. package/plugins/ragents.todo/server/tool-contributor.ts +2 -2
  914. package/plugins/ragents.todo/web/TodoSection.tsx +3 -3
  915. package/plugins/ragents.todo/web/index.ts +1 -1
  916. package/plugins/ragents.transcript/ragents-plugin.json +3 -0
  917. package/plugins/ragents.transcript/server/index.ts +4 -4
  918. package/plugins/ragents.transcript/server/transcript.ts +2 -3
  919. package/plugins/ragents.watch/ragents-plugin.json +6 -0
  920. package/plugins/ragents.watch/server/condition.ts +2 -2
  921. package/plugins/ragents.watch/server/contract.ts +1 -1
  922. package/plugins/ragents.watch/server/functions.ts +3 -3
  923. package/plugins/ragents.watch/server/index.ts +3 -3
  924. package/plugins/ragents.watch/server/observation.ts +6 -6
  925. package/plugins/ragents.watch/server/service.ts +5 -5
  926. package/plugins/ragents.workspace/client/workspace-client.ts +129 -58
  927. package/plugins/ragents.workspace/contract.ts +98 -35
  928. package/plugins/ragents.workspace/prompt.hbs +1 -8
  929. package/plugins/ragents.workspace/ragents-plugin.json +3 -0
  930. package/plugins/ragents.workspace/server/binding.ts +122 -39
  931. package/plugins/ragents.workspace/server/browse-route.ts +96 -103
  932. package/plugins/ragents.workspace/server/clients.ts +236 -68
  933. package/plugins/ragents.workspace/server/config.ts +30 -0
  934. package/plugins/ragents.workspace/server/index.ts +61 -26
  935. package/plugins/ragents.workspace/server/runtime.ts +271 -46
  936. package/{apps/server/src/plugin-support → plugins/ragents.workspace/server}/shell-platform.ts +3 -5
  937. package/{apps/server/src/plugin-support → plugins/ragents.workspace/server}/workspace-tool-naming.ts +7 -1
  938. package/plugins/ragents.workspace/web/FileBrowser.tsx +11 -8
  939. package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +115 -61
  940. package/plugins/ragents.workspace/web/api.ts +1 -1
  941. package/plugins/ragents.workspace/web/index.tsx +1 -1
  942. package/ragents.config.core.ts +2 -7
  943. package/ragents.config.showcase.ts +2 -5
  944. package/scripts/agent/agent-cli.ts +265 -107
  945. package/scripts/agent/journal.ts +3 -1
  946. package/scripts/agent/turn-control.ts +19 -0
  947. package/scripts/package/build-package.ts +68 -13
  948. package/scripts/package/ragents.mjs +4 -2
  949. package/scripts/plugin/build-builtin-plugins.ts +52 -0
  950. package/scripts/plugin/plugin-cli.ts +99 -0
  951. package/scripts/provision/run-provision.ts +20 -18
  952. package/scripts/remote/connect.ts +75 -53
  953. package/scripts/remote/start.ts +2 -3
  954. package/scripts/workspace-client/run-workspace-client.ts +15 -9
  955. package/apps/server/agent-home/settings.json +0 -3
  956. package/apps/server/src/chat-attachments.ts +0 -52
  957. package/apps/server/src/chat-events.ts +0 -185
  958. package/apps/server/src/plugin-support/asset-path.ts +0 -4
  959. package/apps/server/src/profile/plugin-list.ts +0 -19
  960. package/apps/server/src/web-build.ts +0 -82
  961. package/apps/web/column.html +0 -12
  962. package/apps/web/index.html +0 -12
  963. package/apps/web/src/StartSurface.tsx +0 -161
  964. package/apps/web/src/chat/ChatInputToolbar.tsx +0 -488
  965. package/apps/web/src/chat/ChatMessages.tsx +0 -666
  966. package/apps/web/src/chat/ChatPanel.tsx +0 -61
  967. package/apps/web/src/chat/DetailModeSwitch.tsx +0 -58
  968. package/apps/web/src/chat/Markdown.tsx +0 -104
  969. package/apps/web/src/chat/StepPopover.tsx +0 -82
  970. package/apps/web/src/chat/WorkingScenes.tsx +0 -235
  971. package/apps/web/src/chat/attachments.ts +0 -53
  972. package/apps/web/src/chat/chat-scroll.ts +0 -41
  973. package/apps/web/src/chat/texts.ts +0 -61
  974. package/apps/web/src/chat/types.ts +0 -26
  975. package/apps/web/src/column/ColumnApp.tsx +0 -234
  976. package/apps/web/src/column/column-location.ts +0 -30
  977. package/apps/web/src/column/host-contract.ts +0 -93
  978. package/apps/web/src/panel/OverviewPage.tsx +0 -215
  979. package/apps/web/src/panel/SettingsPage.tsx +0 -98
  980. package/apps/web/src/panel/target-state.ts +0 -78
  981. package/apps/web/src/plugin-discovery.ts +0 -5
  982. package/apps/web/src/virtual-plugins.d.ts +0 -3
  983. package/apps/web/vite.config.ts +0 -140
  984. package/packages/agent/src/config.ts +0 -161
  985. package/packages/agent/src/core/auth-storage.ts +0 -271
  986. package/packages/agent/src/core/bash-executor.ts +0 -156
  987. package/packages/agent/src/core/compaction/branch-summarization.ts +0 -372
  988. package/packages/agent/src/core/diagnostics.ts +0 -15
  989. package/packages/agent/src/core/event-bus.ts +0 -33
  990. package/packages/agent/src/core/exec.ts +0 -107
  991. package/packages/agent/src/core/experimental.ts +0 -3
  992. package/packages/agent/src/core/footer-data-provider.ts +0 -388
  993. package/packages/agent/src/core/http-dispatcher.ts +0 -106
  994. package/packages/agent/src/core/index.ts +0 -78
  995. package/packages/agent/src/core/model-config.ts +0 -287
  996. package/packages/agent/src/core/model-registry.ts +0 -126
  997. package/packages/agent/src/core/model-resolver.ts +0 -675
  998. package/packages/agent/src/core/output-guard.ts +0 -108
  999. package/packages/agent/src/core/package-manager.ts +0 -2441
  1000. package/packages/agent/src/core/prompt-templates.ts +0 -284
  1001. package/packages/agent/src/core/resolve-config-value.ts +0 -287
  1002. package/packages/agent/src/core/runtime-credentials.ts +0 -48
  1003. package/packages/agent/src/core/session-cwd.ts +0 -59
  1004. package/packages/agent/src/core/settings-manager.ts +0 -1212
  1005. package/packages/agent/src/core/slash-commands.ts +0 -41
  1006. package/packages/agent/src/core/timings.ts +0 -50
  1007. package/packages/agent/src/core/tools/tool-definition-wrapper.ts +0 -45
  1008. package/packages/agent/src/core/trust-manager.ts +0 -244
  1009. package/packages/agent/src/utils/ansi.ts +0 -60
  1010. package/packages/agent/src/utils/fs-watch.ts +0 -30
  1011. package/packages/agent/src/utils/git.ts +0 -226
  1012. package/packages/agent/src/utils/json.ts +0 -6
  1013. package/packages/agent/src/utils/tools-manager.ts +0 -63
  1014. package/packages/agent-core/package.json +0 -32
  1015. package/packages/ai/src/api/openrouter-images.lazy.ts +0 -10
  1016. package/packages/ai/src/api/openrouter-images.ts +0 -98
  1017. package/packages/ai/src/auth/credential-store.ts +0 -51
  1018. package/packages/ai/src/compat/extension-oauth-types.ts +0 -45
  1019. package/packages/ai/src/image-models.generated.ts +0 -533
  1020. package/packages/ai/src/images-models.ts +0 -274
  1021. package/packages/ai/src/models-store.ts +0 -38
  1022. package/packages/ai/src/oauth.ts +0 -10
  1023. package/packages/ai/src/providers/openrouter-images.ts +0 -14
  1024. package/packages/ai/src/session-resources.ts +0 -24
  1025. package/packages/ai/src/utils/abort-signals.ts +0 -41
  1026. package/packages/ai/src/utils/deferred-tools.ts +0 -39
  1027. package/packages/ai/src/utils/hash.ts +0 -13
  1028. package/packages/ai/src/utils/node-http-proxy.ts +0 -112
  1029. package/plugins/ragents.actor-programs/server/client-runtime.ts +0 -16
  1030. package/plugins/ragents.ask/web/constants.ts +0 -1
  1031. package/plugins/ragents.lsp-roslyn/web/api.ts +0 -10
  1032. package/plugins/ragents.orchestration/web/CanvasStartup.tsx +0 -14
  1033. package/plugins/ragents.orchestration/web/canvas-view-settings.ts +0 -42
  1034. package/plugins/ragents.orchestration/web/column/AddresseeControl.tsx +0 -116
  1035. package/plugins/ragents.orchestration/web/column/column-settings.ts +0 -47
  1036. package/plugins/ragents.orchestration/web/column/column-state.ts +0 -68
  1037. package/plugins/ragents.orchestration/web/contract.ts +0 -25
  1038. package/plugins/ragents.product/model-settings-contract.ts +0 -10
  1039. package/plugins/ragents.profile-distribution/server/web.ts +0 -24
  1040. /package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/authoring-contracts.ts +0 -0
  1041. /package/{plugins/ragents.actor-programs/server → apps/server/src/plugin-support/actor-programs}/runtime-libraries.ts +0 -0
  1042. /package/{plugins/ragents.actor-programs → apps/server/src/plugin-support/actor-programs}/workflow/prompt-reader.ts +0 -0
  1043. /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/file-contracts.d.ts +0 -0
  1044. /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/flow-diagram-contracts.d.ts +0 -0
  1045. /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/flow-diagram.css +0 -0
  1046. /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/form-contracts.d.ts +0 -0
  1047. /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/frame-layout.ts +0 -0
  1048. /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/table-contracts.d.ts +0 -0
  1049. /package/{plugins/ragents.actor-programs → apps/web/src/actor-programs}/client-ui/viewer-contracts.d.ts +0 -0
  1050. /package/{plugins/ragents.orchestration/canvas.hbs → bundles/ragents.orchestration/surface.hbs} +0 -0
  1051. /package/packages/{agent-core/src → agent/src/loop}/index.ts +0 -0
  1052. /package/packages/{agent-core/src → agent/src/loop}/uuid.ts +0 -0
@@ -0,0 +1,2071 @@
1
+ import { createRequire as __ragentsCreateRequire } from "node:module";
2
+ const require = __ragentsCreateRequire(import.meta.url);
3
+
4
+ // server/index.ts
5
+ import path3 from "node:path";
6
+ import { runtimeProviderToken as runtimeProviderToken2, runGuardToken } from "@ragents/host/ragents/host-services.js";
7
+ import { askServiceToken } from "@ragents/plugins/ragents.ask/server/contract";
8
+
9
+ // server/agent-tools.ts
10
+ import { ToolRegistry } from "@ragents/engine";
11
+ import { runtimeProviderToken, runWorkspaceProviderToken } from "@ragents/host/ragents/host-services.js";
12
+ var agentToolsFrom = (host) => async (runId, actorId, provisional) => {
13
+ const runtime = host.service(runtimeProviderToken)();
14
+ const view = runtime.view(runId);
15
+ const actor = provisional ?? view.actors.find((candidate) => candidate.id === actorId);
16
+ if (!actor || actor.kind === "human" || actor.lifecycle.kind === "stopped") {
17
+ throw new Error(`${actorId} bezeichnet keinen aktiven Agenten in diesem Run.`);
18
+ }
19
+ const registry = new ToolRegistry();
20
+ host.tools.entries().forEach((contributor) => registry.register(contributor));
21
+ const workspace = await host.service(runWorkspaceProviderToken)(runId);
22
+ const tools = await registry.resolve({
23
+ runId,
24
+ actorId,
25
+ turnId: null,
26
+ actor,
27
+ view: provisional ? { ...view, actors: [...view.actors, provisional] } : view,
28
+ workspace: workspace.cwd
29
+ });
30
+ if (actor.toolNames === null) return tools;
31
+ const availableNames = new Set(tools.map((tool) => tool.name));
32
+ const unknown = actor.toolNames.filter((name2) => !availableNames.has(name2));
33
+ if (unknown.length > 0) {
34
+ throw new Error(`Actor ${actorId} verlangt unbekannte Werkzeuge: ${unknown.join(", ")}.`);
35
+ }
36
+ const selected2 = new Set(actor.toolNames);
37
+ return tools.filter((tool) => selected2.has(tool.name));
38
+ };
39
+
40
+ // server/methods.ts
41
+ import { DomainError, implement } from "@ragents/engine";
42
+ import { actorProgramContracts } from "@ragents/host/plugin-support/actor-programs/contract.js";
43
+ var MAX_INPUT_BYTES = 64 * 1024;
44
+ var failed = (cause, code, status) => cause instanceof DomainError ? cause : new DomainError(code, cause instanceof Error ? cause.message : String(cause), status);
45
+ var guarded = (code, status, work) => {
46
+ try {
47
+ return work();
48
+ } catch (cause) {
49
+ throw failed(cause, code, status);
50
+ }
51
+ };
52
+ var checkedInput = (input) => {
53
+ if (Buffer.byteLength(JSON.stringify(input ?? null), "utf8") > MAX_INPUT_BYTES)
54
+ throw new DomainError("input-too-large", `Die Aktionseingabe ist gr\xF6\xDFer als ${MAX_INPUT_BYTES} Byte.`, 413);
55
+ return input;
56
+ };
57
+ var createActorProgramMethods = (options) => {
58
+ const session = (runId, code, status) => guarded(code, status, () => options.ensureSession(runId));
59
+ return [
60
+ implement(actorProgramContracts.apps, ({ runId }, { access }) => {
61
+ session(runId, "run-unavailable", 400);
62
+ return {
63
+ apps: options.runtime.apps(runId),
64
+ tools: access.can("runs.inspect") ? options.runtime.runLocalTools(runId) : []
65
+ };
66
+ }),
67
+ implement(actorProgramContracts.source, async ({ runId, moduleId }) => {
68
+ session(runId, "run-unavailable", 404);
69
+ try {
70
+ return await options.runtime.moduleSource(runId, moduleId);
71
+ } catch (cause) {
72
+ throw failed(cause, "actor-program-unknown", 404);
73
+ }
74
+ }),
75
+ implement(actorProgramContracts.action, ({ runId, appId, revision, actionId, requestId, input }) => {
76
+ session(runId, "run-unavailable", 400);
77
+ return guarded("action-rejected", 400, () => {
78
+ const permit = options.runtime.invocationPermit(runId);
79
+ return options.runtime.startInvocation(runId, appId, revision, actionId, requestId, checkedInput(input), permit);
80
+ });
81
+ }),
82
+ implement(actorProgramContracts.invocation, ({ runId, appId, invocationId }) => {
83
+ session(runId, "run-unavailable", 404);
84
+ return guarded("invocation-unknown", 404, () => options.runtime.invocation(runId, appId, invocationId));
85
+ }),
86
+ implement(actorProgramContracts.function, ({ runId, actorHandle, revision, functionId, requestId, input }) => {
87
+ session(runId, "run-unavailable", 400);
88
+ return guarded("function-rejected", 400, () => {
89
+ const permit = options.runtime.invocationPermit(runId);
90
+ return options.runtime.startFunctionInvocation(runId, actorHandle, revision, functionId, requestId, checkedInput(input), permit);
91
+ });
92
+ }),
93
+ implement(actorProgramContracts.functionInvocation, ({ runId, actorHandle, invocationId }) => {
94
+ session(runId, "run-unavailable", 404);
95
+ return guarded("invocation-unknown", 404, () => options.runtime.invocation(runId, actorHandle, invocationId));
96
+ })
97
+ ];
98
+ };
99
+
100
+ // server/routes.ts
101
+ import { randomBytes } from "node:crypto";
102
+ import { guardedJsonRoute } from "@ragents/host/plugin-support/http.js";
103
+ import { browserInputRuntime, browserRuntimeStyles } from "@ragents/host/plugin-support/actor-programs/client-runtime.js";
104
+ var miniAppsApiPrefix = "/api/plugins/ragents.actor-programs";
105
+ var framePattern = new RegExp(`^${miniAppsApiPrefix.replaceAll(".", "\\.")}/runs/([A-Za-z0-9_-]{1,64})/apps/([a-z][a-z0-9_-]{0,129})/frame$`);
106
+ var escapeForwarder = `
107
+ window.addEventListener("keydown", (event) => {
108
+ if (event.key !== "Escape" || event.defaultPrevented) return;
109
+ queueMicrotask(() => {
110
+ if (!event.defaultPrevented) parent.postMessage({ type: "ragents.app.escape", version: 1, token: bridgeToken, keyboard: ragentsInputBridge.keyboardMessage(event, "keydown") }, "*");
111
+ });
112
+ });`;
113
+ var themeReceiver = `
114
+ const applyHostTheme = (theme) => {
115
+ if (theme !== "light" && theme !== "dark") throw new Error("Das Host-Theme muss light oder dark sein.");
116
+ document.documentElement.dataset.theme = theme;
117
+ };`;
118
+ var frameContentSecurityPolicy = (nonce) => `sandbox allow-scripts allow-forms allow-downloads; default-src 'none'; script-src 'nonce-${nonce}'; style-src 'nonce-${nonce}'; img-src 'self' data: blob:; font-src data:; connect-src 'none'; media-src 'self' data: blob:; object-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'self' https://*.vscode-cdn.net vscode-file: vscode-webview:`;
119
+ var escapedScript = (source) => source.replace(/<\/script/gi, "<\\/script");
120
+ var typedBridgeSdk = (nonce, styles) => `<script nonce="${nonce}">
121
+ ${escapedScript(browserInputRuntime)}
122
+ globalThis.__ragentsAppContext = (() => {
123
+ document.documentElement.dataset.uiSurface = "mini-app";
124
+ document.documentElement.dataset.miniAppFrame = "true";
125
+ const style = document.createElement("style");
126
+ style.setAttribute("nonce", ${JSON.stringify(nonce)});
127
+ style.textContent = atob(${JSON.stringify(Buffer.from(styles, "utf8").toString("base64"))});
128
+ document.head.prepend(style);
129
+ const pending = new Map();
130
+ const listeners = new Set();
131
+ const chats = new Map();
132
+ const freeze = (value) => {
133
+ if (value && typeof value === "object") {
134
+ Object.values(value).forEach(freeze);
135
+ Object.freeze(value);
136
+ }
137
+ return value;
138
+ };
139
+ const bridgeToken = new URLSearchParams(location.hash.slice(1)).get("ragentsBridge");
140
+ ${escapeForwarder}
141
+ ${themeReceiver}
142
+ const channel = new MessageChannel();
143
+ const port = channel.port1;
144
+ let currentState = freeze({});
145
+ let currentApp = null;
146
+ let readyResolve;
147
+ const ready = new Promise((resolve) => { readyResolve = resolve; });
148
+ const terminal = new Set(["succeeded", "failed", "cancelled"]);
149
+ const requestId = () => crypto.randomUUID().replaceAll("-", "");
150
+ const stateValue = (value) => value && typeof value === "object" && value.values && typeof value.values === "object"
151
+ ? freeze(structuredClone(value.values))
152
+ : freeze({});
153
+ const settle = (message) => {
154
+ const id = message.requestId || message.invocation?.requestId;
155
+ const waiter = id ? pending.get(id) : undefined;
156
+ if (!waiter || !terminal.has(message.invocation.status)) return;
157
+ pending.delete(id);
158
+ if (message.invocation.status === "succeeded") waiter.resolve(message.invocation.result);
159
+ else waiter.reject(new Error(message.invocation.error || "Die App-Aktion wurde nicht abgeschlossen."));
160
+ };
161
+ port.onmessage = ({ data }) => {
162
+ if (data?.version !== 1) return;
163
+ if (data.type === "ragents.app.ready") {
164
+ applyHostTheme(data.theme);
165
+ if (data.hostInput === true) {
166
+ const disposeInput = ragentsInputBridge.installFrameInputBridge(window, port);
167
+ window.addEventListener("pagehide", disposeInput, { once: true });
168
+ }
169
+ currentApp = data.app;
170
+ currentState = stateValue(data.state);
171
+ listeners.forEach((listener) => listener(currentState));
172
+ readyResolve();
173
+ port.postMessage({ type: "ragents.app.connected", version: 1 });
174
+ } else if (data.type === "ragents.app.theme") {
175
+ applyHostTheme(data.theme);
176
+ } else if (data.type === "ragents.app.state") {
177
+ currentState = stateValue(data.state);
178
+ const waiter = data.requestId ? pending.get(data.requestId) : undefined;
179
+ if (waiter) {
180
+ pending.delete(data.requestId);
181
+ waiter.resolve(currentState);
182
+ }
183
+ listeners.forEach((listener) => listener(currentState));
184
+ } else if (data.type === "ragents.app.invocation") {
185
+ settle(data);
186
+ } else if (data.type === "ragents.app.chat-state") {
187
+ const entry = chats.get(data.actor);
188
+ if (entry) {
189
+ entry.snapshot = freeze(data.snapshot);
190
+ entry.listeners.forEach((listener) => listener());
191
+ }
192
+ const waiter = pending.get(data.requestId);
193
+ if (waiter) { pending.delete(data.requestId); waiter.resolve(); }
194
+ } else if (data.type === "ragents.app.chat-ack") {
195
+ const waiter = pending.get(data.requestId);
196
+ if (waiter) { pending.delete(data.requestId); waiter.resolve(); }
197
+ } else if (data.type === "ragents.app.error") {
198
+ const waiter = data.requestId ? pending.get(data.requestId) : undefined;
199
+ if (waiter) {
200
+ pending.delete(data.requestId);
201
+ waiter.reject(new Error(data.message));
202
+ }
203
+ }
204
+ };
205
+ port.start();
206
+ const send = async (message) => {
207
+ await ready;
208
+ return new Promise((resolve, reject) => {
209
+ pending.set(message.requestId, { resolve, reject });
210
+ port.postMessage(message);
211
+ });
212
+ };
213
+ if (/^[a-f0-9]{32}$/.test(bridgeToken || "")) {
214
+ parent.postMessage(
215
+ { type: "ragents.app.frame-ready", version: 1, token: bridgeToken },
216
+ "*",
217
+ [channel.port2],
218
+ );
219
+ }
220
+ return Object.freeze({
221
+ get actor() { if (!currentApp) throw new Error("Die Actor-Ansicht ist noch nicht bereit."); return Object.freeze({id:currentApp.actorId,handle:currentApp.actorHandle}); },
222
+ ready: ready.then(() => undefined),
223
+ run: Object.freeze({ id: "current" }),
224
+ principal: Object.freeze({ id: "operator", kind: "operator" }),
225
+ state: Object.freeze({
226
+ read: () => currentState,
227
+ subscribe: (listener) => {
228
+ listeners.add(listener);
229
+ return () => listeners.delete(listener);
230
+ },
231
+ }),
232
+ chat: Object.freeze({
233
+ read: (actor) => chats.get(actor)?.snapshot,
234
+ subscribe: (actor, listener) => {
235
+ let entry = chats.get(actor);
236
+ if (!entry) {
237
+ entry = { listeners: new Set(), snapshot: undefined, started: false };
238
+ chats.set(actor, entry);
239
+ ready.then(() => {
240
+ if (chats.get(actor) !== entry) return;
241
+ entry.started = true;
242
+ send({ type: "ragents.app.chat-watch", version: 1, requestId: requestId(), actor })
243
+ .catch((error) => {
244
+ if (chats.get(actor) !== entry) return;
245
+ entry.snapshot = freeze({ messages: [], running: false, error: error.message });
246
+ entry.listeners.forEach((notify) => notify());
247
+ });
248
+ });
249
+ }
250
+ entry.listeners.add(listener);
251
+ return () => {
252
+ entry.listeners.delete(listener);
253
+ if (entry.listeners.size > 0 || chats.get(actor) !== entry) return;
254
+ chats.delete(actor);
255
+ if (entry.started) {
256
+ port.postMessage({ type: "ragents.app.chat-unwatch", version: 1, requestId: requestId(), actor });
257
+ }
258
+ };
259
+ },
260
+ send: (actor, text, attachments) => send({ type: "ragents.app.chat-send", version: 1, requestId: requestId(), actor, text, attachments }),
261
+ }),
262
+ capabilities: Object.freeze({
263
+ list: () => (currentApp?.actions ?? []).map((action) => action.id),
264
+ call: async (actionId, input = {}) => {
265
+ await ready;
266
+ if (!(currentApp?.actions ?? []).some((action) => action.id === actionId)) {
267
+ throw new Error("Die angeforderte App-Aktion ist nicht installiert.");
268
+ }
269
+ return send({
270
+ type: "ragents.app.invoke",
271
+ version: 1,
272
+ requestId: requestId(),
273
+ actionId,
274
+ input,
275
+ });
276
+ },
277
+ }),
278
+ });
279
+ })();
280
+ </script>`;
281
+ var frameHtml = (frame, nonce) => {
282
+ const head = /<head(?:\s[^>]*)?>/i;
283
+ if (!head.test(frame.html)) throw new Error("Die installierte App besitzt keinen g\xFCltigen head.");
284
+ const client = `<script nonce="${nonce}" type="module">await globalThis.__ragentsAppContext.ready;${escapedScript(frame.clientJavaScript)}</script>`;
285
+ return frame.html.replace(head, (value) => `${value}${typedBridgeSdk(nonce, `${browserRuntimeStyles}
286
+ ${frame.styles}`)}${client}`);
287
+ };
288
+ var createMiniAppFrameRoutes = (options) => [
289
+ {
290
+ id: "ragents.actor-programs.frame",
291
+ isApiPath: (pathname) => pathname.startsWith(miniAppsApiPrefix),
292
+ matches: (request, url) => request.method === "GET" && framePattern.test(url.pathname),
293
+ handle: async ({ request, response, url }) => {
294
+ const match = url.pathname.match(framePattern);
295
+ if (!match) throw new Error("Ung\xFCltige App-Route.");
296
+ const [, runId, appId] = match;
297
+ await guardedJsonRoute({
298
+ request,
299
+ response,
300
+ ensureSession: () => options.ensureSession(runId),
301
+ errorStatus: 404,
302
+ handle: () => {
303
+ const revision = url.searchParams.get("revision") ?? "";
304
+ const nonce = randomBytes(18).toString("base64");
305
+ const frame = options.runtime.frame(runId, appId, revision);
306
+ const content = Buffer.from(frameHtml(frame, nonce), "utf8");
307
+ response.writeHead(200, {
308
+ "Cache-Control": "no-store",
309
+ "Content-Security-Policy": frameContentSecurityPolicy(nonce),
310
+ "Content-Type": "text/html; charset=utf-8",
311
+ "Content-Length": content.byteLength,
312
+ "Referrer-Policy": "no-referrer",
313
+ "X-Content-Type-Options": "nosniff"
314
+ });
315
+ response.end(content);
316
+ }
317
+ });
318
+ }
319
+ }
320
+ ];
321
+
322
+ // server/runtime.ts
323
+ import { randomUUID } from "node:crypto";
324
+ import { lstat, mkdir, readdir, readFile, realpath as realpath2, rm, writeFile } from "node:fs/promises";
325
+ import { lstatSync, readFileSync, renameSync } from "node:fs";
326
+ import path from "node:path";
327
+ import { Value } from "typebox/value";
328
+ import { actorByHandle, actorDescriptionMaxLength, agentTools, assertJsonValue as assertJsonValue2, canonicalHash, defineRunFunction, defineToolAvailability, emptyUsage, handleKey, runCapabilityContractHash as runCapabilityContractHash2, scriptInputOf, schemaComplaints } from "@ragents/engine";
329
+ import { ACTOR_PROGRAMS_STATE_ID, ACTOR_INVOCATIONS_STATE_ID, ACTOR_SCRIPT_STATE_ID, ACTOR_STATE_ID, resolveActorView } from "@ragents/host/plugin-support/actor-programs/contract.js";
330
+
331
+ // server/limits.ts
332
+ import { assertJsonValue } from "@ragents/engine";
333
+ var MAX_JSON_BYTES = 25e4;
334
+ var MAX_JSON_DEPTH = 24;
335
+ var MAX_JSON_KEY_LENGTH = 256;
336
+ var MAX_INVOCATIONS_STATE_BYTES = 8 * 1024 * 1024;
337
+ var jsonBytes = (value) => Buffer.byteLength(JSON.stringify(value), "utf8");
338
+ var jsonValue = (value, label) => {
339
+ assertJsonValue(value, label);
340
+ const text = JSON.stringify(value);
341
+ if (Buffer.byteLength(text, "utf8") > MAX_JSON_BYTES)
342
+ throw new Error(`${label} ist gr\xF6\xDFer als ${MAX_JSON_BYTES} Byte.`);
343
+ const pending = [{ value, depth: 0 }];
344
+ while (pending.length > 0) {
345
+ const current = pending.pop();
346
+ if (current.depth > MAX_JSON_DEPTH)
347
+ throw new Error(`${label} ist tiefer als ${MAX_JSON_DEPTH} Ebenen verschachtelt.`);
348
+ if (Array.isArray(current.value)) {
349
+ current.value.forEach((entry) => pending.push({ value: entry, depth: current.depth + 1 }));
350
+ continue;
351
+ }
352
+ if (current.value && typeof current.value === "object") {
353
+ Object.entries(current.value).forEach(([key, entry]) => {
354
+ if (key.length > MAX_JSON_KEY_LENGTH)
355
+ throw new Error(`${label} enth\xE4lt einen Schl\xFCssel mit mehr als ${MAX_JSON_KEY_LENGTH} Zeichen.`);
356
+ pending.push({ value: entry, depth: current.depth + 1 });
357
+ });
358
+ }
359
+ }
360
+ return value;
361
+ };
362
+
363
+ // server/capability-resolver.ts
364
+ import {
365
+ runCapabilityBindingHash,
366
+ runCapabilityContractHash
367
+ } from "@ragents/engine";
368
+ var descriptorOf = (capability) => ({
369
+ id: capability.id,
370
+ label: capability.label,
371
+ description: capability.description,
372
+ schema: capability.schema,
373
+ resultSchema: capability.resultSchema
374
+ });
375
+ var selected = (available2, capabilityIds, idOf, unavailable) => {
376
+ const byId = new Map(available2.map((value) => [idOf(value), value]));
377
+ return capabilityIds.map((id) => {
378
+ const value = byId.get(id);
379
+ if (!value) throw unavailable(id, [...byId.keys()].sort().join(", ") || "keine");
380
+ return value;
381
+ });
382
+ };
383
+ var operatorCapabilityBinding = (actorId, operations, capabilityIds) => {
384
+ const resolved = selected(
385
+ operations.filter((operation) => operation.operator !== "unavailable"),
386
+ capabilityIds,
387
+ (operation) => operation.id,
388
+ (id, names) => new Error(`Capability ${id} ist f\xFCr den Bediener nicht verf\xFCgbar. Verf\xFCgbar sind: ${names}.`)
389
+ );
390
+ const descriptors = resolved.map(descriptorOf);
391
+ return {
392
+ descriptors,
393
+ descriptorContractHash: runCapabilityContractHash(descriptors),
394
+ bindingContractHash: runCapabilityBindingHash({
395
+ principal: { id: actorId, kind: "operator" },
396
+ capabilities: descriptors,
397
+ policies: resolved.map((operation) => ({ id: operation.id, policy: operation.operator }))
398
+ })
399
+ };
400
+ };
401
+ var agentCapabilityBinding = (actor, tools, capabilityIds, blockedNames) => {
402
+ const resolved = selected(
403
+ tools.filter((tool) => !blockedNames.has(tool.name)),
404
+ capabilityIds,
405
+ (tool) => tool.name,
406
+ (id, names) => new Error(
407
+ `Capability ${id} ist f\xFCr @${actor.handle} nicht verf\xFCgbar. Verf\xFCgbar sind: ${names}.`
408
+ )
409
+ );
410
+ const descriptors = resolved.map((tool) => descriptorOf({ ...tool, id: tool.name }));
411
+ return {
412
+ descriptors,
413
+ descriptorContractHash: runCapabilityContractHash(descriptors),
414
+ bindingContractHash: runCapabilityBindingHash({
415
+ principal: { id: actor.id, kind: actor.kind === "script" ? "script" : "agent", grants: actor.grants },
416
+ capabilities: descriptors,
417
+ policies: descriptors.map((descriptor2) => ({ id: descriptor2.id, policy: "agent" }))
418
+ })
419
+ };
420
+ };
421
+
422
+ // server/runtime.ts
423
+ import { compileClientProject, installClientSdk } from "@ragents/host/plugin-support/actor-programs/client-compiler.js";
424
+ import { compileAppBackend, installServerSdk, prepareAppProject, prepareAppWorkspace, projectSourceFiles, readAppPackage, typecheckServerProject } from "@ragents/host/plugin-support/actor-programs/app-project.js";
425
+ import { syncWorkspaceOwnership } from "@ragents/host/plugin-support/workspace-ownership.js";
426
+ import { runManagedProcess, sandboxedLaunch } from "@ragents/workspace-executor";
427
+
428
+ // server/controls-template.ts
429
+ var controlsTemplate = {
430
+ id: "controls",
431
+ title: "UI-Controls ausprobieren",
432
+ description: "Lokale Demo mit Formular, Tabelle, Dateien, Aufgaben, Ablaufdiagramm, SVG-Verbindungen, Nachrichten, Dokument und Diff ohne Funktionsaufrufe.",
433
+ ragents: {
434
+ title: "UI-Controls ausprobieren",
435
+ description: "Eine lokale Demo der vorhandenen Mini-App-Controls. Werte und Dateien bleiben in dieser Ansicht.",
436
+ views: [{ id: "main", client: "src/client.tsx" }]
437
+ },
438
+ files: {
439
+ "src/client.tsx": `import React from "react";
440
+ import { createRoot } from "react-dom/client";
441
+ import * as UI from "@ragents/client/ui";
442
+
443
+ type FormValues = Parameters<typeof UI.Form>[0]["values"];
444
+ type Row = { id: string; name: string; count: number };
445
+ const rows: Row[] = [
446
+ { id: "analysis", name: "Analyse", count: 12 },
447
+ { id: "review", name: "Review", count: 4 },
448
+ { id: "notes", name: "Dokumentation", count: 8 },
449
+ ];
450
+
451
+ const App = () => {
452
+ const [values, setValues] = React.useState<FormValues>({ title: "Ergebnisse pr\xFCfen", notes: "", count: 3, mode: "review", approved: false });
453
+ const [selected, setSelected] = React.useState<string[]>([]);
454
+ const [files, setFiles] = React.useState<File[]>([]);
455
+ const [result, setResult] = React.useState("Noch keine Formularwerte \xFCbernommen.");
456
+ const [messages, setMessages] = React.useState<Parameters<typeof UI.MessageList>[0]["messages"]>([
457
+ { key: "editorial", sender: "Redaktion", text: "Der Hinweis soll **kurz und verst\xE4ndlich** bleiben." },
458
+ { key: "review", sender: "Textpr\xFCfung", text: "\xD6ffnungszeiten und Reparaturhinweis bleiben erhalten." },
459
+ ]);
460
+ const [done, setDone] = React.useState(false);
461
+ return <UI.AppLayout title="UI-Controls ausprobieren" description="Lokale Demo: keine Agenten, Uploads oder Serveraktionen. Werte und Dateiauswahl bleiben nur in dieser Ansicht und werden beim Neuladen zur\xFCckgesetzt.">
462
+ <UI.Stack gap="large">
463
+ <UI.Form title="Formular" fields={[
464
+ { id: "title", label: "Auftrag", type: "text", placeholder: "Was soll bearbeitet werden?", required: true },
465
+ { id: "notes", label: "Hinweise", type: "textarea", rows: 3, placeholder: "Was soll bei der Bearbeitung ber\xFCcksichtigt werden?", hint: "Mehrzeiliger Text bleibt im Formular ausgerichtet." },
466
+ { id: "count", label: "Anzahl", type: "number", placeholder: "Anzahl der Ergebnisse", hint: "1 bis 10 Ergebnisse.", required: true, min: 1, max: 10 },
467
+ { id: "mode", label: "Modus", type: "select", options: [{ value: "review", label: "Pr\xFCfen" }, { value: "draft", label: "Entwerfen" }] },
468
+ { id: "approved", label: "Auswahl best\xE4tigt", type: "checkbox", required: true },
469
+ ]} values={values} onChange={setValues} onSubmit={async (next) => { setResult(JSON.stringify(next, null, 2)); }} submitLabel="Werte lokal anzeigen" />
470
+ <UI.Stack gap="small">
471
+ <UI.DataTable<Row> title="Datentabelle" rows={rows} rowKey={(row) => row.id} filterable
472
+ selectedKeys={selected} onSelectionChange={setSelected}
473
+ columns={[{ id: "name", label: "Arbeit", value: (row) => row.name, sortable: true }, { id: "count", label: "Ergebnisse", value: (row) => row.count, sortable: true }]}
474
+ actions={[{ id: "select", label: "Ausw\xE4hlen", onClick: (row) => { setSelected([row.id]); } }]} />
475
+ <p aria-live="polite">{selected.length} Zeilen ausgew\xE4hlt</p>
476
+ </UI.Stack>
477
+ <UI.FilePicker label="Lokale Dateiauswahl" files={files} onChange={setFiles} maxFiles={5} maxBytes={10 * 1024 * 1024} />
478
+ <UI.Stack gap="small">
479
+ <UI.TaskProgress title="Beispielaufgaben" tasks={[
480
+ { id: "read", label: "Unterlagen lesen", status: "done" },
481
+ { id: "review", label: "Ergebnisse pr\xFCfen", status: done ? "done" : "pending", description: "Lokaler Beispielstatus, kein laufender Actor." },
482
+ ]} />
483
+ <UI.Stack direction="row"><UI.Button onClick={() => setDone((current) => !current)}>Beispielstatus umschalten</UI.Button></UI.Stack>
484
+ </UI.Stack>
485
+ <UI.Stack gap="small">
486
+ <h2>Ablaufdiagramm</h2>
487
+ <p>Das Diagramm erh\xE4lt seinen Zustand aus denselben Daten wie die Aufgabenliste.</p>
488
+ <UI.FlowDiagram label={done ? "Eingang, Pr\xFCfung fertig, Ergebnis bereit" : "Eingang, Pr\xFCfung l\xE4uft, Ergebnis ausstehend"}
489
+ nodes={[
490
+ { id: "input", label: "Eingang", detail: "Unterlagen liegen vor", status: "done", kind: "service" },
491
+ { id: "check", label: "Pr\xFCfung", detail: done ? "Pr\xFCfung abgeschlossen" : "Unterlagen werden gepr\xFCft", status: done ? "done" : "active", kind: "agent" },
492
+ { id: "result", label: "Ergebnis", detail: done ? "Ergebnis bereit" : "Wartet auf die Pr\xFCfung", status: done ? "done" : "pending", kind: "actor" },
493
+ ]}
494
+ edges={[{ source: "input", target: "check" }, { source: "check", target: "result" }]} />
495
+ </UI.Stack>
496
+ <UI.Stack gap="small">
497
+ <h2>SVG-Verbindungen</h2>
498
+ <p>SvgEdge zeichnet die Kanten. Knoten, Beschriftungen und Positionen stehen im Code dieser Ansicht.</p>
499
+ <svg viewBox="0 0 360 160" role="img" aria-label={done ? "Eingang fertig, Pr\xFCfung abgeschlossen, Ergebnis bereit" : "Eingang fertig, Pr\xFCfung l\xE4uft, Ergebnis offen"}
500
+ className="block h-auto w-full text-[13px]">
501
+ <UI.SvgEdge d="M112 42 L144 42" tone={done ? "success" : "warning"} active={!done} />
502
+ <UI.SvgEdge d="M252 42 C320 42 320 118 252 118" arrow={done ? "end" : "none"} tone={done ? "success" : "neutral"} lineStyle={done ? "solid" : "dashed"} />
503
+ <UI.SvgEdge d="M144 118 C64 118 64 96 64 72" arrow="both" tone="accent" />
504
+ {[{ x: 8, y: 12, label: "Eingang", status: "Fertig" },
505
+ { x: 148, y: 12, label: "Pr\xFCfung", status: done ? "Fertig" : "L\xE4uft" },
506
+ { x: 148, y: 88, label: "Ergebnis", status: done ? "Bereit" : "Offen" }].map((node) => <g key={node.label}>
507
+ <rect x={node.x} y={node.y} width="104" height="56" rx="8" className="fill-background stroke-border-strong" />
508
+ <text x={node.x + 52} y={node.y + 23} textAnchor="middle" className="fill-foreground font-semibold">{node.label}</text>
509
+ <text x={node.x + 52} y={node.y + 42} textAnchor="middle" className="fill-muted-foreground text-[11px]">{node.status}</text>
510
+ </g>)}
511
+ </svg>
512
+ </UI.Stack>
513
+ <UI.Stack gap="small">
514
+ <UI.MessageList messages={messages} label="Lokale Redaktionsnotizen" />
515
+ <UI.Stack direction="row"><UI.Button onClick={() => setMessages((current) => [...current, {
516
+ key: "note-" + current.length, sender: current.length % 2 ? "Textpr\xFCfung" : "Redaktion",
517
+ text: "Lokale Beispielnotiz " + (current.length - 1) + ": Diese Nachricht wurde gerade erg\xE4nzt.",
518
+ }])}>Lokale Nachricht erg\xE4nzen</UI.Button></UI.Stack>
519
+ </UI.Stack>
520
+ <UI.DocumentViewer title="Lokales Formularergebnis" format="text" content={result} />
521
+ <UI.DiffViewer title="Beispiel\xE4nderung" patch={"--- a/result.txt\\n+++ b/result.txt\\n@@ -1 +1 @@\\n-Status: offen\\n+Status: gepr\xFCft"} />
522
+ </UI.Stack>
523
+ </UI.AppLayout>;
524
+ };
525
+
526
+ const root = document.getElementById("root");
527
+ if (!root) throw new Error("Das Wurzelelement #root fehlt.");
528
+ createRoot(root).render(<App />);
529
+ `
530
+ }
531
+ };
532
+
533
+ // server/templates.ts
534
+ var blank = {
535
+ id: "blank",
536
+ title: "Leere Mini-App",
537
+ description: "Eine reine React-View am vorhandenen Actor ohne zus\xE4tzliche Serverfunktion.",
538
+ ragents: {
539
+ title: "Meine View",
540
+ description: "Eine kleine Bedienoberfl\xE4che des vorhandenen Actors.",
541
+ views: [{ id: "main", client: "src/client.tsx" }]
542
+ },
543
+ files: {
544
+ "src/client.tsx": `import { createRoot } from "react-dom/client";
545
+ import * as UI from "@ragents/client/ui";
546
+
547
+ const App = () => (
548
+ <UI.AppLayout title="Meine View">
549
+ <UI.Stack><p>Bereit f\xFCr deine Inhalte.</p></UI.Stack>
550
+ </UI.AppLayout>
551
+ );
552
+
553
+ const root = document.getElementById("root");
554
+ if (!root) throw new Error("Das Wurzelelement #root fehlt.");
555
+ createRoot(root).render(<App />);
556
+ `
557
+ }
558
+ };
559
+ var chat = {
560
+ id: "chat",
561
+ title: "Actor-Chat",
562
+ description: "Wiederverwendbarer Chat mit Verlauf und optionaler Eingabe an den Actor dieser View.",
563
+ ragents: {
564
+ title: "Actor-Chat",
565
+ description: "Zeigt das Gespr\xE4ch mit einem Actor und sendet ihm Benutzereingaben.",
566
+ views: [{ id: "main", client: "src/client.tsx" }]
567
+ },
568
+ files: {
569
+ "src/client.tsx": `import { createRoot } from "react-dom/client";
570
+ import * as UI from "@ragents/client/ui";
571
+ import { context } from "@ragents/client";
572
+
573
+ const App = () => (
574
+ <UI.Chat actor={"@" + context.actor.handle} className="h-full" showInput placeholder="Nachricht an den Actor" />
575
+ );
576
+
577
+ const root = document.getElementById("root");
578
+ if (!root) throw new Error("Das Wurzelelement #root fehlt.");
579
+ createRoot(root).render(<App />);
580
+ `
581
+ }
582
+ };
583
+ var textAnalysis = {
584
+ id: "text-analysis",
585
+ title: "Textanalyse",
586
+ description: "Ein TypeScript-Actor analysiert Texte mit eigener Funktion, Zustand und React-View.",
587
+ ragents: {
588
+ title: "Textanalyse",
589
+ description: "Z\xE4hlt Zeichen, W\xF6rter und Zeilen und merkt sich die Zahl der Analysen.",
590
+ backend: "src/server.ts",
591
+ views: [{ id: "main", client: "src/client.tsx" }]
592
+ },
593
+ files: {
594
+ "src/client.tsx": `import React from "react";
595
+ import { createRoot } from "react-dom/client";
596
+ import { context, useAppState } from "@ragents/client";
597
+ import * as UI from "@ragents/client/ui";
598
+
599
+ type FormValues = Parameters<typeof UI.Form>[0]["values"];
600
+
601
+ const App = () => {
602
+ const state = useAppState();
603
+ const [values, setValues] = React.useState<FormValues>({ text: "" });
604
+ const [result, setResult] = React.useState("Bereit");
605
+
606
+ const analyse = async (next: FormValues): Promise<void> => {
607
+ const answer = await context.capabilities.call("analyse", { text: String(next.text ?? "") });
608
+ setResult([
609
+ \`Zeichen: \${answer.characters}\`,
610
+ \`W\xF6rter: \${answer.words}\`,
611
+ \`Zeilen: \${answer.lines}\`,
612
+ ].join("\\n"));
613
+ };
614
+
615
+ return (
616
+ <UI.AppLayout title="Textanalyse" description={<>Analysen: {state.analyses ?? 0}</>}>
617
+ <UI.Grid>
618
+ <UI.Form fields={[
619
+ { id: "text", label: "Text", type: "textarea", rows: 6, placeholder: "Text eingeben" },
620
+ ]} values={values} onChange={setValues} onSubmit={analyse} submitLabel="Analysieren" />
621
+ <UI.Stack><pre aria-live="polite" className="min-h-[90px] overflow-auto rounded-md border border-border bg-muted p-2.5 font-mono whitespace-pre-wrap">{result}</pre></UI.Stack>
622
+ </UI.Grid>
623
+ </UI.AppLayout>
624
+ );
625
+ };
626
+
627
+ const root = document.getElementById("root");
628
+ if (!root) throw new Error("Das Wurzelelement #root fehlt.");
629
+ createRoot(root).render(<App />);
630
+ `,
631
+ "src/contract.ts": `import { Type } from "typebox";
632
+
633
+ export const contract = {
634
+ state: Type.Object({ analyses: Type.Optional(Type.Integer({"minimum": 0})) }, {"additionalProperties": false}),
635
+ functions: {
636
+ analyse: {
637
+ label: "Text analysieren",
638
+ description: "Z\xE4hlt W\xF6rter, Zeichen und Zeilen ohne externe Wirkung.",
639
+ tool: { name: "analyse_text" },
640
+ input: Type.Object({ text: Type.String({"description": "Der zu analysierende Text."}) }, {"additionalProperties": false}),
641
+ output: Type.Object({ text: Type.String(), characters: Type.Integer({"minimum": 0}), words: Type.Integer({"minimum": 0}), lines: Type.Integer({"minimum": 0}), analyses: Type.Integer({"minimum": 1}) }, {"additionalProperties": false}),
642
+ capabilities: [],
643
+ },
644
+ },
645
+ } as const;
646
+ `,
647
+ "src/server.ts": `import { defineActor } from "@ragents/server";
648
+ import { contract } from "./contract.ts";
649
+
650
+ export default defineActor(contract, {
651
+ functions: {
652
+ analyse: async (input, context) => {
653
+ const text = input.text.trim();
654
+ const state = context.state.read();
655
+ const analyses = (state.analyses ?? 0) + 1;
656
+ context.state.replace({ analyses });
657
+
658
+ return {
659
+ text,
660
+ characters: text.length,
661
+ words: text ? text.split(/\\s+/).length : 0,
662
+ lines: text ? text.split(/\\r?\\n/).length : 0,
663
+ analyses,
664
+ };
665
+ },
666
+ },
667
+ });
668
+ `,
669
+ "tests/program.test.ts": `import assert from "node:assert/strict";
670
+ import test from "node:test";
671
+ import type { Static } from "typebox";
672
+ import { createTestContext } from "@ragents/server/testing";
673
+ import { contract } from "../src/contract.ts";
674
+ import program from "../src/server.ts";
675
+
676
+ test("z\xE4hlt W\xF6rter, Zeilen und weitere Analysen", async () => {
677
+ const context = createTestContext<Static<typeof contract.state>>({ state: {} });
678
+ assert.deepEqual(await program.functions.analyse({"text": " Hallo Welt\\nNeue Zeile "}, context), {"text": "Hallo Welt\\nNeue Zeile", "characters": 21, "words": 4, "lines": 2, "analyses": 1});
679
+ assert.deepEqual(await program.functions.analyse({"text": ""}, context), {"text": "", "characters": 0, "words": 0, "lines": 0, "analyses": 2});
680
+ assert.deepEqual(context.state.read(), {"analyses": 2});
681
+ });
682
+ `
683
+ }
684
+ };
685
+ var headlessCounter = {
686
+ id: "headless-counter",
687
+ title: "Z\xE4hler ohne Oberfl\xE4che",
688
+ description: "Ein TypeScript-Actor z\xE4hlt Eingaben in seinem Zustand und bietet dieselbe Arbeit als Funktion an.",
689
+ ragents: {
690
+ title: "Z\xE4hler",
691
+ description: "Sammelt eingehende Texte ohne Modellaufrufe oder Oberfl\xE4che.",
692
+ backend: "src/server.ts"
693
+ },
694
+ files: {
695
+ "src/contract.ts": `import { Type } from "typebox";
696
+
697
+ const state = Type.Object({
698
+ texts: Type.Optional(Type.Array(Type.String())),
699
+ count: Type.Optional(Type.Integer({ minimum: 0 })),
700
+ }, { additionalProperties: false });
701
+
702
+ export const contract = {
703
+ state,
704
+ functions: {
705
+ record: {
706
+ label: "Text z\xE4hlen",
707
+ input: Type.Object({ text: Type.String() }, { additionalProperties: false }),
708
+ output: Type.Object({ count: Type.Integer(), texts: Type.Array(Type.String()) }, { additionalProperties: false }),
709
+ tool: { name: "record_text" },
710
+ },
711
+ inspect: {
712
+ label: "Z\xE4hler lesen",
713
+ input: Type.Object({}, { additionalProperties: false }),
714
+ output: state,
715
+ tool: { name: "read_counter" },
716
+ },
717
+ },
718
+ input: { capabilities: [] },
719
+ } as const;
720
+ `,
721
+ "src/server.ts": `import { defineActor } from "@ragents/server";
722
+ import type { Static } from "typebox";
723
+ import { contract } from "./contract.ts";
724
+
725
+ const record = (state: Static<typeof contract.state>, text: string) => {
726
+ const texts = [...(state.texts ?? []), text];
727
+ return { texts, count: texts.length };
728
+ };
729
+
730
+ export default defineActor(contract, {
731
+ functions: {
732
+ record: (input, context) => {
733
+ const result = record(context.state.read(), input.text);
734
+ context.state.replace(result);
735
+ return result;
736
+ },
737
+ inspect: (_input, context) => context.state.read(),
738
+ },
739
+ onInput: (input, context) => {
740
+ context.state.replace(record(context.state.read(), input.content));
741
+ },
742
+ });
743
+ `,
744
+ "tests/program.test.ts": `import assert from "node:assert/strict";
745
+ import test from "node:test";
746
+ import type { Static } from "typebox";
747
+ import { createTestContext } from "@ragents/server/testing";
748
+ import { contract } from "../src/contract.ts";
749
+ import program from "../src/server.ts";
750
+
751
+ test("Eingaben und Funktionen teilen denselben Z\xE4hler", async () => {
752
+ const context = createTestContext<Static<typeof contract.state>>({ state: {} });
753
+ for (const content of ["eins", "zwei", "drei"]) {
754
+ await program.onInput!({ id: content, content, artifactIds: [], sourceEventIds: [], subscriptionId: null, event: null }, context);
755
+ }
756
+ assert.deepEqual(await program.functions.inspect({}, context), { texts: ["eins", "zwei", "drei"], count: 3 });
757
+ assert.deepEqual(await program.functions.record({ text: "vier" }, context), { texts: ["eins", "zwei", "drei", "vier"], count: 4 });
758
+ assert.deepEqual(context.state.read(), { texts: ["eins", "zwei", "drei", "vier"], count: 4 });
759
+ });
760
+ `
761
+ }
762
+ };
763
+ var sharedList = {
764
+ id: "shared-list",
765
+ title: "Gemeinsame Liste eines Actors",
766
+ description: "Ein Actor besitzt eine Funktion und eine React-View f\xFCr denselben Listenstand.",
767
+ ragents: {
768
+ title: "Gemeinsame Liste",
769
+ description: "Sammelt Texte aus der App und aus einem Agenten-Werkzeug in einer gemeinsamen Liste.",
770
+ backend: "src/server.ts",
771
+ views: [{ id: "main", client: "src/client.tsx" }]
772
+ },
773
+ files: {
774
+ "src/client.tsx": `import React from "react";
775
+ import { createRoot } from "react-dom/client";
776
+ import { context, useAppState } from "@ragents/client";
777
+ import * as UI from "@ragents/client/ui";
778
+
779
+ type FormValues = Parameters<typeof UI.Form>[0]["values"];
780
+
781
+ const App = () => {
782
+ const state = useAppState();
783
+ const [values, setValues] = React.useState<FormValues>({ text: "" });
784
+ const [status, setStatus] = React.useState("Bereit");
785
+ const entries = state.entries ?? [];
786
+
787
+ const append = async (next: FormValues): Promise<void> => {
788
+ const answer = await context.capabilities.call("append", { text: String(next.text ?? "") });
789
+ setValues({ text: "" });
790
+ setStatus(\`Hinzugef\xFCgt: \${answer.text}\`);
791
+ };
792
+
793
+ return (
794
+ <UI.AppLayout title="Gemeinsame Liste" description={<>{entries.length} {entries.length === 1 ? "Eintrag" : "Eintr\xE4ge"}</>}>
795
+ <UI.Grid>
796
+ <UI.Form fields={[
797
+ { id: "text", label: "Neuer Eintrag", type: "textarea", placeholder: "Text eingeben" },
798
+ ]} values={values} onChange={setValues} onSubmit={append} submitLabel="Hinzuf\xFCgen" />
799
+ <UI.Stack>
800
+ <p className="text-muted-foreground" role="status">{status}</p>
801
+ <ul className="border-t border-border">
802
+ {entries.map((entry, index) => <li className="min-h-[31px] border-b border-border-soft py-1.5 [overflow-wrap:anywhere]" key={index}>{entry}</li>)}
803
+ </ul>
804
+ </UI.Stack>
805
+ </UI.Grid>
806
+ </UI.AppLayout>
807
+ );
808
+ };
809
+
810
+ const root = document.getElementById("root");
811
+ if (!root) throw new Error("Das Wurzelelement #root fehlt.");
812
+ createRoot(root).render(<App />);
813
+ `,
814
+ "src/contract.ts": `import { Type } from "typebox";
815
+
816
+ export const contract = {
817
+ state: Type.Object({ entries: Type.Optional(Type.Array(Type.String())) }, {"additionalProperties": false}),
818
+ functions: {
819
+ append: {
820
+ label: "Eintrag hinzuf\xFCgen",
821
+ description: "H\xE4ngt den eingegebenen Text an die gemeinsame Liste an.",
822
+ input: Type.Object({ text: Type.String({"description": "Der Text f\xFCr den neuen Listeneintrag."}) }, {"additionalProperties": false}),
823
+ output: Type.Object({ text: Type.String(), entries: Type.Array(Type.String()) }, {"additionalProperties": false}),
824
+ capabilities: [],
825
+ tool: { name: "append_to_list", card: true },
826
+ },
827
+ },
828
+ } as const;
829
+ `,
830
+ "src/server.ts": `import { defineActor } from "@ragents/server";
831
+ import { contract } from "./contract.ts";
832
+
833
+ export default defineActor(contract, {
834
+ functions: {
835
+ append: async (input, context) => {
836
+ const text = input.text.trim();
837
+ const state = context.state.read();
838
+ const entries = [...(state.entries ?? []), text];
839
+ context.state.replace({ entries });
840
+ return { text, entries };
841
+ },
842
+ },
843
+ });
844
+ `,
845
+ "tests/program.test.ts": `import assert from "node:assert/strict";
846
+ import test from "node:test";
847
+ import type { Static } from "typebox";
848
+ import { createTestContext } from "@ragents/server/testing";
849
+ import { contract } from "../src/contract.ts";
850
+ import program from "../src/server.ts";
851
+
852
+ test("erg\xE4nzt Eintr\xE4ge ohne vorhandene Eintr\xE4ge zu verlieren", async () => {
853
+ const context = createTestContext<Static<typeof contract.state>>({ state: {} });
854
+ assert.deepEqual(await program.functions.append({"text": " Erster Eintrag "}, context), {"text": "Erster Eintrag", "entries": ["Erster Eintrag"]});
855
+ assert.deepEqual(await program.functions.append({"text": "Zweiter Eintrag"}, context), {"text": "Zweiter Eintrag", "entries": ["Erster Eintrag", "Zweiter Eintrag"]});
856
+ assert.deepEqual(context.state.read(), {"entries": ["Erster Eintrag", "Zweiter Eintrag"]});
857
+ });
858
+ `
859
+ }
860
+ };
861
+ var runModuleTemplates = [blank, chat, controlsTemplate, textAnalysis, headlessCounter, sharedList];
862
+ var templateFiles = (template, name2) => ({
863
+ "package.json": `${JSON.stringify({ name: name2, private: true, type: "module", ragents: template.ragents }, null, 2)}
864
+ `,
865
+ ...template.files
866
+ });
867
+ var templateById = (id) => {
868
+ const template = runModuleTemplates.find((candidate) => candidate.id === id);
869
+ if (!template) throw new Error(`Unbekannte Actor-Programm-Vorlage ${id}. G\xFCltig: ${runModuleTemplates.map((entry) => entry.id).join(", ")}.`);
870
+ return template;
871
+ };
872
+
873
+ // server/test-report.ts
874
+ import { realpath } from "node:fs/promises";
875
+ var reporterSource = `
876
+ import { inspect } from "node:util";
877
+ const shown = (value) => inspect(value, { depth: 4, breakLength: Infinity, maxArrayLength: 20, maxStringLength: 200 }).slice(0, 300);
878
+ export default async function* (source) {
879
+ for await (const { type, data } of source) {
880
+ if (type === "test:pass" && data.details?.type !== "suite") yield JSON.stringify({ kind: "pass" }) + "\\n";
881
+ if (type === "test:fail" && data.details?.type !== "suite" && data.details?.error?.failureType !== "subtestsFailed") {
882
+ const error = data.details.error;
883
+ const cause = error.cause instanceof Error ? error.cause : error;
884
+ const assertion = cause.code === "ERR_ASSERTION";
885
+ yield JSON.stringify({ kind: "fail", name: data.name, file: data.file ?? null, line: data.line ?? null, column: data.column ?? null,
886
+ message: String(cause.message), generated: cause.generatedMessage === true, stack: String(cause.stack ?? ""),
887
+ ...(assertion ? { expected: shown(cause.expected), actual: shown(cause.actual) } : {}) }) + "\\n";
888
+ }
889
+ if (type === "test:stderr") yield JSON.stringify({ kind: "stderr", file: data.file ?? null, message: String(data.message) }) + "\\n";
890
+ }
891
+ }
892
+ `;
893
+ var testReporterArgument = `--test-reporter=data:text/javascript,${encodeURIComponent(reporterSource)}`;
894
+ var maxDetailed = 10;
895
+ var frameLine = /^\s+at /;
896
+ var errorLines = (lines) => {
897
+ const meaningful = lines.map((line) => line.trimEnd()).filter((line) => line.trim() !== "" && !frameLine.test(line) && !/^Node\.js v\d/.test(line) && !/^\s*\^+$/.test(line));
898
+ const named = meaningful.filter((line) => /^[A-Za-z]*Error\b/.test(line));
899
+ return (named.length > 0 ? named : meaningful.slice(-5)).slice(0, 5);
900
+ };
901
+ var createTestReport = async (directory) => {
902
+ const roots = [.../* @__PURE__ */ new Set([directory, await realpath(directory)])].sort((left, right) => right.length - left.length);
903
+ const relative = (text) => roots.reduce((result, root) => result.replaceAll(`file://${root}/`, "").replaceAll(`${root}/`, ""), text);
904
+ const failures = [];
905
+ const stderrByFile = /* @__PURE__ */ new Map();
906
+ const unparsed = [];
907
+ let passed = 0;
908
+ let failed2 = 0;
909
+ let pending = "";
910
+ const record = (line) => {
911
+ if (line.trim() === "") return;
912
+ let parsed;
913
+ try {
914
+ parsed = JSON.parse(line);
915
+ } catch {
916
+ unparsed.push(line);
917
+ return;
918
+ }
919
+ if (parsed.kind === "pass") passed += 1;
920
+ if (parsed.kind === "fail") {
921
+ failed2 += 1;
922
+ if (failures.length < maxDetailed) failures.push(parsed);
923
+ }
924
+ if (parsed.kind === "stderr") {
925
+ const lines = stderrByFile.get(parsed.file ?? "") ?? [];
926
+ stderrByFile.set(parsed.file ?? "", [...lines, ...parsed.message.split("\n")].slice(-50));
927
+ }
928
+ };
929
+ const placeOf = (failure) => {
930
+ const frame = failure.stack.split("\n").filter((line) => frameLine.test(line)).map(relative).map((line) => /\(?([^\s()]+:\d+:\d+)\)?\s*$/.exec(line)?.[1]).find((place) => place !== void 0 && !place.startsWith("/") && !place.startsWith("node:") && !place.includes("node_modules/"));
931
+ const declared = failure.file === null ? failure.name : `${relative(failure.file)}${failure.line === null ? "" : `:${failure.line}:${failure.column ?? 1}`}`;
932
+ return frame ?? declared;
933
+ };
934
+ const describe = (failure) => {
935
+ const fileOutput = failure.message === "test failed" && failure.file !== null ? stderrByFile.get(failure.file) ?? stderrByFile.get(relative(failure.file)) : void 0;
936
+ const message = fileOutput ? errorLines(fileOutput).join("; ") : failure.generated ? failure.message.split("\n")[0].replace(/:$/, "") : failure.message.trim().slice(0, 500);
937
+ const values = failure.expected === void 0 || failure.expected === failure.actual ? "" : ` - erwartet ${failure.expected}, tats\xE4chlich ${failure.actual}`;
938
+ return `- ${failure.name} (${placeOf(failure)}): ${relative(message)}${relative(values)}`;
939
+ };
940
+ return {
941
+ stdout: (chunk) => {
942
+ const lines = (pending + chunk).split("\n");
943
+ pending = lines.pop() ?? "";
944
+ lines.forEach(record);
945
+ },
946
+ report: (name2, outcome) => {
947
+ record(pending);
948
+ pending = "";
949
+ const summary = outcome.timedOut ? `Tests f\xFCr ${name2} nach Zeit\xFCberschreitung abgebrochen: ${passed} bestanden, ${failed2} fehlgeschlagen.` : `Tests f\xFCr ${name2} fehlgeschlagen: ${passed} bestanden, ${failed2} fehlgeschlagen.`;
950
+ const details = failures.map(describe);
951
+ const more = failed2 > failures.length ? [`... und ${failed2 - failures.length} weitere`] : [];
952
+ const withoutResult = failed2 === 0 ? [`Der Testlauf endete${outcome.code === null ? "" : ` mit Code ${outcome.code}`} ohne fehlgeschlagenen Test:`, ...errorLines([...unparsed, ...outcome.stderr.split("\n")]).map(relative)] : [];
953
+ return [summary, ...details, ...more, ...withoutResult].join("\n");
954
+ }
955
+ };
956
+ };
957
+
958
+ // server/runtime.ts
959
+ import { FRAME_BODY_CLASS, FRAME_DOCUMENT_CLASS, FRAME_ROOT_CLASS } from "@ragents/host/plugin-support/actor-programs/client-runtime.js";
960
+ import { buildTailwind } from "@ragents/host/plugin-support/actor-programs/tailwind.js";
961
+ var NAME = /^[a-z][a-z0-9-]{0,63}$/;
962
+ var errorText = (error) => error instanceof Error ? error.message : String(error);
963
+ var maxShownComplaints = 10;
964
+ var maxComplaintLength = 240;
965
+ var checkFailure = (title, lines, fallback) => {
966
+ const all = [...new Set(lines.map((line) => line.trim()).filter((line) => line !== ""))];
967
+ if (all.length === 0)
968
+ return new Error(fallback);
969
+ const shown = all.slice(0, maxShownComplaints).map((line) => line.length > maxComplaintLength ? `${line.slice(0, maxComplaintLength - 3)}...` : line);
970
+ const omitted = all.length - shown.length;
971
+ return Object.assign(new Error([
972
+ `${title}: ${all.length} Fehler.`,
973
+ ...shown,
974
+ ...omitted > 0 ? [`... und ${omitted} weitere; alle mit actor_program_diagnostics.`] : []
975
+ ].join("\n")), { lines: all });
976
+ };
977
+ var actorDescriptionOf = (text) => {
978
+ const line = (text ?? "").replace(/\s+/g, " ").trim();
979
+ return line.length <= actorDescriptionMaxLength ? line || void 0 : `${line.slice(0, actorDescriptionMaxLength - 3).trimEnd()}...`;
980
+ };
981
+ var exposed = defineToolAvailability({ availability: "conditional", availabilityDetail: "Ver\xF6ffentlichte Funktion eines aktiven Actors im Run." }, () => true);
982
+ var objectSchema = { type: "object", additionalProperties: true };
983
+ var checked = (schema, value, label) => {
984
+ const result = jsonValue(value, label);
985
+ if (!Value.Check(schema, result))
986
+ throw new Error(`${label}: ${schemaComplaints(schema, result)}`);
987
+ return result;
988
+ };
989
+ var safePath = (name2) => {
990
+ if (!name2 || path.isAbsolute(name2) || name2.includes("\\") || name2.includes("\0") || name2.split("/").some((part) => !part || part === "." || part === ".."))
991
+ throw new Error(`Ung\xFCltiger Paketpfad ${name2}.`);
992
+ return name2;
993
+ };
994
+ var inside = async (directory, relative) => {
995
+ const root = await realpath2(directory);
996
+ const file = await realpath2(path.join(root, safePath(relative)));
997
+ if (!file.startsWith(`${root}${path.sep}`))
998
+ throw new Error(`Paketpfad ${relative} liegt au\xDFerhalb des Pakets.`);
999
+ const stat = await lstat(file);
1000
+ if (!stat.isFile() || stat.size > 2e6)
1001
+ throw new Error(`Ung\xFCltige oder zu gro\xDFe Paketdatei ${relative}.`);
1002
+ return readFile(file, "utf8");
1003
+ };
1004
+ var occupied = (file) => {
1005
+ try {
1006
+ lstatSync(file);
1007
+ return true;
1008
+ } catch (error) {
1009
+ if (error.code === "ENOENT")
1010
+ return false;
1011
+ throw error;
1012
+ }
1013
+ };
1014
+ var packageExists = (name2) => new Error(`Das Paket ${name2} existiert bereits.`);
1015
+ var commitPackage = (staged, directory, name2) => {
1016
+ if (occupied(directory))
1017
+ throw packageExists(name2);
1018
+ try {
1019
+ renameSync(staged, directory);
1020
+ } catch (error) {
1021
+ if (["EEXIST", "ENOTEMPTY", "ENOTDIR"].includes(error.code ?? ""))
1022
+ throw packageExists(name2);
1023
+ throw error;
1024
+ }
1025
+ };
1026
+ var descriptor = (tool) => ({ id: tool.name, label: tool.label, description: tool.description, schema: tool.schema, resultSchema: tool.resultSchema });
1027
+ var ActorProgramRuntime = class {
1028
+ #options;
1029
+ #queues = /* @__PURE__ */ new Map();
1030
+ #active = /* @__PURE__ */ new Map();
1031
+ #installing = /* @__PURE__ */ new Set();
1032
+ #creating = /* @__PURE__ */ new Set();
1033
+ #staged = /* @__PURE__ */ new Set();
1034
+ #removing = /* @__PURE__ */ new Set();
1035
+ #knownRuns = /* @__PURE__ */ new Set();
1036
+ #epochs = /* @__PURE__ */ new Map();
1037
+ #stopping = /* @__PURE__ */ new Set();
1038
+ #shuttingDown = false;
1039
+ constructor(options) {
1040
+ this.#options = options;
1041
+ }
1042
+ runtime() {
1043
+ return this.#options.runtime();
1044
+ }
1045
+ view(runId) {
1046
+ return this.runtime().view(runId);
1047
+ }
1048
+ ownerId(runId) {
1049
+ return this.runtime().state(runId).ownerId;
1050
+ }
1051
+ operatorContext(runId, label = "operation") {
1052
+ return { actorId: this.ownerId(runId), commandId: `actor-program:${label}:${randomUUID()}` };
1053
+ }
1054
+ programsOf(view) {
1055
+ return view.pluginStates.flatMap((entry) => {
1056
+ if (entry.pluginId !== ACTOR_PROGRAMS_STATE_ID || entry.scope.kind !== "actor")
1057
+ return [];
1058
+ const state = entry.state;
1059
+ const actorId = entry.scope.actorId;
1060
+ const actor = view.actors.find((candidate) => candidate.id === actorId);
1061
+ return state.program && actor && actor.kind !== "human" && actor.lifecycle.kind !== "stopped" ? [state.program] : [];
1062
+ });
1063
+ }
1064
+ programs(runId) {
1065
+ return this.runtime().listRuns().some((run) => run.id === runId) ? this.programsOf(this.view(runId)) : [];
1066
+ }
1067
+ actor(runId, actorId) {
1068
+ const actor = this.view(runId).actors.find((candidate) => candidate.id === actorId);
1069
+ if (!actor || actor.kind === "human" || actor.lifecycle.kind === "stopped")
1070
+ throw new Error("Der Actor ist nicht aktiv.");
1071
+ if (this.#removing.has(`${runId}\0${actorId}`))
1072
+ throw new Error("Das Actor-Paket wird entfernt.");
1073
+ return actor;
1074
+ }
1075
+ resolveActor(runId, callerId, reference) {
1076
+ const actors = this.view(runId).actors;
1077
+ const found = reference === "self" ? actors.find((candidate) => candidate.id === callerId) : actorByHandle(actors, reference);
1078
+ if (!found)
1079
+ throw new Error(`Actor ${reference} ist unbekannt.`);
1080
+ return this.actor(runId, found.id);
1081
+ }
1082
+ data(runId, actorId) {
1083
+ const view = this.view(runId);
1084
+ const entry = view.pluginStates.find((item) => item.pluginId === ACTOR_STATE_ID && item.scope.kind === "actor" && item.scope.actorId === actorId);
1085
+ const revision = this.runtime().events(runId).filter((event) => (event.type === "plugin.state-replaced" || event.type === "plugin.state-patched") && event.payload.pluginId === ACTOR_STATE_ID && event.payload.scope.kind === "actor" && event.payload.scope.actorId === actorId).at(-1)?.sequence ?? 0;
1086
+ return { version: 1, revision, values: entry?.state ?? {} };
1087
+ }
1088
+ #writeProgram(context, runId, actorId, program) {
1089
+ this.runtime().replacePluginState(this.operatorContext(runId), runId, { pluginId: ACTOR_PROGRAMS_STATE_ID, scope: { kind: "actor", actorId }, state: jsonValue({ version: 1, program }, "Actor-Programm") });
1090
+ }
1091
+ #script(runId) {
1092
+ return this.view(runId).pluginStates.find((entry) => entry.pluginId === ACTOR_SCRIPT_STATE_ID && entry.scope.kind === "run")?.state;
1093
+ }
1094
+ async #writeSources(directory, files) {
1095
+ for (const source of files) {
1096
+ const file = path.join(directory, safePath(source.path));
1097
+ if (source.path.split("/").includes("node_modules"))
1098
+ throw new Error("Paketquellen d\xFCrfen keine Abh\xE4ngigkeiten \xFCberschreiben.");
1099
+ await mkdir(path.dirname(file), { recursive: true });
1100
+ await writeFile(file, source.content, { flag: "wx" });
1101
+ }
1102
+ }
1103
+ async #refresh(runId, program, signal) {
1104
+ const script = this.#script(runId);
1105
+ const files = script ? this.#options.scriptSources(script.entryId, program.name) : void 0;
1106
+ if (files) {
1107
+ const directory = path.join(await this.workspaceDirectory(runId), program.name);
1108
+ for (const entry of await readdir(directory))
1109
+ if (entry !== "node_modules")
1110
+ await rm(path.join(directory, entry), { recursive: true, force: true });
1111
+ await this.#writeSources(directory, files);
1112
+ }
1113
+ try {
1114
+ await this.#activate(this.operatorContext(runId, "refresh"), runId, program.name, false, signal);
1115
+ } catch (error) {
1116
+ throw new Error(`Der Capability-Vertrag von ${program.name} hat sich ge\xE4ndert und die Neuaktivierung scheiterte: ${errorText(error)}`);
1117
+ }
1118
+ }
1119
+ async #bound(runId, actorId, revision, signal, contractOf, descriptorsFor) {
1120
+ const current = () => {
1121
+ const program2 = this.programs(runId).find((entry) => entry.actorId === actorId);
1122
+ if (!program2)
1123
+ throw new Error("Der Actor besitzt kein aktives Programm.");
1124
+ return program2;
1125
+ };
1126
+ const bind = (program2) => {
1127
+ const contract = contractOf(program2);
1128
+ const descriptors = descriptorsFor(contract.capabilityIds);
1129
+ return { program: program2, contract, descriptors, drifted: runCapabilityContractHash2(descriptors) !== contract.capabilityContractHash };
1130
+ };
1131
+ const program = current();
1132
+ if (revision !== void 0 && program.revision !== revision)
1133
+ throw new Error("Das Actor-Paket wurde ersetzt.");
1134
+ const bound = bind(program);
1135
+ if (!bound.drifted)
1136
+ return bound;
1137
+ await this.#refresh(runId, program, signal);
1138
+ const refreshed = bind(current());
1139
+ if (refreshed.drifted)
1140
+ throw new Error(`Der Capability-Vertrag von ${program.name} weicht auch nach der Neuaktivierung ab.`);
1141
+ return refreshed;
1142
+ }
1143
+ async workspaceDirectory(runId) {
1144
+ this.#knownRuns.add(runId);
1145
+ return prepareAppWorkspace(path.join(this.#options.directoryFor(runId), "actor-workspace"));
1146
+ }
1147
+ templates() {
1148
+ return runModuleTemplates.map(({ id, title, description }) => ({ id, title, description }));
1149
+ }
1150
+ async #create(runId, name2, build) {
1151
+ this.#assertName(name2);
1152
+ const actors = await this.workspaceDirectory(runId);
1153
+ const directory = path.join(actors, name2);
1154
+ const key = `${runId}\0${name2}`;
1155
+ if (this.#creating.has(key))
1156
+ throw new Error(`Das Paket ${name2} wird gerade angelegt.`);
1157
+ if (occupied(directory))
1158
+ throw packageExists(name2);
1159
+ this.#creating.add(key);
1160
+ const staging = path.join(path.dirname(actors), ".staging");
1161
+ const staged = path.join(staging, `${name2}-${randomUUID()}`);
1162
+ this.#staged.add(staged);
1163
+ try {
1164
+ await mkdir(staging, { recursive: true });
1165
+ for (const entry of await readdir(staging))
1166
+ if (!this.#staged.has(path.join(staging, entry)))
1167
+ await rm(path.join(staging, entry), { recursive: true, force: true });
1168
+ await mkdir(staged);
1169
+ const built = await build(staged);
1170
+ commitPackage(staged, directory, name2);
1171
+ return { directory, built };
1172
+ } finally {
1173
+ this.#creating.delete(key);
1174
+ this.#staged.delete(staged);
1175
+ await rm(staged, { recursive: true, force: true });
1176
+ }
1177
+ }
1178
+ async scaffold(runId, name2, templateId) {
1179
+ const sources = Object.entries(templateFiles(templateById(templateId), name2)).map(([file, content]) => ({ path: file, content }));
1180
+ const { built: files } = await this.#create(runId, name2, async (directory) => {
1181
+ await this.#writeSources(directory, sources);
1182
+ await prepareAppProject(directory);
1183
+ const pkg = await readAppPackage(directory);
1184
+ const backend = pkg.backend ? await compileAppBackend({ directory, backend: pkg.backend, runId, executor: this.runtime().nativeTypeScriptExecutor }) : void 0;
1185
+ await installClientSdk(directory, { stateSchema: backend?.contract.state ?? objectSchema, actions: Object.entries(backend?.contract.functions ?? {}).map(([id, fn]) => ({ id, inputSchema: fn.input, resultSchema: fn.output })) });
1186
+ return (await projectSourceFiles(directory)).map((file) => file.path);
1187
+ });
1188
+ return { name: name2, directory: `@actors/${name2}`, files };
1189
+ }
1190
+ async importPackage(context, runId, name2, files, signal, scriptEntryId) {
1191
+ const { directory } = await this.#create(runId, name2, (staged) => this.#writeSources(staged, files));
1192
+ try {
1193
+ if (scriptEntryId)
1194
+ this.runtime().replacePluginState(this.operatorContext(runId), runId, { pluginId: ACTOR_SCRIPT_STATE_ID, scope: { kind: "run" }, state: { version: 1, entryId: scriptEntryId } });
1195
+ await this.activate(context, runId, name2, signal);
1196
+ const program = this.programs(runId).find((entry) => entry.name === name2);
1197
+ return { name: name2, actorId: program.actorId, actorHandle: program.actorHandle, views: program.views.length };
1198
+ } catch (error) {
1199
+ await rm(directory, { recursive: true, force: true });
1200
+ throw error;
1201
+ }
1202
+ }
1203
+ async check(runId, name2, callerId, signal, reference) {
1204
+ this.#assertName(name2);
1205
+ const directory = path.join(await this.workspaceDirectory(runId), name2);
1206
+ if ((await lstat(directory)).isSymbolicLink())
1207
+ throw new Error("Actor-Pakete d\xFCrfen keine Symlinks sein.");
1208
+ await prepareAppProject(directory);
1209
+ const pkg = await readAppPackage(directory);
1210
+ const previous = this.programs(runId).find((program) => program.name === name2);
1211
+ const owner = reference ? this.resolveActor(runId, callerId, reference) : previous ? this.actor(runId, previous.actorId) : !pkg.backend ? this.actor(runId, callerId) : void 0;
1212
+ if (previous && owner?.id !== previous.actorId)
1213
+ throw new Error("Ein aktiviertes Paket kann nicht zu einem anderen Actor wechseln.");
1214
+ const caller = this.view(runId).actors.find((candidate) => candidate.id === callerId);
1215
+ if (!caller)
1216
+ throw new Error("Aufrufender Actor fehlt.");
1217
+ const provisional = owner ?? {
1218
+ id: "pending",
1219
+ handle: name2,
1220
+ displayName: pkg.title,
1221
+ kind: "script",
1222
+ grants: caller.grants.filter((grant) => grant.delegable),
1223
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
1224
+ createdBy: callerId,
1225
+ description: actorDescriptionOf(pkg.description) ?? null,
1226
+ execution: { driver: { kind: "script", config: {} }, workspacePath: null, turnTimeoutMs: null },
1227
+ lifecycle: { kind: "idle", since: (/* @__PURE__ */ new Date()).toISOString() },
1228
+ usage: emptyUsage(),
1229
+ toolNames: null,
1230
+ openedToolNames: []
1231
+ };
1232
+ const available2 = (await this.#options.agentToolsFor(runId, provisional.id, owner ? void 0 : provisional)).map(descriptor);
1233
+ for (const operation of this.#options.operations.list())
1234
+ if (operation.operator !== "unavailable" && !available2.some((entry) => entry.id === operation.id))
1235
+ available2.push(operation);
1236
+ await installServerSdk(directory, available2);
1237
+ const backend = pkg.backend ? await compileAppBackend({ directory, backend: pkg.backend, runId, executor: this.runtime().nativeTypeScriptExecutor, signal }) : void 0;
1238
+ const contract = backend?.contract ?? { state: objectSchema, functions: {} };
1239
+ if (contract.input && owner?.kind === "agent")
1240
+ throw new Error("Ein LLM-Actor verarbeitet Eingaben mit seinem Agententreiber; onInput ist nur f\xFCr TypeScript-Actors erlaubt.");
1241
+ if (contract.state.type !== "object")
1242
+ throw new Error("Actor-Zustand muss ein Object-Schema sein.");
1243
+ const state = owner ? this.data(runId, owner.id).values : {};
1244
+ checked(contract.state, state, "Actor-Zustand");
1245
+ const actorId = owner?.id ?? "pending";
1246
+ const actorHandle = owner?.handle ?? name2;
1247
+ const functions = Object.entries(contract.functions).map(([id, fn]) => {
1248
+ if (!/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/.test(id))
1249
+ throw new Error(`Ung\xFCltiger Funktionsname ${id}.`);
1250
+ if (fn.tool && !/^[a-z][a-z0-9_]{0,63}$/.test(fn.tool.name))
1251
+ throw new Error(`Ung\xFCltiger Werkzeugname ${fn.tool.name}.`);
1252
+ const capabilities = fn.capabilities ?? [];
1253
+ const selected2 = capabilities.map((name3) => {
1254
+ const entry = available2.find((item) => item.id === name3);
1255
+ if (!entry)
1256
+ throw new Error(`Capability ${name3} ist nicht verf\xFCgbar.`);
1257
+ return entry;
1258
+ });
1259
+ return {
1260
+ id,
1261
+ label: fn.label,
1262
+ description: fn.description ?? fn.label,
1263
+ inputSchema: fn.input,
1264
+ resultSchema: fn.output,
1265
+ capabilityIds: capabilities,
1266
+ capabilityContractHash: runCapabilityContractHash2(selected2),
1267
+ confirmation: fn.confirmation ?? null,
1268
+ ...fn.tool ? { tool: { name: fn.tool.name, targets: fn.tool.targets ? fn.tool.targets.map((target) => target === "self" ? actorId : this.resolveActor(runId, callerId, target).id) : null, card: fn.tool.card ?? true } } : {}
1269
+ };
1270
+ });
1271
+ const inputCapabilities = contract.input?.capabilities ?? [];
1272
+ const inputDescriptors = inputCapabilities.map((id) => {
1273
+ const found = available2.find((entry) => entry.id === id);
1274
+ if (!found)
1275
+ throw new Error(`Eingabe-Capability ${id} ist nicht verf\xFCgbar.`);
1276
+ return found;
1277
+ });
1278
+ await installClientSdk(directory, { stateSchema: contract.state, actions: functions.map((fn) => ({ id: fn.id, inputSchema: fn.inputSchema, resultSchema: fn.resultSchema })) });
1279
+ const hasServerFiles = pkg.backend || (await projectSourceFiles(directory)).some((file) => /^tests\/.*\.tsx?$/.test(file.path));
1280
+ const serverErrors = hasServerFiles ? typecheckServerProject(directory, pkg.backend) : [];
1281
+ if (serverErrors.length)
1282
+ throw checkFailure(`Typpr\xFCfung von ${name2}`, serverErrors, `Die Typpr\xFCfung von ${name2} schlug ohne Meldung fehl.`);
1283
+ const clients = [];
1284
+ const views = [];
1285
+ for (const view of pkg.views ?? []) {
1286
+ const client = await compileClientProject({ directory, entryPoint: view.client, stateSchema: contract.state, actions: functions.map((fn) => ({ id: fn.id, inputSchema: fn.inputSchema, resultSchema: fn.resultSchema })) });
1287
+ if (!client.valid)
1288
+ throw checkFailure(
1289
+ `Client-Build von ${view.client}`,
1290
+ client.diagnostics.filter((item) => item.category === "error").map((item) => `${item.fileName ?? view.client}${item.start ? `:${item.start.line}:${item.start.column}` : ""} ${item.message.replace(/\s*\n\s*/g, " ")}`),
1291
+ `Der Client-Build von ${view.client} schlug ohne Meldung fehl.`
1292
+ );
1293
+ const styles = view.styles ? await inside(directory, view.styles) : "";
1294
+ if (/@import\b|url\s*\(\s*["']?\s*(?:https?:|\/\/)/i.test(styles))
1295
+ throw new Error("Ansichts-CSS darf keine externen Ressourcen laden.");
1296
+ const clientFile = `view-${view.id}.mjs`;
1297
+ clients.push({ file: clientFile, javaScript: client.javaScript });
1298
+ views.push({
1299
+ id: `${name2}--${view.id}`,
1300
+ key: view.id,
1301
+ title: view.title ?? pkg.title,
1302
+ visible: previous?.views.find((item) => item.key === view.id)?.visible ?? true,
1303
+ placements: [{ kind: "canvas", anchorActorId: actorId }],
1304
+ html: `<!doctype html><html class="${FRAME_DOCUMENT_CLASS}"><head><meta charset="utf-8"></head><body class="${FRAME_BODY_CLASS}"><div id="root" class="${FRAME_ROOT_CLASS}"></div></body></html>`,
1305
+ styles,
1306
+ clientFile
1307
+ });
1308
+ }
1309
+ const viewSources = [...new Set((pkg.views ?? []).map((view) => path.dirname(path.resolve(directory, view.client))))];
1310
+ const frameStyles = viewSources.length > 0 ? await buildTailwind(viewSources) : "";
1311
+ const files = await projectSourceFiles(directory);
1312
+ const revision = canonicalHash({ files, backend: backend?.javaScript ?? null, clients });
1313
+ const definition = {
1314
+ name: name2,
1315
+ title: pkg.title,
1316
+ description: pkg.description ?? "",
1317
+ actorId,
1318
+ actorHandle,
1319
+ revision,
1320
+ installedBy: previous?.installedBy ?? callerId,
1321
+ directory: path.join(this.#options.directoryFor(runId), "actor-builds", name2, revision),
1322
+ sourceDirectory: directory,
1323
+ ...backend ? { backendFile: "server.mjs" } : {},
1324
+ stateSchema: contract.state,
1325
+ stylesFile: "frame.css",
1326
+ functions,
1327
+ views,
1328
+ ...contract.input ? { input: { capabilityIds: inputCapabilities, capabilityContractHash: runCapabilityContractHash2(inputDescriptors) } } : {}
1329
+ };
1330
+ return { directory, files, definition, clients, frameStyles, createActor: !owner, ...backend ? { backendJavaScript: backend.javaScript } : {} };
1331
+ }
1332
+ activate(context, runId, name2, signal, reference) {
1333
+ return this.#activate(context, runId, name2, true, signal, reference);
1334
+ }
1335
+ async #activate(context, runId, name2, idle, signal, reference) {
1336
+ const key = `${runId}\0${name2}`;
1337
+ if (this.#installing.has(key))
1338
+ throw new Error(`Paket ${name2} wird bereits aktiviert.`);
1339
+ const epoch = this.invocationPermit(runId);
1340
+ this.#installing.add(key);
1341
+ const original = this.programs(runId).find((item) => item.name === name2);
1342
+ let compiled;
1343
+ let published = false;
1344
+ try {
1345
+ compiled = await this.check(runId, name2, context.actorId, signal, reference);
1346
+ const definition = compiled.definition;
1347
+ const tests = compiled.files.filter((file) => /^tests\/.*\.test\.tsx?$/.test(file.path));
1348
+ if (tests.length) {
1349
+ const processContext = await this.#options.serverProcessContextFor(runId);
1350
+ const report = await createTestReport(compiled.directory);
1351
+ let stderr = "";
1352
+ const launch = await sandboxedLaunch(processContext, { command: process.execPath, args: ["--import", "tsx", "--test", testReporterArgument, ...tests.map((file) => file.path)] });
1353
+ const result = await runManagedProcess({
1354
+ command: launch.command,
1355
+ args: [...launch.args],
1356
+ cwd: compiled.directory,
1357
+ env: processContext.env,
1358
+ uid: processContext.uid,
1359
+ gid: processContext.gid,
1360
+ label: `Tests ${name2}`,
1361
+ signal,
1362
+ timeoutMs: 6e4,
1363
+ onStdout: (chunk) => report.stdout(chunk.toString()),
1364
+ onStderr: (chunk) => {
1365
+ stderr = (stderr + chunk.toString()).slice(-12e3);
1366
+ }
1367
+ });
1368
+ if (result.code !== 0 || result.timedOut)
1369
+ throw new Error(report.report(name2, { code: result.code, timedOut: result.timedOut, stderr }));
1370
+ }
1371
+ if (canonicalHash(compiled.files) !== canonicalHash(await projectSourceFiles(compiled.directory)))
1372
+ throw new Error("Paketdateien wurden w\xE4hrend der Pr\xFCfung ge\xE4ndert; erneut aktivieren.");
1373
+ if (epoch !== this.invocationPermit(runId))
1374
+ throw new Error("Der Run wurde w\xE4hrend der Aktivierung gestoppt.");
1375
+ if (this.programs(runId).find((item) => item.name === name2)?.revision !== original?.revision)
1376
+ throw new Error("Das Paket wurde zwischenzeitlich ge\xE4ndert.");
1377
+ if (idle)
1378
+ this.#assertIdle(runId, definition.actorId);
1379
+ const names = /* @__PURE__ */ new Set([...agentTools.map((tool) => tool.name), ...this.#options.reservedToolNames(), ...this.programs(runId).filter((program) => program.name !== name2).flatMap((program) => program.functions.flatMap((fn) => fn.tool ? [fn.tool.name] : []))]);
1380
+ for (const fn of definition.functions)
1381
+ if (fn.tool) {
1382
+ if (names.has(fn.tool.name))
1383
+ throw new Error(`Werkzeugname ${fn.tool.name} ist bereits vergeben.`);
1384
+ names.add(fn.tool.name);
1385
+ }
1386
+ const occupied2 = this.programs(runId).find((program) => program.actorId === definition.actorId && program.name !== name2);
1387
+ if (occupied2)
1388
+ throw new Error(`Actor @${definition.actorHandle} besitzt bereits das Paket ${occupied2.name}. Erg\xE4nze darin Funktionen oder Ansichten.`);
1389
+ await mkdir(definition.directory, { recursive: true });
1390
+ for (const source of compiled.files) {
1391
+ const file = path.join(definition.directory, safePath(source.path));
1392
+ await mkdir(path.dirname(file), { recursive: true });
1393
+ await writeFile(file, source.content);
1394
+ }
1395
+ await prepareAppProject(definition.directory);
1396
+ if (compiled.backendJavaScript !== void 0)
1397
+ await writeFile(path.join(definition.directory, "server.mjs"), compiled.backendJavaScript);
1398
+ for (const client of compiled.clients)
1399
+ await writeFile(path.join(definition.directory, client.file), client.javaScript);
1400
+ await writeFile(path.join(definition.directory, definition.stylesFile), compiled.frameStyles);
1401
+ await writeFile(path.join(definition.directory, "sources.json"), JSON.stringify(compiled.files));
1402
+ await syncWorkspaceOwnership(definition.directory, await this.#options.serverProcessContextFor(runId));
1403
+ signal?.throwIfAborted();
1404
+ if (epoch !== this.invocationPermit(runId))
1405
+ throw new Error("Der Run wurde w\xE4hrend der Aktivierung gestoppt.");
1406
+ if (this.programs(runId).find((item) => item.name === name2)?.revision !== original?.revision)
1407
+ throw new Error("Das Paket wurde zwischenzeitlich ge\xE4ndert.");
1408
+ if (!compiled.createActor) {
1409
+ this.actor(runId, definition.actorId);
1410
+ if (idle)
1411
+ this.#assertIdle(runId, definition.actorId);
1412
+ checked(definition.stateSchema, this.data(runId, definition.actorId).values, "Actor-Zustand");
1413
+ if (this.programs(runId).some((item) => item.actorId === definition.actorId && item.name !== name2))
1414
+ throw new Error("Der Actor besitzt inzwischen ein anderes Paket.");
1415
+ }
1416
+ const currentNames = /* @__PURE__ */ new Set([...agentTools.map((tool) => tool.name), ...this.#options.reservedToolNames(), ...this.programs(runId).filter((program) => program.name !== name2).flatMap((program) => program.functions.flatMap((fn) => fn.tool ? [fn.tool.name] : []))]);
1417
+ for (const fn of definition.functions)
1418
+ if (fn.tool) {
1419
+ if (currentNames.has(fn.tool.name))
1420
+ throw new Error(`Werkzeugname ${fn.tool.name} ist inzwischen vergeben.`);
1421
+ currentNames.add(fn.tool.name);
1422
+ }
1423
+ jsonValue({ version: 1, program: definition }, "Actor-Programm");
1424
+ if (compiled.createActor) {
1425
+ const actors = this.view(runId).actors;
1426
+ const caller = actors.find((actor2) => actor2.id === context.actorId);
1427
+ const holder = actors.find((actor2) => actor2.handle === name2);
1428
+ if (holder?.kind === "script" && holder.lifecycle.kind === "stopped") {
1429
+ checked(definition.stateSchema, this.data(runId, holder.id).values, "Actor-Zustand");
1430
+ this.runtime().restartActor(context, runId, holder.id, "Actor-Paket erneut aktiviert");
1431
+ } else if (holder)
1432
+ throw new Error(`Handle @${name2} geh\xF6rt bereits dem ${holder.kind !== "human" && holder.lifecycle.kind === "stopped" ? "gestoppten" : "aktiven"} Actor ${holder.displayName}; nur ein gestoppter TypeScript-Actor wird beim Aktivieren neu gestartet. W\xE4hle einen anderen Paketnamen.`);
1433
+ else
1434
+ this.runtime().createScriptActor(context, runId, { handle: name2, displayName: definition.title, description: actorDescriptionOf(definition.description), grants: caller.grants.filter((grant) => grant.delegable), toolNames: null });
1435
+ const actor = this.resolveActor(runId, context.actorId, `@${name2}`);
1436
+ definition.actorId = actor.id;
1437
+ definition.actorHandle = actor.handle;
1438
+ for (const view of definition.views)
1439
+ for (const placement of view.placements)
1440
+ placement.anchorActorId = actor.id;
1441
+ for (const fn of definition.functions)
1442
+ if (fn.tool?.targets)
1443
+ fn.tool.targets = fn.tool.targets.map((target) => target === "pending" ? actor.id : target);
1444
+ }
1445
+ signal?.throwIfAborted();
1446
+ this.#writeProgram(context, runId, definition.actorId, definition);
1447
+ published = true;
1448
+ if (original && original.revision !== definition.revision)
1449
+ await this.runtime().nativeTypeScriptExecutor.stopInstance(runId, this.#instance(original));
1450
+ return { name: name2, actor: `@${definition.actorHandle}`, views: definition.views.length, active: true };
1451
+ } finally {
1452
+ this.#installing.delete(key);
1453
+ if (!published && compiled && compiled.definition.revision !== original?.revision)
1454
+ await rm(compiled.definition.directory, { recursive: true, force: true });
1455
+ }
1456
+ }
1457
+ list(runId) {
1458
+ return this.programs(runId).map((program) => ({ name: program.name, actor: `@${program.actorHandle}`, functions: program.functions.map((fn) => fn.id), views: program.views.map((view) => ({ name: view.key, title: view.title, visible: view.visible })) }));
1459
+ }
1460
+ async remove(context, runId, name2) {
1461
+ const program = this.#program(runId, name2);
1462
+ this.#assertIdle(runId, program.actorId);
1463
+ if (this.#installing.has(`${runId}\0${name2}`))
1464
+ throw new Error("Das Paket wird gerade aktiviert.");
1465
+ const actor = this.actor(runId, program.actorId);
1466
+ const key = `${runId}\0${program.actorId}`;
1467
+ this.#removing.add(key);
1468
+ try {
1469
+ await this.stopActor(runId, program.actorId);
1470
+ this.#writeProgram(context, runId, program.actorId, null);
1471
+ if (actor.kind === "script")
1472
+ this.runtime().stopActor(context, runId, program.actorId, "Actor-Paket entfernt");
1473
+ await rm(program.directory, { recursive: true, force: true });
1474
+ } finally {
1475
+ this.#removing.delete(key);
1476
+ }
1477
+ return { removed: name2 };
1478
+ }
1479
+ setVisibility(context, runId, reference, visible) {
1480
+ const { program, view } = resolveActorView(this.programs(runId), reference);
1481
+ this.#writeProgram(context, runId, program.actorId, { ...program, views: program.views.map((item) => item.id === view.id ? { ...item, visible } : item) });
1482
+ return { view: `${program.name}/${view.key}`, visible };
1483
+ }
1484
+ apps(runId) {
1485
+ return this.programs(runId).flatMap((program) => program.views.map((view) => ({
1486
+ id: view.id,
1487
+ actorId: program.actorId,
1488
+ actorHandle: program.actorHandle,
1489
+ title: view.title,
1490
+ description: program.description,
1491
+ revision: program.revision,
1492
+ actions: program.functions.map(({ id, label, description, confirmation }) => ({ id, label, description, confirmation })),
1493
+ placements: view.placements,
1494
+ visible: view.visible,
1495
+ state: this.data(runId, program.actorId),
1496
+ invocations: this.#invocations(runId).invocations.filter((invocation) => invocation.actorId === program.actorId && invocation.revision === program.revision)
1497
+ })));
1498
+ }
1499
+ runLocalTools(runId) {
1500
+ if (!this.runtime().listRuns().some((run) => run.id === runId))
1501
+ return [];
1502
+ const view = this.view(runId);
1503
+ return this.programs(runId).flatMap((program) => program.functions.flatMap((fn) => fn.tool ? [{
1504
+ moduleId: program.name,
1505
+ name: fn.tool.name,
1506
+ description: fn.description,
1507
+ card: fn.tool.card,
1508
+ actorId: program.actorId,
1509
+ actorHandle: program.actorHandle,
1510
+ functionId: fn.id,
1511
+ revision: program.revision,
1512
+ sourceHash: program.revision,
1513
+ installedBy: program.installedBy,
1514
+ parameters: Object.entries(fn.inputSchema.properties ?? {}).map(([name2, schema]) => ({ name: name2, type: ["string", "number", "integer", "boolean"].includes(schema.type ?? "") ? schema.type ?? "json" : "json", description: schema.description ?? name2, required: (fn.inputSchema.required ?? []).includes(name2) })),
1515
+ targets: (fn.tool.targets ?? view.actors.filter((actor) => actor.kind !== "human" && actor.lifecycle.kind !== "stopped").map((actor) => actor.id)).map((actorId) => ({ actorId, handle: view.actors.find((actor) => actor.id === actorId)?.handle ?? null }))
1516
+ }] : []));
1517
+ }
1518
+ async moduleSource(runId, reference) {
1519
+ const program = this.#program(runId, reference);
1520
+ return { files: JSON.parse(await readFile(path.join(program.directory, "sources.json"), "utf8")) };
1521
+ }
1522
+ frame(runId, viewId, revision) {
1523
+ const program = this.#program(runId, viewId);
1524
+ const view = program.views.find((item) => item.id === viewId);
1525
+ if (!view || program.revision !== revision)
1526
+ throw new Error("Die Ansicht wurde ersetzt oder entfernt.");
1527
+ if (!program.stylesFile)
1528
+ throw new Error("Das Programm stammt aus einer \xE4lteren Aktivierung ohne Stylesheet-Datei. Bitte erneut aktivieren.");
1529
+ const frameStyles = readFileSync(path.join(program.directory, program.stylesFile), "utf8");
1530
+ return { ...view, styles: `${frameStyles}
1531
+ ${view.styles}`, platformVersion: 2, clientJavaScript: readFileSync(path.join(program.directory, view.clientFile), "utf8") };
1532
+ }
1533
+ installedTools(context) {
1534
+ return this.programsOf(context.view).flatMap((program) => program.functions.flatMap((fn) => !fn.tool || fn.tool.targets && !fn.tool.targets.includes(context.actorId) ? [] : [defineRunFunction({
1535
+ name: fn.tool.name,
1536
+ label: fn.label,
1537
+ description: fn.description,
1538
+ schema: fn.inputSchema,
1539
+ resultSchema: fn.resultSchema,
1540
+ available: exposed,
1541
+ executionMode: "sequential",
1542
+ run: async (scope, id, input) => {
1543
+ const descriptorsFor = (capabilityIds) => agentCapabilityBinding(context.actor, scope.availableFunctions(), capabilityIds, /* @__PURE__ */ new Set()).descriptors;
1544
+ return this.#executeFunction(context.runId, program, fn, input, { id, kind: "tool", principal: { id: context.actorId, kind: context.actor.kind === "script" ? "script" : "agent" }, descriptorsFor, call: (name2, value, index) => scope.invokeFunction(`${id}:capability:${index}`, name2, value) }, scope.signal ?? new AbortController().signal);
1545
+ }
1546
+ })]));
1547
+ }
1548
+ async #serial(runId, actorId, signal, execute) {
1549
+ const permit = this.invocationPermit(runId);
1550
+ const key = `${runId}\0${actorId}`;
1551
+ const previous = this.#queues.get(key) ?? Promise.resolve();
1552
+ const operation = previous.then(() => {
1553
+ signal.throwIfAborted();
1554
+ if (permit !== this.invocationPermit(runId))
1555
+ throw new Error("Der Run wurde vor dem Funktionsstart gestoppt.");
1556
+ this.actor(runId, actorId);
1557
+ return execute();
1558
+ });
1559
+ const queued = operation.then(() => void 0, () => void 0);
1560
+ this.#queues.set(key, queued);
1561
+ try {
1562
+ return await operation;
1563
+ } finally {
1564
+ if (this.#queues.get(key) === queued)
1565
+ this.#queues.delete(key);
1566
+ }
1567
+ }
1568
+ async #backend(runId, program, input, binding, descriptors, signal) {
1569
+ if (!program.backendFile)
1570
+ throw new Error("Der Actor besitzt kein TypeScript-Backend.");
1571
+ const current = this.#program(runId, program.name);
1572
+ if (current.revision !== program.revision)
1573
+ throw new Error("Das Actor-Paket wurde ersetzt.");
1574
+ const logs = [];
1575
+ let calls = 0;
1576
+ const initial = this.data(runId, program.actorId);
1577
+ const result = await this.runtime().nativeTypeScriptExecutor.execute({
1578
+ program: { entry: program.backendFile, files: [{ fileName: program.backendFile, text: await readFile(path.join(program.directory, program.backendFile), "utf8") }], exportName: "handle" },
1579
+ instanceId: this.#instance(program),
1580
+ cwd: program.directory,
1581
+ input,
1582
+ state: initial.values,
1583
+ std: { now: (/* @__PURE__ */ new Date()).toISOString(), idPrefix: binding.id },
1584
+ context: { runId, actor: { id: program.actorId, handle: program.actorHandle }, invocationId: binding.id, invocationKind: binding.kind, principal: binding.principal, capabilities: descriptors }
1585
+ }, { signal, log: (value) => {
1586
+ if (logs.length < 100)
1587
+ logs.push((typeof value === "string" ? value : JSON.stringify(value)).slice(0, 2e3));
1588
+ }, call: async (name2, value) => {
1589
+ const capability = descriptors.find((entry) => entry.id === name2);
1590
+ if (!capability)
1591
+ throw new Error(`Capability ${name2} ist nicht deklariert.`);
1592
+ if (++calls > 64)
1593
+ throw new Error("Ein Aufruf darf h\xF6chstens 64 Capabilities ausf\xFChren.");
1594
+ if (program.functions.some((fn) => fn.tool?.name === name2))
1595
+ throw new Error("Eine Actor-Funktion darf sich nicht \xFCber ein Werkzeug selbst aufrufen; verwende eine gemeinsame TypeScript-Funktion.");
1596
+ checked(capability.schema, value, `Eingabe ${name2}`);
1597
+ const output = await binding.call(name2, value, calls);
1598
+ return checked(capability.resultSchema, output, `Ergebnis ${name2}`);
1599
+ } });
1600
+ signal.throwIfAborted();
1601
+ this.actor(runId, program.actorId);
1602
+ const state = checked(program.stateSchema, result.state, "Actor-Zustand");
1603
+ return { result: result.result, logs, state, initial };
1604
+ }
1605
+ #commitState(runId, actorId, state, initial) {
1606
+ if (canonicalHash(state) === canonicalHash(initial.values))
1607
+ return;
1608
+ if (this.data(runId, actorId).revision !== initial.revision)
1609
+ throw new Error("Der Actor-Zustand wurde w\xE4hrend des Aufrufs ge\xE4ndert. Erneut aufrufen.");
1610
+ this.runtime().replaceActorState(this.operatorContext(runId), runId, actorId, state);
1611
+ }
1612
+ #executeFunction(runId, bound, declared, input, binding, signal) {
1613
+ const functionOf = (program) => {
1614
+ const fn = program.functions.find((entry) => entry.id === declared.id);
1615
+ if (!fn)
1616
+ throw new Error("Die Funktion ist nicht deklariert.");
1617
+ return fn;
1618
+ };
1619
+ return this.#serial(runId, bound.actorId, signal, async () => {
1620
+ const { program, contract: fn, descriptors } = await this.#bound(runId, bound.actorId, bound.revision, signal, functionOf, binding.descriptorsFor);
1621
+ const value = checked(fn.inputSchema, input, `Eingabe ${fn.id}`);
1622
+ const result = await this.#backend(runId, program, { kind: "function", functionId: fn.id, input: value }, binding, descriptors, signal);
1623
+ const output = checked(fn.resultSchema, result.result, `Ergebnis ${fn.id}`);
1624
+ this.#commitState(runId, program.actorId, result.state, result.initial);
1625
+ binding.output?.push(...result.logs);
1626
+ return output;
1627
+ });
1628
+ }
1629
+ async runInput(request, signal) {
1630
+ this.#knownRuns.add(request.runId);
1631
+ try {
1632
+ const inputOf = (program) => {
1633
+ if (!program.input)
1634
+ throw new Error("Dieser TypeScript-Actor besitzt keinen onInput-Handler.");
1635
+ return program.input;
1636
+ };
1637
+ const descriptorsFor = (capabilityIds) => agentCapabilityBinding(this.actor(request.runId, request.agentId), request.tools, capabilityIds, /* @__PURE__ */ new Set()).descriptors;
1638
+ await this.#serial(request.runId, request.agentId, signal, async () => {
1639
+ const { program, descriptors } = await this.#bound(request.runId, request.agentId, void 0, signal, inputOf, descriptorsFor);
1640
+ const binding = { id: request.turnId, kind: "input", principal: { id: request.agentId, kind: "script" }, descriptorsFor, call: (name2, input, index) => request.invoke(`${request.turnId}:capability:${index}`, name2, input) };
1641
+ const result = await this.#backend(request.runId, program, { kind: "input", input: scriptInputOf(request.input) }, binding, descriptors, signal);
1642
+ this.#commitState(request.runId, request.agentId, result.state, result.initial);
1643
+ for (const text of result.logs)
1644
+ request.emit({ kind: "runtime", text });
1645
+ });
1646
+ return { failure: null, usage: emptyUsage() };
1647
+ } catch (error) {
1648
+ return { failure: errorText(error), usage: emptyUsage() };
1649
+ }
1650
+ }
1651
+ invocationPermit(runId) {
1652
+ if (this.#shuttingDown || this.#stopping.has(runId))
1653
+ throw new Error("Der Run wird gestoppt.");
1654
+ return this.#epochs.get(runId) ?? 0;
1655
+ }
1656
+ startInvocation(runId, viewId, revision, functionId, requestId, input, permit = this.invocationPermit(runId)) {
1657
+ const program = this.#program(runId, viewId);
1658
+ if (!program.views.some((view) => view.id === viewId))
1659
+ throw new Error("Die Ansicht ist unbekannt.");
1660
+ return this.#start(runId, program, viewId, revision, functionId, requestId, input, permit);
1661
+ }
1662
+ startFunctionInvocation(runId, actorHandle, revision, functionId, requestId, input, permit = this.invocationPermit(runId)) {
1663
+ const program = this.programs(runId).find((entry) => entry.actorHandle === handleKey(actorHandle));
1664
+ if (!program)
1665
+ throw new Error("Der Actor ver\xF6ffentlicht kein Programm.");
1666
+ return this.#start(runId, program, program.name, revision, functionId, requestId, input, permit);
1667
+ }
1668
+ #start(runId, program, viewId, revision, functionId, requestId, input, permit) {
1669
+ this.#knownRuns.add(runId);
1670
+ if (permit !== this.invocationPermit(runId))
1671
+ throw new Error("Der Run wurde inzwischen gestoppt.");
1672
+ if (program.revision !== revision)
1673
+ throw new Error("Das Actor-Paket wurde ersetzt. Ansicht aktualisieren.");
1674
+ const fn = program.functions.find((entry) => entry.id === functionId);
1675
+ if (!fn)
1676
+ throw new Error("Die Funktion ist nicht deklariert.");
1677
+ const state = this.#invocations(runId);
1678
+ const prior = state.invocations.find((entry) => entry.requestId === requestId);
1679
+ if (prior) {
1680
+ if (prior.actorId !== program.actorId || prior.actionId !== functionId || prior.revision !== revision || canonicalHash(prior.input) !== canonicalHash(input))
1681
+ throw new Error("Die Request-ID wurde bereits f\xFCr einen anderen Aufruf verwendet.");
1682
+ return prior;
1683
+ }
1684
+ if (!requestId || requestId.length > 200 || state.requestIds.includes(requestId))
1685
+ throw new Error("Ung\xFCltige oder bereits verarbeitete Request-ID.");
1686
+ if (state.requestIds.length >= 1e4)
1687
+ throw new Error("Der Run hat seine Aufrufgrenze erreicht.");
1688
+ if ([...this.#active.values()].filter((entry) => entry.runId === runId).length >= 8)
1689
+ throw new Error("Es laufen bereits acht Actor-Funktionen.");
1690
+ checked(fn.inputSchema, input, "Funktionseingabe");
1691
+ const invocation = { id: randomUUID(), requestId, actorId: program.actorId, actorHandle: program.actorHandle, appId: viewId, revision, actionId: functionId, input, output: [], createdAt: (/* @__PURE__ */ new Date()).toISOString(), status: "queued" };
1692
+ this.#replaceInvocation(runId, invocation, true);
1693
+ const controller = new AbortController();
1694
+ const completed = Promise.resolve().then(async () => {
1695
+ const started = { ...invocation, status: "running", startedAt: (/* @__PURE__ */ new Date()).toISOString() };
1696
+ this.#replaceInvocation(runId, started);
1697
+ try {
1698
+ if (fn.confirmation && !await this.#confirm(runId, invocation, fn.confirmation, controller.signal))
1699
+ throw new Error("Die Funktion wurde nicht best\xE4tigt.");
1700
+ const descriptorsFor = (capabilityIds) => operatorCapabilityBinding(this.ownerId(runId), this.#options.operations.list(), capabilityIds).descriptors;
1701
+ const output = [];
1702
+ const result = await this.#executeFunction(runId, program, fn, input, { output, id: invocation.id, kind: "app-action", principal: { id: this.ownerId(runId), kind: "operator" }, descriptorsFor, call: async (name2, value, index) => {
1703
+ const operation = this.#options.operations.operation(name2);
1704
+ const id = `${invocation.id}:capability:${index}`;
1705
+ const confirmation = operation.operator === "confirm" ? await this.#confirm(runId, invocation, `${operation.label} ausf\xFChren?`, controller.signal, value) : true;
1706
+ if (!confirmation)
1707
+ throw new Error("Die Aktion wurde nicht best\xE4tigt.");
1708
+ return this.#options.operations.invoke(name2, { runId, invocationId: id, principal: { kind: "operator", actorId: this.ownerId(runId) }, signal: controller.signal, ...operation.operator === "confirm" ? { operatorConfirmation: { operationId: name2, invocationId: id, inputHash: canonicalHash(value) } } : {} }, value);
1709
+ } }, controller.signal);
1710
+ this.#replaceInvocation(runId, { ...started, status: "succeeded", result, output, finishedAt: (/* @__PURE__ */ new Date()).toISOString() });
1711
+ } catch (error) {
1712
+ this.#replaceInvocation(runId, { ...started, status: controller.signal.aborted ? "cancelled" : "failed", error: errorText(error).slice(0, 8e3), finishedAt: (/* @__PURE__ */ new Date()).toISOString() });
1713
+ }
1714
+ }).finally(() => this.#active.delete(invocation.id));
1715
+ this.#active.set(invocation.id, { runId, actorId: program.actorId, controller, completed });
1716
+ return invocation;
1717
+ }
1718
+ invocation(runId, reference, id) {
1719
+ const invocation = this.#invocations(runId).invocations.find((entry) => entry.id === id && (entry.appId === reference || entry.actorHandle === reference));
1720
+ if (!invocation)
1721
+ throw new Error("Der Funktionsaufruf ist unbekannt.");
1722
+ return invocation;
1723
+ }
1724
+ #invocations(runId) {
1725
+ return this.view(runId).pluginStates.find((entry) => entry.pluginId === ACTOR_INVOCATIONS_STATE_ID && entry.scope.kind === "run")?.state ?? { version: 1, invocations: [], requestIds: [] };
1726
+ }
1727
+ #replaceInvocation(runId, invocation, remember = false) {
1728
+ const current = this.#invocations(runId);
1729
+ const entries = [...current.invocations.filter((entry) => entry.id !== invocation.id), invocation];
1730
+ const active = entries.filter((entry) => entry.status === "queued" || entry.status === "running");
1731
+ const finished = entries.filter((entry) => entry.status !== "queued" && entry.status !== "running").slice(-20);
1732
+ const state = { version: 1, invocations: [...active, ...finished], requestIds: remember ? [...current.requestIds, invocation.requestId] : current.requestIds };
1733
+ while (jsonBytes(state) > MAX_INVOCATIONS_STATE_BYTES && finished.length) {
1734
+ finished.shift();
1735
+ state.invocations = [...active, ...finished];
1736
+ }
1737
+ assertJsonValue2(state, "Actor-Aufrufe");
1738
+ this.runtime().replacePluginState(this.operatorContext(runId), runId, { pluginId: ACTOR_INVOCATIONS_STATE_ID, scope: { kind: "run" }, state });
1739
+ }
1740
+ async #confirm(runId, invocation, question, signal, input = invocation.input) {
1741
+ const answer = await this.#options.askService().ask({ runId, agentId: this.ownerId(runId), turnId: null, commandId: `actor-confirm:${randomUUID()}` }, { question: `${question}
1742
+ Eingabe: ${JSON.stringify(input).slice(0, 500)}`, options: ["Ausf\xFChren", "Abbrechen"], multi: false, description: `Funktion ${invocation.actionId} von @${invocation.actorHandle}`, parameters: { source: ACTOR_PROGRAMS_STATE_ID, invocationId: invocation.id } }, signal);
1743
+ return answer === "Ausf\xFChren";
1744
+ }
1745
+ #program(runId, reference) {
1746
+ const program = this.programs(runId).find((entry) => entry.name === reference || entry.views.some((view) => view.id === reference));
1747
+ if (!program)
1748
+ throw new Error(`Actor-Paket ${reference} ist nicht aktiv.`);
1749
+ return program;
1750
+ }
1751
+ #instance(program) {
1752
+ return `actor:${program.actorId}:${program.revision}`;
1753
+ }
1754
+ #assertName(name2) {
1755
+ if (!NAME.test(name2))
1756
+ throw new Error("Paketnamen beginnen mit einem Kleinbuchstaben und enthalten h\xF6chstens 64 Kleinbuchstaben, Ziffern oder Bindestriche.");
1757
+ }
1758
+ #assertIdle(runId, actorId) {
1759
+ if (this.#queues.has(`${runId}\0${actorId}`) || [...this.#active.values()].some((entry) => entry.runId === runId && entry.actorId === actorId))
1760
+ throw new Error("Der Actor hat noch laufende Funktionen oder Eingaben.");
1761
+ }
1762
+ async stopActor(runId, actorId) {
1763
+ const active = [...this.#active.values()].filter((entry) => entry.runId === runId && entry.actorId === actorId);
1764
+ active.forEach((entry) => entry.controller.abort(new Error("Actor gestoppt.")));
1765
+ const state = this.view(runId).pluginStates.find((entry) => entry.pluginId === ACTOR_PROGRAMS_STATE_ID && entry.scope.kind === "actor" && entry.scope.actorId === actorId)?.state;
1766
+ if (state?.program)
1767
+ await this.runtime().nativeTypeScriptExecutor.stopInstance(runId, this.#instance(state.program));
1768
+ await Promise.allSettled(active.map((entry) => entry.completed));
1769
+ }
1770
+ async stopRun(runId) {
1771
+ this.#epochs.set(runId, (this.#epochs.get(runId) ?? 0) + 1);
1772
+ this.#stopping.add(runId);
1773
+ try {
1774
+ const active = [...this.#active.values()].filter((entry) => entry.runId === runId);
1775
+ active.forEach((entry) => entry.controller.abort(new Error("Run gestoppt.")));
1776
+ await this.runtime().nativeTypeScriptExecutor.stopRun(runId);
1777
+ await Promise.allSettled([...active.map((entry) => entry.completed), ...[...this.#queues].filter(([key]) => key.startsWith(`${runId}\0`)).map(([, queue]) => queue)]);
1778
+ } finally {
1779
+ this.#stopping.delete(runId);
1780
+ }
1781
+ }
1782
+ waitForRunSettlement(runId) {
1783
+ return Promise.allSettled([...this.#active.values()].filter((entry) => entry.runId === runId).map((entry) => entry.completed).concat([...this.#queues].filter(([key]) => key.startsWith(`${runId}\0`)).map(([, queue]) => queue))).then(() => void 0);
1784
+ }
1785
+ async prepareSession(runId) {
1786
+ this.#knownRuns.add(runId);
1787
+ if (!this.runtime().listRuns().some((run) => run.id === runId))
1788
+ return;
1789
+ for (const invocation of this.#invocations(runId).invocations)
1790
+ if (invocation.status === "queued" || invocation.status === "running")
1791
+ this.#replaceInvocation(runId, { ...invocation, status: "cancelled", error: "Der Server wurde w\xE4hrend des Aufrufs beendet.", finishedAt: (/* @__PURE__ */ new Date()).toISOString() });
1792
+ }
1793
+ async stopSession(runId, _signal) {
1794
+ await this.stopRun(runId);
1795
+ }
1796
+ async disposeRun(runId) {
1797
+ await this.stopRun(runId);
1798
+ }
1799
+ async deleteSession(runId) {
1800
+ await this.stopRun(runId);
1801
+ await rm(this.#options.directoryFor(runId), { recursive: true, force: true });
1802
+ }
1803
+ async shutdown() {
1804
+ this.#shuttingDown = true;
1805
+ await Promise.allSettled([...this.#knownRuns].map((runId) => this.stopRun(runId)));
1806
+ }
1807
+ };
1808
+
1809
+ // server/tool-contributor.ts
1810
+ import { Type } from "typebox";
1811
+ import { defineRunFunction as defineRunFunction2, defineToolAvailability as defineToolAvailability2, holdsUsable } from "@ragents/engine";
1812
+ import { toolDescriptorFrom } from "@ragents/host/plugin-support/agent-tool.js";
1813
+ var metadata = [
1814
+ { name: "actor_program_create", label: "Create Actor Program", description: "Create a private TypeScript package with fixed libraries.", longDescription: "Edit files under @actors/name using workspace tools." },
1815
+ { name: "actor_program_activate", label: "Activate Actor Program", description: "Typecheck, build and test a package, then activate its functions and optional views.", longDescription: "actor self or @handle attaches to an existing actor; omitted creates a TypeScript actor for a backend, or attaches static views to self." },
1816
+ { name: "actor_program_list", label: "List Actor Programs", description: "List active actor packages, functions and views." },
1817
+ { name: "actor_program_remove", label: "Remove Actor Program", description: "Detach functions and views and stop the backend.", longDescription: "A TypeScript actor is stopped; an LLM actor retains its agent behavior." },
1818
+ { name: "actor_view_set_visibility", label: "Show or hide Actor View", description: "Set surface visibility by package-name/view-key or @handle/view-key.", longDescription: "Use names you chose; the server resolves the view ID. A unique view title also works." },
1819
+ { name: "actor_program_diagnostics", label: "Actor Program Diagnostics", description: "Read the last project diagnostics.", longDescription: "Changed errors are automatically supplied before the next model request." }
1820
+ ];
1821
+ var actorProgramManagementToolNames = metadata.map((entry) => entry.name);
1822
+ var actorProgramToolsAvailable = defineToolAvailability2({ availability: "conditional", availabilityDetail: "F\xFCr ausf\xFChrbare Actors mit agent.spawn und plugin.state.write." }, (actor) => actor.kind !== "human" && holdsUsable(actor, "agent.spawn") && holdsUsable(actor, "plugin.state.write"));
1823
+ var name = Type.String({ pattern: "^[a-z][a-z0-9-]{0,63}$" });
1824
+ var managementTools = (runtime, diagnostics) => [
1825
+ defineRunFunction2({ ...metadata[0], schema: Type.Object({ name, template: Type.Union(runtime.templates().map((entry) => Type.Literal(entry.id, { description: entry.description }))) }, { additionalProperties: false }), resultSchema: Type.Object({ name: Type.String(), directory: Type.String(), files: Type.Array(Type.String()) }, { additionalProperties: false }), available: actorProgramToolsAvailable, executionMode: "sequential", run: (scope, _id, input) => runtime.scaffold(scope.caller.runId, input.name, input.template) }),
1826
+ defineRunFunction2({ ...metadata[1], schema: Type.Object({ name, actor: Type.Optional(Type.String()) }, { additionalProperties: false }), resultSchema: Type.Object({ name: Type.String(), actor: Type.String(), views: Type.Number(), active: Type.Literal(true) }, { additionalProperties: false }), available: actorProgramToolsAvailable, executionMode: "sequential", run: (scope, id, input) => runtime.activate(scope.context(id), scope.caller.runId, input.name, scope.signal, input.actor) }),
1827
+ defineRunFunction2({ ...metadata[2], schema: Type.Object({}, { additionalProperties: false }), resultSchema: Type.Array(Type.Object({ name: Type.String(), actor: Type.String(), functions: Type.Array(Type.String()), views: Type.Array(Type.Object({ name: Type.String(), title: Type.String(), visible: Type.Boolean() })) })), available: actorProgramToolsAvailable, executionMode: "sequential", run: (scope) => runtime.list(scope.caller.runId) }),
1828
+ defineRunFunction2({ ...metadata[3], schema: Type.Object({ name }, { additionalProperties: false }), resultSchema: Type.Object({ removed: Type.String() }, { additionalProperties: false }), available: actorProgramToolsAvailable, executionMode: "sequential", run: (scope, id, input) => runtime.remove(scope.context(id), scope.caller.runId, input.name) }),
1829
+ defineRunFunction2({ ...metadata[4], schema: Type.Object({ view: Type.String({ minLength: 1, description: "package-name/view-key or @handle/view-key of an activated view, without the surface entity prefix app:. No generated IDs needed." }), visible: Type.Boolean() }, { additionalProperties: false }), resultSchema: Type.Object({ view: Type.String(), visible: Type.Boolean() }, { additionalProperties: false }), available: actorProgramToolsAvailable, executionMode: "sequential", run: (scope, id, input) => runtime.setVisibility(scope.context(id), scope.caller.runId, input.view, input.visible) }),
1830
+ defineRunFunction2({ ...metadata[5], schema: Type.Object({ name: Type.Optional(name) }, { additionalProperties: false }), resultSchema: Type.String(), available: actorProgramToolsAvailable, executionMode: "sequential", run: (scope, _id, input) => diagnostics.latest(scope.caller.runId, scope.caller.actorId, input.name) })
1831
+ ];
1832
+ var createActorProgramToolContributors = (runtime, diagnostics) => [
1833
+ { name: "ragents.actor-programs.management", descriptors: metadata.map((item) => toolDescriptorFrom(item, actorProgramToolsAvailable)), tools: () => managementTools(runtime, diagnostics) },
1834
+ { name: "ragents.actor-programs.functions", descriptors: [], dynamic: true, tools: (context) => runtime.installedTools(context) }
1835
+ ];
1836
+
1837
+ // server/controls-tool.ts
1838
+ import { Type as Type2 } from "typebox";
1839
+ import { defineRunFunction as defineRunFunction3, defineToolAvailability as defineToolAvailability3 } from "@ragents/engine";
1840
+ import { toolDescriptorFrom as toolDescriptorFrom2 } from "@ragents/host/plugin-support/agent-tool.js";
1841
+ import { readClientUiComponentNames, readClientUiComponentContracts } from "@ragents/host/plugin-support/actor-programs/client-contracts.js";
1842
+
1843
+ // server/prompts.ts
1844
+ import { pluginAsset } from "@ragents/host/plugin-support/plugin-folder.js";
1845
+ import { boundToTools, handlebarsPrompt } from "@ragents/host/plugin-support/prompt.js";
1846
+ var buildingTools = [
1847
+ "actor_program_create",
1848
+ "actor_program_activate",
1849
+ "actor_program_diagnostics",
1850
+ "actor_program_list",
1851
+ "actor_program_remove",
1852
+ "actor_view_set_visibility"
1853
+ ];
1854
+ var actorProgramGuide = handlebarsPrompt(
1855
+ "ragents.actor-programs.prompt",
1856
+ 750,
1857
+ pluginAsset("ragents.actor-programs", "prompt.hbs")
1858
+ );
1859
+ var actorProgramSummary = boundToTools(
1860
+ { ...handlebarsPrompt("ragents.actor-programs.summary", 749, pluginAsset("ragents.actor-programs", "summary.hbs")), delivery: "initial" },
1861
+ "actor_program_controls",
1862
+ ...buildingTools
1863
+ );
1864
+
1865
+ // server/controls-tool.ts
1866
+ var available = defineToolAvailability3({ availability: "always", availabilityDetail: "Typisierte UI-Referenz des installierten Actor-Programm-Plugins." }, () => true);
1867
+ var metadata2 = {
1868
+ name: "actor_program_controls",
1869
+ label: "Actor-Programm-Anleitung und Controls nachschlagen",
1870
+ description: "Read Mini-App control contracts or the actor-program authoring guide.",
1871
+ longDescription: "With topic: guide, explain the TypeScript package workflow through actor_program_activate. Otherwise list control names, or select one component (for example Form) for only its TypeScript props and supporting types. Import controls from @ragents/client/ui and use these exact props."
1872
+ };
1873
+ var describeClientControls = (component) => {
1874
+ const components = readClientUiComponentNames();
1875
+ if (component === void 0) return { components };
1876
+ if (!components.includes(component)) throw new Error(`Unbekanntes Control ${component}. G\xFCltig: ${components.join(", ")}`);
1877
+ return { files: readClientUiComponentContracts(component) };
1878
+ };
1879
+ var createControlsToolContributor = () => ({
1880
+ name: "ragents.actor-programs.controls",
1881
+ descriptors: [toolDescriptorFrom2(metadata2, available)],
1882
+ tools: () => [defineRunFunction3({
1883
+ ...metadata2,
1884
+ available,
1885
+ schema: Type2.Object({
1886
+ topic: Type2.Optional(Type2.Union([Type2.Literal("controls"), Type2.Literal("guide")], { description: "Default controls: query component names or types. Guide: read the short package workflow without component." })),
1887
+ component: Type2.Optional(Type2.String({ minLength: 1, description: "Optional control name from the catalog, without UI. prefix. Only valid when topic is controls or omitted." }))
1888
+ }, { additionalProperties: false }),
1889
+ resultSchema: Type2.Union([
1890
+ Type2.Object({ guide: Type2.String() }, { additionalProperties: false }),
1891
+ Type2.Object({ components: Type2.Array(Type2.String()) }, { additionalProperties: false }),
1892
+ Type2.Object({ files: Type2.Record(Type2.String(), Type2.String()) }, { additionalProperties: false })
1893
+ ]),
1894
+ run: async (_scope, _call, input) => {
1895
+ if (input.topic === "guide") {
1896
+ if (input.component !== void 0) throw new Error("component ist nur bei topic: controls oder ohne topic erlaubt; f\xFCr topic: guide lasse component weg.");
1897
+ return { guide: await actorProgramGuide.render({}) };
1898
+ }
1899
+ return describeClientControls(input.component);
1900
+ }
1901
+ })]
1902
+ });
1903
+
1904
+ // server/index.ts
1905
+ import { sandboxServicesToken } from "@ragents/host/plugin-support/workspace-sandbox-host.js";
1906
+ import { actorProgramsToken } from "@ragents/host/plugin-support/actor-programs/service.js";
1907
+
1908
+ // server/project-diagnostics.ts
1909
+ import { createHash } from "node:crypto";
1910
+ import { readdir as readdir2 } from "node:fs/promises";
1911
+ import path2 from "node:path";
1912
+ import { projectSourceFiles as projectSourceFiles2 } from "@ragents/host/plugin-support/actor-programs/app-project.js";
1913
+ var entryType = "ragents.actor-programs.project-diagnostics";
1914
+ var maxDeltaLines = 8;
1915
+ var maxLineLength = 240;
1916
+ var messageOf = (error) => error instanceof Error ? error.message : String(error);
1917
+ var fingerprintOf = (value) => createHash("sha256").update(JSON.stringify(value)).digest("hex");
1918
+ var errorLines2 = (error) => {
1919
+ const complete = error instanceof Error ? error.lines : void 0;
1920
+ if (Array.isArray(complete) && complete.every((line) => typeof line === "string")) return [...new Set(complete)];
1921
+ const lines = messageOf(error).split("\n").map((line) => line.trim()).filter(Boolean);
1922
+ const issues = lines.filter((line) => !/^(Build failed with \d+ errors?:|.*(?:Typprüfung|Typecheck|Diagnostik).*:)$/i.test(line));
1923
+ return [...new Set(issues.length ? issues : lines)];
1924
+ };
1925
+ var allErrors = (snapshot) => Object.entries(snapshot.programs).sort(([left], [right]) => left.localeCompare(right)).flatMap(([programName, program]) => program.errors.map((error) => `${programName}: ${error}`));
1926
+ var isSnapshot = (value) => {
1927
+ if (value === null || typeof value !== "object") return false;
1928
+ const snapshot = value;
1929
+ return snapshot.version === 1 && snapshot.programs !== null && typeof snapshot.programs === "object" && Object.values(snapshot.programs).every((program) => program && typeof program.fingerprint === "string" && Array.isArray(program.errors) && program.errors.every((error) => typeof error === "string"));
1930
+ };
1931
+ var createProjectDiagnostics = (options) => {
1932
+ const snapshots = /* @__PURE__ */ new Map();
1933
+ const remember = (runId, actorId, snapshot) => {
1934
+ const agents = snapshots.get(runId) ?? /* @__PURE__ */ new Map();
1935
+ agents.set(actorId, snapshot);
1936
+ snapshots.set(runId, agents);
1937
+ };
1938
+ const contribution = {
1939
+ id: entryType,
1940
+ beforeModelCall: async ({ runId, agentId }, call) => {
1941
+ if (options.applies?.(runId, agentId) === false) return void 0;
1942
+ call.signal?.throwIfAborted();
1943
+ const previous = isSnapshot(call.kept) ? call.kept : { version: 1, programs: {} };
1944
+ const next = { version: 1, programs: {} };
1945
+ let changed = false;
1946
+ try {
1947
+ const directory = await options.workspaceFor(runId);
1948
+ const entries = await readdir2(directory, { withFileTypes: true }).catch((error) => {
1949
+ if (error.code === "ENOENT") return [];
1950
+ throw error;
1951
+ });
1952
+ for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
1953
+ if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
1954
+ call.signal?.throwIfAborted();
1955
+ let fingerprint;
1956
+ let errors = [];
1957
+ try {
1958
+ if (entry.isSymbolicLink()) throw new Error("Actor-Projekte d\xFCrfen keine Symlinks sein.");
1959
+ fingerprint = fingerprintOf(await projectSourceFiles2(path2.join(directory, entry.name)));
1960
+ } catch (error) {
1961
+ errors = errorLines2(error);
1962
+ fingerprint = fingerprintOf({ errors });
1963
+ }
1964
+ const prior = previous.programs[entry.name];
1965
+ if (prior?.fingerprint === fingerprint) {
1966
+ next.programs[entry.name] = prior;
1967
+ continue;
1968
+ }
1969
+ changed = true;
1970
+ if (errors.length === 0) {
1971
+ try {
1972
+ await options.check(runId, entry.name, agentId, call.signal);
1973
+ } catch (error) {
1974
+ call.signal?.throwIfAborted();
1975
+ errors = errorLines2(error);
1976
+ }
1977
+ }
1978
+ next.programs[entry.name] = { fingerprint, errors };
1979
+ }
1980
+ } catch (error) {
1981
+ call.signal?.throwIfAborted();
1982
+ const errors = errorLines2(error);
1983
+ Object.assign(next.programs, previous.programs);
1984
+ next.programs["(Workspace)"] = { fingerprint: fingerprintOf({ errors }), errors };
1985
+ }
1986
+ if (JSON.stringify(Object.keys(previous.programs).sort()) !== JSON.stringify(Object.keys(next.programs).sort())) changed = true;
1987
+ if (JSON.stringify(previous) !== JSON.stringify(next)) changed = true;
1988
+ call.signal?.throwIfAborted();
1989
+ remember(runId, agentId, next);
1990
+ if (!changed) return void 0;
1991
+ call.keep(next);
1992
+ const before = new Set(allErrors(previous));
1993
+ const after = new Set(allErrors(next));
1994
+ const added = [...after].filter((error) => !before.has(error));
1995
+ const resolved = [...before].filter((error) => !after.has(error));
1996
+ const changes = [...added.map((error) => `Neu: ${error}`), ...resolved.map((error) => `Behoben: ${error}`)];
1997
+ const lines = changes.slice(0, maxDeltaLines).map((line) => line.length > maxLineLength ? `${line.slice(0, maxLineLength - 3)}...` : line);
1998
+ const omitted = changes.length - lines.length;
1999
+ return [
2000
+ `Actor-Programm-Projektpr\xFCfung (TypeScript und Build): ${after.size} Fehler in ${Object.keys(next.programs).length} Projekten; ${added.length} neu, ${resolved.length} behoben.`,
2001
+ ...lines,
2002
+ ...omitted > 0 ? [`${omitted} weitere \xC4nderungen. Vollst\xE4ndiger letzter Stand: actor_program_diagnostics.`] : []
2003
+ ].join("\n");
2004
+ }
2005
+ };
2006
+ return {
2007
+ contribution,
2008
+ latest(runId, actorId, programName) {
2009
+ const snapshot = snapshots.get(runId)?.get(actorId);
2010
+ if (!snapshot) return "Noch kein Actor-Programm-Projektstand f\xFCr diesen Agenten gepr\xFCft.";
2011
+ const programs = Object.entries(snapshot.programs).filter(([id]) => programName === void 0 || id === programName);
2012
+ if (programs.length === 0) return programName ? `Kein gepr\xFCfter Projektstand f\xFCr ${programName}.` : "Keine Actor-Programm-Projekte vorhanden.";
2013
+ return programs.sort(([left], [right]) => left.localeCompare(right)).map(([id, program]) => [`${id}: ${program.errors.length} Fehler`, ...program.errors].join("\n")).join("\n\n");
2014
+ },
2015
+ forget(runId) {
2016
+ snapshots.delete(runId);
2017
+ }
2018
+ };
2019
+ };
2020
+
2021
+ // server/index.ts
2022
+ var actorProgramsPlugin = (pluginHost) => ({
2023
+ manifest: { id: "ragents.actor-programs" },
2024
+ register: (host) => {
2025
+ const runtime = new ActorProgramRuntime({
2026
+ runtime: host.service(runtimeProviderToken2),
2027
+ agentToolsFor: agentToolsFrom(pluginHost),
2028
+ askService: () => host.service(askServiceToken),
2029
+ reservedToolNames: () => pluginHost.tools.describe().map((entry) => entry.name),
2030
+ serverProcessContextFor: (runId) => host.service(sandboxServicesToken).serverProcessContextFor(runId),
2031
+ operations: { operation: (id) => host.operation(id), invoke: (id, context, input) => host.invokeOperation(id, context, input), list: () => pluginHost.operations.describe() },
2032
+ directoryFor: (runId) => host.storage.session(runId, "programs"),
2033
+ scriptSources: (entryId, name2) => {
2034
+ const script = pluginHost.startEntries.scriptPackage(entryId);
2035
+ return !script ? void 0 : script.handle === name2 ? script.files : script.programs.find((program) => program.name === name2)?.files;
2036
+ }
2037
+ });
2038
+ host.provide(actorProgramsToken, runtime);
2039
+ const diagnostics = createProjectDiagnostics({
2040
+ workspaceFor: (runId) => runtime.workspaceDirectory(runId),
2041
+ check: (runId, name2, actorId, signal) => runtime.check(runId, name2, actorId, signal),
2042
+ applies: (runId, actorId) => {
2043
+ const view = host.service(runtimeProviderToken2)().view(runId);
2044
+ const actor = view.actors.find((candidate) => candidate.id === actorId);
2045
+ return !!actor && actor.kind !== "human" && actorProgramToolsAvailable(actor, view) && (actor.toolNames === null || actor.toolNames.some((name2) => actorProgramManagementToolNames.includes(name2)));
2046
+ }
2047
+ });
2048
+ host.agentRuntime(diagnostics.contribution);
2049
+ host.clientConfig({ routePrefix: miniAppsApiPrefix });
2050
+ host.methods(...createActorProgramMethods({ ensureSession: host.service(runGuardToken), runtime }));
2051
+ host.http(...createMiniAppFrameRoutes({ ensureSession: host.service(runGuardToken), runtime }));
2052
+ host.lifecycle({
2053
+ id: "ragents.actor-programs.lifecycle",
2054
+ initialize: () => host.service(sandboxServicesToken).registerWorkspaceRoot({ id: "ragents.actor-programs", alias: "@actors", environmentVariable: "RAGENTS_ACTORS_DIR", directoryFor: (runId) => runtime.workspaceDirectory(runId), ownershipDirectoryFor: async (runId) => path3.dirname(await runtime.workspaceDirectory(runId)) }),
2055
+ prepareSession: ({ runId }) => runtime.prepareSession(runId),
2056
+ stopSession: ({ runId, signal }) => runtime.stopSession(runId, signal),
2057
+ deleteSession: async ({ runId }) => {
2058
+ diagnostics.forget(runId);
2059
+ await runtime.deleteSession(runId);
2060
+ },
2061
+ shutdown: () => runtime.shutdown()
2062
+ });
2063
+ host.prompts(actorProgramSummary);
2064
+ host.functions(createControlsToolContributor(), ...createActorProgramToolContributors(runtime, diagnostics));
2065
+ }
2066
+ });
2067
+ var plugin = { requires: ["ragents.orchestration", "ragents.ask"], create: actorProgramsPlugin };
2068
+ export {
2069
+ plugin
2070
+ };
2071
+ //# sourceMappingURL=index.js.map