@schlenkr/ragents 0.1.10 → 0.1.12

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 (748) hide show
  1. package/README.md +1 -1
  2. package/apps/server/package.json +1 -1
  3. package/apps/server/src/access-projection.ts +6 -6
  4. package/apps/server/src/access-service.ts +3 -3
  5. package/apps/server/src/access-session.ts +19 -19
  6. package/apps/server/src/api/contracts.ts +29 -29
  7. package/apps/server/src/api/core-methods.ts +17 -17
  8. package/apps/server/src/api/delivery.ts +2 -2
  9. package/apps/server/src/api/reference.ts +27 -27
  10. package/apps/server/src/api/rights.ts +18 -18
  11. package/apps/server/src/chat-handler.ts +5 -5
  12. package/apps/server/src/config-definition.ts +37 -10
  13. package/apps/server/src/config-file.ts +49 -49
  14. package/apps/server/src/config.ts +2 -0
  15. package/apps/server/src/data-directory.ts +2 -2
  16. package/apps/server/src/external-access.ts +1 -1
  17. package/apps/server/src/folder-install.ts +1 -1
  18. package/apps/server/src/help-files.ts +1 -1
  19. package/apps/server/src/host-api.json +6 -1
  20. package/apps/server/src/host-api.ts +3 -2
  21. package/apps/server/src/host-record.ts +3 -3
  22. package/apps/server/src/host-resolution-hooks.mjs +4 -4
  23. package/apps/server/src/host-version.ts +17 -17
  24. package/apps/server/src/host-web.ts +5 -5
  25. package/apps/server/src/main.ts +6 -6
  26. package/apps/server/src/missing-environment.ts +6 -6
  27. package/apps/server/src/parent-watch.ts +4 -4
  28. package/apps/server/src/plugin-build/build.ts +38 -38
  29. package/apps/server/src/plugin-build/host-api-names.ts +7 -7
  30. package/apps/server/src/plugin-build/plugin-description.ts +15 -15
  31. package/apps/server/src/plugin-build/typecheck.ts +1 -1
  32. package/apps/server/src/plugin-support/actor-programs/app-project.ts +19 -19
  33. package/apps/server/src/plugin-support/actor-programs/client-compiler.ts +4 -4
  34. package/apps/server/src/plugin-support/actor-programs/client-contracts.ts +11 -11
  35. package/apps/server/src/plugin-support/actor-programs/contract.ts +17 -17
  36. package/apps/server/src/plugin-support/actor-programs/runtime-libraries.ts +1 -1
  37. package/apps/server/src/plugin-support/actor-programs/workflow/index.ts +5 -5
  38. package/apps/server/src/plugin-support/actor-programs/workflow/prompt-reader.ts +2 -2
  39. package/apps/server/src/plugin-support/chat-display-policy.ts +2 -2
  40. package/apps/server/src/plugin-support/front-matter.ts +6 -6
  41. package/apps/server/src/plugin-support/http.ts +2 -2
  42. package/apps/server/src/plugin-support/language-server/contract.ts +8 -8
  43. package/apps/server/src/plugin-support/language-server/plugin.ts +2 -2
  44. package/apps/server/src/plugin-support/language-server/snapshot-method.ts +1 -1
  45. package/apps/server/src/plugin-support/language-server/tools.ts +11 -11
  46. package/apps/server/src/plugin-support/model-aliases.ts +30 -20
  47. package/apps/server/src/plugin-support/model-choice.ts +15 -15
  48. package/apps/server/src/plugin-support/model-completion.ts +44 -23
  49. package/apps/server/src/plugin-support/model-providers.ts +170 -0
  50. package/apps/server/src/plugin-support/model-upstreams.ts +1 -1
  51. package/apps/server/src/plugin-support/native-typescript-child.ts +4 -4
  52. package/apps/server/src/plugin-support/native-typescript-executor.ts +12 -12
  53. package/apps/server/src/plugin-support/plugin-config.ts +3 -3
  54. package/apps/server/src/plugin-support/plugin-folder.ts +2 -2
  55. package/apps/server/src/plugin-support/plugins-root.ts +2 -2
  56. package/apps/server/src/plugin-support/process-sandbox.ts +39 -39
  57. package/apps/server/src/plugin-support/product-model-settings-contract.ts +3 -3
  58. package/apps/server/src/plugin-support/product-model-settings.ts +10 -10
  59. package/apps/server/src/plugin-support/product-relay.ts +9 -9
  60. package/apps/server/src/plugin-support/product-start-options.ts +4 -4
  61. package/apps/server/src/plugin-support/prompt.ts +1 -1
  62. package/apps/server/src/plugin-support/provision.ts +8 -8
  63. package/apps/server/src/plugin-support/run-scripts.ts +17 -17
  64. package/apps/server/src/plugin-support/skills.ts +18 -18
  65. package/apps/server/src/plugin-support/start-entries-contract.ts +17 -17
  66. package/apps/server/src/plugin-support/start-options-contract.ts +5 -5
  67. package/apps/server/src/plugin-support/system-prompts.ts +11 -11
  68. package/apps/server/src/plugin-support/thinking-level.ts +2 -2
  69. package/apps/server/src/plugin-support/tool-availability.ts +2 -2
  70. package/apps/server/src/plugin-support/workspace-ownership.ts +5 -5
  71. package/apps/server/src/plugin-support/workspace-sandbox-host.ts +37 -37
  72. package/apps/server/src/plugin-support/zip.ts +7 -7
  73. package/apps/server/src/profile/bundle-manifest.ts +27 -27
  74. package/apps/server/src/profile/compose.ts +12 -7
  75. package/apps/server/src/profile/plugin-discovery.ts +14 -14
  76. package/apps/server/src/profile/provisioning.ts +5 -5
  77. package/apps/server/src/profile-target.ts +10 -10
  78. package/apps/server/src/protocol.ts +2 -2
  79. package/apps/server/src/provider.ts +62 -57
  80. package/apps/server/src/ragents/actor-chat-history.ts +8 -8
  81. package/apps/server/src/ragents/chat-text-positions.ts +2 -2
  82. package/apps/server/src/ragents/coordinator.ts +2 -2
  83. package/apps/server/src/ragents/engine.ts +23 -23
  84. package/apps/server/src/ragents/global-chat.ts +8 -8
  85. package/apps/server/src/ragents/host-services.ts +6 -3
  86. package/apps/server/src/ragents/journal-chat-events.ts +1 -1
  87. package/apps/server/src/ragents/run-owner.ts +2 -2
  88. package/apps/server/src/ragents/session.ts +49 -49
  89. package/apps/server/src/ragents/typescript-tools.ts +12 -12
  90. package/apps/server/src/ragents/workspace-runtime.ts +28 -28
  91. package/apps/server/src/rpc/dispatcher.ts +19 -19
  92. package/apps/server/src/rpc/http-transport.ts +11 -11
  93. package/apps/server/src/rpc/stdio-transport.ts +3 -3
  94. package/apps/server/src/run-preparation-input.ts +5 -5
  95. package/apps/server/src/run-preparation.ts +24 -24
  96. package/apps/server/src/run-transfer.ts +39 -39
  97. package/apps/server/src/server.ts +48 -48
  98. package/apps/server/src/settings.ts +1 -1
  99. package/apps/server/src/startup.ts +3 -3
  100. package/apps/server/src/title-compactor.ts +9 -9
  101. package/apps/server/src/title-settings.ts +3 -3
  102. package/apps/server/src/web-bundles.ts +2 -2
  103. package/apps/server/src/web-stylesheet.ts +2 -2
  104. package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-BO4wLQtE.js → highlighted-body-KPVGNVTW-CpPi6QLr.js} +1 -1
  105. package/apps/web/dist/assets/main-DJmCHGzM.js +11 -0
  106. package/apps/web/dist/assets/mermaid-HWGCJPDP-q-mf1kLN.js +608 -0
  107. package/apps/web/dist/assets/runPanel-nk_aMxSn.js +21 -0
  108. package/apps/web/dist/help/guide-access.html +5 -5
  109. package/apps/web/dist/help/guide-access.md +2 -2
  110. package/apps/web/dist/help/guide-clients.html +53 -54
  111. package/apps/web/dist/help/guide-clients.md +50 -51
  112. package/apps/web/dist/help/guide-distributed.html +12 -7
  113. package/apps/web/dist/help/guide-distributed.md +9 -4
  114. package/apps/web/dist/help/guide-functions.html +3 -3
  115. package/apps/web/dist/help/guide-getting-started.html +24 -15
  116. package/apps/web/dist/help/guide-getting-started.md +22 -12
  117. package/apps/web/dist/help/guide-ideas.html +3 -3
  118. package/apps/web/dist/help/guide-plugins.html +5 -4
  119. package/apps/web/dist/help/guide-plugins.md +2 -1
  120. package/apps/web/dist/help/guide-programs.html +3 -3
  121. package/apps/web/dist/help/guide-runtime.html +6 -6
  122. package/apps/web/dist/help/guide-runtime.md +3 -3
  123. package/apps/web/dist/help/guide.html +3 -3
  124. package/apps/web/dist/help/index.html +196 -144
  125. package/apps/web/dist/help/mini-app.css +6 -0
  126. package/apps/web/dist/help/mini-app.js +14 -14
  127. package/apps/web/dist/host-web.json +91 -91
  128. package/apps/web/dist/index.html +3 -3
  129. package/apps/web/dist/run-panel.html +3 -3
  130. package/apps/web/package.json +1 -1
  131. package/apps/web/src/AccessContext.tsx +15 -15
  132. package/apps/web/src/App.tsx +13 -13
  133. package/apps/web/src/DiffCode.tsx +2 -2
  134. package/apps/web/src/HelpDialog.tsx +3 -3
  135. package/apps/web/src/Overview.tsx +13 -13
  136. package/apps/web/src/PluginActivation.ts +1 -1
  137. package/apps/web/src/PluginChat.tsx +15 -15
  138. package/apps/web/src/PluginFailureNotice.tsx +1 -1
  139. package/apps/web/src/PluginRegistry.tsx +44 -44
  140. package/apps/web/src/RunPreparationChat.tsx +11 -11
  141. package/apps/web/src/RunStore.ts +1 -1
  142. package/apps/web/src/SessionList.tsx +14 -14
  143. package/apps/web/src/SettingsModal.tsx +112 -112
  144. package/apps/web/src/StartOptions.tsx +11 -11
  145. package/apps/web/src/StartSelection.tsx +11 -11
  146. package/apps/web/src/StartTiles.tsx +8 -8
  147. package/apps/web/src/SurfaceShortcuts.tsx +3 -3
  148. package/apps/web/src/ThemeSettings.tsx +8 -8
  149. package/apps/web/src/TitleModelSettings.tsx +13 -13
  150. package/apps/web/src/WorkspacePanel.tsx +9 -9
  151. package/apps/web/src/access-session.ts +4 -4
  152. package/apps/web/src/access-token.ts +5 -5
  153. package/apps/web/src/actor-conversation.ts +3 -3
  154. package/apps/web/src/actor-programs/client-ui/DataTable.tsx +8 -8
  155. package/apps/web/src/actor-programs/client-ui/FilePicker.tsx +4 -4
  156. package/apps/web/src/actor-programs/client-ui/FlowDiagram.tsx +13 -13
  157. package/apps/web/src/actor-programs/client-ui/Viewers.tsx +4 -4
  158. package/apps/web/src/actor-programs/client-ui/WorkflowDiagram.tsx +1 -1
  159. package/apps/web/src/actor-programs/client-ui/file-contracts.d.ts +4 -4
  160. package/apps/web/src/actor-programs/client-ui/file-selection.ts +1 -1
  161. package/apps/web/src/actor-programs/client-ui/viewer-contracts.d.ts +3 -3
  162. package/apps/web/src/api.ts +7 -7
  163. package/apps/web/src/chat/QuasselHost.tsx +1 -1
  164. package/apps/web/src/chat/StoppedActorNotice.tsx +5 -5
  165. package/apps/web/src/chat/chat-target.ts +3 -3
  166. package/apps/web/src/chat/requests.ts +2 -2
  167. package/apps/web/src/chat/useAttachmentCapabilities.ts +2 -2
  168. package/apps/web/src/chat-view-settings.tsx +5 -6
  169. package/apps/web/src/diff-view.css +1 -1
  170. package/apps/web/src/highlighting.css +1 -1
  171. package/apps/web/src/language-server/language-server-plugin.tsx +30 -30
  172. package/apps/web/src/lib/labels.ts +6 -6
  173. package/apps/web/src/main.tsx +4 -4
  174. package/apps/web/src/offered-machines.ts +2 -2
  175. package/apps/web/src/page-opener.tsx +1 -1
  176. package/apps/web/src/panel/ConnectionsPage.tsx +23 -23
  177. package/apps/web/src/panel/LoginForm.tsx +6 -6
  178. package/apps/web/src/panel/PanelDialogs.tsx +22 -22
  179. package/apps/web/src/panel/PanelHeader.tsx +2 -2
  180. package/apps/web/src/panel/PanelPage.tsx +1 -1
  181. package/apps/web/src/panel/RunLine.tsx +4 -4
  182. package/apps/web/src/panel/RunsPage.tsx +15 -15
  183. package/apps/web/src/panel/StartPage.tsx +26 -26
  184. package/apps/web/src/panel/connection-state.ts +9 -9
  185. package/apps/web/src/panel/contract.ts +28 -28
  186. package/apps/web/src/panel.tsx +1 -1
  187. package/apps/web/src/plugin-bootstrap.ts +5 -5
  188. package/apps/web/src/product/ModelControl.tsx +3 -3
  189. package/apps/web/src/product/ProductModelSettings.tsx +16 -16
  190. package/apps/web/src/product/SystemPromptControl.tsx +11 -11
  191. package/apps/web/src/product/model-settings.ts +2 -2
  192. package/apps/web/src/rpc/client.ts +16 -16
  193. package/apps/web/src/rpc.ts +1 -1
  194. package/apps/web/src/run-overview.ts +1 -1
  195. package/apps/web/src/run-panel/RunPanelApp.tsx +39 -39
  196. package/apps/web/src/run-panel/RunPanelHeader.tsx +6 -6
  197. package/apps/web/src/run-panel/RunPanelMenu.tsx +6 -6
  198. package/apps/web/src/run-panel/RunPanelRail.tsx +4 -4
  199. package/apps/web/src/run-panel/RunPanelWorkspace.tsx +3 -3
  200. package/apps/web/src/run-panel/clipboard.ts +3 -3
  201. package/apps/web/src/run-panel/host-contract.ts +5 -5
  202. package/apps/web/src/run-panel/host.ts +15 -15
  203. package/apps/web/src/run-panel/input-bridge.ts +1 -1
  204. package/apps/web/src/run-panel/run-panel-location.ts +5 -5
  205. package/apps/web/src/run-panel/use-session-list.ts +1 -1
  206. package/apps/web/src/run-panel/workspace-state.ts +3 -3
  207. package/apps/web/src/run-panel.tsx +4 -4
  208. package/apps/web/src/run-preparation.ts +2 -2
  209. package/apps/web/src/run-view.ts +3 -3
  210. package/apps/web/src/settings-contributions.ts +32 -32
  211. package/apps/web/src/theme.ts +9 -9
  212. package/apps/web/src/title-model-settings.ts +6 -6
  213. package/apps/web/src/ui/ListDetail.tsx +9 -9
  214. package/apps/web/src/ui/dialog.tsx +2 -2
  215. package/apps/web/src/ui/modal-controller.ts +3 -3
  216. package/apps/web/src/ui/modal.tsx +2 -2
  217. package/apps/web/src/ui/popover.tsx +1 -1
  218. package/apps/web/src/ui/relative-time.ts +8 -8
  219. package/apps/web/src/ui/startup-notice.tsx +2 -2
  220. package/apps/web/src/ui/state-icon.tsx +1 -1
  221. package/apps/web/src/ui/state-vocabulary.ts +16 -16
  222. package/apps/web/src/ui/stop-button.tsx +2 -2
  223. package/bundles/ragents.activity/ragents-bundle.json +3 -3
  224. package/bundles/ragents.activity/web/classes.json +1 -1
  225. package/bundles/ragents.activity/web/index.js +1 -1
  226. package/bundles/ragents.activity/web/index.js.map +2 -2
  227. package/bundles/ragents.actor-programs/ragents-bundle.json +3 -3
  228. package/bundles/ragents.actor-programs/server/index.js +225 -225
  229. package/bundles/ragents.actor-programs/server/index.js.map +2 -2
  230. package/bundles/ragents.actor-programs/web/classes.json +1 -1
  231. package/bundles/ragents.actor-programs/web/index.js +1 -1
  232. package/bundles/ragents.actor-programs/web/index.js.map +3 -3
  233. package/bundles/ragents.ask/ragents-bundle.json +3 -3
  234. package/bundles/ragents.ask/server/chunks/{chunk-PDJO75SQ.js → chunk-YOV27MAR.js} +2 -2
  235. package/bundles/ragents.ask/server/chunks/chunk-YOV27MAR.js.map +7 -0
  236. package/bundles/ragents.ask/server/exports/server/contract.js +1 -1
  237. package/bundles/ragents.ask/server/index.js +23 -23
  238. package/bundles/ragents.ask/server/index.js.map +2 -2
  239. package/bundles/ragents.ask/web/chunks/{chunk-WFN4374U.js → chunk-D6NNB5DS.js} +1 -1
  240. package/bundles/ragents.ask/web/chunks/chunk-D6NNB5DS.js.map +7 -0
  241. package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js → chunk-IQBHK7MV.js} +2 -2
  242. package/bundles/ragents.ask/web/chunks/{chunk-MBRPS477.js.map → chunk-IQBHK7MV.js.map} +3 -3
  243. package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js +2 -0
  244. package/bundles/ragents.ask/web/chunks/chunk-PWFIAMX4.js.map +7 -0
  245. package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js +2 -0
  246. package/bundles/ragents.ask/web/chunks/chunk-QHGKEESD.js.map +7 -0
  247. package/bundles/ragents.ask/web/classes.json +1 -1
  248. package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
  249. package/bundles/ragents.ask/web/exports/web/QuestionCard.js +1 -1
  250. package/bundles/ragents.ask/web/exports/web/api.js +1 -1
  251. package/bundles/ragents.ask/web/index.js +1 -1
  252. package/bundles/ragents.ask/web/index.js.map +2 -2
  253. package/bundles/ragents.browser/executor/index.mjs +35 -35
  254. package/bundles/ragents.browser/executor/index.mjs.map +2 -2
  255. package/bundles/ragents.browser/ragents-bundle.json +3 -3
  256. package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js → chunk-PYEISBNE.js} +1 -1
  257. package/bundles/ragents.browser/server/chunks/{chunk-CWLX4VA5.js.map → chunk-PYEISBNE.js.map} +1 -1
  258. package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
  259. package/bundles/ragents.browser/server/index.js +31 -31
  260. package/bundles/ragents.browser/server/index.js.map +2 -2
  261. package/bundles/ragents.browser/skills/browser-testing/SKILL.md +30 -30
  262. package/bundles/ragents.documents/prompt.hbs +1 -1
  263. package/bundles/ragents.documents/ragents-bundle.json +3 -3
  264. package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js → chunk-KMZWOVTI.js} +3 -3
  265. package/bundles/ragents.documents/server/chunks/{chunk-QIECRZ7C.js.map → chunk-KMZWOVTI.js.map} +2 -2
  266. package/bundles/ragents.documents/server/exports/contract.js +1 -1
  267. package/bundles/ragents.documents/server/index.js +26 -26
  268. package/bundles/ragents.documents/server/index.js.map +2 -2
  269. package/bundles/ragents.documents/web/classes.json +1 -1
  270. package/bundles/ragents.documents/web/index.js +1 -1
  271. package/bundles/ragents.documents/web/index.js.map +3 -3
  272. package/bundles/ragents.lsp-fsharp/executor/index.mjs +4 -4
  273. package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +2 -2
  274. package/bundles/ragents.lsp-fsharp/ragents-bundle.json +3 -3
  275. package/bundles/ragents.lsp-fsharp/server/index.js +5 -5
  276. package/bundles/ragents.lsp-fsharp/server/index.js.map +2 -2
  277. package/bundles/ragents.lsp-fsharp/web/index.js +1 -1
  278. package/bundles/ragents.lsp-fsharp/web/index.js.map +2 -2
  279. package/bundles/ragents.lsp-roslyn/executor/index.mjs +3 -3
  280. package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +2 -2
  281. package/bundles/ragents.lsp-roslyn/ragents-bundle.json +3 -3
  282. package/bundles/ragents.lsp-roslyn/server/index.js +17 -17
  283. package/bundles/ragents.lsp-roslyn/server/index.js.map +2 -2
  284. package/bundles/ragents.lsp-roslyn/web/index.js +1 -1
  285. package/bundles/ragents.lsp-roslyn/web/index.js.map +2 -2
  286. package/bundles/ragents.lsp-typescript/executor/index.mjs +2 -2
  287. package/bundles/ragents.lsp-typescript/executor/index.mjs.map +2 -2
  288. package/bundles/ragents.lsp-typescript/ragents-bundle.json +3 -3
  289. package/bundles/ragents.lsp-typescript/server/index.js.map +1 -1
  290. package/bundles/ragents.lsp-typescript/web/index.js +1 -1
  291. package/bundles/ragents.lsp-typescript/web/index.js.map +2 -2
  292. package/bundles/ragents.model-relay/ragents-bundle.json +8 -4
  293. package/bundles/ragents.model-relay/server/index.js +25 -21
  294. package/bundles/ragents.model-relay/server/index.js.map +2 -2
  295. package/bundles/ragents.orchestration/ragents-bundle.json +3 -3
  296. package/bundles/ragents.orchestration/server/index.js +28 -28
  297. package/bundles/ragents.orchestration/server/index.js.map +2 -2
  298. package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js → chunk-CFMJD5ZI.js} +2 -2
  299. package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +2 -0
  300. package/bundles/ragents.orchestration/web/chunks/{chunk-OQYCNYXN.js.map → chunk-HOBLI364.js.map} +2 -2
  301. package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js → chunk-UCIMT2R4.js} +2 -2
  302. package/bundles/ragents.orchestration/web/classes.json +1 -1
  303. package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
  304. package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +1 -1
  305. package/bundles/ragents.orchestration/web/index.js +8 -8
  306. package/bundles/ragents.orchestration/web/index.js.map +2 -2
  307. package/bundles/ragents.overseer/ragents-bundle.json +3 -3
  308. package/bundles/ragents.overseer/server/index.js +98 -98
  309. package/bundles/ragents.overseer/server/index.js.map +2 -2
  310. package/bundles/ragents.overseer/web/classes.json +1 -1
  311. package/bundles/ragents.overseer/web/index.js +1 -1
  312. package/bundles/ragents.overseer/web/index.js.map +2 -2
  313. package/bundles/ragents.processes/ragents-bundle.json +3 -3
  314. package/bundles/ragents.processes/server/index.js +11 -11
  315. package/bundles/ragents.processes/server/index.js.map +2 -2
  316. package/bundles/ragents.processes/web/classes.json +1 -1
  317. package/bundles/ragents.processes/web/index.js +3 -3
  318. package/bundles/ragents.processes/web/index.js.map +2 -2
  319. package/bundles/ragents.product/ragents-bundle.json +3 -3
  320. package/bundles/ragents.product/server/index.js +12 -13
  321. package/bundles/ragents.product/server/index.js.map +2 -2
  322. package/bundles/ragents.product/web/classes.json +1 -1
  323. package/bundles/ragents.product/web/index.js +1 -1
  324. package/bundles/ragents.product/web/index.js.map +2 -2
  325. package/bundles/ragents.profile-distribution/ragents-bundle.json +3 -3
  326. package/bundles/ragents.profile-distribution/server/index.js +31 -31
  327. package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
  328. package/bundles/ragents.reference/ragents-bundle.json +3 -3
  329. package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
  330. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
  331. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
  332. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
  333. package/bundles/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
  334. package/bundles/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
  335. package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
  336. package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
  337. package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
  338. package/bundles/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
  339. package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
  340. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
  341. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
  342. package/bundles/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
  343. package/bundles/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
  344. package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
  345. package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
  346. package/bundles/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
  347. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
  348. package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
  349. package/bundles/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
  350. package/bundles/ragents.reference/run-scripts/moderated-round/package.json +1 -1
  351. package/bundles/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
  352. package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
  353. package/bundles/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
  354. package/bundles/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
  355. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
  356. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
  357. package/bundles/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
  358. package/bundles/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
  359. package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
  360. package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
  361. package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
  362. package/bundles/ragents.reference/run-scripts/word-game/RUN.md +18 -18
  363. package/bundles/ragents.reference/run-scripts/word-game/package.json +2 -2
  364. package/bundles/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
  365. package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
  366. package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
  367. package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
  368. package/bundles/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
  369. package/bundles/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
  370. package/bundles/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
  371. package/bundles/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
  372. package/bundles/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
  373. package/bundles/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
  374. package/bundles/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
  375. package/bundles/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
  376. package/bundles/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
  377. package/bundles/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
  378. package/bundles/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
  379. package/bundles/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
  380. package/bundles/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
  381. package/bundles/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
  382. package/bundles/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
  383. package/bundles/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
  384. package/bundles/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
  385. package/bundles/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
  386. package/bundles/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
  387. package/bundles/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
  388. package/bundles/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
  389. package/bundles/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
  390. package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
  391. package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
  392. package/bundles/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
  393. package/bundles/ragents.reference/skills/decision-brief/SKILL.md +24 -24
  394. package/bundles/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
  395. package/bundles/ragents.reference/web/classes.json +1 -1
  396. package/bundles/ragents.reference/web/index.js +1 -1
  397. package/bundles/ragents.reference/web/index.js.map +2 -2
  398. package/bundles/ragents.todo/ragents-bundle.json +3 -3
  399. package/bundles/ragents.todo/server/index.js +5 -8
  400. package/bundles/ragents.todo/server/index.js.map +2 -2
  401. package/bundles/ragents.todo/web/classes.json +1 -1
  402. package/bundles/ragents.todo/web/index.js +1 -1
  403. package/bundles/ragents.todo/web/index.js.map +2 -2
  404. package/bundles/ragents.transcript/ragents-bundle.json +3 -3
  405. package/bundles/ragents.transcript/server/index.js +11 -11
  406. package/bundles/ragents.transcript/server/index.js.map +2 -2
  407. package/bundles/ragents.watch/ragents-bundle.json +3 -3
  408. package/bundles/ragents.watch/server/index.js +48 -48
  409. package/bundles/ragents.watch/server/index.js.map +2 -2
  410. package/bundles/ragents.workspace/ragents-bundle.json +3 -3
  411. package/bundles/ragents.workspace/server/index.js +83 -83
  412. package/bundles/ragents.workspace/server/index.js.map +2 -2
  413. package/bundles/ragents.workspace/web/classes.json +1 -1
  414. package/bundles/ragents.workspace/web/index.js +1 -1
  415. package/bundles/ragents.workspace/web/index.js.map +2 -2
  416. package/package.json +4 -4
  417. package/packages/agent/dist/core/model-runtime.d.ts +7 -2
  418. package/packages/agent/dist/index.d.ts +1 -1
  419. package/packages/agent/dist/loop/agent-loop.d.ts +2 -2
  420. package/packages/agent/src/core/compaction/utils.ts +1 -1
  421. package/packages/agent/src/core/model-runtime.ts +45 -5
  422. package/packages/agent/src/index.ts +1 -1
  423. package/packages/agent/src/loop/agent-loop.ts +2 -2
  424. package/packages/ai/dist/models.d.ts +1 -0
  425. package/packages/ai/dist/models.generated.d.ts +4544 -983
  426. package/packages/ai/dist/providers/openrouter.models.d.ts +4544 -983
  427. package/packages/ai/src/api/ai-sdk.ts +33 -7
  428. package/packages/ai/src/api-registry.ts +1 -1
  429. package/packages/ai/src/index.ts +2 -2
  430. package/packages/ai/src/models.generated.ts +1 -1
  431. package/packages/ai/src/models.ts +1 -1
  432. package/packages/ai/src/providers/openrouter.models.ts +3725 -552
  433. package/packages/ragents/src/access.ts +12 -12
  434. package/packages/ragents/src/agents/actor-input.ts +33 -33
  435. package/packages/ragents/src/agents/catalog.ts +1 -1
  436. package/packages/ragents/src/agents/delivery.ts +17 -17
  437. package/packages/ragents/src/agents/plugins.ts +1 -1
  438. package/packages/ragents/src/agents/scheduler.ts +7 -7
  439. package/packages/ragents/src/agents/schemas.ts +1 -1
  440. package/packages/ragents/src/agents/tool-orientation.ts +4 -4
  441. package/packages/ragents/src/agents/tools.ts +20 -20
  442. package/packages/ragents/src/agents/toolset.ts +5 -5
  443. package/packages/ragents/src/agents/workspaces.ts +1 -1
  444. package/packages/ragents/src/domain/events.ts +1 -1
  445. package/packages/ragents/src/domain/model.ts +5 -5
  446. package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
  447. package/packages/ragents/src/drivers/agent-turn.ts +4 -4
  448. package/packages/ragents/src/drivers/agent.ts +2 -2
  449. package/packages/ragents/src/drivers/attachments.ts +4 -4
  450. package/packages/ragents/src/http/contracts.ts +14 -14
  451. package/packages/ragents/src/http/methods.ts +6 -6
  452. package/packages/ragents/src/plugin-host.ts +119 -119
  453. package/packages/ragents/src/plugin-types.ts +16 -16
  454. package/packages/ragents/src/rpc/contract.ts +5 -5
  455. package/packages/ragents/src/rpc/contribution.ts +2 -2
  456. package/packages/ragents/src/rpc/peer.ts +11 -11
  457. package/packages/ragents/src/rpc/protocol.ts +2 -2
  458. package/packages/ragents/src/runtime/decisions/turns.ts +1 -1
  459. package/packages/ragents/src/runtime/journal-storage.ts +1 -1
  460. package/packages/ragents/src/runtime/journal.ts +10 -10
  461. package/packages/ragents/src/runtime/orchestration.ts +8 -8
  462. package/packages/ragents/src/runtime/stop.ts +2 -2
  463. package/packages/ragents/src/script/mediators.ts +35 -35
  464. package/packages/ragents/src/typescript/async-compiler.ts +14 -14
  465. package/packages/ragents/src/typescript/compiler-worker.ts +2 -2
  466. package/packages/ragents/src/typescript/compiler.ts +7 -7
  467. package/packages/ragents/src/typescript/snippet.ts +5 -5
  468. package/packages/workspace-executor/src/bash-launch.ts +13 -13
  469. package/packages/workspace-executor/src/commands.ts +18 -18
  470. package/packages/workspace-executor/src/context.ts +15 -15
  471. package/packages/workspace-executor/src/contributions.ts +44 -44
  472. package/packages/workspace-executor/src/errors.ts +1 -1
  473. package/packages/workspace-executor/src/executor.ts +16 -16
  474. package/packages/workspace-executor/src/files.ts +31 -31
  475. package/packages/workspace-executor/src/index.ts +1 -1
  476. package/packages/workspace-executor/src/language-server/contract.ts +2 -2
  477. package/packages/workspace-executor/src/language-server/diagnostics.ts +4 -4
  478. package/packages/workspace-executor/src/language-server/host.ts +36 -36
  479. package/packages/workspace-executor/src/language-server/json-rpc.ts +4 -4
  480. package/packages/workspace-executor/src/language-server/module.ts +11 -11
  481. package/packages/workspace-executor/src/language-server/roots.ts +3 -3
  482. package/packages/workspace-executor/src/language-server/session.ts +15 -15
  483. package/packages/workspace-executor/src/language-server/workspace-solutions.ts +3 -3
  484. package/packages/workspace-executor/src/managed-process.ts +12 -12
  485. package/packages/workspace-executor/src/module.ts +8 -8
  486. package/packages/workspace-executor/src/modules.ts +3 -3
  487. package/packages/workspace-executor/src/paths.ts +11 -11
  488. package/packages/workspace-executor/src/process-sandbox.ts +3 -3
  489. package/packages/workspace-executor/src/processes/module.ts +3 -3
  490. package/packages/workspace-executor/src/processes/process-table.ts +20 -20
  491. package/packages/workspace-executor/src/processes/scanner.ts +3 -3
  492. package/packages/workspace-executor/src/processes/snapshot.ts +2 -2
  493. package/packages/workspace-executor/src/processes/terminator.ts +13 -13
  494. package/packages/workspace-executor/src/run-folders.ts +3 -3
  495. package/packages/workspace-executor/src/safe-environment.ts +4 -4
  496. package/packages/workspace-executor/src/sandbox-tools.ts +28 -28
  497. package/packages/workspace-executor/src/session-ident.ts +2 -2
  498. package/packages/workspace-executor/src/shell-platform.ts +2 -2
  499. package/packages/workspace-executor/src/tools.ts +5 -5
  500. package/plugins/ragents.activity/web/ActivityHeader.tsx +3 -3
  501. package/plugins/ragents.activity/web/activity.ts +2 -2
  502. package/plugins/ragents.actor-programs/server/access-projections.ts +1 -1
  503. package/plugins/ragents.actor-programs/server/agent-tools.ts +2 -2
  504. package/plugins/ragents.actor-programs/server/capability-resolver.ts +3 -3
  505. package/plugins/ragents.actor-programs/server/controls-template.ts +46 -46
  506. package/plugins/ragents.actor-programs/server/controls-tool.ts +4 -4
  507. package/plugins/ragents.actor-programs/server/limits.ts +3 -3
  508. package/plugins/ragents.actor-programs/server/methods.ts +1 -1
  509. package/plugins/ragents.actor-programs/server/project-diagnostics.ts +8 -8
  510. package/plugins/ragents.actor-programs/server/routes.ts +8 -8
  511. package/plugins/ragents.actor-programs/server/runtime.ts +90 -90
  512. package/plugins/ragents.actor-programs/server/templates.ts +59 -59
  513. package/plugins/ragents.actor-programs/server/test-report.ts +5 -5
  514. package/plugins/ragents.actor-programs/server/tool-contributor.ts +1 -1
  515. package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +17 -17
  516. package/plugins/ragents.actor-programs/web/AppsPanel.tsx +26 -26
  517. package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +3 -3
  518. package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +2 -2
  519. package/plugins/ragents.actor-programs/web/FunctionForm.tsx +16 -16
  520. package/plugins/ragents.actor-programs/web/ProgramSource.tsx +5 -5
  521. package/plugins/ragents.actor-programs/web/api.ts +36 -36
  522. package/plugins/ragents.actor-programs/web/bridge.ts +8 -8
  523. package/plugins/ragents.actor-programs/web/chat-state.ts +4 -4
  524. package/plugins/ragents.actor-programs/web/context.ts +1 -1
  525. package/plugins/ragents.actor-programs/web/function-input.ts +6 -6
  526. package/plugins/ragents.actor-programs/web/index.tsx +1 -1
  527. package/plugins/ragents.actor-programs/web/program-state.ts +4 -4
  528. package/plugins/ragents.ask/ask-payload.ts +1 -1
  529. package/plugins/ragents.ask/contract.ts +5 -5
  530. package/plugins/ragents.ask/server/answer-method.ts +1 -1
  531. package/plugins/ragents.ask/server/ask-service.ts +9 -9
  532. package/plugins/ragents.ask/server/ask-tool.ts +10 -10
  533. package/plugins/ragents.ask/server/contract.ts +5 -5
  534. package/plugins/ragents.ask/web/AskActionView.tsx +1 -1
  535. package/plugins/ragents.ask/web/QuestionCard.tsx +22 -22
  536. package/plugins/ragents.ask/web/index.tsx +2 -2
  537. package/plugins/ragents.browser/executor/contract.ts +6 -6
  538. package/plugins/ragents.browser/executor/index.ts +1 -1
  539. package/plugins/ragents.browser/executor/module.ts +6 -6
  540. package/plugins/ragents.browser/executor/pages.ts +32 -32
  541. package/plugins/ragents.browser/executor/playwright.ts +8 -8
  542. package/plugins/ragents.browser/provision.ts +7 -7
  543. package/plugins/ragents.browser/server/browser.ts +14 -14
  544. package/plugins/ragents.browser/server/contract.ts +1 -1
  545. package/plugins/ragents.browser/server/index.ts +1 -1
  546. package/plugins/ragents.browser/server/tools.ts +14 -14
  547. package/plugins/ragents.browser/skills/browser-testing/SKILL.md +30 -30
  548. package/plugins/ragents.documents/contract.ts +2 -2
  549. package/plugins/ragents.documents/prompt.hbs +1 -1
  550. package/plugins/ragents.documents/server/document-write-tool.ts +12 -12
  551. package/plugins/ragents.documents/server/files-route.ts +6 -6
  552. package/plugins/ragents.documents/server/show-document-tool.ts +26 -26
  553. package/plugins/ragents.documents/server/store.ts +1 -1
  554. package/plugins/ragents.documents/web/DocumentViewer.tsx +37 -37
  555. package/plugins/ragents.documents/web/index.tsx +11 -11
  556. package/plugins/ragents.lsp-fsharp/executor.ts +7 -7
  557. package/plugins/ragents.lsp-fsharp/provision.ts +7 -7
  558. package/plugins/ragents.lsp-roslyn/executor.ts +5 -5
  559. package/plugins/ragents.lsp-roslyn/provision.ts +4 -4
  560. package/plugins/ragents.lsp-roslyn/server/index.ts +5 -5
  561. package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +13 -13
  562. package/plugins/ragents.lsp-typescript/executor.ts +3 -3
  563. package/plugins/ragents.model-relay/server/config.ts +6 -2
  564. package/plugins/ragents.model-relay/server/index.ts +2 -2
  565. package/plugins/ragents.model-relay/server/relay.ts +23 -22
  566. package/plugins/ragents.orchestration/contract.ts +8 -8
  567. package/plugins/ragents.orchestration/server/index.ts +4 -4
  568. package/plugins/ragents.orchestration/server/run-stop-tool.ts +3 -3
  569. package/plugins/ragents.orchestration/server/surface-tool.ts +5 -5
  570. package/plugins/ragents.orchestration/tiled-layout.ts +11 -11
  571. package/plugins/ragents.orchestration/web/ActorChat.tsx +3 -3
  572. package/plugins/ragents.orchestration/web/ActorChatControls.tsx +4 -5
  573. package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +1 -1
  574. package/plugins/ragents.orchestration/web/ActorPopout.tsx +1 -1
  575. package/plugins/ragents.orchestration/web/ActorShortcut.tsx +6 -6
  576. package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +15 -15
  577. package/plugins/ragents.orchestration/web/Center.tsx +5 -5
  578. package/plugins/ragents.orchestration/web/DocumentsSection.tsx +2 -2
  579. package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +15 -15
  580. package/plugins/ragents.orchestration/web/FlowInspector.tsx +103 -103
  581. package/plugins/ragents.orchestration/web/JournalStatus.tsx +11 -11
  582. package/plugins/ragents.orchestration/web/MaterialBody.tsx +2 -2
  583. package/plugins/ragents.orchestration/web/StopRunButton.tsx +6 -6
  584. package/plugins/ragents.orchestration/web/TiledSurface.tsx +9 -9
  585. package/plugins/ragents.orchestration/web/actor-header-settings.ts +5 -5
  586. package/plugins/ragents.orchestration/web/constants.ts +2 -2
  587. package/plugins/ragents.orchestration/web/executions.ts +6 -6
  588. package/plugins/ragents.orchestration/web/format.ts +1 -1
  589. package/plugins/ragents.orchestration/web/index.tsx +2 -2
  590. package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +7 -7
  591. package/plugins/ragents.orchestration/web/run-panel/AddresseeTree.tsx +8 -8
  592. package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +22 -22
  593. package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +7 -7
  594. package/plugins/ragents.orchestration/web/run-panel/addressee-tree.ts +13 -13
  595. package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +3 -3
  596. package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +2 -2
  597. package/plugins/ragents.orchestration/web/run-panel/run-panel-startup.ts +3 -3
  598. package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -7
  599. package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +9 -9
  600. package/plugins/ragents.orchestration/web/surface-startup.ts +8 -8
  601. package/plugins/ragents.orchestration/web/surface-view-settings.ts +1 -1
  602. package/plugins/ragents.orchestration/web/tiled-view-settings.ts +1 -1
  603. package/plugins/ragents.overseer/contract.ts +20 -20
  604. package/plugins/ragents.overseer/server/api.ts +6 -6
  605. package/plugins/ragents.overseer/server/coordinator-prompt.ts +10 -10
  606. package/plugins/ragents.overseer/server/coordinator.ts +4 -4
  607. package/plugins/ragents.overseer/server/index.ts +24 -24
  608. package/plugins/ragents.overseer/server/orientation.ts +8 -8
  609. package/plugins/ragents.overseer/server/quick-answer.ts +9 -9
  610. package/plugins/ragents.overseer/server/run-directory.ts +5 -5
  611. package/plugins/ragents.overseer/server/settings.ts +6 -6
  612. package/plugins/ragents.overseer/server/user-location.ts +16 -16
  613. package/plugins/ragents.overseer/web/ModelSettings.tsx +9 -9
  614. package/plugins/ragents.overseer/web/index.tsx +20 -20
  615. package/plugins/ragents.overseer/web/model-settings.ts +1 -1
  616. package/plugins/ragents.overseer/web/quick-answers.ts +2 -2
  617. package/plugins/ragents.processes/contract.ts +5 -5
  618. package/plugins/ragents.processes/server/methods.ts +4 -4
  619. package/plugins/ragents.processes/server/observer.ts +8 -8
  620. package/plugins/ragents.processes/server/run-processes.ts +2 -2
  621. package/plugins/ragents.processes/web/ProcessHeader.tsx +10 -10
  622. package/plugins/ragents.processes/web/processes.ts +10 -10
  623. package/plugins/ragents.product/server/config.ts +1 -1
  624. package/plugins/ragents.product/server/index.ts +4 -4
  625. package/plugins/ragents.product/server/runtime.ts +9 -10
  626. package/plugins/ragents.product/web/index.tsx +1 -1
  627. package/plugins/ragents.profile-distribution/contract.ts +10 -10
  628. package/plugins/ragents.profile-distribution/server/archive.ts +20 -20
  629. package/plugins/ragents.profile-distribution/server/config.ts +2 -2
  630. package/plugins/ragents.profile-distribution/server/index.ts +4 -4
  631. package/plugins/ragents.reference/examples.ts +27 -27
  632. package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +19 -19
  633. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +2 -2
  634. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +14 -14
  635. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +2 -2
  636. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +49 -49
  637. package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +1 -1
  638. package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +9 -9
  639. package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +9 -9
  640. package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +7 -7
  641. package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +1 -1
  642. package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +13 -13
  643. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
  644. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +8 -8
  645. package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +16 -16
  646. package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +1 -1
  647. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -1
  648. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +3 -3
  649. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -1
  650. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +9 -9
  651. package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +39 -39
  652. package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +7 -7
  653. package/plugins/ragents.reference/run-scripts/moderated-round/package.json +1 -1
  654. package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +9 -9
  655. package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
  656. package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +6 -6
  657. package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +12 -12
  658. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +2 -2
  659. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +3 -3
  660. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +4 -4
  661. package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +1 -1
  662. package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +11 -11
  663. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
  664. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +13 -13
  665. package/plugins/ragents.reference/run-scripts/word-game/RUN.md +18 -18
  666. package/plugins/ragents.reference/run-scripts/word-game/package.json +2 -2
  667. package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +1 -1
  668. package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +2 -2
  669. package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +16 -16
  670. package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +39 -39
  671. package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +5 -5
  672. package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +5 -5
  673. package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +5 -5
  674. package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +5 -5
  675. package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +5 -5
  676. package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +5 -5
  677. package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +5 -5
  678. package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +5 -5
  679. package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +5 -5
  680. package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +5 -5
  681. package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +5 -5
  682. package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +5 -5
  683. package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +5 -5
  684. package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +5 -5
  685. package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +5 -5
  686. package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +5 -5
  687. package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +5 -5
  688. package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +5 -5
  689. package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +5 -5
  690. package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +5 -5
  691. package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +5 -5
  692. package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +5 -5
  693. package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +5 -5
  694. package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +5 -5
  695. package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +5 -5
  696. package/plugins/ragents.reference/skills/decision-brief/SKILL.md +24 -24
  697. package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +24 -24
  698. package/plugins/ragents.reference/walkthroughs.ts +128 -128
  699. package/plugins/ragents.reference/web/StartGuides.tsx +23 -23
  700. package/plugins/ragents.todo/contract.ts +0 -3
  701. package/plugins/ragents.todo/server/todo-tool.ts +6 -6
  702. package/plugins/ragents.todo/web/TodoSection.tsx +1 -1
  703. package/plugins/ragents.transcript/server/transcript.ts +11 -11
  704. package/plugins/ragents.watch/server/condition.ts +4 -4
  705. package/plugins/ragents.watch/server/functions.ts +27 -27
  706. package/plugins/ragents.watch/server/observation.ts +2 -2
  707. package/plugins/ragents.watch/server/service.ts +14 -14
  708. package/plugins/ragents.workspace/client/transport.ts +1 -1
  709. package/plugins/ragents.workspace/client/workspace-client.ts +63 -63
  710. package/plugins/ragents.workspace/contract.ts +46 -46
  711. package/plugins/ragents.workspace/server/binding.ts +20 -20
  712. package/plugins/ragents.workspace/server/browse-route.ts +8 -8
  713. package/plugins/ragents.workspace/server/clients.ts +50 -50
  714. package/plugins/ragents.workspace/server/config.ts +7 -7
  715. package/plugins/ragents.workspace/server/index.ts +3 -3
  716. package/plugins/ragents.workspace/server/runtime.ts +26 -26
  717. package/plugins/ragents.workspace/server/shell-platform.ts +1 -1
  718. package/plugins/ragents.workspace/web/FileBrowser.tsx +10 -10
  719. package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +24 -24
  720. package/plugins/ragents.workspace/web/index.tsx +1 -1
  721. package/ragents.config.core.ts +1 -1
  722. package/ragents.config.developer.ts +3 -3
  723. package/ragents.config.showcase.ts +2 -2
  724. package/scripts/agent/agent-cli.ts +96 -96
  725. package/scripts/agent/journal.ts +5 -5
  726. package/scripts/agent/turn-control.ts +4 -4
  727. package/scripts/package/build-package.ts +31 -31
  728. package/scripts/package/host-links.mjs +3 -3
  729. package/scripts/package/publish-package.ts +29 -29
  730. package/scripts/package/ragents.mjs +19 -19
  731. package/scripts/plugin/build-builtin-plugins.ts +5 -5
  732. package/scripts/plugin/plugin-cli.ts +14 -14
  733. package/scripts/provision/run-provision.ts +14 -15
  734. package/scripts/remote/connect.ts +49 -49
  735. package/scripts/remote/start.ts +18 -18
  736. package/scripts/workspace-client/run-workspace-client.ts +23 -23
  737. package/apps/web/dist/assets/main-DnnqWHkH.js +0 -11
  738. package/apps/web/dist/assets/mermaid-HWGCJPDP-BLLeth5_.js +0 -568
  739. package/apps/web/dist/assets/runPanel-DPm7s3KM.js +0 -21
  740. package/bundles/ragents.ask/server/chunks/chunk-PDJO75SQ.js.map +0 -7
  741. package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js +0 -2
  742. package/bundles/ragents.ask/web/chunks/chunk-4VXWWEG7.js.map +0 -7
  743. package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js +0 -2
  744. package/bundles/ragents.ask/web/chunks/chunk-VUBJDIKQ.js.map +0 -7
  745. package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +0 -7
  746. package/bundles/ragents.orchestration/web/chunks/chunk-OQYCNYXN.js +0 -2
  747. /package/bundles/ragents.orchestration/web/chunks/{chunk-OSKPH6SZ.js.map → chunk-CFMJD5ZI.js.map} +0 -0
  748. /package/bundles/ragents.orchestration/web/chunks/{chunk-ODMMQGX2.js.map → chunk-UCIMT2R4.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "format": 4,
2
+ "format": 5,
3
3
  "id": "ragents.profile-distribution",
4
4
  "api": 7,
5
5
  "hostNames": {
@@ -52,8 +52,8 @@
52
52
  },
53
53
  "web": {}
54
54
  },
