@schlenkr/ragents 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (788) hide show
  1. package/LICENSE +166 -0
  2. package/README.md +88 -0
  3. package/apps/server/agent-home/settings.json +3 -0
  4. package/apps/server/package.json +29 -0
  5. package/apps/server/src/access-projection.ts +97 -0
  6. package/apps/server/src/access-service.ts +22 -0
  7. package/apps/server/src/access-session.ts +204 -0
  8. package/apps/server/src/api/contracts.ts +203 -0
  9. package/apps/server/src/api/core-methods.ts +163 -0
  10. package/apps/server/src/api/delivery.ts +40 -0
  11. package/apps/server/src/api/reference.ts +146 -0
  12. package/apps/server/src/api/rights.ts +26 -0
  13. package/apps/server/src/chat-attachments.ts +52 -0
  14. package/apps/server/src/chat-context.ts +6 -0
  15. package/apps/server/src/chat-events.ts +185 -0
  16. package/apps/server/src/chat-handler.ts +37 -0
  17. package/apps/server/src/config-definition.ts +80 -0
  18. package/apps/server/src/config-file.ts +324 -0
  19. package/apps/server/src/config.ts +46 -0
  20. package/apps/server/src/data-directory.ts +42 -0
  21. package/apps/server/src/external-access.ts +40 -0
  22. package/apps/server/src/help-files.ts +63 -0
  23. package/apps/server/src/host-resolution-hooks.mjs +31 -0
  24. package/apps/server/src/host-resolution.ts +3 -0
  25. package/apps/server/src/host-version.ts +74 -0
  26. package/apps/server/src/layout.ts +36 -0
  27. package/apps/server/src/main.ts +54 -0
  28. package/apps/server/src/plugin-support/actor-programs/capability-resolver.ts +107 -0
  29. package/apps/server/src/plugin-support/actor-programs/limits.ts +33 -0
  30. package/apps/server/src/plugin-support/actor-programs/operations.ts +19 -0
  31. package/apps/server/src/plugin-support/actor-programs/service.ts +16 -0
  32. package/apps/server/src/plugin-support/agent-tool.ts +60 -0
  33. package/apps/server/src/plugin-support/asset-path.ts +4 -0
  34. package/apps/server/src/plugin-support/await-with-signal.ts +18 -0
  35. package/apps/server/src/plugin-support/chat-display-contract.ts +7 -0
  36. package/apps/server/src/plugin-support/chat-display-policy.ts +55 -0
  37. package/apps/server/src/plugin-support/front-matter.ts +44 -0
  38. package/apps/server/src/plugin-support/http.ts +93 -0
  39. package/apps/server/src/plugin-support/language-server/contract.ts +18 -0
  40. package/apps/server/src/plugin-support/language-server/plugin.ts +32 -0
  41. package/apps/server/src/plugin-support/language-server/snapshot-method.ts +17 -0
  42. package/apps/server/src/plugin-support/language-server/tools.ts +73 -0
  43. package/apps/server/src/plugin-support/model-choice.ts +109 -0
  44. package/apps/server/src/plugin-support/model-upstreams.ts +12 -0
  45. package/apps/server/src/plugin-support/native-typescript-child.ts +78 -0
  46. package/apps/server/src/plugin-support/native-typescript-executor.ts +260 -0
  47. package/apps/server/src/plugin-support/plugin-config.ts +48 -0
  48. package/apps/server/src/plugin-support/plugin-folder.ts +81 -0
  49. package/apps/server/src/plugin-support/plugin-module.ts +14 -0
  50. package/apps/server/src/plugin-support/plugins-root.ts +41 -0
  51. package/apps/server/src/plugin-support/product-model-settings-contract.ts +24 -0
  52. package/apps/server/src/plugin-support/product-model-settings.ts +120 -0
  53. package/apps/server/src/plugin-support/product-start-options.ts +104 -0
  54. package/apps/server/src/plugin-support/prompt.ts +68 -0
  55. package/apps/server/src/plugin-support/provision.ts +85 -0
  56. package/apps/server/src/plugin-support/run-scripts.ts +88 -0
  57. package/apps/server/src/plugin-support/shell-platform.ts +21 -0
  58. package/apps/server/src/plugin-support/skills.ts +97 -0
  59. package/apps/server/src/plugin-support/start-entries-contract.ts +71 -0
  60. package/apps/server/src/plugin-support/start-options-contract.ts +65 -0
  61. package/apps/server/src/plugin-support/system-prompts.ts +138 -0
  62. package/apps/server/src/plugin-support/thinking-level.ts +8 -0
  63. package/apps/server/src/plugin-support/tool-availability.ts +20 -0
  64. package/apps/server/src/plugin-support/workspace-ownership.ts +36 -0
  65. package/apps/server/src/plugin-support/workspace-sandbox-host.ts +213 -0
  66. package/apps/server/src/plugin-support/workspace-tool-naming.ts +11 -0
  67. package/apps/server/src/plugin-support/zip.ts +69 -0
  68. package/apps/server/src/profile/compose.ts +69 -0
  69. package/apps/server/src/profile/plugin-discovery.ts +112 -0
  70. package/apps/server/src/profile/plugin-list.ts +19 -0
  71. package/apps/server/src/profile/provisioning.ts +81 -0
  72. package/apps/server/src/protocol.ts +106 -0
  73. package/apps/server/src/provider.ts +817 -0
  74. package/apps/server/src/ragents/actor-chat-history.ts +111 -0
  75. package/apps/server/src/ragents/chat-projection.ts +55 -0
  76. package/apps/server/src/ragents/chat-text-positions.ts +43 -0
  77. package/apps/server/src/ragents/coordinator.ts +5 -0
  78. package/apps/server/src/ragents/document-store.ts +12 -0
  79. package/apps/server/src/ragents/engine.ts +417 -0
  80. package/apps/server/src/ragents/global-chat.ts +40 -0
  81. package/apps/server/src/ragents/host-services.ts +26 -0
  82. package/apps/server/src/ragents/journal-chat-events.ts +52 -0
  83. package/apps/server/src/ragents/product-runtime.ts +31 -0
  84. package/apps/server/src/ragents/runtime-bridge.ts +7 -0
  85. package/apps/server/src/ragents/session.ts +859 -0
  86. package/apps/server/src/ragents/start-option-state.ts +37 -0
  87. package/apps/server/src/ragents/typescript-tools.ts +182 -0
  88. package/apps/server/src/ragents/workspace-runtime.ts +64 -0
  89. package/apps/server/src/rpc/dispatcher.ts +178 -0
  90. package/apps/server/src/rpc/http-transport.ts +178 -0
  91. package/apps/server/src/rpc/stdio-transport.ts +44 -0
  92. package/apps/server/src/run-preparation-contract.ts +20 -0
  93. package/apps/server/src/run-preparation-input.ts +16 -0
  94. package/apps/server/src/run-preparation.ts +147 -0
  95. package/apps/server/src/run-transfer.ts +264 -0
  96. package/apps/server/src/server.ts +312 -0
  97. package/apps/server/src/settings.ts +209 -0
  98. package/apps/server/src/startup.ts +13 -0
  99. package/apps/server/src/title-compactor.ts +131 -0
  100. package/apps/server/src/title-settings-contract.ts +9 -0
  101. package/apps/server/src/title-settings.ts +67 -0
  102. package/apps/web/package.json +41 -0
  103. package/apps/web/src/AccessContext.tsx +125 -0
  104. package/apps/web/src/App.tsx +315 -0
  105. package/apps/web/src/CanvasShortcuts.tsx +60 -0
  106. package/apps/web/src/DiffCode.tsx +89 -0
  107. package/apps/web/src/HelpDialog.tsx +87 -0
  108. package/apps/web/src/MaterialSettings.tsx +40 -0
  109. package/apps/web/src/Overview.tsx +201 -0
  110. package/apps/web/src/PluginActivation.ts +41 -0
  111. package/apps/web/src/PluginChat.tsx +552 -0
  112. package/apps/web/src/PluginRegistry.tsx +689 -0
  113. package/apps/web/src/RunPreparationChat.tsx +111 -0
  114. package/apps/web/src/RunStore.ts +86 -0
  115. package/apps/web/src/SessionList.tsx +148 -0
  116. package/apps/web/src/SettingsModal.tsx +949 -0
  117. package/apps/web/src/SourceCode.tsx +49 -0
  118. package/apps/web/src/StartOptions.tsx +231 -0
  119. package/apps/web/src/StartSurface.tsx +161 -0
  120. package/apps/web/src/StatusGroup.tsx +18 -0
  121. package/apps/web/src/ThemeSettings.tsx +46 -0
  122. package/apps/web/src/TitleModelSettings.tsx +100 -0
  123. package/apps/web/src/Toolbar.tsx +28 -0
  124. package/apps/web/src/WorkspacePanel.tsx +309 -0
  125. package/apps/web/src/access-session.ts +27 -0
  126. package/apps/web/src/access-token.ts +31 -0
  127. package/apps/web/src/api.ts +368 -0
  128. package/apps/web/src/chat/ChatInputToolbar.tsx +488 -0
  129. package/apps/web/src/chat/ChatMessages.tsx +666 -0
  130. package/apps/web/src/chat/ChatPanel.tsx +61 -0
  131. package/apps/web/src/chat/DetailModeSwitch.tsx +58 -0
  132. package/apps/web/src/chat/Markdown.tsx +104 -0
  133. package/apps/web/src/chat/QuestionCard.tsx +107 -0
  134. package/apps/web/src/chat/StepPopover.tsx +82 -0
  135. package/apps/web/src/chat/WorkingScenes.tsx +235 -0
  136. package/apps/web/src/chat/attachments.ts +53 -0
  137. package/apps/web/src/chat/chat-scroll.ts +41 -0
  138. package/apps/web/src/chat/chat-target.ts +21 -0
  139. package/apps/web/src/chat/requests.ts +23 -0
  140. package/apps/web/src/chat/texts.ts +61 -0
  141. package/apps/web/src/chat/types.ts +26 -0
  142. package/apps/web/src/chat/useAttachmentCapabilities.ts +35 -0
  143. package/apps/web/src/chat/useChat.ts +46 -0
  144. package/apps/web/src/chat/user-location.ts +22 -0
  145. package/apps/web/src/column/ColumnApp.tsx +158 -0
  146. package/apps/web/src/column/ColumnMenu.tsx +37 -0
  147. package/apps/web/src/column/ColumnRunHeader.tsx +43 -0
  148. package/apps/web/src/column/column-location.ts +30 -0
  149. package/apps/web/src/column/host-contract.ts +83 -0
  150. package/apps/web/src/column/host.ts +101 -0
  151. package/apps/web/src/column/use-session-list.ts +42 -0
  152. package/apps/web/src/column.tsx +43 -0
  153. package/apps/web/src/diff-view.css +38 -0
  154. package/apps/web/src/help-samples.ts +11 -0
  155. package/apps/web/src/highlighting.css +74 -0
  156. package/apps/web/src/highlighting.ts +262 -0
  157. package/apps/web/src/lib/format.ts +5 -0
  158. package/apps/web/src/lib/guards.ts +8 -0
  159. package/apps/web/src/lib/http.ts +9 -0
  160. package/apps/web/src/lib/labels.ts +11 -0
  161. package/apps/web/src/lib/local-storage-setting.ts +39 -0
  162. package/apps/web/src/main.tsx +30 -0
  163. package/apps/web/src/material-settings.ts +104 -0
  164. package/apps/web/src/model-settings-events.ts +1 -0
  165. package/apps/web/src/page-opener.tsx +14 -0
  166. package/apps/web/src/panel/LoginForm.tsx +31 -0
  167. package/apps/web/src/panel/OverviewPage.tsx +90 -0
  168. package/apps/web/src/panel/PanelPage.tsx +9 -0
  169. package/apps/web/src/panel/SettingsPage.tsx +102 -0
  170. package/apps/web/src/panel/contract.ts +101 -0
  171. package/apps/web/src/panel/target-state.ts +53 -0
  172. package/apps/web/src/panel.tsx +30 -0
  173. package/apps/web/src/plugin-bootstrap.ts +90 -0
  174. package/apps/web/src/plugin-discovery.ts +5 -0
  175. package/apps/web/src/rpc/client.ts +301 -0
  176. package/apps/web/src/rpc.ts +4 -0
  177. package/apps/web/src/run-overview.ts +34 -0
  178. package/apps/web/src/run-preparation.ts +16 -0
  179. package/apps/web/src/run-read-state.ts +33 -0
  180. package/apps/web/src/settings-contributions.ts +274 -0
  181. package/apps/web/src/theme.ts +135 -0
  182. package/apps/web/src/title-model-settings.ts +51 -0
  183. package/apps/web/src/toolLine.ts +67 -0
  184. package/apps/web/src/ui/ListDetail.tsx +149 -0
  185. package/apps/web/src/ui/SectionLabel.tsx +7 -0
  186. package/apps/web/src/ui/SvgEdge.tsx +39 -0
  187. package/apps/web/src/ui/alert.tsx +75 -0
  188. package/apps/web/src/ui/badge.tsx +51 -0
  189. package/apps/web/src/ui/button.tsx +57 -0
  190. package/apps/web/src/ui/card.tsx +102 -0
  191. package/apps/web/src/ui/checkbox.tsx +26 -0
  192. package/apps/web/src/ui/dialog.tsx +250 -0
  193. package/apps/web/src/ui/dropdown-menu.tsx +265 -0
  194. package/apps/web/src/ui/empty.tsx +103 -0
  195. package/apps/web/src/ui/field.tsx +236 -0
  196. package/apps/web/src/ui/frame.css +4 -0
  197. package/apps/web/src/ui/index.ts +43 -0
  198. package/apps/web/src/ui/input.tsx +19 -0
  199. package/apps/web/src/ui/label.tsx +17 -0
  200. package/apps/web/src/ui/modal-controller.ts +70 -0
  201. package/apps/web/src/ui/modal.tsx +62 -0
  202. package/apps/web/src/ui/popover.tsx +102 -0
  203. package/apps/web/src/ui/progress.tsx +80 -0
  204. package/apps/web/src/ui/radio-group.tsx +35 -0
  205. package/apps/web/src/ui/select.tsx +198 -0
  206. package/apps/web/src/ui/separator.tsx +22 -0
  207. package/apps/web/src/ui/skeleton.tsx +13 -0
  208. package/apps/web/src/ui/spinner.tsx +10 -0
  209. package/apps/web/src/ui/switch.tsx +29 -0
  210. package/apps/web/src/ui/table.tsx +113 -0
  211. package/apps/web/src/ui/tabs.tsx +79 -0
  212. package/apps/web/src/ui/tailwind.css +21 -0
  213. package/apps/web/src/ui/textarea.tsx +17 -0
  214. package/apps/web/src/ui/theme.css +300 -0
  215. package/apps/web/src/ui/toggle-group.tsx +87 -0
  216. package/apps/web/src/ui/toggle.tsx +42 -0
  217. package/apps/web/src/ui/tooltip.tsx +63 -0
  218. package/apps/web/src/ui/useFileInput.ts +50 -0
  219. package/apps/web/src/virtual-plugins.d.ts +3 -0
  220. package/apps/web/src/vite-env.d.ts +1 -0
  221. package/package.json +82 -0
  222. package/packages/agent/package.json +64 -0
  223. package/packages/agent/src/config.ts +161 -0
  224. package/packages/agent/src/core/agent-session-runtime.ts +548 -0
  225. package/packages/agent/src/core/agent-session-services.ts +224 -0
  226. package/packages/agent/src/core/agent-session.ts +3357 -0
  227. package/packages/agent/src/core/auth-guidance.ts +18 -0
  228. package/packages/agent/src/core/auth-storage.ts +271 -0
  229. package/packages/agent/src/core/bash-executor.ts +156 -0
  230. package/packages/agent/src/core/compaction/branch-summarization.ts +372 -0
  231. package/packages/agent/src/core/compaction/compaction.ts +875 -0
  232. package/packages/agent/src/core/compaction/index.ts +7 -0
  233. package/packages/agent/src/core/compaction/utils.ts +174 -0
  234. package/packages/agent/src/core/defaults.ts +3 -0
  235. package/packages/agent/src/core/diagnostics.ts +15 -0
  236. package/packages/agent/src/core/event-bus.ts +33 -0
  237. package/packages/agent/src/core/exec.ts +107 -0
  238. package/packages/agent/src/core/experimental.ts +3 -0
  239. package/packages/agent/src/core/extensions/index.ts +149 -0
  240. package/packages/agent/src/core/extensions/loader.ts +709 -0
  241. package/packages/agent/src/core/extensions/runner.ts +1132 -0
  242. package/packages/agent/src/core/extensions/types.ts +1460 -0
  243. package/packages/agent/src/core/extensions/wrapper.ts +45 -0
  244. package/packages/agent/src/core/footer-data-provider.ts +388 -0
  245. package/packages/agent/src/core/http-dispatcher.ts +106 -0
  246. package/packages/agent/src/core/index.ts +78 -0
  247. package/packages/agent/src/core/messages.ts +195 -0
  248. package/packages/agent/src/core/model-config.ts +287 -0
  249. package/packages/agent/src/core/model-registry.ts +126 -0
  250. package/packages/agent/src/core/model-resolver.ts +675 -0
  251. package/packages/agent/src/core/model-runtime.ts +517 -0
  252. package/packages/agent/src/core/output-guard.ts +108 -0
  253. package/packages/agent/src/core/package-manager.ts +2441 -0
  254. package/packages/agent/src/core/prompt-templates.ts +284 -0
  255. package/packages/agent/src/core/provider-composer.ts +549 -0
  256. package/packages/agent/src/core/resolve-config-value.ts +287 -0
  257. package/packages/agent/src/core/resource-loader.ts +946 -0
  258. package/packages/agent/src/core/runtime-credentials.ts +48 -0
  259. package/packages/agent/src/core/sdk.ts +358 -0
  260. package/packages/agent/src/core/session-cwd.ts +59 -0
  261. package/packages/agent/src/core/session-manager.ts +1623 -0
  262. package/packages/agent/src/core/settings-manager.ts +1212 -0
  263. package/packages/agent/src/core/skills.ts +487 -0
  264. package/packages/agent/src/core/slash-commands.ts +41 -0
  265. package/packages/agent/src/core/source-info.ts +40 -0
  266. package/packages/agent/src/core/system-prompt.ts +147 -0
  267. package/packages/agent/src/core/timings.ts +50 -0
  268. package/packages/agent/src/core/tools/bash.ts +314 -0
  269. package/packages/agent/src/core/tools/edit-diff.ts +704 -0
  270. package/packages/agent/src/core/tools/edit.ts +222 -0
  271. package/packages/agent/src/core/tools/file-mutation-queue.ts +61 -0
  272. package/packages/agent/src/core/tools/index.ts +130 -0
  273. package/packages/agent/src/core/tools/output-accumulator.ts +222 -0
  274. package/packages/agent/src/core/tools/path-utils.ts +118 -0
  275. package/packages/agent/src/core/tools/read.ts +195 -0
  276. package/packages/agent/src/core/tools/tool-definition-wrapper.ts +45 -0
  277. package/packages/agent/src/core/tools/truncate.ts +276 -0
  278. package/packages/agent/src/core/tools/write.ts +90 -0
  279. package/packages/agent/src/core/trust-manager.ts +244 -0
  280. package/packages/agent/src/index.ts +287 -0
  281. package/packages/agent/src/utils/ansi.ts +60 -0
  282. package/packages/agent/src/utils/child-process.ts +137 -0
  283. package/packages/agent/src/utils/exif-orientation.ts +183 -0
  284. package/packages/agent/src/utils/frontmatter.ts +39 -0
  285. package/packages/agent/src/utils/fs-watch.ts +30 -0
  286. package/packages/agent/src/utils/git.ts +226 -0
  287. package/packages/agent/src/utils/image-convert.ts +49 -0
  288. package/packages/agent/src/utils/image-process.ts +119 -0
  289. package/packages/agent/src/utils/image-resize-core.ts +164 -0
  290. package/packages/agent/src/utils/image-resize-worker.ts +42 -0
  291. package/packages/agent/src/utils/image-resize.ts +123 -0
  292. package/packages/agent/src/utils/json.ts +6 -0
  293. package/packages/agent/src/utils/mime.ts +116 -0
  294. package/packages/agent/src/utils/paths.ts +118 -0
  295. package/packages/agent/src/utils/photon.ts +139 -0
  296. package/packages/agent/src/utils/shell.ts +225 -0
  297. package/packages/agent/src/utils/sleep.ts +18 -0
  298. package/packages/agent/src/utils/tools-manager.ts +63 -0
  299. package/packages/agent-core/package.json +32 -0
  300. package/packages/agent-core/src/agent-loop.ts +877 -0
  301. package/packages/agent-core/src/agent.ts +598 -0
  302. package/packages/agent-core/src/index.ts +4 -0
  303. package/packages/agent-core/src/types.ts +455 -0
  304. package/packages/agent-core/src/uuid.ts +54 -0
  305. package/packages/ai/package.json +46 -0
  306. package/packages/ai/src/api/ai-sdk-messages.ts +102 -0
  307. package/packages/ai/src/api/ai-sdk-transport.ts +53 -0
  308. package/packages/ai/src/api/ai-sdk.lazy.ts +4 -0
  309. package/packages/ai/src/api/ai-sdk.ts +273 -0
  310. package/packages/ai/src/api/lazy.ts +75 -0
  311. package/packages/ai/src/api/openrouter-images.lazy.ts +10 -0
  312. package/packages/ai/src/api/openrouter-images.ts +98 -0
  313. package/packages/ai/src/api/simple-options.ts +77 -0
  314. package/packages/ai/src/api/transform-messages.ts +185 -0
  315. package/packages/ai/src/api-registry.ts +226 -0
  316. package/packages/ai/src/auth/context.ts +45 -0
  317. package/packages/ai/src/auth/credential-store.ts +51 -0
  318. package/packages/ai/src/auth/helpers.ts +47 -0
  319. package/packages/ai/src/auth/resolve.ts +139 -0
  320. package/packages/ai/src/auth/types.ts +220 -0
  321. package/packages/ai/src/compat/extension-oauth-types.ts +45 -0
  322. package/packages/ai/src/env-api-keys.ts +24 -0
  323. package/packages/ai/src/image-models.generated.ts +533 -0
  324. package/packages/ai/src/images-models.ts +274 -0
  325. package/packages/ai/src/index.ts +33 -0
  326. package/packages/ai/src/models-store.ts +38 -0
  327. package/packages/ai/src/models.generated.ts +6 -0
  328. package/packages/ai/src/models.ts +705 -0
  329. package/packages/ai/src/oauth.ts +10 -0
  330. package/packages/ai/src/providers/all.ts +64 -0
  331. package/packages/ai/src/providers/faux.ts +539 -0
  332. package/packages/ai/src/providers/openrouter-images.ts +14 -0
  333. package/packages/ai/src/providers/openrouter.models.ts +6050 -0
  334. package/packages/ai/src/providers/openrouter.ts +15 -0
  335. package/packages/ai/src/session-resources.ts +24 -0
  336. package/packages/ai/src/types.ts +692 -0
  337. package/packages/ai/src/utils/abort-signals.ts +41 -0
  338. package/packages/ai/src/utils/deferred-tools.ts +39 -0
  339. package/packages/ai/src/utils/diagnostics.ts +45 -0
  340. package/packages/ai/src/utils/error-body.ts +129 -0
  341. package/packages/ai/src/utils/estimate.ts +146 -0
  342. package/packages/ai/src/utils/event-stream.ts +88 -0
  343. package/packages/ai/src/utils/hash.ts +13 -0
  344. package/packages/ai/src/utils/headers.ts +18 -0
  345. package/packages/ai/src/utils/json-parse.ts +124 -0
  346. package/packages/ai/src/utils/node-http-proxy.ts +112 -0
  347. package/packages/ai/src/utils/overflow.ts +165 -0
  348. package/packages/ai/src/utils/provider-env.ts +52 -0
  349. package/packages/ai/src/utils/retry.ts +101 -0
  350. package/packages/ai/src/utils/sanitize-unicode.ts +25 -0
  351. package/packages/ai/src/utils/typebox-helpers.ts +24 -0
  352. package/packages/ai/src/utils/validation.ts +383 -0
  353. package/packages/ragents/package.json +31 -0
  354. package/packages/ragents/src/access.ts +54 -0
  355. package/packages/ragents/src/agents/actor-input.ts +191 -0
  356. package/packages/ragents/src/agents/catalog.ts +220 -0
  357. package/packages/ragents/src/agents/delivery.ts +187 -0
  358. package/packages/ragents/src/agents/live.ts +71 -0
  359. package/packages/ragents/src/agents/plugins.ts +130 -0
  360. package/packages/ragents/src/agents/scheduler.ts +1048 -0
  361. package/packages/ragents/src/agents/schemas.ts +64 -0
  362. package/packages/ragents/src/agents/tool-orientation.ts +12 -0
  363. package/packages/ragents/src/agents/tools.ts +709 -0
  364. package/packages/ragents/src/agents/toolset.ts +324 -0
  365. package/packages/ragents/src/agents/turn.ts +65 -0
  366. package/packages/ragents/src/agents/workspace-tools.ts +11 -0
  367. package/packages/ragents/src/agents/workspaces.ts +15 -0
  368. package/packages/ragents/src/domain/draft.ts +11 -0
  369. package/packages/ragents/src/domain/driver.ts +56 -0
  370. package/packages/ragents/src/domain/event-semantics.ts +668 -0
  371. package/packages/ragents/src/domain/event-validation.ts +620 -0
  372. package/packages/ragents/src/domain/events.ts +236 -0
  373. package/packages/ragents/src/domain/json-patch.ts +77 -0
  374. package/packages/ragents/src/domain/json.ts +86 -0
  375. package/packages/ragents/src/domain/model.ts +267 -0
  376. package/packages/ragents/src/domain/plugin-state.ts +33 -0
  377. package/packages/ragents/src/domain/portable-id.ts +9 -0
  378. package/packages/ragents/src/domain/projection.ts +506 -0
  379. package/packages/ragents/src/domain/schema-errors.ts +56 -0
  380. package/packages/ragents/src/domain/vocabulary.ts +37 -0
  381. package/packages/ragents/src/drivers/agent-runtime.ts +1503 -0
  382. package/packages/ragents/src/drivers/agent.ts +108 -0
  383. package/packages/ragents/src/drivers/attachments.ts +56 -0
  384. package/packages/ragents/src/drivers/skill-preload.ts +205 -0
  385. package/packages/ragents/src/drivers/types.ts +77 -0
  386. package/packages/ragents/src/http/contracts.ts +80 -0
  387. package/packages/ragents/src/http/methods.ts +150 -0
  388. package/packages/ragents/src/index.ts +161 -0
  389. package/packages/ragents/src/plugin-host.ts +1184 -0
  390. package/packages/ragents/src/plugin-types.ts +373 -0
  391. package/packages/ragents/src/rpc/contract.ts +76 -0
  392. package/packages/ragents/src/rpc/contribution.ts +67 -0
  393. package/packages/ragents/src/rpc/peer.ts +208 -0
  394. package/packages/ragents/src/rpc/protocol.ts +129 -0
  395. package/packages/ragents/src/runtime/artifacts.ts +95 -0
  396. package/packages/ragents/src/runtime/canonical-hash.ts +5 -0
  397. package/packages/ragents/src/runtime/canonical-json.ts +41 -0
  398. package/packages/ragents/src/runtime/command.ts +35 -0
  399. package/packages/ragents/src/runtime/decisions/actions.ts +77 -0
  400. package/packages/ragents/src/runtime/decisions/actors.ts +283 -0
  401. package/packages/ragents/src/runtime/decisions/artifacts.ts +28 -0
  402. package/packages/ragents/src/runtime/decisions/inputs.ts +79 -0
  403. package/packages/ragents/src/runtime/decisions/subscriptions.ts +135 -0
  404. package/packages/ragents/src/runtime/decisions/turns.ts +166 -0
  405. package/packages/ragents/src/runtime/domain-error.ts +10 -0
  406. package/packages/ragents/src/runtime/durable-fs.ts +13 -0
  407. package/packages/ragents/src/runtime/failures.ts +18 -0
  408. package/packages/ragents/src/runtime/guards.ts +196 -0
  409. package/packages/ragents/src/runtime/journal-storage.ts +228 -0
  410. package/packages/ragents/src/runtime/journal.ts +952 -0
  411. package/packages/ragents/src/runtime/orchestration.ts +711 -0
  412. package/packages/ragents/src/runtime/serial-queue.ts +13 -0
  413. package/packages/ragents/src/runtime/services.ts +15 -0
  414. package/packages/ragents/src/runtime/stop.ts +186 -0
  415. package/packages/ragents/src/script/driver.ts +18 -0
  416. package/packages/ragents/src/script/mediators.ts +386 -0
  417. package/packages/ragents/src/script/programs.ts +10 -0
  418. package/packages/ragents/src/script/std.ts +27 -0
  419. package/packages/ragents/src/script/types.ts +6 -0
  420. package/packages/ragents/src/typescript/async-compiler.ts +322 -0
  421. package/packages/ragents/src/typescript/build-contract.ts +14 -0
  422. package/packages/ragents/src/typescript/compiler-worker.ts +52 -0
  423. package/packages/ragents/src/typescript/compiler.ts +304 -0
  424. package/packages/ragents/src/typescript/index.ts +48 -0
  425. package/packages/ragents/src/typescript/native-executor.ts +40 -0
  426. package/packages/ragents/src/typescript/native-program.ts +5 -0
  427. package/packages/ragents/src/typescript/run-context.ts +199 -0
  428. package/packages/ragents/src/typescript/schema.ts +176 -0
  429. package/packages/ragents/src/typescript/snippet.ts +121 -0
  430. package/packages/workspace-executor/package.json +25 -0
  431. package/packages/workspace-executor/src/context.ts +123 -0
  432. package/packages/workspace-executor/src/executor.ts +134 -0
  433. package/packages/workspace-executor/src/git-config-environment.ts +10 -0
  434. package/packages/workspace-executor/src/index.ts +52 -0
  435. package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +59 -0
  436. package/packages/workspace-executor/src/language-server/adapters/index.ts +7 -0
  437. package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +54 -0
  438. package/packages/workspace-executor/src/language-server/adapters/typescript.ts +46 -0
  439. package/packages/workspace-executor/src/language-server/contract.ts +23 -0
  440. package/packages/workspace-executor/src/language-server/diagnostics.ts +62 -0
  441. package/packages/workspace-executor/src/language-server/host.ts +409 -0
  442. package/packages/workspace-executor/src/language-server/json-rpc.ts +103 -0
  443. package/packages/workspace-executor/src/language-server/roots.ts +29 -0
  444. package/packages/workspace-executor/src/language-server/session.ts +442 -0
  445. package/packages/workspace-executor/src/language-server/solution.ts +13 -0
  446. package/packages/workspace-executor/src/managed-process.ts +329 -0
  447. package/packages/workspace-executor/src/paths.ts +43 -0
  448. package/packages/workspace-executor/src/run-marker.ts +6 -0
  449. package/packages/workspace-executor/src/safe-environment.ts +47 -0
  450. package/packages/workspace-executor/src/sandbox-tools.ts +258 -0
  451. package/packages/workspace-executor/src/session-ident.ts +37 -0
  452. package/packages/workspace-executor/src/shell-platform.ts +11 -0
  453. package/packages/workspace-executor/src/tools.ts +28 -0
  454. package/plugins/package.json +8 -0
  455. package/plugins/ragents.activity/server/index.ts +9 -0
  456. package/plugins/ragents.activity/web/ActivityHeader.tsx +58 -0
  457. package/plugins/ragents.activity/web/activity.ts +144 -0
  458. package/plugins/ragents.activity/web/index.tsx +13 -0
  459. package/plugins/ragents.actor-programs/client-ui/DataTable.tsx +100 -0
  460. package/plugins/ragents.actor-programs/client-ui/FilePicker.tsx +65 -0
  461. package/plugins/ragents.actor-programs/client-ui/FlowDiagram.tsx +234 -0
  462. package/plugins/ragents.actor-programs/client-ui/FlowDiagramRenderer.tsx +85 -0
  463. package/plugins/ragents.actor-programs/client-ui/Form.tsx +126 -0
  464. package/plugins/ragents.actor-programs/client-ui/Layout.tsx +27 -0
  465. package/plugins/ragents.actor-programs/client-ui/MessageList.tsx +30 -0
  466. package/plugins/ragents.actor-programs/client-ui/Viewers.tsx +41 -0
  467. package/plugins/ragents.actor-programs/client-ui/WorkflowDiagram.tsx +14 -0
  468. package/plugins/ragents.actor-programs/client-ui/contracts.d.ts +84 -0
  469. package/plugins/ragents.actor-programs/client-ui/file-contracts.d.ts +19 -0
  470. package/plugins/ragents.actor-programs/client-ui/file-selection.ts +24 -0
  471. package/plugins/ragents.actor-programs/client-ui/flow-diagram-contracts.d.ts +27 -0
  472. package/plugins/ragents.actor-programs/client-ui/flow-diagram.css +23 -0
  473. package/plugins/ragents.actor-programs/client-ui/form-contracts.d.ts +38 -0
  474. package/plugins/ragents.actor-programs/client-ui/frame-layout.ts +4 -0
  475. package/plugins/ragents.actor-programs/client-ui/index.tsx +81 -0
  476. package/plugins/ragents.actor-programs/client-ui/layout-contracts.d.ts +33 -0
  477. package/plugins/ragents.actor-programs/client-ui/message-list-contracts.d.ts +33 -0
  478. package/plugins/ragents.actor-programs/client-ui/table-contracts.d.ts +35 -0
  479. package/plugins/ragents.actor-programs/client-ui/viewer-contracts.d.ts +37 -0
  480. package/plugins/ragents.actor-programs/client-ui/workflow-diagram-contracts.d.ts +10 -0
  481. package/plugins/ragents.actor-programs/contract.ts +180 -0
  482. package/plugins/ragents.actor-programs/parameter-types.ts +3 -0
  483. package/plugins/ragents.actor-programs/prompt.hbs +79 -0
  484. package/plugins/ragents.actor-programs/server/agent-tools.ts +31 -0
  485. package/plugins/ragents.actor-programs/server/app-project.ts +284 -0
  486. package/plugins/ragents.actor-programs/server/authoring-contracts.ts +10 -0
  487. package/plugins/ragents.actor-programs/server/client-compiler.ts +174 -0
  488. package/plugins/ragents.actor-programs/server/client-contracts.ts +187 -0
  489. package/plugins/ragents.actor-programs/server/client-runtime.ts +16 -0
  490. package/plugins/ragents.actor-programs/server/controls-template.ts +118 -0
  491. package/plugins/ragents.actor-programs/server/controls-tool.ts +48 -0
  492. package/plugins/ragents.actor-programs/server/index.ts +51 -0
  493. package/plugins/ragents.actor-programs/server/methods.ts +72 -0
  494. package/plugins/ragents.actor-programs/server/project-diagnostics.ts +138 -0
  495. package/plugins/ragents.actor-programs/server/prompts.ts +21 -0
  496. package/plugins/ragents.actor-programs/server/routes.ts +235 -0
  497. package/plugins/ragents.actor-programs/server/runtime-libraries.ts +4 -0
  498. package/plugins/ragents.actor-programs/server/runtime.ts +721 -0
  499. package/plugins/ragents.actor-programs/server/tailwind.ts +22 -0
  500. package/plugins/ragents.actor-programs/server/templates.ts +400 -0
  501. package/plugins/ragents.actor-programs/server/tool-contributor.ts +29 -0
  502. package/plugins/ragents.actor-programs/summary.hbs +17 -0
  503. package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +463 -0
  504. package/plugins/ragents.actor-programs/web/AppsPanel.tsx +436 -0
  505. package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +116 -0
  506. package/plugins/ragents.actor-programs/web/ExpandIcon.tsx +5 -0
  507. package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +31 -0
  508. package/plugins/ragents.actor-programs/web/FunctionForm.tsx +102 -0
  509. package/plugins/ragents.actor-programs/web/ProgramSource.tsx +81 -0
  510. package/plugins/ragents.actor-programs/web/api.ts +353 -0
  511. package/plugins/ragents.actor-programs/web/bridge.ts +122 -0
  512. package/plugins/ragents.actor-programs/web/chat-state.ts +37 -0
  513. package/plugins/ragents.actor-programs/web/context.ts +30 -0
  514. package/plugins/ragents.actor-programs/web/function-call.ts +28 -0
  515. package/plugins/ragents.actor-programs/web/function-input.ts +40 -0
  516. package/plugins/ragents.actor-programs/web/index.tsx +96 -0
  517. package/plugins/ragents.actor-programs/web/invocations.ts +43 -0
  518. package/plugins/ragents.actor-programs/web/program-state.ts +68 -0
  519. package/plugins/ragents.actor-programs/web/state-revision.ts +16 -0
  520. package/plugins/ragents.actor-programs/workflow/index.ts +202 -0
  521. package/plugins/ragents.actor-programs/workflow/prompt-reader.ts +15 -0
  522. package/plugins/ragents.ask/ask.hbs +4 -0
  523. package/plugins/ragents.ask/contract.ts +17 -0
  524. package/plugins/ragents.ask/server/answer-method.ts +15 -0
  525. package/plugins/ragents.ask/server/ask-service.ts +152 -0
  526. package/plugins/ragents.ask/server/ask-tool.ts +39 -0
  527. package/plugins/ragents.ask/server/contract.ts +22 -0
  528. package/plugins/ragents.ask/server/index.ts +26 -0
  529. package/plugins/ragents.ask/server/tool-contributor.ts +11 -0
  530. package/plugins/ragents.ask/web/QuestionSection.tsx +47 -0
  531. package/plugins/ragents.ask/web/api.ts +6 -0
  532. package/plugins/ragents.ask/web/constants.ts +1 -0
  533. package/plugins/ragents.ask/web/index.tsx +50 -0
  534. package/plugins/ragents.browser/provision.ts +48 -0
  535. package/plugins/ragents.browser/server/browser.ts +393 -0
  536. package/plugins/ragents.browser/server/contract.ts +36 -0
  537. package/plugins/ragents.browser/server/index.ts +35 -0
  538. package/plugins/ragents.browser/server/tools.ts +197 -0
  539. package/plugins/ragents.browser/skills/browser-testing/SKILL.md +36 -0
  540. package/plugins/ragents.documents/contract.ts +33 -0
  541. package/plugins/ragents.documents/prompt.hbs +18 -0
  542. package/plugins/ragents.documents/server/config.ts +14 -0
  543. package/plugins/ragents.documents/server/document-write-tool.ts +45 -0
  544. package/plugins/ragents.documents/server/files-route.ts +137 -0
  545. package/plugins/ragents.documents/server/index.ts +38 -0
  546. package/plugins/ragents.documents/server/show-document-tool.ts +73 -0
  547. package/plugins/ragents.documents/server/store.ts +35 -0
  548. package/plugins/ragents.documents/server/tool-contributor.ts +16 -0
  549. package/plugins/ragents.documents/web/DocumentViewer.tsx +450 -0
  550. package/plugins/ragents.documents/web/api.ts +8 -0
  551. package/plugins/ragents.documents/web/index.tsx +279 -0
  552. package/plugins/ragents.lsp-fsharp/provision.ts +74 -0
  553. package/plugins/ragents.lsp-fsharp/server/index.ts +16 -0
  554. package/plugins/ragents.lsp-fsharp/web/index.tsx +7 -0
  555. package/plugins/ragents.lsp-roslyn/provision.ts +54 -0
  556. package/plugins/ragents.lsp-roslyn/server/index.ts +15 -0
  557. package/plugins/ragents.lsp-roslyn/web/api.ts +10 -0
  558. package/plugins/ragents.lsp-roslyn/web/index.tsx +7 -0
  559. package/plugins/ragents.lsp-roslyn/web/language-server-plugin.tsx +236 -0
  560. package/plugins/ragents.lsp-typescript/server/index.ts +7 -0
  561. package/plugins/ragents.lsp-typescript/web/index.tsx +7 -0
  562. package/plugins/ragents.model-relay/server/config.ts +37 -0
  563. package/plugins/ragents.model-relay/server/index.ts +31 -0
  564. package/plugins/ragents.model-relay/server/relay.ts +213 -0
  565. package/plugins/ragents.orchestration/canvas.hbs +50 -0
  566. package/plugins/ragents.orchestration/contract.ts +322 -0
  567. package/plugins/ragents.orchestration/orchestration.hbs +105 -0
  568. package/plugins/ragents.orchestration/server/canvas-tool.ts +248 -0
  569. package/plugins/ragents.orchestration/server/index.ts +64 -0
  570. package/plugins/ragents.orchestration/server/run-stop-tool.ts +30 -0
  571. package/plugins/ragents.orchestration/tiled-layout.ts +47 -0
  572. package/plugins/ragents.orchestration/web/ActorCanvasControls.tsx +159 -0
  573. package/plugins/ragents.orchestration/web/ActorChat.tsx +56 -0
  574. package/plugins/ragents.orchestration/web/ActorChatControls.tsx +64 -0
  575. package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +36 -0
  576. package/plugins/ragents.orchestration/web/ActorNet.tsx +607 -0
  577. package/plugins/ragents.orchestration/web/ActorPopout.tsx +36 -0
  578. package/plugins/ragents.orchestration/web/ActorShortcut.tsx +76 -0
  579. package/plugins/ragents.orchestration/web/ActorTile.tsx +22 -0
  580. package/plugins/ragents.orchestration/web/CanvasStartup.tsx +14 -0
  581. package/plugins/ragents.orchestration/web/CanvasTiles.tsx +47 -0
  582. package/plugins/ragents.orchestration/web/CardSizeSettings.tsx +42 -0
  583. package/plugins/ragents.orchestration/web/Center.tsx +576 -0
  584. package/plugins/ragents.orchestration/web/DocumentsSection.tsx +37 -0
  585. package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +109 -0
  586. package/plugins/ragents.orchestration/web/FlowInspector.tsx +932 -0
  587. package/plugins/ragents.orchestration/web/JournalStatus.tsx +87 -0
  588. package/plugins/ragents.orchestration/web/MaterialBody.tsx +104 -0
  589. package/plugins/ragents.orchestration/web/ScriptActorCard.tsx +56 -0
  590. package/plugins/ragents.orchestration/web/StopRunButton.tsx +52 -0
  591. package/plugins/ragents.orchestration/web/TiledCanvas.tsx +281 -0
  592. package/plugins/ragents.orchestration/web/ZoomSettings.tsx +38 -0
  593. package/plugins/ragents.orchestration/web/actor-conversation.ts +64 -0
  594. package/plugins/ragents.orchestration/web/actor-header-settings.ts +41 -0
  595. package/plugins/ragents.orchestration/web/api.ts +33 -0
  596. package/plugins/ragents.orchestration/web/canvas-layout-storage.ts +39 -0
  597. package/plugins/ragents.orchestration/web/canvas-layout.ts +326 -0
  598. package/plugins/ragents.orchestration/web/canvas-scene.ts +311 -0
  599. package/plugins/ragents.orchestration/web/canvas-stage.ts +21 -0
  600. package/plugins/ragents.orchestration/web/canvas-startup.ts +36 -0
  601. package/plugins/ragents.orchestration/web/canvas-view-settings.ts +48 -0
  602. package/plugins/ragents.orchestration/web/card-size-settings.ts +36 -0
  603. package/plugins/ragents.orchestration/web/column/AddresseeControl.tsx +116 -0
  604. package/plugins/ragents.orchestration/web/column/ColumnSettings.tsx +50 -0
  605. package/plugins/ragents.orchestration/web/column/RunColumn.tsx +370 -0
  606. package/plugins/ragents.orchestration/web/column/column-actors.ts +38 -0
  607. package/plugins/ragents.orchestration/web/column/column-settings.ts +47 -0
  608. package/plugins/ragents.orchestration/web/column/column-state.ts +59 -0
  609. package/plugins/ragents.orchestration/web/column/sheet-status.ts +30 -0
  610. package/plugins/ragents.orchestration/web/constants.ts +10 -0
  611. package/plugins/ragents.orchestration/web/contract.ts +25 -0
  612. package/plugins/ragents.orchestration/web/executions.ts +124 -0
  613. package/plugins/ragents.orchestration/web/format.ts +4 -0
  614. package/plugins/ragents.orchestration/web/index.tsx +182 -0
  615. package/plugins/ragents.orchestration/web/keyboard-navigation.ts +55 -0
  616. package/plugins/ragents.orchestration/web/material-layout.ts +14 -0
  617. package/plugins/ragents.orchestration/web/run-view.ts +199 -0
  618. package/plugins/ragents.orchestration/web/tile-docking.ts +99 -0
  619. package/plugins/ragents.orchestration/web/tiled-view-settings.ts +76 -0
  620. package/plugins/ragents.orchestration/web/useCanvasMeasurements.ts +78 -0
  621. package/plugins/ragents.orchestration/web/zoom-settings.ts +28 -0
  622. package/plugins/ragents.overseer/contract.ts +165 -0
  623. package/plugins/ragents.overseer/server/api.ts +82 -0
  624. package/plugins/ragents.overseer/server/coordinator-prompt.ts +13 -0
  625. package/plugins/ragents.overseer/server/index.ts +71 -0
  626. package/plugins/ragents.overseer/server/orientation.ts +33 -0
  627. package/plugins/ragents.overseer/server/quick-answer.ts +54 -0
  628. package/plugins/ragents.overseer/server/reset-method.ts +5 -0
  629. package/plugins/ragents.overseer/server/run-directory.ts +49 -0
  630. package/plugins/ragents.overseer/server/settings-method.ts +8 -0
  631. package/plugins/ragents.overseer/server/settings.ts +83 -0
  632. package/plugins/ragents.overseer/server/user-location.ts +96 -0
  633. package/plugins/ragents.overseer/web/ModelSettings.tsx +70 -0
  634. package/plugins/ragents.overseer/web/chat-display.ts +10 -0
  635. package/plugins/ragents.overseer/web/index.tsx +208 -0
  636. package/plugins/ragents.overseer/web/model-settings.ts +61 -0
  637. package/plugins/ragents.overseer/web/quick-answers.ts +64 -0
  638. package/plugins/ragents.processes/contract.ts +61 -0
  639. package/plugins/ragents.processes/server/index.ts +36 -0
  640. package/plugins/ragents.processes/server/methods.ts +39 -0
  641. package/plugins/ragents.processes/server/observer.ts +179 -0
  642. package/plugins/ragents.processes/server/process-table.ts +395 -0
  643. package/plugins/ragents.processes/server/snapshot.ts +63 -0
  644. package/plugins/ragents.processes/server/terminator.ts +164 -0
  645. package/plugins/ragents.processes/web/ProcessHeader.tsx +157 -0
  646. package/plugins/ragents.processes/web/index.tsx +23 -0
  647. package/plugins/ragents.processes/web/processes.ts +75 -0
  648. package/plugins/ragents.product/model-settings-contract.ts +10 -0
  649. package/plugins/ragents.product/preamble.hbs +9 -0
  650. package/plugins/ragents.product/server/config.ts +73 -0
  651. package/plugins/ragents.product/server/index.ts +117 -0
  652. package/plugins/ragents.product/server/relay.ts +118 -0
  653. package/plugins/ragents.product/server/runtime.ts +30 -0
  654. package/plugins/ragents.product/web/ModelControl.tsx +81 -0
  655. package/plugins/ragents.product/web/ProductModelSettings.tsx +131 -0
  656. package/plugins/ragents.product/web/SystemPromptControl.tsx +136 -0
  657. package/plugins/ragents.product/web/index.tsx +29 -0
  658. package/plugins/ragents.product/web/model-settings.ts +39 -0
  659. package/plugins/ragents.product/web/start-options.tsx +12 -0
  660. package/plugins/ragents.profile-distribution/contract.ts +38 -0
  661. package/plugins/ragents.profile-distribution/server/archive.ts +159 -0
  662. package/plugins/ragents.profile-distribution/server/config.ts +27 -0
  663. package/plugins/ragents.profile-distribution/server/index.ts +93 -0
  664. package/plugins/ragents.profile-distribution/server/web.ts +48 -0
  665. package/plugins/ragents.reference/examples.ts +33 -0
  666. package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +27 -0
  667. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +10 -0
  668. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +80 -0
  669. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +82 -0
  670. package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +154 -0
  671. package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +9 -0
  672. package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +32 -0
  673. package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +59 -0
  674. package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +14 -0
  675. package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +9 -0
  676. package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +87 -0
  677. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +26 -0
  678. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +32 -0
  679. package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +24 -0
  680. package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +10 -0
  681. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -0
  682. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +5 -0
  683. package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -0
  684. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +27 -0
  685. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +127 -0
  686. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/state.ts +38 -0
  687. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +42 -0
  688. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +38 -0
  689. package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +223 -0
  690. package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +12 -0
  691. package/plugins/ragents.reference/run-scripts/moderated-round/package.json +9 -0
  692. package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +60 -0
  693. package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +26 -0
  694. package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +24 -0
  695. package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +18 -0
  696. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +16 -0
  697. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +39 -0
  698. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +15 -0
  699. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/server.ts +14 -0
  700. package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +13 -0
  701. package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +9 -0
  702. package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +65 -0
  703. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +26 -0
  704. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +42 -0
  705. package/plugins/ragents.reference/run-scripts/word-game/RUN.md +25 -0
  706. package/plugins/ragents.reference/run-scripts/word-game/package.json +11 -0
  707. package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +27 -0
  708. package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +23 -0
  709. package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +106 -0
  710. package/plugins/ragents.reference/run-scripts/word-game/src/state.ts +22 -0
  711. package/plugins/ragents.reference/run-scripts/word-game/src/view.tsx +54 -0
  712. package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +253 -0
  713. package/plugins/ragents.reference/server/index.ts +12 -0
  714. package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +12 -0
  715. package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +12 -0
  716. package/plugins/ragents.reference/skills/120-canvas-conversation-circle/SKILL.md +12 -0
  717. package/plugins/ragents.reference/skills/130-canvas-pipeline-with-approval/SKILL.md +12 -0
  718. package/plugins/ragents.reference/skills/140-canvas-team-tree-and-topic-grid/SKILL.md +12 -0
  719. package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +12 -0
  720. package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +12 -0
  721. package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +12 -0
  722. package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +12 -0
  723. package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +12 -0
  724. package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +12 -0
  725. package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +12 -0
  726. package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +12 -0
  727. package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +12 -0
  728. package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +12 -0
  729. package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +12 -0
  730. package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +12 -0
  731. package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +12 -0
  732. package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +12 -0
  733. package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +12 -0
  734. package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +12 -0
  735. package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +12 -0
  736. package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +12 -0
  737. package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +12 -0
  738. package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +12 -0
  739. package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +12 -0
  740. package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +12 -0
  741. package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +12 -0
  742. package/plugins/ragents.reference/skills/decision-brief/SKILL.md +33 -0
  743. package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +33 -0
  744. package/plugins/ragents.reference/walkthroughs.ts +219 -0
  745. package/plugins/ragents.reference/web/StartGuides.tsx +89 -0
  746. package/plugins/ragents.reference/web/index.tsx +10 -0
  747. package/plugins/ragents.todo/contract.ts +60 -0
  748. package/plugins/ragents.todo/server/index.ts +10 -0
  749. package/plugins/ragents.todo/server/todo-tool.ts +70 -0
  750. package/plugins/ragents.todo/server/tool-contributor.ts +9 -0
  751. package/plugins/ragents.todo/web/TodoSection.tsx +47 -0
  752. package/plugins/ragents.todo/web/index.ts +12 -0
  753. package/plugins/ragents.transcript/server/index.ts +20 -0
  754. package/plugins/ragents.transcript/server/transcript.ts +78 -0
  755. package/plugins/ragents.watch/contract.ts +48 -0
  756. package/plugins/ragents.watch/server/condition.ts +56 -0
  757. package/plugins/ragents.watch/server/contract.ts +4 -0
  758. package/plugins/ragents.watch/server/functions.ts +62 -0
  759. package/plugins/ragents.watch/server/index.ts +39 -0
  760. package/plugins/ragents.watch/server/observation.ts +69 -0
  761. package/plugins/ragents.watch/server/service.ts +294 -0
  762. package/plugins/ragents.workspace/client/transport.ts +13 -0
  763. package/plugins/ragents.workspace/client/workspace-client.ts +247 -0
  764. package/plugins/ragents.workspace/contract.ts +182 -0
  765. package/plugins/ragents.workspace/prompt.hbs +14 -0
  766. package/plugins/ragents.workspace/server/binding.ts +92 -0
  767. package/plugins/ragents.workspace/server/browse-route.ts +134 -0
  768. package/plugins/ragents.workspace/server/clients.ts +161 -0
  769. package/plugins/ragents.workspace/server/index.ts +91 -0
  770. package/plugins/ragents.workspace/server/runtime.ts +170 -0
  771. package/plugins/ragents.workspace/web/FileBrowser.tsx +271 -0
  772. package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +216 -0
  773. package/plugins/ragents.workspace/web/api.ts +8 -0
  774. package/plugins/ragents.workspace/web/file-icons.tsx +94 -0
  775. package/plugins/ragents.workspace/web/index.tsx +37 -0
  776. package/ragents.config.core.ts +65 -0
  777. package/ragents.config.developer.ts +46 -0
  778. package/scripts/agent/agent-cli.ts +461 -0
  779. package/scripts/agent/journal.ts +125 -0
  780. package/scripts/package/build-package.ts +249 -0
  781. package/scripts/package/host-links.d.mts +1 -0
  782. package/scripts/package/host-links.mjs +39 -0
  783. package/scripts/package/publish-package.ts +129 -0
  784. package/scripts/package/ragents.mjs +59 -0
  785. package/scripts/provision/run-provision.ts +72 -0
  786. package/scripts/remote/connect.ts +265 -0
  787. package/scripts/remote/start.ts +91 -0
  788. package/scripts/workspace-client/run-workspace-client.ts +112 -0
