@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,44 @@
|
|
|
1
|
+
import { createInterface } from "node:readline";
|
|
2
|
+
import type { Readable, Writable } from "node:stream";
|
|
3
|
+
import { RPC_ERROR_CODES, RpcPeer, rpcFailure, unrestrictedAccess, type AccessContext } from "@aicontainer/ragents";
|
|
4
|
+
import { RpcConnection, type RpcDispatcher } from "./dispatcher.js";
|
|
5
|
+
|
|
6
|
+
export interface StdioTransportOptions {
|
|
7
|
+
dispatcher: RpcDispatcher;
|
|
8
|
+
input: Readable;
|
|
9
|
+
output: Writable;
|
|
10
|
+
access?: AccessContext;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface StdioTransport {
|
|
14
|
+
connection: RpcConnection;
|
|
15
|
+
closed: Promise<void>;
|
|
16
|
+
close: (reason: string) => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** JSON-RPC über stdin und stdout, eine Nachricht je Zeile; der Aufrufer gilt als vertraut. */
|
|
20
|
+
export const startStdioTransport = (options: StdioTransportOptions): StdioTransport => {
|
|
21
|
+
const write = (message: unknown) => new Promise<void>((resolve, reject) => {
|
|
22
|
+
options.output.write(`${JSON.stringify(message)}\n`, (error) => error ? reject(error) : resolve());
|
|
23
|
+
});
|
|
24
|
+
const peer = new RpcPeer({ send: write });
|
|
25
|
+
const connection = new RpcConnection({ id: "stdio", access: options.access ?? unrestrictedAccess, local: true, peer }, options.dispatcher);
|
|
26
|
+
const lines = createInterface({ input: options.input, crlfDelay: Infinity });
|
|
27
|
+
let settle: () => void = () => undefined;
|
|
28
|
+
const closed = new Promise<void>((resolve) => { settle = resolve; });
|
|
29
|
+
const close = (reason: string) => {
|
|
30
|
+
lines.close();
|
|
31
|
+
connection.close(reason);
|
|
32
|
+
settle();
|
|
33
|
+
};
|
|
34
|
+
lines.on("line", (line) => {
|
|
35
|
+
if (!line.trim()) return;
|
|
36
|
+
try {
|
|
37
|
+
peer.receive(JSON.parse(line));
|
|
38
|
+
} catch {
|
|
39
|
+
void write(rpcFailure(null, RPC_ERROR_CODES.parse, "Die Zeile enthält kein gültiges JSON")).catch(() => undefined);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
lines.on("close", () => close("Die Eingabe wurde geschlossen"));
|
|
43
|
+
return { connection, closed, close };
|
|
44
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ChatAttachmentInput } from "./chat-events.js";
|
|
2
|
+
|
|
3
|
+
export interface RunPreparationMessage {
|
|
4
|
+
role: "user" | "assistant";
|
|
5
|
+
text: string;
|
|
6
|
+
attachments?: ChatAttachmentInput[];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface RunPreparationRequest {
|
|
10
|
+
messages: RunPreparationMessage[];
|
|
11
|
+
skillName?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type RunPreparationResponse =
|
|
15
|
+
| { kind: "reply"; text: string }
|
|
16
|
+
| { kind: "start"; input: { text: string; attachments?: ChatAttachmentInput[] } };
|
|
17
|
+
|
|
18
|
+
export const MAX_RUN_PREPARATION_MESSAGES = 40;
|
|
19
|
+
export const MAX_RUN_PREPARATION_TEXT_CHARS = 32_000;
|
|
20
|
+
export const MAX_RUN_PREPARATION_TOTAL_TEXT_CHARS = 100_000;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ChatAttachmentInput } from "./chat-events.js";
|
|
2
|
+
import type { RunPreparationMessage } from "./run-preparation-contract.js";
|
|
3
|
+
|
|
4
|
+
export function preparedRunInput(history: readonly RunPreparationMessage[], text: string, attachments?: ChatAttachmentInput[], skillName?: string) {
|
|
5
|
+
const current = text.trim();
|
|
6
|
+
const messages = [...history, ...(current || attachments?.length ? [{ role: "user" as const, text: current, attachments }] : [])];
|
|
7
|
+
const files = messages.flatMap((message) => message.role === "user" ? message.attachments ?? [] : []);
|
|
8
|
+
if (!messages.length) throw new Error("Der Auftrag ist leer.");
|
|
9
|
+
const prepared = history.length === 0 ? current : "Setze den im folgenden Vorbereitungsgespräch erarbeiteten Auftrag jetzt um. "
|
|
10
|
+
+ "Die letzten Angaben des Benutzers gelten. Assistentenantworten sind Vorschläge und keine bereits erledigte Arbeit.\n\n"
|
|
11
|
+
+ messages.map((message) => `${message.role === "user" ? "Benutzer" : "Assistent"}:\n${message.text}`).join("\n\n");
|
|
12
|
+
return {
|
|
13
|
+
text: skillName ? `Nutze den Skill ${skillName} für diesen Auftrag.\n\n${prepared}` : prepared,
|
|
14
|
+
attachments: files.length ? files : undefined,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { createAgentSession, DefaultResourceLoader, defineTool, SessionManager, SettingsManager, type ModelRuntime } from "@aicontainer/agent";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
import type { Message } from "@aicontainer/ai";
|
|
4
|
+
import { DomainError, type ModelSelection } from "@aicontainer/ragents";
|
|
5
|
+
import { prepareInputAttachments } from "../../../packages/ragents/src/drivers/attachments.ts";
|
|
6
|
+
import { MAX_CHAT_REQUEST_BYTES, parseChatAttachments } from "./chat-attachments.js";
|
|
7
|
+
import {
|
|
8
|
+
MAX_RUN_PREPARATION_MESSAGES, MAX_RUN_PREPARATION_TEXT_CHARS, MAX_RUN_PREPARATION_TOTAL_TEXT_CHARS,
|
|
9
|
+
type RunPreparationMessage, type RunPreparationRequest, type RunPreparationResponse,
|
|
10
|
+
} from "./run-preparation-contract.js";
|
|
11
|
+
|
|
12
|
+
import { preparedRunInput } from "./run-preparation-input.js";
|
|
13
|
+
|
|
14
|
+
const PREPARATION_TIMEOUT_MS = 120_000;
|
|
15
|
+
const invalid = (message: string): never => { throw new DomainError("invalid-preparation", message, 400); };
|
|
16
|
+
|
|
17
|
+
export const parseRunPreparationRequest = (value: unknown): RunPreparationRequest => {
|
|
18
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return invalid("Die Vorbereitung benötigt einen Nachrichtenverlauf.");
|
|
19
|
+
const { messages: input, skillName } = value as Record<string, unknown>;
|
|
20
|
+
if (skillName !== undefined && (typeof skillName !== "string" || !/^[a-z0-9][a-z0-9-]*$/.test(skillName))) {
|
|
21
|
+
return invalid("Der ausgewählte Skillname ist ungültig.");
|
|
22
|
+
}
|
|
23
|
+
if (!Array.isArray(input) || input.length === 0 || input.length > MAX_RUN_PREPARATION_MESSAGES || input.length % 2 === 0) {
|
|
24
|
+
return invalid(`Der Verlauf benötigt höchstens ${MAX_RUN_PREPARATION_MESSAGES} abwechselnde Nachrichten und muss mit einer Benutzernachricht beginnen und enden.`);
|
|
25
|
+
}
|
|
26
|
+
let totalText = 0;
|
|
27
|
+
const messages = input.map((value, index): RunPreparationMessage => {
|
|
28
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return invalid(`Nachricht ${index + 1} ist ungültig.`);
|
|
29
|
+
const { role, text, attachments: supplied } = value as Record<string, unknown>;
|
|
30
|
+
if ((role !== "user" && role !== "assistant") || role !== (index % 2 === 0 ? "user" : "assistant")) return invalid("Benutzer- und Modellnachrichten müssen sich abwechseln.");
|
|
31
|
+
if (typeof text !== "string" || text.length > MAX_RUN_PREPARATION_TEXT_CHARS) return invalid(`Eine Nachricht darf höchstens ${MAX_RUN_PREPARATION_TEXT_CHARS} Zeichen enthalten.`);
|
|
32
|
+
totalText += text.length;
|
|
33
|
+
if (totalText > MAX_RUN_PREPARATION_TOTAL_TEXT_CHARS) return invalid(`Der Verlauf darf zusammen höchstens ${MAX_RUN_PREPARATION_TOTAL_TEXT_CHARS} Textzeichen enthalten.`);
|
|
34
|
+
if (role === "assistant" && supplied !== undefined) return invalid("Nur Benutzernachrichten dürfen Anhänge enthalten.");
|
|
35
|
+
try {
|
|
36
|
+
const attachments = parseChatAttachments(supplied);
|
|
37
|
+
if (!text.trim() && attachments.length === 0) return invalid("Eine Nachricht benötigt Text oder Anhänge.");
|
|
38
|
+
return { role, text, ...(attachments.length ? { attachments } : {}) };
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (error instanceof DomainError) throw error;
|
|
41
|
+
return invalid(error instanceof Error ? error.message : String(error));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
try { parseChatAttachments(messages.flatMap((message) => message.attachments ?? [])); }
|
|
45
|
+
catch (error) { return invalid(error instanceof Error ? error.message : String(error)); }
|
|
46
|
+
if (Buffer.byteLength(JSON.stringify({ messages }), "utf8") > MAX_CHAT_REQUEST_BYTES) return invalid("Der Nachrichtenverlauf ist zu groß.");
|
|
47
|
+
return { messages, ...(typeof skillName === "string" ? { skillName } : {}) };
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export const prepareRunMessage = async (options: {
|
|
51
|
+
runtime: ModelRuntime;
|
|
52
|
+
prompt: string;
|
|
53
|
+
agentDir: string;
|
|
54
|
+
selection: ModelSelection;
|
|
55
|
+
request: RunPreparationRequest;
|
|
56
|
+
signal: AbortSignal;
|
|
57
|
+
}): Promise<RunPreparationResponse> => {
|
|
58
|
+
const signal = AbortSignal.any([options.signal, AbortSignal.timeout(PREPARATION_TIMEOUT_MS)]);
|
|
59
|
+
try {
|
|
60
|
+
signal.throwIfAborted();
|
|
61
|
+
const { runtime, selection } = options;
|
|
62
|
+
const model = runtime.getModel(selection.provider, selection.model);
|
|
63
|
+
if (!model) throw new DomainError("preparation-model-unavailable", `Das Modell ${selection.provider}/${selection.model} ist nicht konfiguriert.`, 400);
|
|
64
|
+
const messages: Message[] = [];
|
|
65
|
+
for (const message of options.request.messages) {
|
|
66
|
+
signal.throwIfAborted();
|
|
67
|
+
if (message.role === "assistant") {
|
|
68
|
+
messages.push({ role: "assistant", content: [{ type: "text", text: message.text }],
|
|
69
|
+
api: model.api, provider: model.provider, model: model.id, stopReason: "stop", timestamp: Date.now(),
|
|
70
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0,
|
|
71
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
|
|
72
|
+
});
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const prepared = await prepareInputAttachments({ prompt: message.text, workspace: "", tools: [], workspaceTools: [],
|
|
77
|
+
attachments: message.attachments?.map((attachment) => ({ name: attachment.name, mediaType: attachment.mediaType,
|
|
78
|
+
content: Buffer.from(attachment.data, "base64") })),
|
|
79
|
+
}, model.input);
|
|
80
|
+
messages.push({ role: "user", timestamp: Date.now(), content: prepared.attachments.length
|
|
81
|
+
? [...(prepared.prompt ? [{ type: "text" as const, text: prepared.prompt }] : []), ...prepared.attachments]
|
|
82
|
+
: prepared.prompt });
|
|
83
|
+
} catch (error) {
|
|
84
|
+
throw new DomainError("preparation-attachment-unsupported", `Der Anhang kann im Vorbereitungs-Chat nicht verwendet werden: ${error instanceof Error ? error.message : String(error)}`, 400);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
signal.throwIfAborted();
|
|
88
|
+
const settingsManager = SettingsManager.inMemory({ compaction: { enabled: false }, retry: {
|
|
89
|
+
enabled: false, provider: { maxRetries: 0, timeoutMs: PREPARATION_TIMEOUT_MS },
|
|
90
|
+
} });
|
|
91
|
+
const systemPrompt = [options.prompt, options.request.skillName ? `Ausgewählter Skill: ${options.request.skillName}` : ""].filter(Boolean).join("\n\n");
|
|
92
|
+
const resourceLoader = new DefaultResourceLoader({ cwd: options.agentDir, agentDir: options.agentDir, settingsManager,
|
|
93
|
+
noExtensions: true, noSkills: true, noPromptTemplates: true, noContextFiles: true,
|
|
94
|
+
systemPrompt, systemPromptOverride: () => systemPrompt, appendSystemPrompt: [],
|
|
95
|
+
});
|
|
96
|
+
await resourceLoader.reload({ signal });
|
|
97
|
+
signal.throwIfAborted();
|
|
98
|
+
const sessionManager = SessionManager.inMemory(options.agentDir);
|
|
99
|
+
for (const message of messages.slice(0, -1)) sessionManager.appendMessage(message);
|
|
100
|
+
let startRequested = false;
|
|
101
|
+
const startRun = defineTool({
|
|
102
|
+
name: "start_run", label: "Run starten",
|
|
103
|
+
description: "Den besprochenen Run starten, ausschließlich nach dem ausdrücklichen sinngemäßen Go des Benutzers zur Ausführung. Keine feste Formulierung nötig. Eine Detailbestätigung, ein Zitat oder eine Fähigkeitsfrage genügt nicht. Der Host übernimmt Auftrag, Skill und Anhänge aus dem Gespräch sowie die Startoptionen.",
|
|
104
|
+
parameters: Type.Object({}),
|
|
105
|
+
execute: async () => {
|
|
106
|
+
signal.throwIfAborted();
|
|
107
|
+
startRequested = true;
|
|
108
|
+
return { content: [{ type: "text", text: "Start zur Übergabe vorgemerkt. Nach Abschluss dieser Antwort übernimmt die Oberfläche den Auftrag." }], details: {} };
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
const { session } = await createAgentSession({ cwd: options.agentDir, agentDir: options.agentDir, modelRuntime: runtime,
|
|
112
|
+
model, thinkingLevel: selection.thinking ?? "off", settingsManager, resourceLoader, sessionManager,
|
|
113
|
+
tools: [startRun.name], customTools: [startRun],
|
|
114
|
+
});
|
|
115
|
+
const abort = () => { void session.abort(); };
|
|
116
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
117
|
+
try {
|
|
118
|
+
signal.throwIfAborted();
|
|
119
|
+
const latest = messages.at(-1)!;
|
|
120
|
+
if (latest.role !== "user") throw new Error("Die letzte Nachricht muss vom Benutzer kommen.");
|
|
121
|
+
const content = latest.content;
|
|
122
|
+
await session.prompt(typeof content === "string" ? content : content.filter((part) => part.type === "text").map((part) => part.text).join("\n"), {
|
|
123
|
+
expandPromptTemplates: false,
|
|
124
|
+
...(typeof content === "string" ? {} : { attachments: content.filter((part) => part.type !== "text") }),
|
|
125
|
+
});
|
|
126
|
+
signal.throwIfAborted();
|
|
127
|
+
const completed = session.messages.at(-1);
|
|
128
|
+
if (!completed || completed.role !== "assistant" || completed.stopReason !== "stop") {
|
|
129
|
+
throw new DomainError("preparation-model-failed", completed?.role === "assistant"
|
|
130
|
+
? completed.errorMessage ?? `Die Vorbereitung wurde nicht vollständig beantwortet (${completed.stopReason}).`
|
|
131
|
+
: "Die Vorbereitung wurde nicht vollständig beantwortet.", 502);
|
|
132
|
+
}
|
|
133
|
+
if (startRequested) return { kind: "start", input: preparedRunInput(options.request.messages, "", undefined, options.request.skillName) };
|
|
134
|
+
const text = completed.content.flatMap((part) => part.type === "text" ? [part.text] : []).join("\n").trim();
|
|
135
|
+
if (text.length > MAX_RUN_PREPARATION_TEXT_CHARS) throw new DomainError("preparation-response-too-large", "Die Modellantwort ist für die Vorbereitung zu lang. Bitte grenze den Auftrag ein.", 502);
|
|
136
|
+
return { kind: "reply", text };
|
|
137
|
+
} finally {
|
|
138
|
+
signal.removeEventListener("abort", abort);
|
|
139
|
+
session.dispose();
|
|
140
|
+
}
|
|
141
|
+
} catch (error) {
|
|
142
|
+
if (options.signal.aborted) throw new DomainError("preparation-aborted", "Die Vorbereitung wurde abgebrochen.", 499);
|
|
143
|
+
if (signal.aborted) throw new DomainError("preparation-timeout", "Die Vorbereitung hat zu lange gedauert. Bitte versuche es erneut.", 504);
|
|
144
|
+
if (error instanceof DomainError) throw error;
|
|
145
|
+
throw new DomainError("preparation-model-failed", `Die Vorbereitung ist fehlgeschlagen: ${error instanceof Error ? error.message : String(error)}`, 502);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { chmod, mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { create as createTar, extract as extractTar } from "tar";
|
|
5
|
+
import { DomainError, isPendingActorInput, isRunId, type CommandRecord, type RunState } from "@aicontainer/ragents";
|
|
6
|
+
import { parseJournalRecord } from "@aicontainer/ragents/src/runtime/journal-storage";
|
|
7
|
+
|
|
8
|
+
export const RUN_TRANSFER_FORMAT_VERSION = 1;
|
|
9
|
+
|
|
10
|
+
export const RUN_TRANSFER_DIRECTORY = "transfer";
|
|
11
|
+
|
|
12
|
+
export const RUN_TRANSFER_MANIFEST_ENTRY = `${RUN_TRANSFER_DIRECTORY}/manifest.json`;
|
|
13
|
+
|
|
14
|
+
export const RUN_TRANSFER_MAX_ARCHIVE_BYTES = 16 * 1024 * 1024;
|
|
15
|
+
|
|
16
|
+
/** Was ein Archiv über den Run sagt, den es trägt; das Ziel prüft daran, ob es ihn annehmen kann. */
|
|
17
|
+
export interface RunTransferManifest {
|
|
18
|
+
readonly formatVersion: number;
|
|
19
|
+
readonly runId: string;
|
|
20
|
+
readonly hostVersion: string;
|
|
21
|
+
readonly executorVersion: string;
|
|
22
|
+
readonly profile: string;
|
|
23
|
+
readonly title: string;
|
|
24
|
+
readonly revision: number;
|
|
25
|
+
readonly events: number;
|
|
26
|
+
/** Der Projektordner auf dem Rechner der Quelle, an den der Run gebunden ist; null, wenn der Arbeitsbereich mitzieht. */
|
|
27
|
+
readonly boundDirectory: string | null;
|
|
28
|
+
readonly exportedAt: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RunTransferExport {
|
|
32
|
+
readonly manifest: RunTransferManifest;
|
|
33
|
+
/** Das tar.gz als Base64, weil die Nachrichtenschicht JSON überträgt. */
|
|
34
|
+
readonly archive: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface RunTransferImport {
|
|
38
|
+
readonly manifest: RunTransferManifest;
|
|
39
|
+
/** Die letzte Sequenz des wiedergegebenen Journals auf dem Ziel. */
|
|
40
|
+
readonly sequence: number;
|
|
41
|
+
readonly events: number;
|
|
42
|
+
readonly workspace: string;
|
|
43
|
+
readonly boundDirectory: string | null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface RunTransferPlaces {
|
|
47
|
+
readonly dataDirectory: string;
|
|
48
|
+
readonly hostVersion: string;
|
|
49
|
+
readonly executorVersion: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const runTransferRunDirectory = (dataDirectory: string, runId: string): string =>
|
|
53
|
+
path.join(dataDirectory, "runs", runId);
|
|
54
|
+
|
|
55
|
+
export const runTransferSessionDirectory = (dataDirectory: string, runId: string): string =>
|
|
56
|
+
path.join(dataDirectory, "sessions", runId);
|
|
57
|
+
|
|
58
|
+
export const runTransferStagingDirectory = (dataDirectory: string, name: string): string =>
|
|
59
|
+
path.join(dataDirectory, RUN_TRANSFER_DIRECTORY, name);
|
|
60
|
+
|
|
61
|
+
const assertRunId = (runId: string): string => {
|
|
62
|
+
if (!isRunId(runId)) throw new DomainError("invalid-run", `Ungültige Run-Kennung: ${runId}`, 400);
|
|
63
|
+
return runId;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** Der Export braucht einen ruhenden Run: sonst wäre das Archiv ein Schnappschuss mitten in einem Turn. */
|
|
67
|
+
export const assertRunStopped = (options: {
|
|
68
|
+
runId: string;
|
|
69
|
+
state: RunState;
|
|
70
|
+
isRunning: (actorId: string) => boolean;
|
|
71
|
+
sessionRunning: boolean;
|
|
72
|
+
}): void => {
|
|
73
|
+
const { runId, state } = options;
|
|
74
|
+
const working = [...state.actors.values()].find((actor) => actor.kind !== "human"
|
|
75
|
+
&& (actor.lifecycle.kind === "running" || options.isRunning(actor.id)));
|
|
76
|
+
if (working) throw new DomainError("run-transfer-running", `Der Run ${runId} arbeitet gerade (@${working.handle}); stoppe ihn vor dem Umzug.`, 409);
|
|
77
|
+
const pending = [...state.inputs.values()].find(isPendingActorInput);
|
|
78
|
+
if (pending) {
|
|
79
|
+
const target = state.actors.get(pending.actorId)?.handle ?? pending.actorId;
|
|
80
|
+
throw new DomainError("run-transfer-running", `Der Run ${runId} hat eine wartende Eingabe für @${target}; warte sie ab oder stoppe den Run.`, 409);
|
|
81
|
+
}
|
|
82
|
+
if (options.sessionRunning) throw new DomainError("run-transfer-running", `Der Run ${runId} arbeitet gerade; stoppe ihn vor dem Umzug.`, 409);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** Ein Run mit Bindung an einen Projektordner der Quelle braucht auf dem Ziel einen Ersatzordner. */
|
|
86
|
+
export const assertWorkspaceReplacement = (manifest: RunTransferManifest, workspacePath: string | undefined): void => {
|
|
87
|
+
if (manifest.boundDirectory === null || workspacePath !== undefined) return;
|
|
88
|
+
throw new DomainError(
|
|
89
|
+
"run-transfer-binding",
|
|
90
|
+
`Der Run ${manifest.runId} ist an den Projektordner ${manifest.boundDirectory} des Quellservers gebunden; nenne beim Import einen Ersatzordner auf diesem Server.`,
|
|
91
|
+
409,
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/** Der Run behält seine Kennung, also muss sie im Ziel frei sein: kein Journal, kein Ordner, kein Archiv. */
|
|
96
|
+
export const assertRunIdFree = (options: { runId: string; known: boolean; directories: readonly string[] }): void => {
|
|
97
|
+
if (options.known) throw new DomainError("run-transfer-exists", `Den Run ${options.runId} gibt es auf diesem Server schon.`, 409);
|
|
98
|
+
for (const directory of options.directories) {
|
|
99
|
+
if (existsSync(directory)) throw new DomainError("run-transfer-exists", `Die Kennung ${options.runId} ist auf diesem Server belegt: ${directory}`, 409);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// Halbfertige Journal- und Payload-Schreibvorgänge gehören nie ins Archiv.
|
|
104
|
+
const temporary = (entry: string): boolean => {
|
|
105
|
+
const name = path.basename(entry);
|
|
106
|
+
return name.startsWith(".journal.") || name.startsWith(".payload.");
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export const packRunArchive = async (options: {
|
|
110
|
+
places: RunTransferPlaces;
|
|
111
|
+
runId: string;
|
|
112
|
+
manifest: RunTransferManifest;
|
|
113
|
+
}): Promise<Buffer> => {
|
|
114
|
+
const runId = assertRunId(options.runId);
|
|
115
|
+
const { dataDirectory } = options.places;
|
|
116
|
+
if (!existsSync(path.join(runTransferRunDirectory(dataDirectory, runId), "journal.jsonl"))) {
|
|
117
|
+
throw new DomainError("run-transfer-missing", `Der Run ${runId} hat kein Journal unter ${runTransferRunDirectory(dataDirectory, runId)}`, 404);
|
|
118
|
+
}
|
|
119
|
+
const manifestFile = path.join(dataDirectory, ...RUN_TRANSFER_MANIFEST_ENTRY.split("/"));
|
|
120
|
+
await mkdir(path.dirname(manifestFile), { recursive: true, mode: 0o700 });
|
|
121
|
+
await writeFile(manifestFile, `${JSON.stringify(options.manifest, null, 2)}\n`, "utf8");
|
|
122
|
+
const entries = [
|
|
123
|
+
RUN_TRANSFER_MANIFEST_ENTRY,
|
|
124
|
+
`runs/${runId}`,
|
|
125
|
+
...(existsSync(runTransferSessionDirectory(dataDirectory, runId)) ? [`sessions/${runId}`] : []),
|
|
126
|
+
];
|
|
127
|
+
const chunks: Buffer[] = [];
|
|
128
|
+
try {
|
|
129
|
+
for await (const chunk of createTar({ gzip: true, cwd: dataDirectory, portable: true, filter: (entry) => !temporary(entry) }, entries)) {
|
|
130
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
131
|
+
}
|
|
132
|
+
} finally {
|
|
133
|
+
await rm(manifestFile, { force: true });
|
|
134
|
+
}
|
|
135
|
+
const archive = Buffer.concat(chunks);
|
|
136
|
+
if (archive.byteLength > RUN_TRANSFER_MAX_ARCHIVE_BYTES) {
|
|
137
|
+
throw new DomainError(
|
|
138
|
+
"run-transfer-too-large",
|
|
139
|
+
`Das Archiv des Runs ${runId} hat ${archive.byteLength} Byte und überschreitet die Grenze von ${RUN_TRANSFER_MAX_ARCHIVE_BYTES} Byte der Nachrichtenschicht`,
|
|
140
|
+
413,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
return archive;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const manifestOf = (value: unknown, location: string): RunTransferManifest => {
|
|
147
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${location} ist kein Objekt`);
|
|
148
|
+
const raw = value as Record<string, unknown>;
|
|
149
|
+
const text = (key: string): string => {
|
|
150
|
+
const entry = raw[key];
|
|
151
|
+
if (typeof entry !== "string" || !entry) throw new Error(`${location}.${key} fehlt`);
|
|
152
|
+
return entry;
|
|
153
|
+
};
|
|
154
|
+
const count = (key: string): number => {
|
|
155
|
+
const entry = raw[key];
|
|
156
|
+
if (typeof entry !== "number" || !Number.isSafeInteger(entry) || entry < 0) throw new Error(`${location}.${key} ist keine Anzahl`);
|
|
157
|
+
return entry;
|
|
158
|
+
};
|
|
159
|
+
if (raw.formatVersion !== RUN_TRANSFER_FORMAT_VERSION) {
|
|
160
|
+
throw new Error(`${location}.formatVersion ${String(raw.formatVersion)} wird nicht unterstützt; erwartet ${RUN_TRANSFER_FORMAT_VERSION}`);
|
|
161
|
+
}
|
|
162
|
+
if (raw.boundDirectory !== null && typeof raw.boundDirectory !== "string") throw new Error(`${location}.boundDirectory ist weder Pfad noch null`);
|
|
163
|
+
return {
|
|
164
|
+
formatVersion: RUN_TRANSFER_FORMAT_VERSION,
|
|
165
|
+
runId: assertRunId(text("runId")),
|
|
166
|
+
hostVersion: text("hostVersion"),
|
|
167
|
+
executorVersion: text("executorVersion"),
|
|
168
|
+
profile: text("profile"),
|
|
169
|
+
title: typeof raw.title === "string" ? raw.title : "",
|
|
170
|
+
revision: count("revision"),
|
|
171
|
+
events: count("events"),
|
|
172
|
+
boundDirectory: raw.boundDirectory,
|
|
173
|
+
exportedAt: text("exportedAt"),
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export interface UnpackedRun {
|
|
178
|
+
readonly manifest: RunTransferManifest;
|
|
179
|
+
readonly staging: string;
|
|
180
|
+
readonly records: readonly CommandRecord[];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const onlyEntry = async (directory: string, expected: string, location: string): Promise<void> => {
|
|
184
|
+
const unexpected = (await readdir(directory)).filter((entry) => entry !== expected);
|
|
185
|
+
if (unexpected.length > 0) throw new DomainError("run-transfer-invalid", `${location} enthält neben ${expected} noch ${unexpected.join(", ")}`, 400);
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
/** Entpackt das Archiv in einen Staging-Ordner des Ziels und liest Manifest und Journalrecords daraus. */
|
|
189
|
+
export const unpackRunArchive = async (options: {
|
|
190
|
+
places: RunTransferPlaces;
|
|
191
|
+
archive: Buffer;
|
|
192
|
+
staging: string;
|
|
193
|
+
}): Promise<UnpackedRun> => {
|
|
194
|
+
const { staging } = options;
|
|
195
|
+
await rm(staging, { recursive: true, force: true });
|
|
196
|
+
await mkdir(staging, { recursive: true, mode: 0o700 });
|
|
197
|
+
const file = path.join(staging, "archive.tar.gz");
|
|
198
|
+
await writeFile(file, options.archive);
|
|
199
|
+
await extractTar({ file, cwd: staging, strict: true });
|
|
200
|
+
await rm(file);
|
|
201
|
+
const manifestFile = path.join(staging, ...RUN_TRANSFER_MANIFEST_ENTRY.split("/"));
|
|
202
|
+
if (!existsSync(manifestFile)) throw new DomainError("run-transfer-invalid", `Das Archiv enthält kein ${RUN_TRANSFER_MANIFEST_ENTRY}`, 400);
|
|
203
|
+
let parsed: unknown;
|
|
204
|
+
try {
|
|
205
|
+
parsed = JSON.parse(await readFile(manifestFile, "utf8"));
|
|
206
|
+
} catch (error) {
|
|
207
|
+
throw new DomainError("run-transfer-invalid", `Das Manifest des Archivs ist kein gültiges JSON: ${error instanceof Error ? error.message : String(error)}`, 400);
|
|
208
|
+
}
|
|
209
|
+
let manifest: RunTransferManifest;
|
|
210
|
+
try {
|
|
211
|
+
manifest = manifestOf(parsed, "Das Manifest");
|
|
212
|
+
} catch (error) {
|
|
213
|
+
throw new DomainError("run-transfer-invalid", error instanceof Error ? error.message : String(error), 400);
|
|
214
|
+
}
|
|
215
|
+
const { hostVersion, executorVersion } = options.places;
|
|
216
|
+
if (manifest.hostVersion !== hostVersion) {
|
|
217
|
+
throw new DomainError(
|
|
218
|
+
"run-transfer-host-version",
|
|
219
|
+
`Das Archiv kommt vom Host ${manifest.hostVersion}, dieser Server läuft auf ${hostVersion}; ein Umzug geht nur zwischen gleichen Host-Versionen`,
|
|
220
|
+
409,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
if (manifest.executorVersion !== executorVersion) {
|
|
224
|
+
throw new DomainError(
|
|
225
|
+
"run-transfer-executor-version",
|
|
226
|
+
`Das Archiv bringt den Executor ${manifest.executorVersion} mit, dieser Server hat ${executorVersion}`,
|
|
227
|
+
409,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
const runDirectory = path.join(staging, "runs", manifest.runId);
|
|
231
|
+
const journalFile = path.join(runDirectory, "journal.jsonl");
|
|
232
|
+
if (!existsSync(journalFile)) throw new DomainError("run-transfer-invalid", `Das Archiv enthält kein Journal für den Run ${manifest.runId}`, 400);
|
|
233
|
+
await onlyEntry(path.join(staging, "runs"), manifest.runId, "Der Ordner runs des Archivs");
|
|
234
|
+
if (existsSync(path.join(staging, "sessions"))) {
|
|
235
|
+
await onlyEntry(path.join(staging, "sessions"), manifest.runId, "Der Ordner sessions des Archivs");
|
|
236
|
+
}
|
|
237
|
+
const lines = (await readFile(journalFile, "utf8")).split("\n").filter((line) => line.trim().length > 0);
|
|
238
|
+
const records = lines.map((line, index) => parseJournalRecord(line, runDirectory, `${journalFile}:${index + 1}`));
|
|
239
|
+
if (records.length === 0) throw new DomainError("run-transfer-invalid", `Das Journal des Runs ${manifest.runId} im Archiv ist leer`, 400);
|
|
240
|
+
const foreign = records.find((record) => record.runId !== manifest.runId);
|
|
241
|
+
if (foreign) throw new DomainError("run-transfer-invalid", `Das Journal im Archiv gehört zum Run ${foreign.runId}, nicht zu ${manifest.runId}`, 400);
|
|
242
|
+
const events = records.reduce((total, record) => total + record.events.length, 0);
|
|
243
|
+
if (events !== manifest.events) {
|
|
244
|
+
throw new DomainError("run-transfer-invalid", `Das Manifest nennt ${manifest.events} Ereignisse, das Journal im Archiv hat ${events}`, 400);
|
|
245
|
+
}
|
|
246
|
+
return { manifest, staging, records };
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/** Legt die Session-Ablage des Archivs an ihrem Platz im Ziel ab; das Journal übernimmt danach die Records. */
|
|
250
|
+
export const installSessionDirectory = async (options: {
|
|
251
|
+
places: RunTransferPlaces;
|
|
252
|
+
runId: string;
|
|
253
|
+
staging: string;
|
|
254
|
+
mode: number;
|
|
255
|
+
}): Promise<string | null> => {
|
|
256
|
+
const source = path.join(options.staging, "sessions", options.runId);
|
|
257
|
+
if (!existsSync(source)) return null;
|
|
258
|
+
const target = runTransferSessionDirectory(options.places.dataDirectory, options.runId);
|
|
259
|
+
if (existsSync(target)) throw new DomainError("run-transfer-exists", `Die Session-Ablage ${target} gibt es schon`, 409);
|
|
260
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
261
|
+
await rename(source, target);
|
|
262
|
+
await chmod(target, options.mode);
|
|
263
|
+
return target;
|
|
264
|
+
};
|