55
- "stand": "8894e98d0ae19da1b57689c3434e69a04ccbb6d4ead9e6a2003e9b7f4a20f3cf",
56
- "sourceStand": "09c1232121a90042e1ffbb8e6a9509cd7bff36e19534cb3baa3efa12de631da6",
55
+ "revision": "3e99cf5cb8921685ad83aa6aaf9657da4c648f9d68cb744988a73f227c342e1d",
56
+ "sourceRevision": "f86bd0f1a439a2c9d143101af2a58881306dd8910240226548afbebfc125682c",
57
57
  "server": "server/index.js",
58
58
  "exports": {
59
59
  "server": {},
@@ -12,25 +12,25 @@ import { defineOperation } from "@ragents/engine/src/rpc/contract";
12
12
  var pluginEntry = Type.Object({
13
13
  id: Type.String({ minLength: 1 }),
14
14
  source: Type.Union([Type.Literal("host"), Type.Literal("archive")], {
15
- description: "host: der Client nimmt das eingebaute Bundle seines Hosts; archive: das Bundle liegt im Archiv"
15
+ description: "host: the client takes the built-in bundle of its host; archive: the bundle is in the archive"
16
16
  })
17
17
  }, { additionalProperties: false });
18
18
  var description = Type.Object({
19
- profile: Type.String({ minLength: 1, description: "Profilname; die Datei hei\xDFt ragents.config.<profil>.ts" }),
20
- version: Type.String({ minLength: 64, maxLength: 64, description: "Stand des Archivs als SHA-256" }),
21
- hostApi: Type.Integer({ minimum: 1, description: "Nummer der Host-API, gegen die die Bundles im Archiv gebaut sind; der Host des Clients muss genau diese bieten" }),
22
- hostVersion: Type.String({ minLength: 40, maxLength: 40, description: "Git-Commit des Hosts dieses Servers; ein Checkout mit anderer Host-API kommt damit zu einer passenden" }),
23
- packageVersion: Type.String({ minLength: 1, description: "Fassung des npm-Pakets, die diesen Commit tr\xE4gt; eine Installation mit anderer Host-API kommt damit zu einer passenden" }),
24
- file: Type.String({ minLength: 1, description: "Pfad der Profildatei innerhalb des Archivs" }),
25
- size: Type.Integer({ minimum: 0, description: "Archivgr\xF6\xDFe in Byte" }),
26
- archivePath: Type.String({ minLength: 1, description: "HTTP-Pfad des Archivs auf diesem Server" }),
19
+ profile: Type.String({ minLength: 1, description: "Profile name; the file is called ragents.config.<profile>.ts" }),
20
+ version: Type.String({ minLength: 64, maxLength: 64, description: "Version of the archive as SHA-256" }),
21
+ hostApi: Type.Integer({ minimum: 1, description: "Number of the host API the bundles in the archive are built against; the client's host must offer exactly this one" }),
22
+ hostVersion: Type.String({ minLength: 40, maxLength: 40, description: "Git commit of this server's host; a checkout with a different host API uses it to get a matching one" }),
23
+ packageVersion: Type.String({ minLength: 1, description: "Version of the npm package that carries this commit; an installation with a different host API uses it to get a matching one" }),
24
+ file: Type.String({ minLength: 1, description: "Path of the profile file inside the archive" }),
25
+ size: Type.Integer({ minimum: 0, description: "Archive size in bytes" }),
26
+ archivePath: Type.String({ minLength: 1, description: "HTTP path of the archive on this server" }),
27
27
  plugins: Type.Array(pluginEntry)
28
28
  }, { additionalProperties: false });
29
29
  var profileArchivePath = (version) => `/profile/${version}.tar.gz`;
30
30
  var profileDistributionContracts = {
31
31
  describe: defineOperation({
32
32
  id: "ragents.profile.describe",
33
- description: "Das Client-Profil dieses Servers: Name, Stand, verlangte Host-API, Host- und Paketfassung, Plugins und Archiv. Recht: profile.fetch.",
33
+ description: "The client profile of this server: name, version, required host API, host and package version, plugins and archive. Right: profile.fetch.",
34
34
  rights: ["profile.fetch"],
35
35
  input: Type.Object({}, { additionalProperties: false }),
36
36
  result: description
@@ -54,7 +54,7 @@ var commonRoot = (first, others) => {
54
54
  for (const folder of others) {
55
55
  while (folder !== root && !folder.startsWith(root + path.sep)) {
56
56
  const parent = path.dirname(root);
57
- if (parent === root) throw new Error(`Profildatei und Plugin ${folder} haben keinen gemeinsamen Ordner`);
57
+ if (parent === root) throw new Error(`Profile file and plugin ${folder} have no common folder`);
58
58
  root = parent;
59
59
  }
60
60
  }
@@ -64,36 +64,36 @@ var posixRelative = (root, target) => path.relative(root, target).split(path.sep
64
64
  var placeholderEnvironment = new Proxy({}, { get: () => "client-placeholder-value" });
65
65
  var checkSections = (source, raw, pluginIds) => {
66
66
  for (const [section, value] of Object.entries(raw)) {
67
- if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${source}: die Sektion ${section} ist kein Objekt`);
68
- if (section !== "host" && !pluginIds.has(section)) throw new Error(`${source}: die Sektion ${section} geh\xF6rt zu keinem Plugin aus host.PLUGINS`);
67
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${source}: the section ${section} is not an object`);
68
+ if (section !== "host" && !pluginIds.has(section)) throw new Error(`${source}: the section ${section} belongs to no plugin from host.PLUGINS`);
69
69
  for (const [key, entry] of Object.entries(value)) {
70
- if (section === "host" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} ist kein Host-Schl\xFCssel`);
70
+ if (section === "host" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} is not a host key`);
71
71
  if (isEnvironmentReference(entry) || isProvisionedReference(entry)) continue;
72
- if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} ist ein Secret und muss als env("...") stehen`);
72
+ if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} is a secret and must be written as env("...")`);
73
73
  const valid = typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean" || Array.isArray(entry) && entry.every((item) => typeof item === "string") || Array.isArray(entry) && entry.every((item) => !!item && typeof item === "object" && !Array.isArray(item));
74
- if (!valid) throw new Error(`${source}: ${section}.${key} hat keinen g\xFCltigen Wert`);
75
- if (typeof entry === "string" && /^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} verweist als Text auf die Umgebung; env("...") verwenden`);
74
+ if (!valid) throw new Error(`${source}: ${section}.${key} has no valid value`);
75
+ if (typeof entry === "string" && /^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} references the environment as text; use env("...")`);
76
76
  }
77
77
  }
78
78
  };
79
79
  var inspectClientProfile = async (source, root = bundlesRoot) => {
80
80
  const name = PROFILE_FILE.exec(path.basename(source));
81
- if (!name) throw new Error(`Die Client-Profildatei muss ragents.config.<profil>.ts hei\xDFen: ${source}`);
82
- if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`Die Client-Profildatei ${source} fehlt`);
81
+ if (!name) throw new Error(`The client profile file must be called ragents.config.<profile>.ts: ${source}`);
82
+ if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`The client profile file ${source} is missing`);
83
83
  const profile = name[1];