@@ -0,0 +1,185 @@
1
+ import type {
2
+ Api,
3
+ AssistantMessage,
4
+ Message,
5
+ Model,
6
+ ToolCall,
7
+ ToolResultMessage,
8
+ } from "../types.ts";
9
+
10
+ function validateInputModalities<TApi extends Api>(messages: Message[], model: Model<TApi>): void {
11
+ for (const message of messages) {
12
+ if ((message.role !== "user" && message.role !== "toolResult") || !Array.isArray(message.content)) continue;
13
+ for (const block of message.content) {
14
+ if (block.type !== "text" && !model.input.includes(block.type)) {
15
+ throw new Error(`Model ${model.id} does not support ${block.type} input. Supported inputs: ${model.input.join(", ")}.`);
16
+ }
17
+ }
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Normalize tool call ID for cross-provider compatibility.
23
+ * OpenAI Responses API generates IDs that are 450+ chars with special characters like `|`.
24
+ * Anthropic APIs require IDs matching ^[a-zA-Z0-9_-]+$ (max 64 chars).
25
+ */
26
+ export function transformMessages<TApi extends Api>(
27
+ messages: Message[],
28
+ model: Model<TApi>,
29
+ normalizeToolCallId?: (id: string, model: Model<TApi>, source: AssistantMessage) => string,
30
+ ): Message[] {
31
+ // Build a map of original tool call IDs to normalized IDs
32
+ const toolCallIdMap = new Map<string, string>();
33
+ // Normalize null/undefined content from untyped callers (custom tools, hand-built
34
+ // histories, old session files) so downstream code can rely on the type contract.
35
+ const normalizedMessages = messages.map((msg) => (msg.content == null ? { ...msg, content: [] } : msg));
36
+ validateInputModalities(normalizedMessages, model);
37
+
38
+ // First pass: transform thinking blocks and tool call IDs.
39
+ const transformed = normalizedMessages.map((msg) => {
40
+ // User messages pass through unchanged
41
+ if (msg.role === "user") {
42
+ return msg;
43
+ }
44
+
45
+ // Handle toolResult messages - normalize toolCallId if we have a mapping
46
+ if (msg.role === "toolResult") {
47
+ const normalizedId = toolCallIdMap.get(msg.toolCallId);
48
+ if (normalizedId && normalizedId !== msg.toolCallId) {
49
+ return { ...msg, toolCallId: normalizedId };
50
+ }
51
+ return msg;
52
+ }
53
+
54
+ // Assistant messages need transformation check
55
+ if (msg.role === "assistant") {
56
+ const assistantMsg = msg as AssistantMessage;
57
+ const isSameModel =
58
+ assistantMsg.provider === model.provider &&
59
+ assistantMsg.api === model.api &&
60
+ assistantMsg.model === model.id;
61
+
62
+ const transformedContent = assistantMsg.content.flatMap((block) => {
63
+ if (block.type === "thinking") {
64
+ // Redacted thinking is opaque encrypted content, only valid for the same model.
65
+ // Drop it for cross-model to avoid API errors.
66
+ if (block.redacted) {
67
+ return isSameModel ? block : [];
68
+ }
69
+ // For same model: keep thinking blocks with signatures (needed for replay)
70
+ // even if the thinking text is empty (OpenAI encrypted reasoning)
71
+ if (isSameModel && block.thinkingSignature) return block;
72
+ // Skip empty thinking blocks, convert others to plain text
73
+ if (!block.thinking || block.thinking.trim() === "") return [];
74
+ if (isSameModel) return block;
75
+ return {
76
+ type: "text" as const,
77
+ text: block.thinking,
78
+ };
79
+ }
80
+
81
+ if (block.type === "text") {
82
+ if (isSameModel) return block;
83
+ return {
84
+ type: "text" as const,
85
+ text: block.text,
86
+ };
87
+ }
88
+
89
+ if (block.type === "toolCall") {
90
+ const toolCall = block as ToolCall;
91
+ let normalizedToolCall: ToolCall = toolCall;
92
+
93
+ if (!isSameModel && toolCall.thoughtSignature) {
94
+ normalizedToolCall = { ...toolCall };
95
+ delete (normalizedToolCall as { thoughtSignature?: string }).thoughtSignature;
96
+ }
97
+
98
+ if (!isSameModel && normalizeToolCallId) {
99
+ const normalizedId = normalizeToolCallId(toolCall.id, model, assistantMsg);
100
+ if (normalizedId !== toolCall.id) {
101
+ toolCallIdMap.set(toolCall.id, normalizedId);
102
+ normalizedToolCall = { ...normalizedToolCall, id: normalizedId };
103
+ }
104
+ }
105
+
106
+ return normalizedToolCall;
107
+ }
108
+
109
+ return block;
110
+ });
111
+
112
+ return {
113
+ ...assistantMsg,
114
+ content: transformedContent,
115
+ };
116
+ }
117
+ return msg;
118
+ });
119
+
120
+ // Second pass: insert synthetic empty tool results for orphaned tool calls
121
+ // This preserves thinking signatures and satisfies API requirements
122
+ const result: Message[] = [];
123
+ let pendingToolCalls: ToolCall[] = [];
124
+ let existingToolResultIds = new Set<string>();
125
+ const insertSyntheticToolResults = () => {
126
+ if (pendingToolCalls.length > 0) {
127
+ for (const tc of pendingToolCalls) {
128
+ if (!existingToolResultIds.has(tc.id)) {
129
+ result.push({
130
+ role: "toolResult",
131
+ toolCallId: tc.id,
132
+ toolName: tc.name,
133
+ content: [{ type: "text", text: "No result provided" }],
134
+ isError: true,
135
+ timestamp: Date.now(),
136
+ } as ToolResultMessage);
137
+ }
138
+ }
139
+ pendingToolCalls = [];
140
+ existingToolResultIds = new Set();
141
+ }
142
+ };
143
+
144
+ for (let i = 0; i < transformed.length; i++) {
145
+ const msg = transformed[i];
146
+
147
+ if (msg.role === "assistant") {
148
+ // If we have pending orphaned tool calls from a previous assistant, insert synthetic results now
149
+ insertSyntheticToolResults();
150
+
151
+ // Skip errored/aborted assistant messages entirely.
152
+ // These are incomplete turns that shouldn't be replayed:
153
+ // - May have partial content (reasoning without message, incomplete tool calls)
154
+ // - Replaying them can cause API errors (e.g., OpenAI "reasoning without following item")
155
+ // - The model should retry from the last valid state
156
+ const assistantMsg = msg as AssistantMessage;
157
+ if (assistantMsg.stopReason === "error" || assistantMsg.stopReason === "aborted") {
158
+ continue;
159
+ }
160
+
161
+ // Track tool calls from this assistant message
162
+ const toolCalls = assistantMsg.content.filter((b) => b.type === "toolCall") as ToolCall[];
163
+ if (toolCalls.length > 0) {
164
+ pendingToolCalls = toolCalls;
165
+ existingToolResultIds = new Set();
166
+ }
167
+
168
+ result.push(msg);
169
+ } else if (msg.role === "toolResult") {
170
+ existingToolResultIds.add(msg.toolCallId);
171
+ result.push(msg);
172
+ } else if (msg.role === "user") {
173
+ // User message interrupts tool flow - insert synthetic results for orphaned calls
174
+ insertSyntheticToolResults();
175
+ result.push(msg);
176
+ } else {
177
+ result.push(msg);
178
+ }
179
+ }
180
+
181
+ // If the conversation ends with unresolved tool calls, synthesize results now.
182
+ insertSyntheticToolResults();
183
+
184
+ return result;
185
+ }
@@ -0,0 +1,226 @@
1
+ import { aiSdkApi } from "./api/ai-sdk.lazy.ts";
2
+ import { getEnvApiKey } from "./env-api-keys.ts";
3
+ import type { ModelsApiStreamOptions } from "./models.ts";
4
+ import { builtinModels } from "./providers/all.ts";
5
+ import { createFauxCore, type FauxProviderRegistration, type RegisterFauxProviderOptions } from "./providers/faux.ts";
6
+ import type {
7
+ Api,
8
+ ApiStreamOptions,
9
+ AssistantMessage,
10
+ AssistantMessageEventStream,
11
+ Context,
12
+ Model,
13
+ ProviderStreamOptions,
14
+ ProviderStreams,
15
+ SimpleStreamOptions,
16
+ StreamFunction,
17
+ StreamOptions,
18
+ } from "./types.ts";
19
+
20
+ export type ApiStreamFunction = (
21
+ model: Model<Api>,
22
+ context: Context,
23
+ options?: StreamOptions,
24
+ ) => AssistantMessageEventStream;
25
+
26
+ export type ApiStreamSimpleFunction = (
27
+ model: Model<Api>,
28
+ context: Context,
29
+ options?: SimpleStreamOptions,
30
+ ) => AssistantMessageEventStream;
31
+
32
+ export interface ApiProvider<TApi extends Api = Api, TOptions extends StreamOptions = StreamOptions> {
33
+ api: TApi;
34
+ stream: StreamFunction<TApi, TOptions>;
35
+ streamSimple: StreamFunction<TApi, SimpleStreamOptions>;
36
+ }
37
+
38
+ interface ApiProviderInternal {
39
+ api: Api;
40
+ stream: ApiStreamFunction;
41
+ streamSimple: ApiStreamSimpleFunction;
42
+ }
43
+
44
+ type RegisteredApiProvider = {
45
+ provider: ApiProviderInternal;
46
+ sourceId?: string;
47
+ };
48
+
49
+ const apiProviderRegistry = new Map<string, RegisteredApiProvider>();
50
+
51
+ function wrapStream<TApi extends Api, TOptions extends StreamOptions>(
52
+ api: TApi,
53
+ stream: StreamFunction<TApi, TOptions>,
54
+ ): ApiStreamFunction {
55
+ return (model, context, options) => {
56
+ if (model.api !== api) {
57
+ throw new Error(`Mismatched api: ${model.api} expected ${api}`);
58
+ }
59
+ return stream(model as Model<TApi>, context, options as TOptions);
60
+ };
61
+ }
62
+
63
+ function wrapStreamSimple<TApi extends Api>(
64
+ api: TApi,
65
+ streamSimple: StreamFunction<TApi, SimpleStreamOptions>,
66
+ ): ApiStreamSimpleFunction {
67
+ return (model, context, options) => {
68
+ if (model.api !== api) {
69
+ throw new Error(`Mismatched api: ${model.api} expected ${api}`);
70
+ }
71
+ return streamSimple(model as Model<TApi>, context, options);
72
+ };
73
+ }
74
+
75
+ export function registerApiProvider<TApi extends Api, TOptions extends StreamOptions>(
76
+ provider: ApiProvider<TApi, TOptions>,
77
+ sourceId?: string,
78
+ ): void {
79
+ apiProviderRegistry.set(provider.api, {
80
+ provider: {
81
+ api: provider.api,
82
+ stream: wrapStream(provider.api, provider.stream),
83
+ streamSimple: wrapStreamSimple(provider.api, provider.streamSimple),
84
+ },
85
+ sourceId,
86
+ });
87
+ }
88
+
89
+ export function getApiProvider(api: Api): ApiProviderInternal | undefined {
90
+ return apiProviderRegistry.get(api)?.provider;
91
+ }
92
+
93
+ export function getApiProviders(): ApiProviderInternal[] {
94
+ return Array.from(apiProviderRegistry.values(), (entry) => entry.provider);
95
+ }
96
+
97
+ export function unregisterApiProviders(sourceId: string): void {
98
+ for (const [api, entry] of apiProviderRegistry.entries()) {
99
+ if (entry.sourceId === sourceId) {
100
+ apiProviderRegistry.delete(api);
101
+ }
102
+ }
103
+ }
104
+
105
+ export function registerFauxProvider(options: RegisterFauxProviderOptions = {}): FauxProviderRegistration {
106
+ const core = createFauxCore(options);
107
+ const sourceId = `faux-provider-${Math.random().toString(36).slice(2, 10)}`;
108
+ registerApiProvider({ api: core.api, stream: core.stream, streamSimple: core.streamSimple }, sourceId);
109
+ return {
110
+ api: core.api,
111
+ models: core.models,
112
+ getModel: core.getModel,
113
+ state: core.state,
114
+ setResponses: core.setResponses,
115
+ appendResponses: core.appendResponses,
116
+ getPendingResponseCount: core.getPendingResponseCount,
117
+ unregister() {
118
+ unregisterApiProviders(sourceId);
119
+ },
120
+ };
121
+ }
122
+
123
+ const BUILTIN_APIS: [Api, ProviderStreams][] = [["openai-completions", aiSdkApi()]];
124
+
125
+ const builtinApiProviderInstances = new Map<Api, ReturnType<typeof getApiProvider>>();
126
+
127
+ // Registriert die eingebauten APIs, ohne bereits registrierte Overrides zu überschreiben.
128
+ export function registerBuiltInApiProviders(): void {
129
+ for (const [api, streams] of BUILTIN_APIS) {
130
+ if (!getApiProvider(api)) {
131
+ registerApiProvider({ api, stream: streams.stream, streamSimple: streams.streamSimple });
132
+ }
133
+ builtinApiProviderInstances.set(api, getApiProvider(api));
134
+ }
135
+ }
136
+
137
+ export function resetApiProviders(): void {
138
+ apiProviderRegistry.clear();
139
+ builtinApiProviderInstances.clear();
140
+ registerBuiltInApiProviders();
141
+ }
142
+
143
+ registerBuiltInApiProviders();
144
+
145
+ const registryModels = builtinModels();
146
+ const AMBIENT_AUTH_MARKER = "<authenticated>";
147
+
148
+ function hasExplicitApiKey(apiKey: string | undefined): apiKey is string {
149
+ return typeof apiKey === "string" && apiKey.trim().length > 0;
150
+ }
151
+
152
+ function withEnvApiKey<TOptions extends StreamOptions>(
153
+ model: Model<Api>,
154
+ options: TOptions | undefined,
155
+ ): TOptions | undefined {
156
+ if (hasExplicitApiKey(options?.apiKey)) return options;
157
+ const apiKey = getEnvApiKey(model.provider, options?.env);
158
+ if (!apiKey || apiKey === AMBIENT_AUTH_MARKER) return options;
159
+ return { ...options, apiKey } as TOptions;
160
+ }
161
+
162
+ function hasResolvedCloudflareAuth(options: StreamOptions | undefined): boolean {
163
+ return hasExplicitApiKey(options?.apiKey) || typeof options?.headers?.["cf-aig-authorization"] === "string";
164
+ }
165
+
166
+ function getBuiltinProviderForModel(model: Model<Api>) {
167
+ if (getApiProvider(model.api) !== builtinApiProviderInstances.get(model.api)) return undefined;
168
+ const provider = registryModels.getProvider(model.provider);
169
+ return provider?.getModels().some((candidate) => candidate.api === model.api) ? provider : undefined;
170
+ }
171
+
172
+ function resolveApiProvider(api: Api) {
173
+ const provider = getApiProvider(api);
174
+ if (!provider) {
175
+ throw new Error(`No API provider registered for api: ${api}`);
176
+ }
177
+ return provider;
178
+ }
179
+
180
+ export function stream<TApi extends Api>(
181
+ model: Model<TApi>,
182
+ context: Context,
183
+ options?: ProviderStreamOptions,
184
+ ): AssistantMessageEventStream {
185
+ const builtinProvider = getBuiltinProviderForModel(model);
186
+ if (builtinProvider) {
187
+ if (model.provider.startsWith("cloudflare-") && !hasResolvedCloudflareAuth(options)) {
188
+ return registryModels.stream(model, context, options as ModelsApiStreamOptions<TApi> | undefined);
189
+ }
190
+ return builtinProvider.stream(model, context, withEnvApiKey(model, options) as ApiStreamOptions<TApi>);
191
+ }
192
+ const provider = resolveApiProvider(model.api);
193
+ return provider.stream(model, context, withEnvApiKey(model, options) as StreamOptions);
194
+ }
195
+
196
+ export async function complete<TApi extends Api>(
197
+ model: Model<TApi>,
198
+ context: Context,
199
+ options?: ProviderStreamOptions,
200
+ ): Promise<AssistantMessage> {
201
+ return stream(model, context, options).result();
202
+ }
203
+
204
+ export function streamSimple<TApi extends Api>(
205
+ model: Model<TApi>,
206
+ context: Context,
207
+ options?: SimpleStreamOptions,
208
+ ): AssistantMessageEventStream {
209
+ const builtinProvider = getBuiltinProviderForModel(model);
210
+ if (builtinProvider) {
211
+ if (model.provider.startsWith("cloudflare-") && !hasResolvedCloudflareAuth(options)) {
212
+ return registryModels.streamSimple(model, context, options);
213
+ }
214
+ return builtinProvider.streamSimple(model, context, withEnvApiKey(model, options));
215
+ }
216
+ const provider = resolveApiProvider(model.api);
217
+ return provider.streamSimple(model, context, withEnvApiKey(model, options));
218
+ }
219
+
220
+ export async function completeSimple<TApi extends Api>(
221
+ model: Model<TApi>,
222
+ context: Context,
223
+ options?: SimpleStreamOptions,
224
+ ): Promise<AssistantMessage> {
225
+ return streamSimple(model, context, options).result();
226
+ }
@@ -0,0 +1,45 @@
1
+ import type { AuthContext } from "./types.ts";
2
+
3
+ interface NodeFsModule {
4
+ access(path: string): Promise<void>;
5
+ }
6
+
7
+ interface NodeOsModule {
8
+ homedir(): string;
9
+ }
10
+
11
+ // Variable specifier so browser bundlers do not try to resolve node builtins.
12
+ const importNodeModule = (specifier: string): Promise<unknown> => import(specifier);
13
+
14
+ function getProcessEnv(): Record<string, string | undefined> | undefined {
15
+ const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;
16
+ return proc?.env;
17
+ }
18
+
19
+ /**
20
+ * Default auth context: env vars from `process.env` (undefined in browsers),
21
+ * file existence via node:fs (always false in browsers).
22
+ */
23
+ export function defaultProviderAuthContext(): AuthContext {
24
+ return {
25
+ async env(name: string): Promise<string | undefined> {
26
+ const value = getProcessEnv()?.[name];
27
+ return typeof value === "string" && value.trim().length > 0 ? value : undefined;
28
+ },
29
+
30
+ async fileExists(path: string): Promise<boolean> {
31
+ try {
32
+ const fs = (await importNodeModule("node:fs/promises")) as NodeFsModule;
33
+ let resolved = path;
34
+ if (resolved.startsWith("~")) {
35
+ const os = (await importNodeModule("node:os")) as NodeOsModule;
36
+ resolved = os.homedir() + resolved.slice(1);
37
+ }
38
+ await fs.access(resolved);
39
+ return true;
40
+ } catch {
41
+ return false;
42
+ }
43
+ },
44
+ };
45
+ }
@@ -0,0 +1,51 @@
1
+ import type { Credential, CredentialInfo, CredentialStore } from "./types.ts";
2
+
3
+ /**
4
+ * Default in-memory credential store. Apps inject persistent stores.
5
+ * Keyed by `Provider.id`, one credential per provider; see `CredentialStore`.
6
+ * Writes are serialized per provider through a promise chain.
7
+ */
8
+ export class InMemoryCredentialStore implements CredentialStore {
9
+ private credentials = new Map<string, Credential>();
10
+ private chains = new Map<string, Promise<unknown>>();
11
+
12
+ /** Serialize tasks per provider id. */
13
+ private enqueue<T>(providerId: string, task: () => Promise<T>): Promise<T> {
14
+ const previous = this.chains.get(providerId) ?? Promise.resolve();
15
+ const next = (async () => {
16
+ await previous.catch(() => {});
17
+ return task();
18
+ })();
19
+ this.chains.set(
20
+ providerId,
21
+ next.catch(() => {}),
22
+ );
23
+ return next;
24
+ }
25
+
26
+ async read(providerId: string): Promise<Credential | undefined> {
27
+ return this.credentials.get(providerId);
28
+ }
29
+
30
+ async list(): Promise<readonly CredentialInfo[]> {
31
+ return [...this.credentials].map(([providerId, credential]) => ({ providerId, type: credential.type }));
32
+ }
33
+
34
+ modify(
35
+ providerId: string,
36
+ fn: (current: Credential | undefined) => Promise<Credential | undefined>,
37
+ ): Promise<Credential | undefined> {
38
+ return this.enqueue(providerId, async () => {
39
+ const current = this.credentials.get(providerId);
40
+ const next = await fn(current);
41
+ if (next !== undefined) this.credentials.set(providerId, next);
42
+ return next ?? current;
43
+ });
44
+ }
45
+
46
+ delete(providerId: string): Promise<void> {
47
+ return this.enqueue(providerId, async () => {
48
+ this.credentials.delete(providerId);
49
+ });
50
+ }
51
+ }
@@ -0,0 +1,47 @@
1
+ import type { ApiKeyAuth, OAuthAuth } from "./types.ts";
2
+
3
+ /**
4
+ * Standard api-key auth: a stored credential key wins, otherwise the first
5
+ * set env var resolves. Includes a `login` that prompts for the key.
6
+ * Providers with non-standard resolution (provider env, ambient files, IAM)
7
+ * write their own `ApiKeyAuth`.
8
+ */
9
+ export function envApiKeyAuth(name: string, envVars: readonly string[]): ApiKeyAuth {
10
+ return {
11
+ name,
12
+ login: async (interaction) => {
13
+ const key = await interaction.prompt({ type: "secret", message: `Enter ${name}` });
14
+ return { type: "api_key", key };
15
+ },
16
+ resolve: async ({ ctx, credential }) => {
17
+ if (credential?.key) return { auth: { apiKey: credential.key }, source: "stored credential" };
18
+ for (const envVar of envVars) {
19
+ const value = await ctx.env(envVar);
20
+ if (value) return { auth: { apiKey: value }, source: envVar };
21
+ }
22
+ return undefined;
23
+ },
24
+ };
25
+ }
26
+
27
+ /**
28
+ * Wraps a dynamically imported `OAuthAuth` so provider definitions can
29
+ * advertise OAuth without importing the implementation. The flow loads on
30
+ * first `login`/`refresh`/`toAuth` call; callers keep Node-only flow code out
31
+ * of bundles by loading through a bundler-opaque dynamic import (variable
32
+ * specifier, see the bedrock lazy wrapper).
33
+ */
34
+ export function lazyOAuth(input: { name: string; loginLabel?: string; load: () => Promise<OAuthAuth> }): OAuthAuth {
35
+ let promise: Promise<OAuthAuth> | undefined;
36
+ const loaded = () => {
37
+ promise ??= input.load();
38
+ return promise;
39
+ };
40
+ return {
41
+ name: input.name,
42
+ loginLabel: input.loginLabel,
43
+ login: async (interaction) => (await loaded()).login(interaction),
44
+ refresh: async (credential) => (await loaded()).refresh(credential),
45
+ toAuth: async (credential) => (await loaded()).toAuth(credential),
46
+ };
47
+ }
@@ -0,0 +1,139 @@
1
+ import type { ProviderEnv } from "../types.ts";
2
+ import type {
3
+ ApiKeyAuth,
4
+ ApiKeyCredential,
5
+ AuthContext,
6
+ AuthResult,
7
+ Credential,
8
+ CredentialStore,
9
+ OAuthAuth,
10
+ OAuthCredential,
11
+ ProviderAuth,
12
+ } from "./types.ts";
13
+
14
+ export type ModelsErrorCode = "model_source" | "model_validation" | "provider" | "stream" | "auth" | "oauth";
15
+
16
+ export interface AuthResolutionOverrides {
17
+ apiKey?: string;
18
+ env?: ProviderEnv;
19
+ }
20
+
21
+ export class ModelsError extends Error {
22
+ readonly code: ModelsErrorCode;
23
+
24
+ constructor(code: ModelsErrorCode, message: string, options?: { cause?: unknown }) {
25
+ super(message, options);
26
+ this.name = "ModelsError";
27
+ this.code = code;
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Auth resolution shared by the `Models` and `ImagesModels` collections.
33
+ * A stored credential owns the provider: ambient/env is consulted only when
34
+ * nothing is stored. No silent env fallback after a failed refresh or for a
35
+ * credential type without a matching handler.
36
+ */
37
+ export async function resolveProviderAuth(
38
+ provider: { id: string; auth: ProviderAuth },
39
+ credentials: CredentialStore,
40
+ authContext: AuthContext,
41
+ overrides?: AuthResolutionOverrides,
42
+ ): Promise<AuthResult | undefined> {
43
+ const requestAuthContext = overrides?.env ? overlayEnvAuthContext(authContext, overrides.env) : authContext;
44
+
45
+ if (overrides?.apiKey !== undefined && provider.auth.apiKey) {
46
+ return resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, {
47
+ type: "api_key",
48
+ key: overrides.apiKey,
49
+ env: overrides.env,
50
+ });
51
+ }
52
+
53
+ const stored = await readCredential(credentials, provider.id);
54
+ if (stored) {
55
+ if (stored.type === "oauth" && provider.auth.oauth) {
56
+ return resolveStoredOAuth(credentials, provider.id, provider.auth.oauth, stored);
57
+ }
58
+ if (stored.type === "api_key" && provider.auth.apiKey) {
59
+ const credential = overrides?.env ? { ...stored, env: { ...stored.env, ...overrides.env } } : stored;
60
+ return resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, credential);
61
+ }
62
+ return undefined;
63
+ }
64
+
65
+ // Ambient (env vars, AWS profiles, ADC files).
66
+ return provider.auth.apiKey
67
+ ? resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, undefined)
68
+ : undefined;
69
+ }
70
+
71
+ function overlayEnvAuthContext(base: AuthContext, env: ProviderEnv): AuthContext {
72
+ return {
73
+ env: async (name) => env[name] || (await base.env(name)),
74
+ fileExists: (path) => base.fileExists(path),
75
+ };
76
+ }
77
+
78
+ /**
79
+ * OAuth resolution with double-checked locking (same pattern as today's
80
+ * AuthStorage): valid tokens cost zero locks; expired tokens lock, re-check
81
+ * expiry under the lock, refresh once globally, and persist the rotated
82
+ * credential before release.
83
+ */
84
+ async function resolveStoredOAuth(
85
+ credentials: CredentialStore,
86
+ providerId: string,
87
+ oauth: OAuthAuth,
88
+ stored: OAuthCredential,
89
+ ): Promise<AuthResult | undefined> {
90
+ let credential = stored;
91
+
92
+ if (Date.now() >= credential.expires) {
93
+ // Optimistic check said expired; the authoritative check runs under the lock.
94
+ let post: Credential | undefined;
95
+ try {
96
+ post = await credentials.modify(providerId, async (current) => {
97
+ if (current?.type !== "oauth") return undefined; // logged out meanwhile
98
+ if (Date.now() < current.expires) return undefined; // another process/request refreshed
99
+ try {
100
+ return await oauth.refresh(current);
101
+ } catch (error) {
102
+ throw new ModelsError("oauth", `OAuth refresh failed for ${providerId}`, { cause: error });
103
+ }
104
+ });
105
+ } catch (error) {
106
+ if (error instanceof ModelsError) throw error;
107
+ throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
108
+ }
109
+ if (post?.type !== "oauth") return undefined; // logged out meanwhile
110
+ credential = post;
111
+ }
112
+
113
+ try {
114
+ return { auth: await oauth.toAuth(credential), source: "OAuth" };
115
+ } catch (error) {
116
+ throw new ModelsError("oauth", `OAuth auth derivation failed for ${providerId}`, { cause: error });
117
+ }
118
+ }
119
+
120
+ async function resolveApiKey(
121
+ authContext: AuthContext,
122
+ apiKey: ApiKeyAuth,
123
+ providerId: string,
124
+ credential: ApiKeyCredential | undefined,
125
+ ): Promise<AuthResult | undefined> {
126
+ try {
127
+ return await apiKey.resolve({ ctx: authContext, credential });
128
+ } catch (error) {
129
+ throw new ModelsError("auth", `API key auth failed for provider ${providerId}`, { cause: error });
130
+ }
131
+ }
132
+
133
+ async function readCredential(credentials: CredentialStore, providerId: string): Promise<Credential | undefined> {
134
+ try {
135
+ return await credentials.read(providerId);
136
+ } catch (error) {
137
+ throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
138
+ }
139
+ }