@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.
- package/LICENSE +166 -0
- package/README.md +88 -0
- package/apps/server/agent-home/settings.json +3 -0
- package/apps/server/package.json +29 -0
- package/apps/server/src/access-projection.ts +97 -0
- package/apps/server/src/access-service.ts +22 -0
- package/apps/server/src/access-session.ts +204 -0
- package/apps/server/src/api/contracts.ts +203 -0
- package/apps/server/src/api/core-methods.ts +163 -0
- package/apps/server/src/api/delivery.ts +40 -0
- package/apps/server/src/api/reference.ts +146 -0
- package/apps/server/src/api/rights.ts +26 -0
- package/apps/server/src/chat-attachments.ts +52 -0
- package/apps/server/src/chat-context.ts +6 -0
- package/apps/server/src/chat-events.ts +185 -0
- package/apps/server/src/chat-handler.ts +37 -0
- package/apps/server/src/config-definition.ts +80 -0
- package/apps/server/src/config-file.ts +324 -0
- package/apps/server/src/config.ts +46 -0
- package/apps/server/src/data-directory.ts +42 -0
- package/apps/server/src/external-access.ts +40 -0
- package/apps/server/src/help-files.ts +63 -0
- package/apps/server/src/host-resolution-hooks.mjs +31 -0
- package/apps/server/src/host-resolution.ts +3 -0
- package/apps/server/src/host-version.ts +74 -0
- package/apps/server/src/layout.ts +36 -0
- package/apps/server/src/main.ts +54 -0
- package/apps/server/src/plugin-support/actor-programs/capability-resolver.ts +107 -0
- package/apps/server/src/plugin-support/actor-programs/limits.ts +33 -0
- package/apps/server/src/plugin-support/actor-programs/operations.ts +19 -0
- package/apps/server/src/plugin-support/actor-programs/service.ts +16 -0
- package/apps/server/src/plugin-support/agent-tool.ts +60 -0
- package/apps/server/src/plugin-support/asset-path.ts +4 -0
- package/apps/server/src/plugin-support/await-with-signal.ts +18 -0
- package/apps/server/src/plugin-support/chat-display-contract.ts +7 -0
- package/apps/server/src/plugin-support/chat-display-policy.ts +55 -0
- package/apps/server/src/plugin-support/front-matter.ts +44 -0
- package/apps/server/src/plugin-support/http.ts +93 -0
- package/apps/server/src/plugin-support/language-server/contract.ts +18 -0
- package/apps/server/src/plugin-support/language-server/plugin.ts +32 -0
- package/apps/server/src/plugin-support/language-server/snapshot-method.ts +17 -0
- package/apps/server/src/plugin-support/language-server/tools.ts +73 -0
- package/apps/server/src/plugin-support/model-choice.ts +109 -0
- package/apps/server/src/plugin-support/model-upstreams.ts +12 -0
- package/apps/server/src/plugin-support/native-typescript-child.ts +78 -0
- package/apps/server/src/plugin-support/native-typescript-executor.ts +260 -0
- package/apps/server/src/plugin-support/plugin-config.ts +48 -0
- package/apps/server/src/plugin-support/plugin-folder.ts +81 -0
- package/apps/server/src/plugin-support/plugin-module.ts +14 -0
- package/apps/server/src/plugin-support/plugins-root.ts +41 -0
- package/apps/server/src/plugin-support/product-model-settings-contract.ts +24 -0
- package/apps/server/src/plugin-support/product-model-settings.ts +120 -0
- package/apps/server/src/plugin-support/product-start-options.ts +104 -0
- package/apps/server/src/plugin-support/prompt.ts +68 -0
- package/apps/server/src/plugin-support/provision.ts +85 -0
- package/apps/server/src/plugin-support/run-scripts.ts +88 -0
- package/apps/server/src/plugin-support/shell-platform.ts +21 -0
- package/apps/server/src/plugin-support/skills.ts +97 -0
- package/apps/server/src/plugin-support/start-entries-contract.ts +71 -0
- package/apps/server/src/plugin-support/start-options-contract.ts +65 -0
- package/apps/server/src/plugin-support/system-prompts.ts +138 -0
- package/apps/server/src/plugin-support/thinking-level.ts +8 -0
- package/apps/server/src/plugin-support/tool-availability.ts +20 -0
- package/apps/server/src/plugin-support/workspace-ownership.ts +36 -0
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +213 -0
- package/apps/server/src/plugin-support/workspace-tool-naming.ts +11 -0
- package/apps/server/src/plugin-support/zip.ts +69 -0
- package/apps/server/src/profile/compose.ts +69 -0
- package/apps/server/src/profile/plugin-discovery.ts +112 -0
- package/apps/server/src/profile/plugin-list.ts +19 -0
- package/apps/server/src/profile/provisioning.ts +81 -0
- package/apps/server/src/protocol.ts +106 -0
- package/apps/server/src/provider.ts +817 -0
- package/apps/server/src/ragents/actor-chat-history.ts +111 -0
- package/apps/server/src/ragents/chat-projection.ts +55 -0
- package/apps/server/src/ragents/chat-text-positions.ts +43 -0
- package/apps/server/src/ragents/coordinator.ts +5 -0
- package/apps/server/src/ragents/document-store.ts +12 -0
- package/apps/server/src/ragents/engine.ts +417 -0
- package/apps/server/src/ragents/global-chat.ts +40 -0
- package/apps/server/src/ragents/host-services.ts +26 -0
- package/apps/server/src/ragents/journal-chat-events.ts +52 -0
- package/apps/server/src/ragents/product-runtime.ts +31 -0
- package/apps/server/src/ragents/runtime-bridge.ts +7 -0
- package/apps/server/src/ragents/session.ts +859 -0
- package/apps/server/src/ragents/start-option-state.ts +37 -0
- package/apps/server/src/ragents/typescript-tools.ts +182 -0
- package/apps/server/src/ragents/workspace-runtime.ts +64 -0
- package/apps/server/src/rpc/dispatcher.ts +178 -0
- package/apps/server/src/rpc/http-transport.ts +178 -0
- package/apps/server/src/rpc/stdio-transport.ts +44 -0
- package/apps/server/src/run-preparation-contract.ts +20 -0
- package/apps/server/src/run-preparation-input.ts +16 -0
- package/apps/server/src/run-preparation.ts +147 -0
- package/apps/server/src/run-transfer.ts +264 -0
- package/apps/server/src/server.ts +312 -0
- package/apps/server/src/settings.ts +209 -0
- package/apps/server/src/startup.ts +13 -0
- package/apps/server/src/title-compactor.ts +131 -0
- package/apps/server/src/title-settings-contract.ts +9 -0
- package/apps/server/src/title-settings.ts +67 -0
- package/apps/web/package.json +41 -0
- package/apps/web/src/AccessContext.tsx +125 -0
- package/apps/web/src/App.tsx +315 -0
- package/apps/web/src/CanvasShortcuts.tsx +60 -0
- package/apps/web/src/DiffCode.tsx +89 -0
- package/apps/web/src/HelpDialog.tsx +87 -0
- package/apps/web/src/MaterialSettings.tsx +40 -0
- package/apps/web/src/Overview.tsx +201 -0
- package/apps/web/src/PluginActivation.ts +41 -0
- package/apps/web/src/PluginChat.tsx +552 -0
- package/apps/web/src/PluginRegistry.tsx +689 -0
- package/apps/web/src/RunPreparationChat.tsx +111 -0
- package/apps/web/src/RunStore.ts +86 -0
- package/apps/web/src/SessionList.tsx +148 -0
- package/apps/web/src/SettingsModal.tsx +949 -0
- package/apps/web/src/SourceCode.tsx +49 -0
- package/apps/web/src/StartOptions.tsx +231 -0
- package/apps/web/src/StartSurface.tsx +161 -0
- package/apps/web/src/StatusGroup.tsx +18 -0
- package/apps/web/src/ThemeSettings.tsx +46 -0
- package/apps/web/src/TitleModelSettings.tsx +100 -0
- package/apps/web/src/Toolbar.tsx +28 -0
- package/apps/web/src/WorkspacePanel.tsx +309 -0
- package/apps/web/src/access-session.ts +27 -0
- package/apps/web/src/access-token.ts +31 -0
- package/apps/web/src/api.ts +368 -0
- package/apps/web/src/chat/ChatInputToolbar.tsx +488 -0
- package/apps/web/src/chat/ChatMessages.tsx +666 -0
- package/apps/web/src/chat/ChatPanel.tsx +61 -0
- package/apps/web/src/chat/DetailModeSwitch.tsx +58 -0
- package/apps/web/src/chat/Markdown.tsx +104 -0
- package/apps/web/src/chat/QuestionCard.tsx +107 -0
- package/apps/web/src/chat/StepPopover.tsx +82 -0
- package/apps/web/src/chat/WorkingScenes.tsx +235 -0
- package/apps/web/src/chat/attachments.ts +53 -0
- package/apps/web/src/chat/chat-scroll.ts +41 -0
- package/apps/web/src/chat/chat-target.ts +21 -0
- package/apps/web/src/chat/requests.ts +23 -0
- package/apps/web/src/chat/texts.ts +61 -0
- package/apps/web/src/chat/types.ts +26 -0
- package/apps/web/src/chat/useAttachmentCapabilities.ts +35 -0
- package/apps/web/src/chat/useChat.ts +46 -0
- package/apps/web/src/chat/user-location.ts +22 -0
- package/apps/web/src/column/ColumnApp.tsx +158 -0
- package/apps/web/src/column/ColumnMenu.tsx +37 -0
- package/apps/web/src/column/ColumnRunHeader.tsx +43 -0
- package/apps/web/src/column/column-location.ts +30 -0
- package/apps/web/src/column/host-contract.ts +83 -0
- package/apps/web/src/column/host.ts +101 -0
- package/apps/web/src/column/use-session-list.ts +42 -0
- package/apps/web/src/column.tsx +43 -0
- package/apps/web/src/diff-view.css +38 -0
- package/apps/web/src/help-samples.ts +11 -0
- package/apps/web/src/highlighting.css +74 -0
- package/apps/web/src/highlighting.ts +262 -0
- package/apps/web/src/lib/format.ts +5 -0
- package/apps/web/src/lib/guards.ts +8 -0
- package/apps/web/src/lib/http.ts +9 -0
- package/apps/web/src/lib/labels.ts +11 -0
- package/apps/web/src/lib/local-storage-setting.ts +39 -0
- package/apps/web/src/main.tsx +30 -0
- package/apps/web/src/material-settings.ts +104 -0
- package/apps/web/src/model-settings-events.ts +1 -0
- package/apps/web/src/page-opener.tsx +14 -0
- package/apps/web/src/panel/LoginForm.tsx +31 -0
- package/apps/web/src/panel/OverviewPage.tsx +90 -0
- package/apps/web/src/panel/PanelPage.tsx +9 -0
- package/apps/web/src/panel/SettingsPage.tsx +102 -0
- package/apps/web/src/panel/contract.ts +101 -0
- package/apps/web/src/panel/target-state.ts +53 -0
- package/apps/web/src/panel.tsx +30 -0
- package/apps/web/src/plugin-bootstrap.ts +90 -0
- package/apps/web/src/plugin-discovery.ts +5 -0
- package/apps/web/src/rpc/client.ts +301 -0
- package/apps/web/src/rpc.ts +4 -0
- package/apps/web/src/run-overview.ts +34 -0
- package/apps/web/src/run-preparation.ts +16 -0
- package/apps/web/src/run-read-state.ts +33 -0
- package/apps/web/src/settings-contributions.ts +274 -0
- package/apps/web/src/theme.ts +135 -0
- package/apps/web/src/title-model-settings.ts +51 -0
- package/apps/web/src/toolLine.ts +67 -0
- package/apps/web/src/ui/ListDetail.tsx +149 -0
- package/apps/web/src/ui/SectionLabel.tsx +7 -0
- package/apps/web/src/ui/SvgEdge.tsx +39 -0
- package/apps/web/src/ui/alert.tsx +75 -0
- package/apps/web/src/ui/badge.tsx +51 -0
- package/apps/web/src/ui/button.tsx +57 -0
- package/apps/web/src/ui/card.tsx +102 -0
- package/apps/web/src/ui/checkbox.tsx +26 -0
- package/apps/web/src/ui/dialog.tsx +250 -0
- package/apps/web/src/ui/dropdown-menu.tsx +265 -0
- package/apps/web/src/ui/empty.tsx +103 -0
- package/apps/web/src/ui/field.tsx +236 -0
- package/apps/web/src/ui/frame.css +4 -0
- package/apps/web/src/ui/index.ts +43 -0
- package/apps/web/src/ui/input.tsx +19 -0
- package/apps/web/src/ui/label.tsx +17 -0
- package/apps/web/src/ui/modal-controller.ts +70 -0
- package/apps/web/src/ui/modal.tsx +62 -0
- package/apps/web/src/ui/popover.tsx +102 -0
- package/apps/web/src/ui/progress.tsx +80 -0
- package/apps/web/src/ui/radio-group.tsx +35 -0
- package/apps/web/src/ui/select.tsx +198 -0
- package/apps/web/src/ui/separator.tsx +22 -0
- package/apps/web/src/ui/skeleton.tsx +13 -0
- package/apps/web/src/ui/spinner.tsx +10 -0
- package/apps/web/src/ui/switch.tsx +29 -0
- package/apps/web/src/ui/table.tsx +113 -0
- package/apps/web/src/ui/tabs.tsx +79 -0
- package/apps/web/src/ui/tailwind.css +21 -0
- package/apps/web/src/ui/textarea.tsx +17 -0
- package/apps/web/src/ui/theme.css +300 -0
- package/apps/web/src/ui/toggle-group.tsx +87 -0
- package/apps/web/src/ui/toggle.tsx +42 -0
- package/apps/web/src/ui/tooltip.tsx +63 -0
- package/apps/web/src/ui/useFileInput.ts +50 -0
- package/apps/web/src/virtual-plugins.d.ts +3 -0
- package/apps/web/src/vite-env.d.ts +1 -0
- package/package.json +82 -0
- package/packages/agent/package.json +64 -0
- package/packages/agent/src/config.ts +161 -0
- package/packages/agent/src/core/agent-session-runtime.ts +548 -0
- package/packages/agent/src/core/agent-session-services.ts +224 -0
- package/packages/agent/src/core/agent-session.ts +3357 -0
- package/packages/agent/src/core/auth-guidance.ts +18 -0
- package/packages/agent/src/core/auth-storage.ts +271 -0
- package/packages/agent/src/core/bash-executor.ts +156 -0
- package/packages/agent/src/core/compaction/branch-summarization.ts +372 -0
- package/packages/agent/src/core/compaction/compaction.ts +875 -0
- package/packages/agent/src/core/compaction/index.ts +7 -0
- package/packages/agent/src/core/compaction/utils.ts +174 -0
- package/packages/agent/src/core/defaults.ts +3 -0
- package/packages/agent/src/core/diagnostics.ts +15 -0
- package/packages/agent/src/core/event-bus.ts +33 -0
- package/packages/agent/src/core/exec.ts +107 -0
- package/packages/agent/src/core/experimental.ts +3 -0
- package/packages/agent/src/core/extensions/index.ts +149 -0
- package/packages/agent/src/core/extensions/loader.ts +709 -0
- package/packages/agent/src/core/extensions/runner.ts +1132 -0
- package/packages/agent/src/core/extensions/types.ts +1460 -0
- package/packages/agent/src/core/extensions/wrapper.ts +45 -0
- package/packages/agent/src/core/footer-data-provider.ts +388 -0
- package/packages/agent/src/core/http-dispatcher.ts +106 -0
- package/packages/agent/src/core/index.ts +78 -0
- package/packages/agent/src/core/messages.ts +195 -0
- package/packages/agent/src/core/model-config.ts +287 -0
- package/packages/agent/src/core/model-registry.ts +126 -0
- package/packages/agent/src/core/model-resolver.ts +675 -0
- package/packages/agent/src/core/model-runtime.ts +517 -0
- package/packages/agent/src/core/output-guard.ts +108 -0
- package/packages/agent/src/core/package-manager.ts +2441 -0
- package/packages/agent/src/core/prompt-templates.ts +284 -0
- package/packages/agent/src/core/provider-composer.ts +549 -0
- package/packages/agent/src/core/resolve-config-value.ts +287 -0
- package/packages/agent/src/core/resource-loader.ts +946 -0
- package/packages/agent/src/core/runtime-credentials.ts +48 -0
- package/packages/agent/src/core/sdk.ts +358 -0
- package/packages/agent/src/core/session-cwd.ts +59 -0
- package/packages/agent/src/core/session-manager.ts +1623 -0
- package/packages/agent/src/core/settings-manager.ts +1212 -0
- package/packages/agent/src/core/skills.ts +487 -0
- package/packages/agent/src/core/slash-commands.ts +41 -0
- package/packages/agent/src/core/source-info.ts +40 -0
- package/packages/agent/src/core/system-prompt.ts +147 -0
- package/packages/agent/src/core/timings.ts +50 -0
- package/packages/agent/src/core/tools/bash.ts +314 -0
- package/packages/agent/src/core/tools/edit-diff.ts +704 -0
- package/packages/agent/src/core/tools/edit.ts +222 -0
- package/packages/agent/src/core/tools/file-mutation-queue.ts +61 -0
- package/packages/agent/src/core/tools/index.ts +130 -0
- package/packages/agent/src/core/tools/output-accumulator.ts +222 -0
- package/packages/agent/src/core/tools/path-utils.ts +118 -0
- package/packages/agent/src/core/tools/read.ts +195 -0
- package/packages/agent/src/core/tools/tool-definition-wrapper.ts +45 -0
- package/packages/agent/src/core/tools/truncate.ts +276 -0
- package/packages/agent/src/core/tools/write.ts +90 -0
- package/packages/agent/src/core/trust-manager.ts +244 -0
- package/packages/agent/src/index.ts +287 -0
- package/packages/agent/src/utils/ansi.ts +60 -0
- package/packages/agent/src/utils/child-process.ts +137 -0
- package/packages/agent/src/utils/exif-orientation.ts +183 -0
- package/packages/agent/src/utils/frontmatter.ts +39 -0
- package/packages/agent/src/utils/fs-watch.ts +30 -0
- package/packages/agent/src/utils/git.ts +226 -0
- package/packages/agent/src/utils/image-convert.ts +49 -0
- package/packages/agent/src/utils/image-process.ts +119 -0
- package/packages/agent/src/utils/image-resize-core.ts +164 -0
- package/packages/agent/src/utils/image-resize-worker.ts +42 -0
- package/packages/agent/src/utils/image-resize.ts +123 -0
- package/packages/agent/src/utils/json.ts +6 -0
- package/packages/agent/src/utils/mime.ts +116 -0
- package/packages/agent/src/utils/paths.ts +118 -0
- package/packages/agent/src/utils/photon.ts +139 -0
- package/packages/agent/src/utils/shell.ts +225 -0
- package/packages/agent/src/utils/sleep.ts +18 -0
- package/packages/agent/src/utils/tools-manager.ts +63 -0
- package/packages/agent-core/package.json +32 -0
- package/packages/agent-core/src/agent-loop.ts +877 -0
- package/packages/agent-core/src/agent.ts +598 -0
- package/packages/agent-core/src/index.ts +4 -0
- package/packages/agent-core/src/types.ts +455 -0
- package/packages/agent-core/src/uuid.ts +54 -0
- package/packages/ai/package.json +46 -0
- package/packages/ai/src/api/ai-sdk-messages.ts +102 -0
- package/packages/ai/src/api/ai-sdk-transport.ts +53 -0
- package/packages/ai/src/api/ai-sdk.lazy.ts +4 -0
- package/packages/ai/src/api/ai-sdk.ts +273 -0
- package/packages/ai/src/api/lazy.ts +75 -0
- package/packages/ai/src/api/openrouter-images.lazy.ts +10 -0
- package/packages/ai/src/api/openrouter-images.ts +98 -0
- package/packages/ai/src/api/simple-options.ts +77 -0
- package/packages/ai/src/api/transform-messages.ts +185 -0
- package/packages/ai/src/api-registry.ts +226 -0
- package/packages/ai/src/auth/context.ts +45 -0
- package/packages/ai/src/auth/credential-store.ts +51 -0
- package/packages/ai/src/auth/helpers.ts +47 -0
- package/packages/ai/src/auth/resolve.ts +139 -0
- package/packages/ai/src/auth/types.ts +220 -0
- package/packages/ai/src/compat/extension-oauth-types.ts +45 -0
- package/packages/ai/src/env-api-keys.ts +24 -0
- package/packages/ai/src/image-models.generated.ts +533 -0
- package/packages/ai/src/images-models.ts +274 -0
- package/packages/ai/src/index.ts +33 -0
- package/packages/ai/src/models-store.ts +38 -0
- package/packages/ai/src/models.generated.ts +6 -0
- package/packages/ai/src/models.ts +705 -0
- package/packages/ai/src/oauth.ts +10 -0
- package/packages/ai/src/providers/all.ts +64 -0
- package/packages/ai/src/providers/faux.ts +539 -0
- package/packages/ai/src/providers/openrouter-images.ts +14 -0
- package/packages/ai/src/providers/openrouter.models.ts +6050 -0
- package/packages/ai/src/providers/openrouter.ts +15 -0
- package/packages/ai/src/session-resources.ts +24 -0
- package/packages/ai/src/types.ts +692 -0
- package/packages/ai/src/utils/abort-signals.ts +41 -0
- package/packages/ai/src/utils/deferred-tools.ts +39 -0
- package/packages/ai/src/utils/diagnostics.ts +45 -0
- package/packages/ai/src/utils/error-body.ts +129 -0
- package/packages/ai/src/utils/estimate.ts +146 -0
- package/packages/ai/src/utils/event-stream.ts +88 -0
- package/packages/ai/src/utils/hash.ts +13 -0
- package/packages/ai/src/utils/headers.ts +18 -0
- package/packages/ai/src/utils/json-parse.ts +124 -0
- package/packages/ai/src/utils/node-http-proxy.ts +112 -0
- package/packages/ai/src/utils/overflow.ts +165 -0
- package/packages/ai/src/utils/provider-env.ts +52 -0
- package/packages/ai/src/utils/retry.ts +101 -0
- package/packages/ai/src/utils/sanitize-unicode.ts +25 -0
- package/packages/ai/src/utils/typebox-helpers.ts +24 -0
- package/packages/ai/src/utils/validation.ts +383 -0
- package/packages/ragents/package.json +31 -0
- package/packages/ragents/src/access.ts +54 -0
- package/packages/ragents/src/agents/actor-input.ts +191 -0
- package/packages/ragents/src/agents/catalog.ts +220 -0
- package/packages/ragents/src/agents/delivery.ts +187 -0
- package/packages/ragents/src/agents/live.ts +71 -0
- package/packages/ragents/src/agents/plugins.ts +130 -0
- package/packages/ragents/src/agents/scheduler.ts +1048 -0
- package/packages/ragents/src/agents/schemas.ts +64 -0
- package/packages/ragents/src/agents/tool-orientation.ts +12 -0
- package/packages/ragents/src/agents/tools.ts +709 -0
- package/packages/ragents/src/agents/toolset.ts +324 -0
- package/packages/ragents/src/agents/turn.ts +65 -0
- package/packages/ragents/src/agents/workspace-tools.ts +11 -0
- package/packages/ragents/src/agents/workspaces.ts +15 -0
- package/packages/ragents/src/domain/draft.ts +11 -0
- package/packages/ragents/src/domain/driver.ts +56 -0
- package/packages/ragents/src/domain/event-semantics.ts +668 -0
- package/packages/ragents/src/domain/event-validation.ts +620 -0
- package/packages/ragents/src/domain/events.ts +236 -0
- package/packages/ragents/src/domain/json-patch.ts +77 -0
- package/packages/ragents/src/domain/json.ts +86 -0
- package/packages/ragents/src/domain/model.ts +267 -0
- package/packages/ragents/src/domain/plugin-state.ts +33 -0
- package/packages/ragents/src/domain/portable-id.ts +9 -0
- package/packages/ragents/src/domain/projection.ts +506 -0
- package/packages/ragents/src/domain/schema-errors.ts +56 -0
- package/packages/ragents/src/domain/vocabulary.ts +37 -0
- package/packages/ragents/src/drivers/agent-runtime.ts +1503 -0
- package/packages/ragents/src/drivers/agent.ts +108 -0
- package/packages/ragents/src/drivers/attachments.ts +56 -0
- package/packages/ragents/src/drivers/skill-preload.ts +205 -0
- package/packages/ragents/src/drivers/types.ts +77 -0
- package/packages/ragents/src/http/contracts.ts +80 -0
- package/packages/ragents/src/http/methods.ts +150 -0
- package/packages/ragents/src/index.ts +161 -0
- package/packages/ragents/src/plugin-host.ts +1184 -0
- package/packages/ragents/src/plugin-types.ts +373 -0
- package/packages/ragents/src/rpc/contract.ts +76 -0
- package/packages/ragents/src/rpc/contribution.ts +67 -0
- package/packages/ragents/src/rpc/peer.ts +208 -0
- package/packages/ragents/src/rpc/protocol.ts +129 -0
- package/packages/ragents/src/runtime/artifacts.ts +95 -0
- package/packages/ragents/src/runtime/canonical-hash.ts +5 -0
- package/packages/ragents/src/runtime/canonical-json.ts +41 -0
- package/packages/ragents/src/runtime/command.ts +35 -0
- package/packages/ragents/src/runtime/decisions/actions.ts +77 -0
- package/packages/ragents/src/runtime/decisions/actors.ts +283 -0
- package/packages/ragents/src/runtime/decisions/artifacts.ts +28 -0
- package/packages/ragents/src/runtime/decisions/inputs.ts +79 -0
- package/packages/ragents/src/runtime/decisions/subscriptions.ts +135 -0
- package/packages/ragents/src/runtime/decisions/turns.ts +166 -0
- package/packages/ragents/src/runtime/domain-error.ts +10 -0
- package/packages/ragents/src/runtime/durable-fs.ts +13 -0
- package/packages/ragents/src/runtime/failures.ts +18 -0
- package/packages/ragents/src/runtime/guards.ts +196 -0
- package/packages/ragents/src/runtime/journal-storage.ts +228 -0
- package/packages/ragents/src/runtime/journal.ts +952 -0
- package/packages/ragents/src/runtime/orchestration.ts +711 -0
- package/packages/ragents/src/runtime/serial-queue.ts +13 -0
- package/packages/ragents/src/runtime/services.ts +15 -0
- package/packages/ragents/src/runtime/stop.ts +186 -0
- package/packages/ragents/src/script/driver.ts +18 -0
- package/packages/ragents/src/script/mediators.ts +386 -0
- package/packages/ragents/src/script/programs.ts +10 -0
- package/packages/ragents/src/script/std.ts +27 -0
- package/packages/ragents/src/script/types.ts +6 -0
- package/packages/ragents/src/typescript/async-compiler.ts +322 -0
- package/packages/ragents/src/typescript/build-contract.ts +14 -0
- package/packages/ragents/src/typescript/compiler-worker.ts +52 -0
- package/packages/ragents/src/typescript/compiler.ts +304 -0
- package/packages/ragents/src/typescript/index.ts +48 -0
- package/packages/ragents/src/typescript/native-executor.ts +40 -0
- package/packages/ragents/src/typescript/native-program.ts +5 -0
- package/packages/ragents/src/typescript/run-context.ts +199 -0
- package/packages/ragents/src/typescript/schema.ts +176 -0
- package/packages/ragents/src/typescript/snippet.ts +121 -0
- package/packages/workspace-executor/package.json +25 -0
- package/packages/workspace-executor/src/context.ts +123 -0
- package/packages/workspace-executor/src/executor.ts +134 -0
- package/packages/workspace-executor/src/git-config-environment.ts +10 -0
- package/packages/workspace-executor/src/index.ts +52 -0
- package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +59 -0
- package/packages/workspace-executor/src/language-server/adapters/index.ts +7 -0
- package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +54 -0
- package/packages/workspace-executor/src/language-server/adapters/typescript.ts +46 -0
- package/packages/workspace-executor/src/language-server/contract.ts +23 -0
- package/packages/workspace-executor/src/language-server/diagnostics.ts +62 -0
- package/packages/workspace-executor/src/language-server/host.ts +409 -0
- package/packages/workspace-executor/src/language-server/json-rpc.ts +103 -0
- package/packages/workspace-executor/src/language-server/roots.ts +29 -0
- package/packages/workspace-executor/src/language-server/session.ts +442 -0
- package/packages/workspace-executor/src/language-server/solution.ts +13 -0
- package/packages/workspace-executor/src/managed-process.ts +329 -0
- package/packages/workspace-executor/src/paths.ts +43 -0
- package/packages/workspace-executor/src/run-marker.ts +6 -0
- package/packages/workspace-executor/src/safe-environment.ts +47 -0
- package/packages/workspace-executor/src/sandbox-tools.ts +258 -0
- package/packages/workspace-executor/src/session-ident.ts +37 -0
- package/packages/workspace-executor/src/shell-platform.ts +11 -0
- package/packages/workspace-executor/src/tools.ts +28 -0
- package/plugins/package.json +8 -0
- package/plugins/ragents.activity/server/index.ts +9 -0
- package/plugins/ragents.activity/web/ActivityHeader.tsx +58 -0
- package/plugins/ragents.activity/web/activity.ts +144 -0
- package/plugins/ragents.activity/web/index.tsx +13 -0
- package/plugins/ragents.actor-programs/client-ui/DataTable.tsx +100 -0
- package/plugins/ragents.actor-programs/client-ui/FilePicker.tsx +65 -0
- package/plugins/ragents.actor-programs/client-ui/FlowDiagram.tsx +234 -0
- package/plugins/ragents.actor-programs/client-ui/FlowDiagramRenderer.tsx +85 -0
- package/plugins/ragents.actor-programs/client-ui/Form.tsx +126 -0
- package/plugins/ragents.actor-programs/client-ui/Layout.tsx +27 -0
- package/plugins/ragents.actor-programs/client-ui/MessageList.tsx +30 -0
- package/plugins/ragents.actor-programs/client-ui/Viewers.tsx +41 -0
- package/plugins/ragents.actor-programs/client-ui/WorkflowDiagram.tsx +14 -0
- package/plugins/ragents.actor-programs/client-ui/contracts.d.ts +84 -0
- package/plugins/ragents.actor-programs/client-ui/file-contracts.d.ts +19 -0
- package/plugins/ragents.actor-programs/client-ui/file-selection.ts +24 -0
- package/plugins/ragents.actor-programs/client-ui/flow-diagram-contracts.d.ts +27 -0
- package/plugins/ragents.actor-programs/client-ui/flow-diagram.css +23 -0
- package/plugins/ragents.actor-programs/client-ui/form-contracts.d.ts +38 -0
- package/plugins/ragents.actor-programs/client-ui/frame-layout.ts +4 -0
- package/plugins/ragents.actor-programs/client-ui/index.tsx +81 -0
- package/plugins/ragents.actor-programs/client-ui/layout-contracts.d.ts +33 -0
- package/plugins/ragents.actor-programs/client-ui/message-list-contracts.d.ts +33 -0
- package/plugins/ragents.actor-programs/client-ui/table-contracts.d.ts +35 -0
- package/plugins/ragents.actor-programs/client-ui/viewer-contracts.d.ts +37 -0
- package/plugins/ragents.actor-programs/client-ui/workflow-diagram-contracts.d.ts +10 -0
- package/plugins/ragents.actor-programs/contract.ts +180 -0
- package/plugins/ragents.actor-programs/parameter-types.ts +3 -0
- package/plugins/ragents.actor-programs/prompt.hbs +79 -0
- package/plugins/ragents.actor-programs/server/agent-tools.ts +31 -0
- package/plugins/ragents.actor-programs/server/app-project.ts +284 -0
- package/plugins/ragents.actor-programs/server/authoring-contracts.ts +10 -0
- package/plugins/ragents.actor-programs/server/client-compiler.ts +174 -0
- package/plugins/ragents.actor-programs/server/client-contracts.ts +187 -0
- package/plugins/ragents.actor-programs/server/client-runtime.ts +16 -0
- package/plugins/ragents.actor-programs/server/controls-template.ts +118 -0
- package/plugins/ragents.actor-programs/server/controls-tool.ts +48 -0
- package/plugins/ragents.actor-programs/server/index.ts +51 -0
- package/plugins/ragents.actor-programs/server/methods.ts +72 -0
- package/plugins/ragents.actor-programs/server/project-diagnostics.ts +138 -0
- package/plugins/ragents.actor-programs/server/prompts.ts +21 -0
- package/plugins/ragents.actor-programs/server/routes.ts +235 -0
- package/plugins/ragents.actor-programs/server/runtime-libraries.ts +4 -0
- package/plugins/ragents.actor-programs/server/runtime.ts +721 -0
- package/plugins/ragents.actor-programs/server/tailwind.ts +22 -0
- package/plugins/ragents.actor-programs/server/templates.ts +400 -0
- package/plugins/ragents.actor-programs/server/tool-contributor.ts +29 -0
- package/plugins/ragents.actor-programs/summary.hbs +17 -0
- package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +463 -0
- package/plugins/ragents.actor-programs/web/AppsPanel.tsx +436 -0
- package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +116 -0
- package/plugins/ragents.actor-programs/web/ExpandIcon.tsx +5 -0
- package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +31 -0
- package/plugins/ragents.actor-programs/web/FunctionForm.tsx +102 -0
- package/plugins/ragents.actor-programs/web/ProgramSource.tsx +81 -0
- package/plugins/ragents.actor-programs/web/api.ts +353 -0
- package/plugins/ragents.actor-programs/web/bridge.ts +122 -0
- package/plugins/ragents.actor-programs/web/chat-state.ts +37 -0
- package/plugins/ragents.actor-programs/web/context.ts +30 -0
- package/plugins/ragents.actor-programs/web/function-call.ts +28 -0
- package/plugins/ragents.actor-programs/web/function-input.ts +40 -0
- package/plugins/ragents.actor-programs/web/index.tsx +96 -0
- package/plugins/ragents.actor-programs/web/invocations.ts +43 -0
- package/plugins/ragents.actor-programs/web/program-state.ts +68 -0
- package/plugins/ragents.actor-programs/web/state-revision.ts +16 -0
- package/plugins/ragents.actor-programs/workflow/index.ts +202 -0
- package/plugins/ragents.actor-programs/workflow/prompt-reader.ts +15 -0
- package/plugins/ragents.ask/ask.hbs +4 -0
- package/plugins/ragents.ask/contract.ts +17 -0
- package/plugins/ragents.ask/server/answer-method.ts +15 -0
- package/plugins/ragents.ask/server/ask-service.ts +152 -0
- package/plugins/ragents.ask/server/ask-tool.ts +39 -0
- package/plugins/ragents.ask/server/contract.ts +22 -0
- package/plugins/ragents.ask/server/index.ts +26 -0
- package/plugins/ragents.ask/server/tool-contributor.ts +11 -0
- package/plugins/ragents.ask/web/QuestionSection.tsx +47 -0
- package/plugins/ragents.ask/web/api.ts +6 -0
- package/plugins/ragents.ask/web/constants.ts +1 -0
- package/plugins/ragents.ask/web/index.tsx +50 -0
- package/plugins/ragents.browser/provision.ts +48 -0
- package/plugins/ragents.browser/server/browser.ts +393 -0
- package/plugins/ragents.browser/server/contract.ts +36 -0
- package/plugins/ragents.browser/server/index.ts +35 -0
- package/plugins/ragents.browser/server/tools.ts +197 -0
- package/plugins/ragents.browser/skills/browser-testing/SKILL.md +36 -0
- package/plugins/ragents.documents/contract.ts +33 -0
- package/plugins/ragents.documents/prompt.hbs +18 -0
- package/plugins/ragents.documents/server/config.ts +14 -0
- package/plugins/ragents.documents/server/document-write-tool.ts +45 -0
- package/plugins/ragents.documents/server/files-route.ts +137 -0
- package/plugins/ragents.documents/server/index.ts +38 -0
- package/plugins/ragents.documents/server/show-document-tool.ts +73 -0
- package/plugins/ragents.documents/server/store.ts +35 -0
- package/plugins/ragents.documents/server/tool-contributor.ts +16 -0
- package/plugins/ragents.documents/web/DocumentViewer.tsx +450 -0
- package/plugins/ragents.documents/web/api.ts +8 -0
- package/plugins/ragents.documents/web/index.tsx +279 -0
- package/plugins/ragents.lsp-fsharp/provision.ts +74 -0
- package/plugins/ragents.lsp-fsharp/server/index.ts +16 -0
- package/plugins/ragents.lsp-fsharp/web/index.tsx +7 -0
- package/plugins/ragents.lsp-roslyn/provision.ts +54 -0
- package/plugins/ragents.lsp-roslyn/server/index.ts +15 -0
- package/plugins/ragents.lsp-roslyn/web/api.ts +10 -0
- package/plugins/ragents.lsp-roslyn/web/index.tsx +7 -0
- package/plugins/ragents.lsp-roslyn/web/language-server-plugin.tsx +236 -0
- package/plugins/ragents.lsp-typescript/server/index.ts +7 -0
- package/plugins/ragents.lsp-typescript/web/index.tsx +7 -0
- package/plugins/ragents.model-relay/server/config.ts +37 -0
- package/plugins/ragents.model-relay/server/index.ts +31 -0
- package/plugins/ragents.model-relay/server/relay.ts +213 -0
- package/plugins/ragents.orchestration/canvas.hbs +50 -0
- package/plugins/ragents.orchestration/contract.ts +322 -0
- package/plugins/ragents.orchestration/orchestration.hbs +105 -0
- package/plugins/ragents.orchestration/server/canvas-tool.ts +248 -0
- package/plugins/ragents.orchestration/server/index.ts +64 -0
- package/plugins/ragents.orchestration/server/run-stop-tool.ts +30 -0
- package/plugins/ragents.orchestration/tiled-layout.ts +47 -0
- package/plugins/ragents.orchestration/web/ActorCanvasControls.tsx +159 -0
- package/plugins/ragents.orchestration/web/ActorChat.tsx +56 -0
- package/plugins/ragents.orchestration/web/ActorChatControls.tsx +64 -0
- package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +36 -0
- package/plugins/ragents.orchestration/web/ActorNet.tsx +607 -0
- package/plugins/ragents.orchestration/web/ActorPopout.tsx +36 -0
- package/plugins/ragents.orchestration/web/ActorShortcut.tsx +76 -0
- package/plugins/ragents.orchestration/web/ActorTile.tsx +22 -0
- package/plugins/ragents.orchestration/web/CanvasStartup.tsx +14 -0
- package/plugins/ragents.orchestration/web/CanvasTiles.tsx +47 -0
- package/plugins/ragents.orchestration/web/CardSizeSettings.tsx +42 -0
- package/plugins/ragents.orchestration/web/Center.tsx +576 -0
- package/plugins/ragents.orchestration/web/DocumentsSection.tsx +37 -0
- package/plugins/ragents.orchestration/web/ExecutionsPanel.tsx +109 -0
- package/plugins/ragents.orchestration/web/FlowInspector.tsx +932 -0
- package/plugins/ragents.orchestration/web/JournalStatus.tsx +87 -0
- package/plugins/ragents.orchestration/web/MaterialBody.tsx +104 -0
- package/plugins/ragents.orchestration/web/ScriptActorCard.tsx +56 -0
- package/plugins/ragents.orchestration/web/StopRunButton.tsx +52 -0
- package/plugins/ragents.orchestration/web/TiledCanvas.tsx +281 -0
- package/plugins/ragents.orchestration/web/ZoomSettings.tsx +38 -0
- package/plugins/ragents.orchestration/web/actor-conversation.ts +64 -0
- package/plugins/ragents.orchestration/web/actor-header-settings.ts +41 -0
- package/plugins/ragents.orchestration/web/api.ts +33 -0
- package/plugins/ragents.orchestration/web/canvas-layout-storage.ts +39 -0
- package/plugins/ragents.orchestration/web/canvas-layout.ts +326 -0
- package/plugins/ragents.orchestration/web/canvas-scene.ts +311 -0
- package/plugins/ragents.orchestration/web/canvas-stage.ts +21 -0
- package/plugins/ragents.orchestration/web/canvas-startup.ts +36 -0
- package/plugins/ragents.orchestration/web/canvas-view-settings.ts +48 -0
- package/plugins/ragents.orchestration/web/card-size-settings.ts +36 -0
- package/plugins/ragents.orchestration/web/column/AddresseeControl.tsx +116 -0
- package/plugins/ragents.orchestration/web/column/ColumnSettings.tsx +50 -0
- package/plugins/ragents.orchestration/web/column/RunColumn.tsx +370 -0
- package/plugins/ragents.orchestration/web/column/column-actors.ts +38 -0
- package/plugins/ragents.orchestration/web/column/column-settings.ts +47 -0
- package/plugins/ragents.orchestration/web/column/column-state.ts +59 -0
- package/plugins/ragents.orchestration/web/column/sheet-status.ts +30 -0
- package/plugins/ragents.orchestration/web/constants.ts +10 -0
- package/plugins/ragents.orchestration/web/contract.ts +25 -0
- package/plugins/ragents.orchestration/web/executions.ts +124 -0
- package/plugins/ragents.orchestration/web/format.ts +4 -0
- package/plugins/ragents.orchestration/web/index.tsx +182 -0
- package/plugins/ragents.orchestration/web/keyboard-navigation.ts +55 -0
- package/plugins/ragents.orchestration/web/material-layout.ts +14 -0
- package/plugins/ragents.orchestration/web/run-view.ts +199 -0
- package/plugins/ragents.orchestration/web/tile-docking.ts +99 -0
- package/plugins/ragents.orchestration/web/tiled-view-settings.ts +76 -0
- package/plugins/ragents.orchestration/web/useCanvasMeasurements.ts +78 -0
- package/plugins/ragents.orchestration/web/zoom-settings.ts +28 -0
- package/plugins/ragents.overseer/contract.ts +165 -0
- package/plugins/ragents.overseer/server/api.ts +82 -0
- package/plugins/ragents.overseer/server/coordinator-prompt.ts +13 -0
- package/plugins/ragents.overseer/server/index.ts +71 -0
- package/plugins/ragents.overseer/server/orientation.ts +33 -0
- package/plugins/ragents.overseer/server/quick-answer.ts +54 -0
- package/plugins/ragents.overseer/server/reset-method.ts +5 -0
- package/plugins/ragents.overseer/server/run-directory.ts +49 -0
- package/plugins/ragents.overseer/server/settings-method.ts +8 -0
- package/plugins/ragents.overseer/server/settings.ts +83 -0
- package/plugins/ragents.overseer/server/user-location.ts +96 -0
- package/plugins/ragents.overseer/web/ModelSettings.tsx +70 -0
- package/plugins/ragents.overseer/web/chat-display.ts +10 -0
- package/plugins/ragents.overseer/web/index.tsx +208 -0
- package/plugins/ragents.overseer/web/model-settings.ts +61 -0
- package/plugins/ragents.overseer/web/quick-answers.ts +64 -0
- package/plugins/ragents.processes/contract.ts +61 -0
- package/plugins/ragents.processes/server/index.ts +36 -0
- package/plugins/ragents.processes/server/methods.ts +39 -0
- package/plugins/ragents.processes/server/observer.ts +179 -0
- package/plugins/ragents.processes/server/process-table.ts +395 -0
- package/plugins/ragents.processes/server/snapshot.ts +63 -0
- package/plugins/ragents.processes/server/terminator.ts +164 -0
- package/plugins/ragents.processes/web/ProcessHeader.tsx +157 -0
- package/plugins/ragents.processes/web/index.tsx +23 -0
- package/plugins/ragents.processes/web/processes.ts +75 -0
- package/plugins/ragents.product/model-settings-contract.ts +10 -0
- package/plugins/ragents.product/preamble.hbs +9 -0
- package/plugins/ragents.product/server/config.ts +73 -0
- package/plugins/ragents.product/server/index.ts +117 -0
- package/plugins/ragents.product/server/relay.ts +118 -0
- package/plugins/ragents.product/server/runtime.ts +30 -0
- package/plugins/ragents.product/web/ModelControl.tsx +81 -0
- package/plugins/ragents.product/web/ProductModelSettings.tsx +131 -0
- package/plugins/ragents.product/web/SystemPromptControl.tsx +136 -0
- package/plugins/ragents.product/web/index.tsx +29 -0
- package/plugins/ragents.product/web/model-settings.ts +39 -0
- package/plugins/ragents.product/web/start-options.tsx +12 -0
- package/plugins/ragents.profile-distribution/contract.ts +38 -0
- package/plugins/ragents.profile-distribution/server/archive.ts +159 -0
- package/plugins/ragents.profile-distribution/server/config.ts +27 -0
- package/plugins/ragents.profile-distribution/server/index.ts +93 -0
- package/plugins/ragents.profile-distribution/server/web.ts +48 -0
- package/plugins/ragents.reference/examples.ts +33 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +27 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/package.json +10 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/client.tsx +80 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/src/conversation.ts +82 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/actors/balcony-app/tests/conversation.test.ts +154 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +32 -0
- package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +59 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +14 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +87 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +26 -0
- package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +32 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/RUN.md +24 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/package.json +10 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/experiment.md +1 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/helper.md +5 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/prompts/quiz.md +1 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/client.tsx +27 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +127 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/state.ts +38 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/view.tsx +42 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/src/workflow.ts +38 -0
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +223 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/RUN.md +12 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/src/server.ts +60 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +26 -0
- package/plugins/ragents.reference/run-scripts/moderated-round/tests/program.test.ts +24 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/RUN.md +18 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/package.json +16 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/client.tsx +39 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/contract.ts +15 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/src/server.ts +14 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/actors/shared-list/tests/program.test.ts +13 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/package.json +9 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +65 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +26 -0
- package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/program.test.ts +42 -0
- package/plugins/ragents.reference/run-scripts/word-game/RUN.md +25 -0
- package/plugins/ragents.reference/run-scripts/word-game/package.json +11 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/client.tsx +27 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +23 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +106 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/state.ts +22 -0
- package/plugins/ragents.reference/run-scripts/word-game/src/view.tsx +54 -0
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +253 -0
- package/plugins/ragents.reference/server/index.ts +12 -0
- package/plugins/ragents.reference/skills/100-shared-actor-list/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/110-all-card-slots/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/120-canvas-conversation-circle/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/130-canvas-pipeline-with-approval/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/140-canvas-team-tree-and-topic-grid/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/150-editorial-workbench/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/160-learning-companion/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/170-photo-collection/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/180-decision-workbench/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/190-review-queue/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/20-circle-of-four/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/200-typescript-diagnostics/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/210-moderator-handover/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/220-actor-approval-list/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/230-shared-state-views/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/240-live-result-list/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/250-balcony-wizard/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/30-llm-without-runtime-knowledge/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/35-actor-input-fifo/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/40-subscription-matrix/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/50-subscription-removal/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/60-stop-in-the-circle/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/65-artifact-least-privilege/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/70-headless-counter/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/75-lsp-demo/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/95-hello-world/SKILL.md +12 -0
- package/plugins/ragents.reference/skills/decision-brief/SKILL.md +33 -0
- package/plugins/ragents.reference/skills/learning-sprint/SKILL.md +33 -0
- package/plugins/ragents.reference/walkthroughs.ts +219 -0
- package/plugins/ragents.reference/web/StartGuides.tsx +89 -0
- package/plugins/ragents.reference/web/index.tsx +10 -0
- package/plugins/ragents.todo/contract.ts +60 -0
- package/plugins/ragents.todo/server/index.ts +10 -0
- package/plugins/ragents.todo/server/todo-tool.ts +70 -0
- package/plugins/ragents.todo/server/tool-contributor.ts +9 -0
- package/plugins/ragents.todo/web/TodoSection.tsx +47 -0
- package/plugins/ragents.todo/web/index.ts +12 -0
- package/plugins/ragents.transcript/server/index.ts +20 -0
- package/plugins/ragents.transcript/server/transcript.ts +78 -0
- package/plugins/ragents.watch/contract.ts +48 -0
- package/plugins/ragents.watch/server/condition.ts +56 -0
- package/plugins/ragents.watch/server/contract.ts +4 -0
- package/plugins/ragents.watch/server/functions.ts +62 -0
- package/plugins/ragents.watch/server/index.ts +39 -0
- package/plugins/ragents.watch/server/observation.ts +69 -0
- package/plugins/ragents.watch/server/service.ts +294 -0
- package/plugins/ragents.workspace/client/transport.ts +13 -0
- package/plugins/ragents.workspace/client/workspace-client.ts +247 -0
- package/plugins/ragents.workspace/contract.ts +182 -0
- package/plugins/ragents.workspace/prompt.hbs +14 -0
- package/plugins/ragents.workspace/server/binding.ts +92 -0
- package/plugins/ragents.workspace/server/browse-route.ts +134 -0
- package/plugins/ragents.workspace/server/clients.ts +161 -0
- package/plugins/ragents.workspace/server/index.ts +91 -0
- package/plugins/ragents.workspace/server/runtime.ts +170 -0
- package/plugins/ragents.workspace/web/FileBrowser.tsx +271 -0
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +216 -0
- package/plugins/ragents.workspace/web/api.ts +8 -0
- package/plugins/ragents.workspace/web/file-icons.tsx +94 -0
- package/plugins/ragents.workspace/web/index.tsx +37 -0
- package/ragents.config.core.ts +65 -0
- package/ragents.config.developer.ts +46 -0
- package/scripts/agent/agent-cli.ts +461 -0
- package/scripts/agent/journal.ts +125 -0
- package/scripts/package/build-package.ts +249 -0
- package/scripts/package/host-links.d.mts +1 -0
- package/scripts/package/host-links.mjs +39 -0
- package/scripts/package/publish-package.ts +129 -0
- package/scripts/package/ragents.mjs +59 -0
- package/scripts/provision/run-provision.ts +72 -0
- package/scripts/remote/connect.ts +265 -0
- package/scripts/remote/start.ts +91 -0
- package/scripts/workspace-client/run-workspace-client.ts +112 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { pluginStateKey, type JsonValue, type PluginStateScope, type RunState } from "@aicontainer/ragents";
|
|
2
|
+
import { modelStartOptionId, systemPromptStartOptionId } from "../plugin-support/start-options-contract.js";
|
|
3
|
+
|
|
4
|
+
export { modelStartOptionId, systemPromptStartOptionId };
|
|
5
|
+
|
|
6
|
+
export const startOptionScope = Object.freeze({ kind: "run" } satisfies PluginStateScope);
|
|
7
|
+
|
|
8
|
+
export const storedStartOption = (state: RunState | null, optionId: string): JsonValue | undefined =>
|
|
9
|
+
state?.pluginStates.get(pluginStateKey(optionId, startOptionScope))?.state;
|
|
10
|
+
|
|
11
|
+
export interface StoredSystemPrompt {
|
|
12
|
+
readonly promptIds: readonly string[] | undefined;
|
|
13
|
+
readonly shareWithAgents: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const storedSystemPrompt = (state: RunState | null): StoredSystemPrompt => {
|
|
17
|
+
const value = storedStartOption(state, systemPromptStartOptionId) as
|
|
18
|
+
| { promptId?: unknown; promptIds?: unknown; shareWithAgents?: unknown }
|
|
19
|
+
| undefined;
|
|
20
|
+
const ids = Array.isArray(value?.promptIds)
|
|
21
|
+
? value.promptIds.filter((id): id is string => typeof id === "string")
|
|
22
|
+
: typeof value?.promptId === "string" ? [value.promptId] : undefined;
|
|
23
|
+
return {
|
|
24
|
+
promptIds: ids,
|
|
25
|
+
shareWithAgents: value?.shareWithAgents === true,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const storedModel = (state: RunState | null): string | undefined => {
|
|
30
|
+
const value = (storedStartOption(state, modelStartOptionId) as { model?: unknown } | undefined)?.model;
|
|
31
|
+
return typeof value === "string" && value ? value : undefined;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const storedThinking = (state: RunState | null): string | undefined => {
|
|
35
|
+
const value = (storedStartOption(state, modelStartOptionId) as { thinking?: unknown } | undefined)?.thinking;
|
|
36
|
+
return typeof value === "string" && value ? value : undefined;
|
|
37
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import {
|
|
5
|
+
assertJsonValue,
|
|
6
|
+
defineRunFunction,
|
|
7
|
+
defineToolAvailability,
|
|
8
|
+
executeTypeScriptSnippet,
|
|
9
|
+
typeScriptSnippetDeclarations,
|
|
10
|
+
type RunCapabilityDescriptor,
|
|
11
|
+
type RunFunction,
|
|
12
|
+
type PluginHost,
|
|
13
|
+
type ToolContributor,
|
|
14
|
+
type ToolScope,
|
|
15
|
+
} from "@aicontainer/ragents";
|
|
16
|
+
import { allowedWorkspacePath, expandWorkspaceAlias, type WorkspaceProcessContext } from "@aicontainer/workspace-executor";
|
|
17
|
+
import { sandboxServicesToken } from "../plugin-support/workspace-sandbox-host.js";
|
|
18
|
+
|
|
19
|
+
const metadata = [
|
|
20
|
+
{
|
|
21
|
+
name: "typescript_api",
|
|
22
|
+
label: "TypeScript API",
|
|
23
|
+
description: "Discover the typed functions available to this actor. Omit names for a compact searchable list; pass exact names for their TypeScript declarations with field documentation and the matching guidance. JSON schemas with validation constraints are added only on request. Functions are called as await context.functions.name(input) from snippets and actor programs.",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "typescript_eval",
|
|
27
|
+
label: "Evaluate TypeScript",
|
|
28
|
+
description: "Typecheck and execute a one-off TypeScript snippet as the calling actor, with the same context.functions API as actor programs. Supply code or a workspace path containing an async function body: await and return are supported; use await import() for Node modules. Return a JSON value; no return yields null. context.log captures output. Locals and context.state last for this execution only. Function calls can change the run and are not rolled back on later failure. Use an actor program for persistent state and future messages or events.",
|
|
29
|
+
},
|
|
30
|
+
] as const;
|
|
31
|
+
|
|
32
|
+
const available = defineToolAvailability({
|
|
33
|
+
availability: "conditional",
|
|
34
|
+
availabilityDetail: "Für aktive ausführbare Actors mit einer Funktionsauswahl.",
|
|
35
|
+
}, (actor) => actor.kind !== "human" && actor.lifecycle.kind !== "stopped");
|
|
36
|
+
|
|
37
|
+
export interface TypeScriptToolOptions {
|
|
38
|
+
readonly processContextFor: (runId: string) => Promise<WorkspaceProcessContext>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const functionsOf = (scope: ToolScope): readonly RunFunction[] => scope.availableFunctions()
|
|
42
|
+
.filter((entry) => !metadata.some((tool) => tool.name === entry.name))
|
|
43
|
+
.sort((left, right) => left.name.localeCompare(right.name));
|
|
44
|
+
|
|
45
|
+
const descriptorOf = (entry: RunFunction): RunCapabilityDescriptor => ({
|
|
46
|
+
id: entry.name,
|
|
47
|
+
label: entry.label,
|
|
48
|
+
description: entry.description,
|
|
49
|
+
schema: entry.schema,
|
|
50
|
+
resultSchema: entry.resultSchema,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const apiEntrySchema = Type.Object({
|
|
54
|
+
name: Type.String(),
|
|
55
|
+
label: Type.String(),
|
|
56
|
+
description: Type.String(),
|
|
57
|
+
longDescription: Type.Optional(Type.String()),
|
|
58
|
+
inputSchema: Type.Optional(Type.Unknown()),
|
|
59
|
+
resultSchema: Type.Optional(Type.Unknown()),
|
|
60
|
+
}, { additionalProperties: false });
|
|
61
|
+
|
|
62
|
+
const schemaJson = (schema: RunFunction["schema"]) => {
|
|
63
|
+
const value: unknown = JSON.parse(JSON.stringify(schema));
|
|
64
|
+
assertJsonValue(value, "Function schema");
|
|
65
|
+
return value;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const sourceOf = async (input: { code?: string; path?: string }, context: WorkspaceProcessContext): Promise<string> => {
|
|
69
|
+
if (input.code !== undefined) return input.code;
|
|
70
|
+
const requested = expandWorkspaceAlias(input.path!, context.workspaceAliases ?? {});
|
|
71
|
+
const filename = await allowedWorkspacePath(path.resolve(context.cwd, requested), [context.root, context.cwd, ...context.additionalRoots ?? []]);
|
|
72
|
+
return readFile(filename, "utf8");
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const createTypeScriptToolContributor = (options: TypeScriptToolOptions): ToolContributor => {
|
|
76
|
+
const tools: readonly RunFunction[] = [
|
|
77
|
+
defineRunFunction({
|
|
78
|
+
...metadata[0],
|
|
79
|
+
nativeTool: true,
|
|
80
|
+
available,
|
|
81
|
+
executionMode: "parallel",
|
|
82
|
+
schema: Type.Object({
|
|
83
|
+
query: Type.Optional(Type.String({ minLength: 1, description: "Search names and descriptions. Omit for all available names." })),
|
|
84
|
+
names: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { minItems: 1, uniqueItems: true, description: "Exact function names whose complete declarations and guidance are needed." })),
|
|
85
|
+
schemas: Type.Optional(Type.Boolean({ description: "With names: also return the JSON schemas including validation constraints such as lengths and patterns." })),
|
|
86
|
+
}, { additionalProperties: false }),
|
|
87
|
+
resultSchema: Type.Object({
|
|
88
|
+
functions: Type.Array(apiEntrySchema),
|
|
89
|
+
declarations: Type.Optional(Type.String()),
|
|
90
|
+
guidance: Type.Optional(Type.String()),
|
|
91
|
+
}, { additionalProperties: false }),
|
|
92
|
+
run: async (scope, _id, input) => {
|
|
93
|
+
if (input.names && input.query !== undefined) throw new Error("typescript_api erwartet names oder query, nicht beides.");
|
|
94
|
+
if (input.schemas && !input.names) throw new Error("typescript_api liefert JSON-Schemas nur zu ausgewählten names.");
|
|
95
|
+
const functions = functionsOf(scope);
|
|
96
|
+
if (input.names) {
|
|
97
|
+
const unknown = input.names.filter((name) => !functions.some((entry) => entry.name === name));
|
|
98
|
+
if (unknown.length > 0) throw new Error(`Nicht verfügbare TypeScript-Funktionen: ${unknown.join(", ")}. Mit typescript_api ohne names verfügbare Funktionen nachschlagen.`);
|
|
99
|
+
}
|
|
100
|
+
const query = input.query?.toLocaleLowerCase();
|
|
101
|
+
const selected = input.names ? functions.filter((entry) => input.names!.includes(entry.name))
|
|
102
|
+
: query ? functions.filter((entry) => `${entry.name} ${entry.label} ${entry.description}`.toLocaleLowerCase().includes(query)) : functions;
|
|
103
|
+
return {
|
|
104
|
+
functions: selected.map(({ name, label, description, longDescription, schema, resultSchema }) => ({
|
|
105
|
+
name, label, description,
|
|
106
|
+
...(input.names && longDescription ? { longDescription } : {}),
|
|
107
|
+
...(input.schemas ? { inputSchema: schemaJson(schema), resultSchema: schemaJson(resultSchema) } : {}),
|
|
108
|
+
})),
|
|
109
|
+
...(input.names ? {
|
|
110
|
+
declarations: typeScriptSnippetDeclarations(selected.map(descriptorOf)),
|
|
111
|
+
guidance: [
|
|
112
|
+
"The context belongs to the calling actor: functions act as context.principal. In a snippet, context.state starts as {} and is discarded when it finishes. Actor programs retain their declared state and can receive later inputs. TypeScript checks calls against the declared input and result types before execution; schema constraints are also validated by the host.",
|
|
113
|
+
await scope.functionGuidance(input.names),
|
|
114
|
+
].filter(Boolean).join("\n\n"),
|
|
115
|
+
} : {}),
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
}),
|
|
119
|
+
defineRunFunction({
|
|
120
|
+
...metadata[1],
|
|
121
|
+
nativeTool: true,
|
|
122
|
+
available,
|
|
123
|
+
executionMode: "sequential",
|
|
124
|
+
schema: Type.Object({
|
|
125
|
+
code: Type.Optional(Type.String({ minLength: 1, description: "Async TypeScript function body. context is supplied; await and return work directly." })),
|
|
126
|
+
path: Type.Optional(Type.String({ minLength: 1, description: "Workspace file containing the same snippet body. Use a relative path or an existing workspace alias such as @actors; generated absolute paths are not needed." })),
|
|
127
|
+
}, { additionalProperties: false }),
|
|
128
|
+
resultSchema: Type.Object({ result: Type.Unknown(), logs: Type.Array(Type.String()) }, { additionalProperties: false }),
|
|
129
|
+
run: async (scope, id, input) => {
|
|
130
|
+
if ((input.code === undefined) === (input.path === undefined)) throw new Error("typescript_eval braucht genau eines von code oder path.");
|
|
131
|
+
scope.signal?.throwIfAborted();
|
|
132
|
+
const actor = scope.runtime.view(scope.caller.runId).actors.find((candidate) => candidate.id === scope.caller.actorId);
|
|
133
|
+
if (!actor || actor.kind === "human" || actor.lifecycle.kind === "stopped") throw new Error("Das TypeScript-Snippet braucht einen aktiven ausführbaren Actor.");
|
|
134
|
+
const processContext = await options.processContextFor(scope.caller.runId);
|
|
135
|
+
const code = await sourceOf(input, processContext);
|
|
136
|
+
if (!scope.caller.turnId) throw new Error("Das TypeScript-Snippet braucht einen laufenden Turn.");
|
|
137
|
+
scope.runtime.recordToolCallSource(scope.context(id, "source"), scope.caller.runId, actor.id, {
|
|
138
|
+
turnId: scope.caller.turnId, toolCallId: id, code, path: input.path ?? null,
|
|
139
|
+
});
|
|
140
|
+
const capabilities = functionsOf(scope).map(descriptorOf);
|
|
141
|
+
let callIndex = 0;
|
|
142
|
+
const output = await executeTypeScriptSnippet({
|
|
143
|
+
code,
|
|
144
|
+
capabilities,
|
|
145
|
+
cwd: processContext.cwd,
|
|
146
|
+
signal: scope.signal,
|
|
147
|
+
executor: scope.runtime.nativeTypeScriptExecutor,
|
|
148
|
+
context: {
|
|
149
|
+
runId: scope.caller.runId,
|
|
150
|
+
invocationId: id,
|
|
151
|
+
actor: { id: actor.id, handle: actor.handle },
|
|
152
|
+
principal: { id: actor.id, kind: actor.kind === "script" ? "script" : "agent" },
|
|
153
|
+
},
|
|
154
|
+
call: (name, value) => scope.invokeFunction(`${id}:function:${++callIndex}`, name, value),
|
|
155
|
+
});
|
|
156
|
+
return { result: output.result, logs: output.logs };
|
|
157
|
+
},
|
|
158
|
+
}),
|
|
159
|
+
];
|
|
160
|
+
return {
|
|
161
|
+
name: "ragents.typescript",
|
|
162
|
+
descriptors: tools.map((entry) => ({
|
|
163
|
+
name: entry.name,
|
|
164
|
+
description: entry.description,
|
|
165
|
+
nativeTool: true,
|
|
166
|
+
scope: "per-turn",
|
|
167
|
+
availability: "conditional",
|
|
168
|
+
availabilityDetail: "Für aktive ausführbare Actors mit einer Funktionsauswahl.",
|
|
169
|
+
})),
|
|
170
|
+
tools: () => tools,
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const registeredHosts = new WeakSet<PluginHost>();
|
|
175
|
+
|
|
176
|
+
export const registerTypeScriptFunctions = (host: PluginHost): void => {
|
|
177
|
+
if (registeredHosts.has(host)) return;
|
|
178
|
+
host.tools.register("ragents.runtime", [createTypeScriptToolContributor({
|
|
179
|
+
processContextFor: (runId) => host.service(sandboxServicesToken).processContextFor(runId),
|
|
180
|
+
})]);
|
|
181
|
+
registeredHosts.add(host);
|
|
182
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { serviceToken, type JsonValue, type WorkspaceToolNaming } from "@aicontainer/ragents";
|
|
2
|
+
import type { ResolvedWorkspaceRoot } from "@aicontainer/workspace-executor";
|
|
3
|
+
|
|
4
|
+
export interface SessionWorkspace {
|
|
5
|
+
cwd: string;
|
|
6
|
+
hostSandbox?: { home: string; readOnlyRoots: readonly ResolvedWorkspaceRoot[] };
|
|
7
|
+
gitEnv?: NodeJS.ProcessEnv;
|
|
8
|
+
gitConfig?: ReadonlyArray<readonly [string, string]>;
|
|
9
|
+
extraEnv?: NodeJS.ProcessEnv;
|
|
10
|
+
currentRoot: () => Promise<string>;
|
|
11
|
+
ensureWritable: () => Promise<string>;
|
|
12
|
+
runOperation: <T>(operation: () => Promise<T>) => Promise<T>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface WorkspaceRuntimeDescription {
|
|
16
|
+
mode: string;
|
|
17
|
+
directoryPattern: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Umzug eines Runs auf einen anderen Server: was seine Bindung dort bedeutet und wie das Ziel sie ersetzt. */
|
|
21
|
+
export interface WorkspaceTransfer {
|
|
22
|
+
/** Der Projektordner auf diesem Serverrechner, an den der Run gebunden ist; null, wenn der Arbeitsbereich in der Session-Ablage liegt. */
|
|
23
|
+
boundDirectory: (runId: string) => string | null;
|
|
24
|
+
/** Prüft einen Ersatzordner, bevor der Import etwas anlegt. */
|
|
25
|
+
assertDirectory: (directory: string) => void;
|
|
26
|
+
/** Bindet den Run auf dem Ziel an einen vorhandenen Ersatzordner. */
|
|
27
|
+
rebind: (runId: string, directory: string) => void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface WorkspaceRuntime {
|
|
31
|
+
resolve: (runId: string, emitSystem: (text: string) => void) => Promise<SessionWorkspace>;
|
|
32
|
+
describe: () => WorkspaceRuntimeDescription;
|
|
33
|
+
toolNaming?: WorkspaceToolNaming;
|
|
34
|
+
transfer?: WorkspaceTransfer;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const workspaceRuntimeToken = serviceToken<WorkspaceRuntime>("ragents.workspace-runtime");
|
|
38
|
+
|
|
39
|
+
export interface WorkspaceResolverContext {
|
|
40
|
+
runId: string;
|
|
41
|
+
directory: string;
|
|
42
|
+
choice: JsonValue | null;
|
|
43
|
+
emitSystem: (text: string) => void;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface WorkspaceResolution {
|
|
47
|
+
cwd: string;
|
|
48
|
+
extraEnv?: NodeJS.ProcessEnv;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface WorkspaceResolver {
|
|
52
|
+
optionId?: string;
|
|
53
|
+
resolve: (context: WorkspaceResolverContext) => Promise<WorkspaceResolution>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const workspaceResolverToken = serviceToken<WorkspaceResolver>("ragents.workspace-resolver");
|
|
57
|
+
|
|
58
|
+
export interface GitWorkspaceView {
|
|
59
|
+
branch: (runId: string) => Promise<string | undefined>;
|
|
60
|
+
changes: (runId: string) => Promise<unknown>;
|
|
61
|
+
file: (runId: string, filePath: string, view: "diff" | "current") => Promise<unknown>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const gitWorkspaceViewToken = serviceToken<GitWorkspaceView>("ragents.git-workspace-view");
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import type { TSchema } from "typebox";
|
|
3
|
+
import { Value } from "typebox/value";
|
|
4
|
+
import {
|
|
5
|
+
DomainError,
|
|
6
|
+
RPC_ERROR_CODES,
|
|
7
|
+
RPC_METHODS,
|
|
8
|
+
RpcError,
|
|
9
|
+
type AccessContext,
|
|
10
|
+
type ChannelContributionRegistry,
|
|
11
|
+
type JsonValue,
|
|
12
|
+
type MethodConnection,
|
|
13
|
+
type MethodContributionRegistry,
|
|
14
|
+
type OperationContract,
|
|
15
|
+
type OperationInput,
|
|
16
|
+
type OperationResult,
|
|
17
|
+
type RpcCallOptions,
|
|
18
|
+
type RpcEventParams,
|
|
19
|
+
type RpcHandlerContext,
|
|
20
|
+
type RpcPeer,
|
|
21
|
+
type RpcSubscribeParams,
|
|
22
|
+
type RpcSubscribeResult,
|
|
23
|
+
type RpcUnsubscribeParams,
|
|
24
|
+
} from "@aicontainer/ragents";
|
|
25
|
+
|
|
26
|
+
const MAX_SUBSCRIPTIONS = 64;
|
|
27
|
+
|
|
28
|
+
export interface RpcConnectionOptions {
|
|
29
|
+
id: string;
|
|
30
|
+
access: AccessContext;
|
|
31
|
+
local: boolean;
|
|
32
|
+
peer: RpcPeer;
|
|
33
|
+
/** Ohne Ereignisstrom erreichen Benachrichtigungen den Client nicht; Abonnements sind dann abgelehnt. */
|
|
34
|
+
streamless?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const firstComplaint = (schema: TSchema, value: unknown): string =>
|
|
38
|
+
[...Value.Errors(schema, value)].at(0)?.message ?? "Schema nicht erfüllt";
|
|
39
|
+
|
|
40
|
+
/** Eine Verbindung eines Clients: hält ihre Abonnements und ist der Rückweg für Anfragen des Servers. */
|
|
41
|
+
export class RpcConnection implements MethodConnection {
|
|
42
|
+
readonly id: string;
|
|
43
|
+
readonly access: AccessContext;
|
|
44
|
+
readonly local: boolean;
|
|
45
|
+
readonly peer: RpcPeer;
|
|
46
|
+
readonly streamless: boolean;
|
|
47
|
+
readonly subscriptions = new Map<string, () => void>();
|
|
48
|
+
readonly #closeListeners = new Set<() => void>();
|
|
49
|
+
#closed = false;
|
|
50
|
+
|
|
51
|
+
constructor(options: RpcConnectionOptions, dispatcher: RpcDispatcher) {
|
|
52
|
+
this.id = options.id;
|
|
53
|
+
this.access = options.access;
|
|
54
|
+
this.local = options.local;
|
|
55
|
+
this.peer = options.peer;
|
|
56
|
+
this.streamless = options.streamless ?? false;
|
|
57
|
+
this.peer.fallback((method, params, context) => dispatcher.dispatch(this, method, params, context));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get userId(): string | null {
|
|
61
|
+
return this.access.user?.id ?? null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
get closed(): boolean {
|
|
65
|
+
return this.#closed;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
call<C extends OperationContract>(contract: C, input: OperationInput<C>, options?: RpcCallOptions): Promise<OperationResult<C>> {
|
|
69
|
+
if (contract.implementedBy !== "client") return Promise.reject(new Error(`Die Operation ${contract.id} wird vom Server ausgeführt, nicht vom Client`));
|
|
70
|
+
if (this.streamless) return Promise.reject(new DomainError("stream-required", "Der Rückruf an den Client braucht einen Ereignisstrom.", 409));
|
|
71
|
+
return this.peer.call(contract, input, options);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
onClose(listener: () => void): () => void {
|
|
75
|
+
this.#closeListeners.add(listener);
|
|
76
|
+
return () => { this.#closeListeners.delete(listener); };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
close(reason: string): void {
|
|
80
|
+
if (this.#closed) return;
|
|
81
|
+
this.#closed = true;
|
|
82
|
+
for (const stop of this.subscriptions.values()) stop();
|
|
83
|
+
this.subscriptions.clear();
|
|
84
|
+
this.peer.close(reason);
|
|
85
|
+
for (const listener of [...this.#closeListeners]) listener();
|
|
86
|
+
this.#closeListeners.clear();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface RpcDispatcherOptions {
|
|
91
|
+
methods: MethodContributionRegistry;
|
|
92
|
+
channels: ChannelContributionRegistry;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Führt Anfragen einer Verbindung gegen die registrierten Verträge aus: Rechte, Eingabe, Ausführung, Antwort. */
|
|
96
|
+
export class RpcDispatcher {
|
|
97
|
+
readonly #options: RpcDispatcherOptions;
|
|
98
|
+
|
|
99
|
+
constructor(options: RpcDispatcherOptions) {
|
|
100
|
+
this.#options = options;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async dispatch(connection: RpcConnection, method: string, params: unknown, context: RpcHandlerContext): Promise<unknown> {
|
|
104
|
+
if (method === RPC_METHODS.subscribe) return this.#subscribe(connection, params);
|
|
105
|
+
if (method === RPC_METHODS.unsubscribe) return this.#unsubscribe(connection, params);
|
|
106
|
+
const found = this.#options.methods.find(method);
|
|
107
|
+
if (!found || found.contribution.contract.implementedBy === "client") {
|
|
108
|
+
throw new RpcError(RPC_ERROR_CODES.methodNotFound, `Unbekannte Methode: ${method}`);
|
|
109
|
+
}
|
|
110
|
+
const { contract, execute } = found.contribution;
|
|
111
|
+
assertRights(connection.access, contract.rights);
|
|
112
|
+
const input = params === undefined ? {} : params;
|
|
113
|
+
if (!Value.Check(contract.input, input)) {
|
|
114
|
+
throw new RpcError(RPC_ERROR_CODES.invalidParams, `Ungültige Eingabe für ${method}: ${firstComplaint(contract.input, input)}`);
|
|
115
|
+
}
|
|
116
|
+
const result = await execute(input, {
|
|
117
|
+
access: connection.access,
|
|
118
|
+
signal: context.signal,
|
|
119
|
+
progress: (value: JsonValue) => context.progress(value),
|
|
120
|
+
connection,
|
|
121
|
+
local: connection.local,
|
|
122
|
+
});
|
|
123
|
+
const plain = result === undefined ? null : JSON.parse(JSON.stringify(result)) as unknown;
|
|
124
|
+
if (!Value.Check(contract.result, plain)) {
|
|
125
|
+
const complaint = firstComplaint(contract.result, plain);
|
|
126
|
+
console.error(`Die Antwort von ${method} verletzt ihren Vertrag: ${complaint}`);
|
|
127
|
+
throw new RpcError(RPC_ERROR_CODES.internal, `Die Antwort von ${method} verletzt ihren Vertrag: ${complaint}`);
|
|
128
|
+
}
|
|
129
|
+
return plain;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async #subscribe(connection: RpcConnection, params: unknown): Promise<RpcSubscribeResult> {
|
|
133
|
+
const { channel, params: channelParams } = (params ?? {}) as Partial<RpcSubscribeParams>;
|
|
134
|
+
if (typeof channel !== "string") throw new RpcError(RPC_ERROR_CODES.invalidParams, "channel fehlt");
|
|
135
|
+
if (connection.streamless) throw new DomainError("stream-required", "Abonnements brauchen einen Ereignisstrom.", 409);
|
|
136
|
+
const found = this.#options.channels.find(channel);
|
|
137
|
+
if (!found) throw new DomainError("unknown-channel", `Unbekannter Ereigniskanal: ${channel}`, 400);
|
|
138
|
+
const { contract, open } = found.contribution;
|
|
139
|
+
assertRights(connection.access, contract.rights);
|
|
140
|
+
const input = channelParams === undefined ? {} : channelParams;
|
|
141
|
+
if (!Value.Check(contract.params, input)) {
|
|
142
|
+
throw new RpcError(RPC_ERROR_CODES.invalidParams, `Ungültige Parameter für ${channel}: ${firstComplaint(contract.params, input)}`);
|
|
143
|
+
}
|
|
144
|
+
if (connection.subscriptions.size >= MAX_SUBSCRIPTIONS) throw new DomainError("too-many-channels", "Zu viele Ereigniskanäle auf einer Verbindung.", 429);
|
|
145
|
+
const subscription = randomUUID();
|
|
146
|
+
const buffered: unknown[] = [];
|
|
147
|
+
let opening = true;
|
|
148
|
+
const send = (message: unknown) => connection.peer.notify(RPC_METHODS.event, { subscription, channel, message } satisfies RpcEventParams);
|
|
149
|
+
const emit = (message: unknown) => {
|
|
150
|
+
if (opening) buffered.push(message);
|
|
151
|
+
else if (connection.subscriptions.has(subscription)) send(message);
|
|
152
|
+
};
|
|
153
|
+
const stop = await open(input, emit, { access: connection.access, connection });
|
|
154
|
+
opening = false;
|
|
155
|
+
if (connection.closed) {
|
|
156
|
+
stop();
|
|
157
|
+
throw new DomainError("connection-closed", "Die Ereignisverbindung wurde beendet.", 410);
|
|
158
|
+
}
|
|
159
|
+
connection.subscriptions.set(subscription, stop);
|
|
160
|
+
// Erst die Antwort auf das Abonnement, dann die beim Öffnen entstandenen Nachrichten.
|
|
161
|
+
setTimeout(() => { if (connection.subscriptions.has(subscription)) for (const message of buffered) send(message); }, 0);
|
|
162
|
+
return { subscription };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
#unsubscribe(connection: RpcConnection, params: unknown): null {
|
|
166
|
+
const { subscription } = (params ?? {}) as Partial<RpcUnsubscribeParams>;
|
|
167
|
+
if (typeof subscription !== "string") throw new RpcError(RPC_ERROR_CODES.invalidParams, "subscription fehlt");
|
|
168
|
+
const stop = connection.subscriptions.get(subscription);
|
|
169
|
+
connection.subscriptions.delete(subscription);
|
|
170
|
+
stop?.();
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export const assertRights = (access: AccessContext, rights: readonly string[]): void => {
|
|
176
|
+
const missing = rights.find((right) => !access.can(right));
|
|
177
|
+
if (missing) throw new DomainError("access-denied", `Das Recht ${missing} fehlt.`, 403);
|
|
178
|
+
};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
3
|
+
import {
|
|
4
|
+
isRpcMessage,
|
|
5
|
+
isRpcRequest,
|
|
6
|
+
isRpcResponse,
|
|
7
|
+
RPC_ERROR_CODES,
|
|
8
|
+
RPC_METHODS,
|
|
9
|
+
RpcPeer,
|
|
10
|
+
rpcFailure,
|
|
11
|
+
type AccessContext,
|
|
12
|
+
type RpcMessage,
|
|
13
|
+
} from "@aicontainer/ragents";
|
|
14
|
+
import { PayloadTooLargeError, readBody, writeJson } from "../plugin-support/http.js";
|
|
15
|
+
import { RpcConnection, type RpcDispatcher } from "./dispatcher.js";
|
|
16
|
+
|
|
17
|
+
export const RPC_PATH = "/rpc";
|
|
18
|
+
export const RPC_STREAM_PATH = "/rpc/stream";
|
|
19
|
+
export const RPC_CONNECTION_HEADER = "x-ragents-connection";
|
|
20
|
+
|
|
21
|
+
const PING_INTERVAL_MS = 15_000;
|
|
22
|
+
const DEFAULT_MAX_BODY_BYTES = 32 * 1024 * 1024;
|
|
23
|
+
|
|
24
|
+
interface StreamConnection {
|
|
25
|
+
connection: RpcConnection;
|
|
26
|
+
response: ServerResponse;
|
|
27
|
+
ping: NodeJS.Timeout;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface RpcHttpTransportOptions {
|
|
31
|
+
dispatcher: RpcDispatcher;
|
|
32
|
+
maxBodyBytes?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const isRpcPath = (pathname: string): boolean => pathname === RPC_PATH || pathname === RPC_STREAM_PATH;
|
|
36
|
+
|
|
37
|
+
/** JSON-RPC über HTTP: Anfragen per POST, Benachrichtigungen und Anfragen des Servers über einen SSE-Strom je Verbindung. */
|
|
38
|
+
export class RpcHttpTransport {
|
|
39
|
+
readonly #dispatcher: RpcDispatcher;
|
|
40
|
+
readonly #maxBodyBytes: number;
|
|
41
|
+
readonly #streams = new Map<string, StreamConnection>();
|
|
42
|
+
|
|
43
|
+
constructor(options: RpcHttpTransportOptions) {
|
|
44
|
+
this.#dispatcher = options.dispatcher;
|
|
45
|
+
this.#maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
connectionCount(): number {
|
|
49
|
+
return this.#streams.size;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async handle(request: IncomingMessage, response: ServerResponse, url: URL, access: AccessContext, local: boolean): Promise<boolean> {
|
|
53
|
+
if (url.pathname === RPC_STREAM_PATH) {
|
|
54
|
+
if (request.method !== "GET") {
|
|
55
|
+
response.setHeader("Allow", "GET");
|
|
56
|
+
writeJson(response, 405, { error: "Methode nicht erlaubt" });
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
this.#openStream(request, response, access, local);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (url.pathname !== RPC_PATH) return false;
|
|
63
|
+
if (request.method !== "POST") {
|
|
64
|
+
response.setHeader("Allow", "POST");
|
|
65
|
+
writeJson(response, 405, { error: "Methode nicht erlaubt" });
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
await this.#post(request, response, access, local);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
close(): void {
|
|
73
|
+
for (const stream of [...this.#streams.values()]) this.#end(stream, "Der Server wird beendet");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#openStream(request: IncomingMessage, response: ServerResponse, access: AccessContext, local: boolean): void {
|
|
77
|
+
const id = randomBytes(16).toString("hex");
|
|
78
|
+
const write = (payload: string) => {
|
|
79
|
+
if (!response.writableEnded && !response.destroyed) response.write(payload);
|
|
80
|
+
};
|
|
81
|
+
const peer = new RpcPeer({ send: (message) => write(`data: ${JSON.stringify(message)}\n\n`) });
|
|
82
|
+
const connection = new RpcConnection({ id, access, local, peer }, this.#dispatcher);
|
|
83
|
+
const stream: StreamConnection = { connection, response, ping: setInterval(() => write(": ping\n\n"), PING_INTERVAL_MS) };
|
|
84
|
+
this.#streams.set(id, stream);
|
|
85
|
+
response.writeHead(200, { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive" });
|
|
86
|
+
write(`event: hello\ndata: ${JSON.stringify({ connection: id })}\n\n`);
|
|
87
|
+
request.on("close", () => this.#end(stream, "Der Ereignisstrom wurde beendet"));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
#end(stream: StreamConnection, reason: string): void {
|
|
91
|
+
if (!this.#streams.delete(stream.connection.id)) return;
|
|
92
|
+
clearInterval(stream.ping);
|
|
93
|
+
stream.connection.close(reason);
|
|
94
|
+
if (!stream.response.writableEnded) stream.response.end();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#streamFor(request: IncomingMessage, access: AccessContext): StreamConnection | undefined {
|
|
98
|
+
const header = request.headers[RPC_CONNECTION_HEADER];
|
|
99
|
+
const id = Array.isArray(header) ? header[0] : header;
|
|
100
|
+
if (!id) return undefined;
|
|
101
|
+
const stream = this.#streams.get(id);
|
|
102
|
+
if (!stream) throw new DomainRejection(404, "unknown-connection", "Die Ereignisverbindung ist unbekannt oder beendet.");
|
|
103
|
+
if (stream.connection.userId !== (access.user?.id ?? null)) throw new DomainRejection(403, "foreign-connection", "Die Ereignisverbindung gehört einem anderen Benutzer.");
|
|
104
|
+
return stream;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async #post(request: IncomingMessage, response: ServerResponse, access: AccessContext, local: boolean): Promise<void> {
|
|
108
|
+
let message: unknown;
|
|
109
|
+
try {
|
|
110
|
+
message = JSON.parse(await readBody(request, this.#maxBodyBytes));
|
|
111
|
+
} catch (error) {
|
|
112
|
+
if (error instanceof PayloadTooLargeError) {
|
|
113
|
+
writeJson(response, 413, rpcFailure(null, RPC_ERROR_CODES.invalidRequest, error.message));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
writeJson(response, 400, rpcFailure(null, RPC_ERROR_CODES.parse, "Der Request enthält kein gültiges JSON"));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (!isRpcMessage(message)) {
|
|
120
|
+
writeJson(response, 400, rpcFailure(null, RPC_ERROR_CODES.invalidRequest, "Die Nachricht ist kein gültiges JSON-RPC"));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
let stream: StreamConnection | undefined;
|
|
124
|
+
try {
|
|
125
|
+
stream = this.#streamFor(request, access);
|
|
126
|
+
} catch (error) {
|
|
127
|
+
if (error instanceof DomainRejection) {
|
|
128
|
+
writeJson(response, error.status, rpcFailure(isRpcRequest(message) ? message.id : null, RPC_ERROR_CODES.application, error.message, { code: error.code, status: error.status }));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
if (!isRpcRequest(message)) {
|
|
134
|
+
if (!stream) {
|
|
135
|
+
writeJson(response, 409, rpcFailure(null, RPC_ERROR_CODES.invalidRequest, "Benachrichtigungen und Antworten brauchen einen Ereignisstrom."));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
stream.connection.peer.receive(message);
|
|
139
|
+
response.writeHead(202, { "Cache-Control": "no-store" });
|
|
140
|
+
response.end();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
await this.#answer(request, response, message, stream, access, local);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Eine Anfrage bekommt ihren eigenen Peer, dessen Antwort die HTTP-Antwort ist; Abonnements landen auf dem Strom. */
|
|
147
|
+
#answer(request: IncomingMessage, response: ServerResponse, message: RpcMessage, stream: StreamConnection | undefined, access: AccessContext, local: boolean): Promise<void> {
|
|
148
|
+
return new Promise<void>((resolve) => {
|
|
149
|
+
let answered = false;
|
|
150
|
+
const peer = new RpcPeer({
|
|
151
|
+
send: (reply) => {
|
|
152
|
+
if (!isRpcResponse(reply)) {
|
|
153
|
+
stream?.connection.peer.notify(reply.method, reply.params);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (answered) return;
|
|
157
|
+
answered = true;
|
|
158
|
+
writeJson(response, 200, reply);
|
|
159
|
+
resolve();
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
const target = stream?.connection ?? new RpcConnection({ id: `request-${randomBytes(8).toString("hex")}`, access, local, peer, streamless: true }, this.#dispatcher);
|
|
163
|
+
peer.fallback((method, params, context) => this.#dispatcher.dispatch(target, method, params, context));
|
|
164
|
+
request.on("close", () => {
|
|
165
|
+
if (answered) return;
|
|
166
|
+
peer.receive({ jsonrpc: "2.0", method: RPC_METHODS.cancel, params: { id: (message as { id: unknown }).id } });
|
|
167
|
+
});
|
|
168
|
+
response.on("close", () => { if (!answered) { answered = true; resolve(); } });
|
|
169
|
+
peer.receive(message);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
class DomainRejection extends Error {
|
|
175
|
+
constructor(readonly status: number, readonly code: string, message: string) {
|
|
176
|
+
super(message);
|
|
177
|
+
}
|
|
178
|
+
}
|