84
84
  const module = await import(pathToFileURL(source).href);
85
85
  const raw = module.config;
86
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${source} exportiert keine Konstante config`);
86
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new Error(`${source} exports no constant config`);
87
87
  const host = raw.host;
88
88
  const entries = host?.PLUGINS;
89
89
  if (!Array.isArray(entries) || entries.length === 0 || !entries.every((entry) => typeof entry === "string" && entry)) {
90
- throw new Error(`${source}: host.PLUGINS muss eine nicht leere Liste sein`);
90
+ throw new Error(`${source}: host.PLUGINS must be a non-empty list`);
91
91
  }
92
- if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE muss ${profile} sein`);
92
+ if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE must be ${profile}`);
93
93
  const directory = path.dirname(source);
94
94
  const unportable = entries.filter((entry) => isPluginPath(entry) && !/^\.{1,2}\//.test(entry));
95
95
  if (unportable.length > 0) {
96
- throw new Error(`${source}: ${unportable.join(", ")} nennt ein Bundle absolut oder mit ~/; der Client l\xF6st diesen Pfad auf seinem eigenen Rechner auf und f\xE4nde dort nicht das gelieferte Bundle. Im Client-Profil jedes Bundle relativ zur Profildatei nennen (./ oder ../)`);
96
+ throw new Error(`${source}: ${unportable.join(", ")} names a bundle absolutely or with ~/; the client resolves this path on its own machine and would not find the delivered bundle there. In the client profile, name every bundle relative to the profile file (./ or ../)`);
97
97
  }
98
98
  const plugins = (() => {
99
99
  try {
@@ -105,7 +105,7 @@ var inspectClientProfile = async (source, root = bundlesRoot) => {
105
105
  checkSections(source, raw, /* @__PURE__ */ new Set([...discoverPluginIds(root), ...plugins.map((plugin2) => plugin2.id)]));
106
106
  const users = resolveProfileUsers(source, module.users, placeholderEnvironment);
107
107
  const anonymous = resolveAnonymousUser(source, module.anonymousUser);
108
- if (users && anonymous) throw new Error(`${source}: users und anonymousUser schlie\xDFen einander aus`);
108
+ if (users && anonymous) throw new Error(`${source}: users and anonymousUser exclude each other`);
109
109
  const archived = plugins.filter((plugin2) => plugin2.source === "archive").map((plugin2) => plugin2.folder);
110
110
  const commonDirectory = commonRoot(directory, archived);
111
111
  return { profile, source, root: commonDirectory, file: posixRelative(commonDirectory, source), plugins };
@@ -114,7 +114,7 @@ var collectFiles = (folder, root) => {
114
114
  const files = [];
115
115
  for (const entry of readdirSync(folder, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name, "en"))) {
116
116
  const absolute = path.join(folder, entry.name);
117
- if (entry.isSymbolicLink()) throw new Error(`Das Client-Profil enth\xE4lt einen symbolischen Link, den das Archiv nicht abbildet: ${absolute}`);
117
+ if (entry.isSymbolicLink()) throw new Error(`The client profile contains a symbolic link that the archive does not represent: ${absolute}`);
118
118
  if (entry.isDirectory()) {
119
119
  files.push(...collectFiles(absolute, root));
120
120
  } else if (entry.isFile()) {
@@ -126,7 +126,7 @@ var collectFiles = (folder, root) => {
126
126
  var clientProfileEntries = (inspected) => {
127
127
  const entries = [inspected.file, ...inspected.plugins.filter((plugin2) => plugin2.source === "archive").flatMap((plugin2) => collectFiles(plugin2.folder, inspected.root))];
128
128
  for (const entry of entries) {
129
- if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`Der Archiveintrag ${entry} ist keine Datei`);
129
+ if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`The archive entry ${entry} is not a file`);
130
130
  }
131
131
  return entries;
132
132
  };
@@ -159,7 +159,7 @@ var profileDistributionConfig = Object.freeze({
159
159
  clientProfileFile: resolveClientProfileFile,
160
160
  hostVersion: () => {
161
161
  const value = env.optional("HOST_VERSION");
162
- if (value !== void 0 && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION muss ein vollst\xE4ndiger Git-Commit sein, nicht "${value}"`);
162
+ if (value !== void 0 && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION must be a full Git commit, not "${value}"`);
163
163
  return value;
164
164
  }
165
165
  });
@@ -175,7 +175,7 @@ var archiveRoute = (state) => ({
175
175
  const current = state();
176
176
  const version = archivePattern.exec(url.pathname)?.[1];
177
177
  if (version !== current.description.version) {
178
- writeJson(response, 404, { error: `Der Stand ${version} wird nicht mehr angeboten; aktuell ist ${current.description.version}` });
178
+ writeJson(response, 404, { error: `Version ${version} is no longer offered; the current one is ${current.description.version}` });
179
179
  return;
180
180
  }
181
181
  response.writeHead(200, {
@@ -194,13 +194,13 @@ var profileDistributionPlugin = {
194
194
  if (!file) {
195
195
  host.lifecycle({
196
196
  id: "ragents.profile-distribution",
197
- initialize: () => console.log("Profilverteilung: CLIENT_PROFILE_FILE ist nicht gesetzt, dieser Server bietet kein Client-Profil an")
197
+ initialize: () => console.log("Profile distribution: CLIENT_PROFILE_FILE is not set, this server offers no client profile")
198
198
  });
199
199
  return;
200
200
  }
201
201
  let ready;
202
202
  const state = () => {
203
- if (!ready) throw new DomainError("profile-not-ready", "Das Client-Profil ist noch nicht gepackt.", 503);
203
+ if (!ready) throw new DomainError("profile-not-ready", "The client profile is not packed yet.", 503);
204
204
  return ready;
205
205
  };
206
206
  host.lifecycle({
@@ -225,7 +225,7 @@ var profileDistributionPlugin = {
225
225
  plugins: inspected.plugins.map((plugin2) => ({ id: plugin2.id, source: plugin2.source }))
226
226
  }
227
227
  };
228
- console.log(`Profilverteilung: ${inspected.profile} Stand ${packed.version.slice(0, 12)} (${packed.entries.length} Dateien, ${packed.archive.byteLength} Byte, Host-API ${hostApi}, Host ${hostVersion.slice(0, 12)}, Paket ${packageVersion})`);
228
+ console.log(`Profile distribution: ${inspected.profile} version ${packed.version.slice(0, 12)} (${packed.entries.length} files, ${packed.archive.byteLength} bytes, host API ${hostApi}, host ${hostVersion.slice(0, 12)}, package ${packageVersion})`);
229
229
  }
230
230
  });
231
231
  host.methods(implement(profileDistributionContracts.describe, () => state().description));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../plugins/ragents.profile-distribution/server/index.ts", "../../../plugins/ragents.profile-distribution/contract.ts", "../../../plugins/ragents.profile-distribution/server/archive.ts", "../../../plugins/ragents.profile-distribution/server/config.ts"],
4
- "sourcesContent": ["import { DomainError, implement, type HttpRouteContribution, type RAgentsPlugin } from \"@ragents/engine\";\nimport { readHostApiVersion, readHostVersion, readPackageVersion } from \"@ragents/host/host-version.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { writeJson } from \"@ragents/host/plugin-support/http.js\";\nimport { profileArchivePath, profileDistributionContracts, type ClientProfileDescription } from \"../contract.js\";\nimport { inspectClientProfile, packClientProfile } from \"./archive.js\";\nimport { profileDistributionConfig, profileDistributionConfigDescriptors } from \"./config.js\";\n\ninterface DistributionState {\n readonly description: ClientProfileDescription;\n readonly archive: Buffer;\n}\n\nconst archivePattern = /^\\/profile\\/([0-9a-f]{64})\\.tar\\.gz$/;\n\nconst archiveRoute = (state: () => DistributionState): HttpRouteContribution => ({\n id: \"ragents.profile-distribution.archive\",\n isApiPath: (pathname) => pathname.startsWith(\"/profile/\"),\n matches: (request, url) => request.method === \"GET\" && archivePattern.test(url.pathname),\n requiredRights: [\"profile.fetch\"],\n handle: ({ response, url }) => {\n const current = state();\n const version = archivePattern.exec(url.pathname)?.[1];\n if (version !== current.description.version) {\n writeJson(response, 404, { error: `Der Stand ${version} wird nicht mehr angeboten; aktuell ist ${current.description.version}` });\n return;\n }\n response.writeHead(200, {\n \"Content-Type\": \"application/gzip\",\n \"Content-Length\": current.archive.byteLength,\n \"Cache-Control\": \"no-store\",\n });\n response.end(current.archive);\n },\n});\n\nconst profileDistributionPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.profile-distribution\" },\n register: (host) => {\n host.config(...profileDistributionConfigDescriptors);\n const file = profileDistributionConfig.clientProfileFile();\n if (!file) {\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: () => console.log(\"Profilverteilung: CLIENT_PROFILE_FILE ist nicht gesetzt, dieser Server bietet kein Client-Profil an\"),\n });\n return;\n }\n let ready: DistributionState | undefined;\n const state = (): DistributionState => {\n if (!ready) throw new DomainError(\"profile-not-ready\", \"Das Client-Profil ist noch nicht gepackt.\", 503);\n return ready;\n };\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: async () => {\n const hostVersion = profileDistributionConfig.hostVersion() ?? readHostVersion();\n const packageVersion = readPackageVersion();\n const hostApi = readHostApiVersion();\n const inspected = await inspectClientProfile(file);\n const packed = await packClientProfile(inspected);\n ready = {\n archive: packed.archive,\n description: {\n profile: inspected.profile,\n version: packed.version,\n hostApi,\n hostVersion,\n packageVersion,\n file: inspected.file,\n size: packed.archive.byteLength,\n archivePath: profileArchivePath(packed.version),\n plugins: inspected.plugins.map((plugin) => ({ id: plugin.id, source: plugin.source })),\n },\n };\n console.log(`Profilverteilung: ${inspected.profile} Stand ${packed.version.slice(0, 12)} (${packed.entries.length} Dateien, ${packed.archive.byteLength} Byte, Host-API ${hostApi}, Host ${hostVersion.slice(0, 12)}, Paket ${packageVersion})`);\n },\n });\n host.methods(implement(profileDistributionContracts.describe, () => state().description));\n host.http(archiveRoute(state));\n },\n};\n\nexport const plugin: PluginModule = {\n create: () => profileDistributionPlugin,\n};\n", "import { Type, type Static } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nconst pluginEntry = Type.Object({\n id: Type.String({ minLength: 1 }),\n source: Type.Union([Type.Literal(\"host\"), Type.Literal(\"archive\")], {\n description: \"host: der Client nimmt das eingebaute Bundle seines Hosts; archive: das Bundle liegt im Archiv\",\n }),\n}, { additionalProperties: false });\n\nconst description = Type.Object({\n profile: Type.String({ minLength: 1, description: \"Profilname; die Datei hei\u00DFt ragents.config.<profil>.ts\" }),\n version: Type.String({ minLength: 64, maxLength: 64, description: \"Stand des Archivs als SHA-256\" }),\n hostApi: Type.Integer({ minimum: 1, description: \"Nummer der Host-API, gegen die die Bundles im Archiv gebaut sind; der Host des Clients muss genau diese bieten\" }),\n hostVersion: Type.String({ minLength: 40, maxLength: 40, description: \"Git-Commit des Hosts dieses Servers; ein Checkout mit anderer Host-API kommt damit zu einer passenden\" }),\n packageVersion: Type.String({ minLength: 1, description: \"Fassung des npm-Pakets, die diesen Commit tr\u00E4gt; eine Installation mit anderer Host-API kommt damit zu einer passenden\" }),\n file: Type.String({ minLength: 1, description: \"Pfad der Profildatei innerhalb des Archivs\" }),\n size: Type.Integer({ minimum: 0, description: \"Archivgr\u00F6\u00DFe in Byte\" }),\n archivePath: Type.String({ minLength: 1, description: \"HTTP-Pfad des Archivs auf diesem Server\" }),\n plugins: Type.Array(pluginEntry),\n}, { additionalProperties: false });\n\nexport type ClientProfileDescription = Static<typeof description>;\n\nexport const profileArchivePath = (version: string): string => `/profile/${version}.tar.gz`;\n\nexport const profileDistributionContracts = {\n describe: defineOperation({\n id: \"ragents.profile.describe\",\n description: \"Das Client-Profil dieses Servers: Name, Stand, verlangte Host-API, Host- und Paketfassung, Plugins und Archiv. Recht: profile.fetch.\",\n rights: [\"profile.fetch\"],\n input: Type.Object({}, { additionalProperties: false }),\n result: description,\n }),\n};\n", "import { createHash } from \"node:crypto\";\nimport { readdirSync, statSync, lstatSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { create as createTar } from \"tar\";\nimport { hostConfigKeys } from \"@ragents/host/config.js\";\nimport { isEnvironmentReference, isProvisionedReference } from \"@ragents/host/config-definition.js\";\nimport { resolveAnonymousUser, resolveProfileUsers, SECRET_KEY_PATTERN } from \"@ragents/host/config-file.js\";\nimport { discoverPluginIds, resolvePluginEntries, type ResolvedPlugin } from \"@ragents/host/profile/plugin-discovery.js\";\nimport { bundlesRoot, isPluginPath } from \"@ragents/host/plugin-support/plugins-root.js\";\n\nexport interface ClientProfilePlugin extends ResolvedPlugin {\n readonly source: \"host\" | \"archive\";\n}\n\nexport interface InspectedClientProfile {\n readonly profile: string;\n readonly source: string;\n readonly root: string;\n readonly file: string;\n readonly plugins: readonly ClientProfilePlugin[];\n}\n\nexport interface PackedClientProfile {\n readonly archive: Buffer;\n readonly version: string;\n readonly entries: readonly string[];\n}\n\nconst PROFILE_FILE = /^ragents\\.config\\.([a-z0-9]+(?:-[a-z0-9]+)*)\\.ts$/;\n\nconst commonRoot = (first: string, others: readonly string[]): string => {\n let root = first;\n for (const folder of others) {\n while (folder !== root && !folder.startsWith(root + path.sep)) {\n const parent = path.dirname(root);\n if (parent === root) throw new Error(`Profildatei und Plugin ${folder} haben keinen gemeinsamen Ordner`);\n root = parent;\n }\n }\n return root;\n};\n\nconst posixRelative = (root: string, target: string): string => path.relative(root, target).split(path.sep).join(\"/\");\n\n// Jeder Name ist frei, damit ein Passwort- oder Token-Verweis auch ohne die Client-Umgebung pr\u00FCfbar ist.\nconst placeholderEnvironment: Readonly<Record<string, string | undefined>> = new Proxy({}, { get: () => \"client-placeholder-value\" });\n\nconst checkSections = (source: string, raw: Record<string, unknown>, pluginIds: ReadonlySet<string>): void => {\n for (const [section, value] of Object.entries(raw)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(`${source}: die Sektion ${section} ist kein Objekt`);\n if (section !== \"host\" && !pluginIds.has(section)) throw new Error(`${source}: die Sektion ${section} geh\u00F6rt zu keinem Plugin aus host.PLUGINS`);\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (section === \"host\" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} ist kein Host-Schl\u00FCssel`);\n if (isEnvironmentReference(entry) || isProvisionedReference(entry)) continue;\n if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} ist ein Secret und muss als env(\"...\") stehen`);\n const valid = typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\"\n || (Array.isArray(entry) && entry.every((item) => typeof item === \"string\"))\n || (Array.isArray(entry) && entry.every((item) => !!item && typeof item === \"object\" && !Array.isArray(item)));\n if (!valid) throw new Error(`${source}: ${section}.${key} hat keinen g\u00FCltigen Wert`);\n if (typeof entry === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} verweist als Text auf die Umgebung; env(\"...\") verwenden`);\n }\n }\n};\n\n/** Pr\u00FCft die Client-Profildatei ohne ihre Umgebung und bestimmt, welche Plugins ins Archiv geh\u00F6ren. */\nexport const inspectClientProfile = async (source: string, root = bundlesRoot): Promise<InspectedClientProfile> => {\n const name = PROFILE_FILE.exec(path.basename(source));\n if (!name) throw new Error(`Die Client-Profildatei muss ragents.config.<profil>.ts hei\u00DFen: ${source}`);\n if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`Die Client-Profildatei ${source} fehlt`);\n const profile = name[1]!;\n const module = await import(pathToFileURL(source).href) as Record<string, unknown>;\n const raw = module.config;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) throw new Error(`${source} exportiert keine Konstante config`);\n const host = (raw as Record<string, unknown>).host as Record<string, unknown> | undefined;\n const entries = host?.PLUGINS;\n if (!Array.isArray(entries) || entries.length === 0 || !entries.every((entry) => typeof entry === \"string\" && entry)) {\n throw new Error(`${source}: host.PLUGINS muss eine nicht leere Liste sein`);\n }\n if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE muss ${profile} sein`);\n const directory = path.dirname(source);\n const unportable = (entries as string[]).filter((entry) => isPluginPath(entry) && !/^\\.{1,2}\\//.test(entry));\n if (unportable.length > 0) {\n throw new Error(`${source}: ${unportable.join(\", \")} nennt ein Bundle absolut oder mit ~/; der Client l\u00F6st diesen Pfad auf seinem eigenen Rechner auf und f\u00E4nde dort nicht das gelieferte Bundle. Im Client-Profil jedes Bundle relativ zur Profildatei nennen (./ oder ../)`);\n }\n const plugins = ((): readonly ClientProfilePlugin[] => {\n try {\n return resolvePluginEntries(entries as string[], directory, root)\n .map((plugin, index) => ({ ...plugin, source: isPluginPath((entries as string[])[index]!) ? \"archive\" : \"host\" }));\n } catch (cause) {\n throw new Error(`${source}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });\n }\n })();\n checkSections(source, raw as Record<string, unknown>, new Set([...discoverPluginIds(root), ...plugins.map((plugin) => plugin.id)]));\n const users = resolveProfileUsers(source, module.users, placeholderEnvironment);\n const anonymous = resolveAnonymousUser(source, module.anonymousUser);\n if (users && anonymous) throw new Error(`${source}: users und anonymousUser schlie\u00DFen einander aus`);\n const archived = plugins.filter((plugin) => plugin.source === \"archive\").map((plugin) => plugin.folder);\n const commonDirectory = commonRoot(directory, archived);\n return { profile, source, root: commonDirectory, file: posixRelative(commonDirectory, source), plugins };\n};\n\nconst collectFiles = (folder: string, root: string): string[] => {\n const files: string[] = [];\n for (const entry of readdirSync(folder, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name, \"en\"))) {\n const absolute = path.join(folder, entry.name);\n if (entry.isSymbolicLink()) throw new Error(`Das Client-Profil enth\u00E4lt einen symbolischen Link, den das Archiv nicht abbildet: ${absolute}`);\n if (entry.isDirectory()) {\n files.push(...collectFiles(absolute, root));\n } else if (entry.isFile()) {\n files.push(posixRelative(root, absolute));\n }\n }\n return files;\n};\n\n/** Die Eintr\u00E4ge des Archivs: die Profildatei und die Dateien der Bundles, die sie per Pfad nennt; das Web hat der Client selbst. */\nexport const clientProfileEntries = (inspected: InspectedClientProfile): readonly string[] => {\n const entries = [inspected.file, ...inspected.plugins.filter((plugin) => plugin.source === \"archive\").flatMap((plugin) => collectFiles(plugin.folder, inspected.root))];\n for (const entry of entries) {\n if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`Der Archiveintrag ${entry} ist keine Datei`);\n }\n return entries;\n};\n\n/** Packt die Eintr\u00E4ge deterministisch aus ihrem gemeinsamen Ordner; der Stand ist der SHA-256 des Archivs. */\nexport const packClientProfile = async (inspected: InspectedClientProfile): Promise<PackedClientProfile> => {\n const entries = clientProfileEntries(inspected);\n const chunks: Buffer[] = [];\n for await (const chunk of createTar({ gzip: { level: 9 }, cwd: inspected.root, portable: true, noMtime: true }, [...entries])) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const archive = Buffer.concat(chunks);\n return { archive, version: createHash(\"sha256\").update(archive).digest(\"hex\"), entries };\n};\n", "import path from \"node:path\";\nimport { configFilePath } from \"@ragents/host/config-file.js\";\nimport { declaredEnvironment } from \"@ragents/host/plugin-support/plugin-config.js\";\n\nexport const profileDistributionConfigDescriptors = [\n { key: \"CLIENT_PROFILE_FILE\", source: \"environment\" },\n { key: \"HOST_VERSION\", source: \"environment\" },\n] as const;\n\nconst env = declaredEnvironment(profileDistributionConfigDescriptors);\n\n/** Der Pfad gilt relativ zur Server-Profildatei, damit beide Dateien nebeneinander liegen k\u00F6nnen. */\nconst resolveClientProfileFile = (): string | undefined => {\n const value = env.optional(\"CLIENT_PROFILE_FILE\");\n if (!value) return undefined;\n const profile = configFilePath();\n return path.resolve(profile ? path.dirname(profile) : process.cwd(), value);\n};\n\nexport const profileDistributionConfig = Object.freeze({\n clientProfileFile: resolveClientProfileFile,\n hostVersion: () => {\n const value = env.optional(\"HOST_VERSION\");\n if (value !== undefined && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION muss ein vollst\u00E4ndiger Git-Commit sein, nicht \"${value}\"`);\n return value;\n },\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { DomainError, implement, type HttpRouteContribution, type RAgentsPlugin } from \"@ragents/engine\";\nimport { readHostApiVersion, readHostVersion, readPackageVersion } from \"@ragents/host/host-version.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { writeJson } from \"@ragents/host/plugin-support/http.js\";\nimport { profileArchivePath, profileDistributionContracts, type ClientProfileDescription } from \"../contract.js\";\nimport { inspectClientProfile, packClientProfile } from \"./archive.js\";\nimport { profileDistributionConfig, profileDistributionConfigDescriptors } from \"./config.js\";\n\ninterface DistributionState {\n readonly description: ClientProfileDescription;\n readonly archive: Buffer;\n}\n\nconst archivePattern = /^\\/profile\\/([0-9a-f]{64})\\.tar\\.gz$/;\n\nconst archiveRoute = (state: () => DistributionState): HttpRouteContribution => ({\n id: \"ragents.profile-distribution.archive\",\n isApiPath: (pathname) => pathname.startsWith(\"/profile/\"),\n matches: (request, url) => request.method === \"GET\" && archivePattern.test(url.pathname),\n requiredRights: [\"profile.fetch\"],\n handle: ({ response, url }) => {\n const current = state();\n const version = archivePattern.exec(url.pathname)?.[1];\n if (version !== current.description.version) {\n writeJson(response, 404, { error: `Version ${version} is no longer offered; the current one is ${current.description.version}` });\n return;\n }\n response.writeHead(200, {\n \"Content-Type\": \"application/gzip\",\n \"Content-Length\": current.archive.byteLength,\n \"Cache-Control\": \"no-store\",\n });\n response.end(current.archive);\n },\n});\n\nconst profileDistributionPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.profile-distribution\" },\n register: (host) => {\n host.config(...profileDistributionConfigDescriptors);\n const file = profileDistributionConfig.clientProfileFile();\n if (!file) {\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: () => console.log(\"Profile distribution: CLIENT_PROFILE_FILE is not set, this server offers no client profile\"),\n });\n return;\n }\n let ready: DistributionState | undefined;\n const state = (): DistributionState => {\n if (!ready) throw new DomainError(\"profile-not-ready\", \"The client profile is not packed yet.\", 503);\n return ready;\n };\n host.lifecycle({\n id: \"ragents.profile-distribution\",\n initialize: async () => {\n const hostVersion = profileDistributionConfig.hostVersion() ?? readHostVersion();\n const packageVersion = readPackageVersion();\n const hostApi = readHostApiVersion();\n const inspected = await inspectClientProfile(file);\n const packed = await packClientProfile(inspected);\n ready = {\n archive: packed.archive,\n description: {\n profile: inspected.profile,\n version: packed.version,\n hostApi,\n hostVersion,\n packageVersion,\n file: inspected.file,\n size: packed.archive.byteLength,\n archivePath: profileArchivePath(packed.version),\n plugins: inspected.plugins.map((plugin) => ({ id: plugin.id, source: plugin.source })),\n },\n };\n console.log(`Profile distribution: ${inspected.profile} version ${packed.version.slice(0, 12)} (${packed.entries.length} files, ${packed.archive.byteLength} bytes, host API ${hostApi}, host ${hostVersion.slice(0, 12)}, package ${packageVersion})`);\n },\n });\n host.methods(implement(profileDistributionContracts.describe, () => state().description));\n host.http(archiveRoute(state));\n },\n};\n\nexport const plugin: PluginModule = {\n create: () => profileDistributionPlugin,\n};\n", "import { Type, type Static } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nconst pluginEntry = Type.Object({\n id: Type.String({ minLength: 1 }),\n source: Type.Union([Type.Literal(\"host\"), Type.Literal(\"archive\")], {\n description: \"host: the client takes the built-in bundle of its host; archive: the bundle is in the archive\",\n }),\n}, { additionalProperties: false });\n\nconst description = Type.Object({\n profile: Type.String({ minLength: 1, description: \"Profile name; the file is called ragents.config.<profile>.ts\" }),\n version: Type.String({ minLength: 64, maxLength: 64, description: \"Version of the archive as SHA-256\" }),\n hostApi: Type.Integer({ minimum: 1, description: \"Number of the host API the bundles in the archive are built against; the client's host must offer exactly this one\" }),\n hostVersion: Type.String({ minLength: 40, maxLength: 40, description: \"Git commit of this server's host; a checkout with a different host API uses it to get a matching one\" }),\n packageVersion: Type.String({ minLength: 1, description: \"Version of the npm package that carries this commit; an installation with a different host API uses it to get a matching one\" }),\n file: Type.String({ minLength: 1, description: \"Path of the profile file inside the archive\" }),\n size: Type.Integer({ minimum: 0, description: \"Archive size in bytes\" }),\n archivePath: Type.String({ minLength: 1, description: \"HTTP path of the archive on this server\" }),\n plugins: Type.Array(pluginEntry),\n}, { additionalProperties: false });\n\nexport type ClientProfileDescription = Static<typeof description>;\n\nexport const profileArchivePath = (version: string): string => `/profile/${version}.tar.gz`;\n\nexport const profileDistributionContracts = {\n describe: defineOperation({\n id: \"ragents.profile.describe\",\n description: \"The client profile of this server: name, version, required host API, host and package version, plugins and archive. Right: profile.fetch.\",\n rights: [\"profile.fetch\"],\n input: Type.Object({}, { additionalProperties: false }),\n result: description,\n }),\n};\n", "import { createHash } from \"node:crypto\";\nimport { readdirSync, statSync, lstatSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { create as createTar } from \"tar\";\nimport { hostConfigKeys } from \"@ragents/host/config.js\";\nimport { isEnvironmentReference, isProvisionedReference } from \"@ragents/host/config-definition.js\";\nimport { resolveAnonymousUser, resolveProfileUsers, SECRET_KEY_PATTERN } from \"@ragents/host/config-file.js\";\nimport { discoverPluginIds, resolvePluginEntries, type ResolvedPlugin } from \"@ragents/host/profile/plugin-discovery.js\";\nimport { bundlesRoot, isPluginPath } from \"@ragents/host/plugin-support/plugins-root.js\";\n\nexport interface ClientProfilePlugin extends ResolvedPlugin {\n readonly source: \"host\" | \"archive\";\n}\n\nexport interface InspectedClientProfile {\n readonly profile: string;\n readonly source: string;\n readonly root: string;\n readonly file: string;\n readonly plugins: readonly ClientProfilePlugin[];\n}\n\nexport interface PackedClientProfile {\n readonly archive: Buffer;\n readonly version: string;\n readonly entries: readonly string[];\n}\n\nconst PROFILE_FILE = /^ragents\\.config\\.([a-z0-9]+(?:-[a-z0-9]+)*)\\.ts$/;\n\nconst commonRoot = (first: string, others: readonly string[]): string => {\n let root = first;\n for (const folder of others) {\n while (folder !== root && !folder.startsWith(root + path.sep)) {\n const parent = path.dirname(root);\n if (parent === root) throw new Error(`Profile file and plugin ${folder} have no common folder`);\n root = parent;\n }\n }\n return root;\n};\n\nconst posixRelative = (root: string, target: string): string => path.relative(root, target).split(path.sep).join(\"/\");\n\n// Every name is set so a password or token reference can be checked even without the client environment.\nconst placeholderEnvironment: Readonly<Record<string, string | undefined>> = new Proxy({}, { get: () => \"client-placeholder-value\" });\n\nconst checkSections = (source: string, raw: Record<string, unknown>, pluginIds: ReadonlySet<string>): void => {\n for (const [section, value] of Object.entries(raw)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(`${source}: the section ${section} is not an object`);\n if (section !== \"host\" && !pluginIds.has(section)) throw new Error(`${source}: the section ${section} belongs to no plugin from host.PLUGINS`);\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (section === \"host\" && !hostConfigKeys.includes(key)) throw new Error(`${source}: host.${key} is not a host key`);\n if (isEnvironmentReference(entry) || isProvisionedReference(entry)) continue;\n if (SECRET_KEY_PATTERN.test(key)) throw new Error(`${source}: ${section}.${key} is a secret and must be written as env(\"...\")`);\n const valid = typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\"\n || (Array.isArray(entry) && entry.every((item) => typeof item === \"string\"))\n || (Array.isArray(entry) && entry.every((item) => !!item && typeof item === \"object\" && !Array.isArray(item)));\n if (!valid) throw new Error(`${source}: ${section}.${key} has no valid value`);\n if (typeof entry === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(entry)) throw new Error(`${source}: ${section}.${key} references the environment as text; use env(\"...\")`);\n }\n }\n};\n\n/** Checks the client profile file without its environment and determines which plugins belong in the archive. */\nexport const inspectClientProfile = async (source: string, root = bundlesRoot): Promise<InspectedClientProfile> => {\n const name = PROFILE_FILE.exec(path.basename(source));\n if (!name) throw new Error(`The client profile file must be called ragents.config.<profile>.ts: ${source}`);\n if (!statSync(source, { throwIfNoEntry: false })?.isFile()) throw new Error(`The client profile file ${source} is missing`);\n const profile = name[1]!;\n const module = await import(pathToFileURL(source).href) as Record<string, unknown>;\n const raw = module.config;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) throw new Error(`${source} exports no constant config`);\n const host = (raw as Record<string, unknown>).host as Record<string, unknown> | undefined;\n const entries = host?.PLUGINS;\n if (!Array.isArray(entries) || entries.length === 0 || !entries.every((entry) => typeof entry === \"string\" && entry)) {\n throw new Error(`${source}: host.PLUGINS must be a non-empty list`);\n }\n if (host?.PRODUCT_PROFILE !== profile) throw new Error(`${source}: host.PRODUCT_PROFILE must be ${profile}`);\n const directory = path.dirname(source);\n const unportable = (entries as string[]).filter((entry) => isPluginPath(entry) && !/^\\.{1,2}\\//.test(entry));\n if (unportable.length > 0) {\n throw new Error(`${source}: ${unportable.join(\", \")} names a bundle absolutely or with ~/; the client resolves this path on its own machine and would not find the delivered bundle there. In the client profile, name every bundle relative to the profile file (./ or ../)`);\n }\n const plugins = ((): readonly ClientProfilePlugin[] => {\n try {\n return resolvePluginEntries(entries as string[], directory, root)\n .map((plugin, index) => ({ ...plugin, source: isPluginPath((entries as string[])[index]!) ? \"archive\" : \"host\" }));\n } catch (cause) {\n throw new Error(`${source}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });\n }\n })();\n checkSections(source, raw as Record<string, unknown>, new Set([...discoverPluginIds(root), ...plugins.map((plugin) => plugin.id)]));\n const users = resolveProfileUsers(source, module.users, placeholderEnvironment);\n const anonymous = resolveAnonymousUser(source, module.anonymousUser);\n if (users && anonymous) throw new Error(`${source}: users and anonymousUser exclude each other`);\n const archived = plugins.filter((plugin) => plugin.source === \"archive\").map((plugin) => plugin.folder);\n const commonDirectory = commonRoot(directory, archived);\n return { profile, source, root: commonDirectory, file: posixRelative(commonDirectory, source), plugins };\n};\n\nconst collectFiles = (folder: string, root: string): string[] => {\n const files: string[] = [];\n for (const entry of readdirSync(folder, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name, \"en\"))) {\n const absolute = path.join(folder, entry.name);\n if (entry.isSymbolicLink()) throw new Error(`The client profile contains a symbolic link that the archive does not represent: ${absolute}`);\n if (entry.isDirectory()) {\n files.push(...collectFiles(absolute, root));\n } else if (entry.isFile()) {\n files.push(posixRelative(root, absolute));\n }\n }\n return files;\n};\n\n/** The archive entries: the profile file and the files of the bundles it names by path; the client has the web itself. */\nexport const clientProfileEntries = (inspected: InspectedClientProfile): readonly string[] => {\n const entries = [inspected.file, ...inspected.plugins.filter((plugin) => plugin.source === \"archive\").flatMap((plugin) => collectFiles(plugin.folder, inspected.root))];\n for (const entry of entries) {\n if (!lstatSync(path.join(inspected.root, entry)).isFile()) throw new Error(`The archive entry ${entry} is not a file`);\n }\n return entries;\n};\n\n/** Packs the entries deterministically from their common folder; the version is the SHA-256 of the archive. */\nexport const packClientProfile = async (inspected: InspectedClientProfile): Promise<PackedClientProfile> => {\n const entries = clientProfileEntries(inspected);\n const chunks: Buffer[] = [];\n for await (const chunk of createTar({ gzip: { level: 9 }, cwd: inspected.root, portable: true, noMtime: true }, [...entries])) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const archive = Buffer.concat(chunks);\n return { archive, version: createHash(\"sha256\").update(archive).digest(\"hex\"), entries };\n};\n", "import path from \"node:path\";\nimport { configFilePath } from \"@ragents/host/config-file.js\";\nimport { declaredEnvironment } from \"@ragents/host/plugin-support/plugin-config.js\";\n\nexport const profileDistributionConfigDescriptors = [\n { key: \"CLIENT_PROFILE_FILE\", source: \"environment\" },\n { key: \"HOST_VERSION\", source: \"environment\" },\n] as const;\n\nconst env = declaredEnvironment(profileDistributionConfigDescriptors);\n\n/** The path is relative to the server profile file so both files can sit next to each other. */\nconst resolveClientProfileFile = (): string | undefined => {\n const value = env.optional(\"CLIENT_PROFILE_FILE\");\n if (!value) return undefined;\n const profile = configFilePath();\n return path.resolve(profile ? path.dirname(profile) : process.cwd(), value);\n};\n\nexport const profileDistributionConfig = Object.freeze({\n clientProfileFile: resolveClientProfileFile,\n hostVersion: () => {\n const value = env.optional(\"HOST_VERSION\");\n if (value !== undefined && !/^[0-9a-f]{40}$/.test(value)) throw new Error(`HOST_VERSION must be a full Git commit, not \"${value}\"`);\n return value;\n },\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["plugin", "path", "plugin"]
7
7
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "format": 4,
2
+ "format": 5,
3
3
  "id": "ragents.reference",
4
4
  "api": 7,
5
5
  "hostNames": {
@@ -20,8 +20,8 @@
20
20
  ]
21
21
  }
22
22
  },
23
- "stand": "b3fa5275dc209c315f26ec832458603d442d2a56974471ee83292e7d26079a12",
24
- "sourceStand": "da96161902a69ec9b16e63d49ce99ff931ed25eb082b6210a3bbdfe10bb04d58",
23
+ "revision": "809c8770905fa2a4d557425abf27aee27a863aec8a80655b96e40bd82307f493",
24
+ "sourceRevision": "abe068f9695702223dd49b2169ecca54e5a82fd4b37d02346d0c9df3582cff87",
25
25
  "server": "server/index.js",
26
26
  "web": {
27
27
  "entry": "web/index.js",
@@ -1,27 +1,27 @@
1
1
  ---
2
- title: Balkon-Wizard einrichten
3
- description: "Ein vorbereitetes KI-Interview zeigt adaptive Fragen in einer eigenen Mini-App. Der Berater ist von Anfang an Primary-Actor; das Formular zählt fünf Antworten."
2
+ title: Set up balcony wizard
3
+ description: "A prepared AI interview shows adaptive questions in a mini-app of its own. The advisor is the primary actor from the start; the form counts five answers."
4
4
  order: 140
5
5
  coordinator: false
6
- tags: Run-Scripts, Anwendungsfall, Konzeptdemo, Mini-Apps, LLM-Actor mit View, Frei gesteuerter Chat, Primary-Actor
6
+ tags: Run scripts, Use case, Concept demo, Mini-apps, LLM actor with view, Controlled chat, Primary actor
7
7
  ---
8
8
 
9
- Das TypeScript-Setup legt einen Balkon-Berater mit der Rolle `standard` und ausdrücklich
10
- ohne Werkzeuge an. Das mitgelieferte Programm `actors/balcony-app/` bindet eine eigenständige
11
- Mini-App an diesen Actor. Die Fläche zeigt allein deren Kachel statt einer Chatkachel; ein Koordinator
12
- wird für diesen Run nicht angelegt. Der Berater wird zum Primary-Actor und behält seinen eigenen
13
- Interview-Prompt.
9
+ The TypeScript setup creates a balcony advisor with the role `standard` and explicitly
10
+ without tools. The bundled program `actors/balcony-app/` binds a standalone mini-app to
11
+ this actor. The surface shows only its tile instead of a chat tile; no coordinator
12
+ is created for this run. The advisor becomes the primary actor and keeps its own
13
+ interview prompt.
14
14
 
15
- In der App beginnt "Beratung starten" das Gespräch. Das LLM stellt jeweils eine Frage anhand
16
- der bisherigen Antworten, ohne feste Fragenliste. Die App zählt fünf Antworten und zeigt danach
17
- die Empfehlung zu Stil, Pflanzen, Möbeln, Pflege und nächsten Schritten. Der Benutzer schreibt in
18
- ein Formular, nicht in ein Chat-Widget. Fortschritt und abgeschlossene Antworten lassen sich nach
19
- dem Neuladen aus dem Gespräch rekonstruieren; eine fehlgeschlagene Modellantwort kann erneut
20
- angefordert werden, ohne eine weitere Antwort zu zählen.
15
+ In the app, "Start consultation" begins the conversation. The LLM asks one question at a time
16
+ based on the previous answers, without a fixed list of questions. The app counts five answers and
17
+ then shows the recommendation on style, plants, furniture, care, and next steps. The user writes
18
+ into a form, not into a chat widget. Progress and completed answers can be reconstructed from the
19
+ conversation after a reload; a failed model answer can be requested again without counting
20
+ another answer.
21
21
 
22
- Die Vorlage benötigt keine Startwerte. Das Setup wird einmal ausgeführt und startet noch keinen
23
- Modellaufruf. Erst eine Aktion in der App schickt Text an den Berater. Fragen und Empfehlungen
24
- bleiben Modellantworten; die App prüft ihre fachliche Qualität nicht automatisch.
22
+ The template needs no start values. The setup runs once and does not start a model call yet.
23
+ Only an action in the app sends text to the advisor. Questions and recommendations
24
+ remain model answers; the app does not check their subject-matter quality automatically.
25
25
 
26
- Dies ist ein vorbereitetes Demo zum direkten Starten. Die separate Skill "Balkon-Wizard"
27
- beauftragt weiterhin den Run-Builder, selbst eine App für diese Aufgabe zu bauen.
26
+ This is a prepared demo to start directly. The separate skill "Balcony wizard"
27
+ still asks the run builder to build an app for this task itself.
@@ -3,8 +3,8 @@
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "ragents": {
6
- "title": "Balkonberatung",
7
- "description": "Fünf Fragen und eine persönliche Gestaltungsempfehlung in einer eigenen Mini-App.",
6
+ "title": "Balcony advice",
7
+ "description": "Five questions and a personal design recommendation in a mini-app of its own.",
8
8
  "views": [{ "id": "main", "client": "src/client.tsx" }]
9
9
  }
10
10
  }
@@ -41,34 +41,34 @@ function App() {
41
41
  const evaluating = conversation.answers === answerCount || sender.finalAnswer;
42
42
  const disabled = Boolean(snapshot?.readOnly || snapshot?.running || pending);
43
43
 
44
- return <UI.AppLayout title="Dein Balkon" description="Fünf Fragen zu deinem Balkon. Daraus entsteht eine persönliche Gestaltungsempfehlung.">
44
+ return <UI.AppLayout title="Your balcony" description="Five questions about your balcony. They lead to a personal design recommendation.">
45
45
  <UI.Stack gap="large">
46
46
  <UI.Stack gap="small">
47
- <label htmlFor="interview-progress">{conversation.answers} von {answerCount} Antworten</label>
47
+ <label htmlFor="interview-progress">{conversation.answers} of {answerCount} answers</label>
48
48
  <progress className="h-2.5 w-full [accent-color:var(--foreground)]" id="interview-progress" max={answerCount} value={conversation.answers} />
49
49
  </UI.Stack>
50
- {snapshot?.readOnly && <p>Dieser Run ist schreibgeschützt.</p>}
50
+ {snapshot?.readOnly && <p>This run is read-only.</p>}
51
51
  {(sendError || conversation.error) && <p role="alert">{sendError || conversation.error}</p>}
52
52
  {conversation.phase === "start" && !pending && <UI.Stack>
53
- <p>Du beantwortest immer nur eine Frage. Deine bisherigen Angaben bleiben beim erneuten Öffnen erhalten.</p>
54
- <UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(startMarker)}>Beratung starten</UI.Button></UI.Stack>
53
+ <p>You always answer only one question. Your previous answers are kept when you open this again.</p>
54
+ <UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(startMarker)}>Start consultation</UI.Button></UI.Stack>
55
55
  </UI.Stack>}
56
- {waiting && <p role="status">{evaluating ? "Deine Antworten werden ausgewertet. Die Empfehlung entsteht ..." : "Deine nächste Frage entsteht ..."}</p>}
56
+ {waiting && <p role="status">{evaluating ? "Your answers are being evaluated. The recommendation is being created ..." : "Your next question is being created ..."}</p>}
57
57
  {conversation.canRetry && <UI.Stack>
58
- <p>Die nächste Modellantwort konnte nicht angezeigt werden. Deine bereits gesendeten Antworten bleiben erhalten.</p>
59
- <UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(retryMarker)} variant="outline">Modellantwort erneut anfordern</UI.Button></UI.Stack>
58
+ <p>The next model answer could not be shown. The answers you already sent are kept.</p>
59
+ <UI.Stack direction="row"><UI.Button disabled={disabled} onClick={() => void send(retryMarker)} variant="outline">Request model answer again</UI.Button></UI.Stack>
60
60
  </UI.Stack>}
61
61
  {conversation.phase === "question" && !pending && <UI.Stack>
62
- <h2>Frage {conversation.answers + 1} von {answerCount}</h2>
62
+ <h2>Question {conversation.answers + 1} of {answerCount}</h2>
63
63
  <UI.Markdown text={conversation.text} />
64
- <UI.Form title="Deine Antwort" fields={[
65
- { id: "answer", label: "Antwort", type: "textarea", rows: 4, required: true, placeholder: "Beschreibe deinen Balkon und deine Wünsche ..." },
64
+ <UI.Form title="Your answer" fields={[
65
+ { id: "answer", label: "Answer", type: "textarea", rows: 4, required: true, placeholder: "Describe your balcony and your wishes ..." },
66
66
  ]} values={values} onChange={setValues} disabled={disabled} onSubmit={async (next) => {
67
67
  await send(answerInput(conversation.answers, String(next.answer ?? "")));
68
- }} submitLabel={conversation.answers === 4 ? "Antwort senden und auswerten" : "Antwort senden"} />
68
+ }} submitLabel={conversation.answers === 4 ? "Send answer and evaluate" : "Send answer"} />
69
69
  </UI.Stack>}
70
70
  {conversation.phase === "complete" && !pending && <UI.Stack>
71
- <h2>Deine Gestaltungsempfehlung</h2>
71
+ <h2>Your design recommendation</h2>
72
72
  <UI.Markdown text={conversation.text} />
73
73
  </UI.Stack>}
74
74
  </UI.Stack>
@@ -76,5 +76,5 @@ function App() {
76
76
  }
77
77
 
78
78
  const root = document.getElementById("root");
79
- if (!root) throw new Error("Das Wurzelelement #root fehlt.");
79
+ if (!root) throw new Error("The #root element is missing.");
80
80
  createRoot(root).render(<App />);
@@ -52,8 +52,8 @@ export function deriveConversation(snapshot: ChatSnapshot | undefined): Conversa
52
52
  }
53
53
 
54
54
  export function answerInput(answers: number, text: string): string {
55
- if (!Number.isInteger(answers) || answers < 0 || answers >= answerCount) throw new Error("Das Interview nimmt genau fünf Antworten an.");
56
- if (!text.trim()) throw new Error("Bitte eine Antwort eingeben.");
55
+ if (!Number.isInteger(answers) || answers < 0 || answers >= answerCount) throw new Error("The interview accepts exactly five answers.");
56
+ if (!text.trim()) throw new Error("Please enter an answer.");
57
57
  return `ANSWER ${answers + 1}/5\n${text.trim()}`;
58
58
  }
59
59