@aquaclawai/aquarium 1.0.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/dist/agent-types/claude-code/index.d.ts +2 -0
- package/dist/agent-types/claude-code/index.d.ts.map +1 -0
- package/dist/agent-types/claude-code/index.js +2 -0
- package/dist/agent-types/claude-code/index.js.map +1 -0
- package/dist/agent-types/claude-code/manifest.d.ts +3 -0
- package/dist/agent-types/claude-code/manifest.d.ts.map +1 -0
- package/dist/agent-types/claude-code/manifest.js +45 -0
- package/dist/agent-types/claude-code/manifest.js.map +1 -0
- package/dist/agent-types/openclaw/adapter.d.ts +3 -0
- package/dist/agent-types/openclaw/adapter.d.ts.map +1 -0
- package/dist/agent-types/openclaw/adapter.js +714 -0
- package/dist/agent-types/openclaw/adapter.js.map +1 -0
- package/dist/agent-types/openclaw/gateway-rpc.d.ts +21 -0
- package/dist/agent-types/openclaw/gateway-rpc.d.ts.map +1 -0
- package/dist/agent-types/openclaw/gateway-rpc.js +202 -0
- package/dist/agent-types/openclaw/gateway-rpc.js.map +1 -0
- package/dist/agent-types/openclaw/index.d.ts +3 -0
- package/dist/agent-types/openclaw/index.d.ts.map +1 -0
- package/dist/agent-types/openclaw/index.js +3 -0
- package/dist/agent-types/openclaw/index.js.map +1 -0
- package/dist/agent-types/openclaw/manifest.d.ts +137 -0
- package/dist/agent-types/openclaw/manifest.d.ts.map +1 -0
- package/dist/agent-types/openclaw/manifest.js +191 -0
- package/dist/agent-types/openclaw/manifest.js.map +1 -0
- package/dist/agent-types/openclaw/provider-registry.d.ts +46 -0
- package/dist/agent-types/openclaw/provider-registry.d.ts.map +1 -0
- package/dist/agent-types/openclaw/provider-registry.js +108 -0
- package/dist/agent-types/openclaw/provider-registry.js.map +1 -0
- package/dist/agent-types/openclaw/reverse-adapter.d.ts +7 -0
- package/dist/agent-types/openclaw/reverse-adapter.d.ts.map +1 -0
- package/dist/agent-types/openclaw/reverse-adapter.js +528 -0
- package/dist/agent-types/openclaw/reverse-adapter.js.map +1 -0
- package/dist/agent-types/openclaw/security-profiles.d.ts +21 -0
- package/dist/agent-types/openclaw/security-profiles.d.ts.map +1 -0
- package/dist/agent-types/openclaw/security-profiles.js +251 -0
- package/dist/agent-types/openclaw/security-profiles.js.map +1 -0
- package/dist/agent-types/openclaw/workspace-templates.d.ts +2 -0
- package/dist/agent-types/openclaw/workspace-templates.d.ts.map +1 -0
- package/dist/agent-types/openclaw/workspace-templates.js +363 -0
- package/dist/agent-types/openclaw/workspace-templates.js.map +1 -0
- package/dist/agent-types/opencode/index.d.ts +2 -0
- package/dist/agent-types/opencode/index.d.ts.map +1 -0
- package/dist/agent-types/opencode/index.js +2 -0
- package/dist/agent-types/opencode/index.js.map +1 -0
- package/dist/agent-types/opencode/manifest.d.ts +3 -0
- package/dist/agent-types/opencode/manifest.d.ts.map +1 -0
- package/dist/agent-types/opencode/manifest.js +63 -0
- package/dist/agent-types/opencode/manifest.js.map +1 -0
- package/dist/agent-types/registry.d.ts +4 -0
- package/dist/agent-types/registry.d.ts.map +1 -0
- package/dist/agent-types/registry.js +24 -0
- package/dist/agent-types/registry.js.map +1 -0
- package/dist/agent-types/types.d.ts +169 -0
- package/dist/agent-types/types.d.ts.map +1 -0
- package/dist/agent-types/types.js +2 -0
- package/dist/agent-types/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +72 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +68 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/db/adapter.d.ts +21 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +11 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/knexfile.d.ts +5 -0
- package/dist/db/knexfile.d.ts.map +1 -0
- package/dist/db/knexfile.js +34 -0
- package/dist/db/knexfile.js.map +1 -0
- package/dist/db/migration-helpers.d.ts +45 -0
- package/dist/db/migration-helpers.d.ts.map +1 -0
- package/dist/db/migration-helpers.js +90 -0
- package/dist/db/migration-helpers.js.map +1 -0
- package/dist/db/migrations/001_initial.d.ts +4 -0
- package/dist/db/migrations/001_initial.d.ts.map +1 -0
- package/dist/db/migrations/001_initial.js +56 -0
- package/dist/db/migrations/001_initial.js.map +1 -0
- package/dist/db/migrations/002_instance_config.d.ts +4 -0
- package/dist/db/migrations/002_instance_config.d.ts.map +1 -0
- package/dist/db/migrations/002_instance_config.js +12 -0
- package/dist/db/migrations/002_instance_config.js.map +1 -0
- package/dist/db/migrations/003_instance_status_message.d.ts +4 -0
- package/dist/db/migrations/003_instance_status_message.d.ts.map +1 -0
- package/dist/db/migrations/003_instance_status_message.js +11 -0
- package/dist/db/migrations/003_instance_status_message.js.map +1 -0
- package/dist/db/migrations/004_templates.d.ts +4 -0
- package/dist/db/migrations/004_templates.d.ts.map +1 -0
- package/dist/db/migrations/004_templates.js +95 -0
- package/dist/db/migrations/004_templates.js.map +1 -0
- package/dist/db/migrations/005_group_chats.d.ts +4 -0
- package/dist/db/migrations/005_group_chats.d.ts.map +1 -0
- package/dist/db/migrations/005_group_chats.js +66 -0
- package/dist/db/migrations/005_group_chats.js.map +1 -0
- package/dist/db/migrations/006_template_setup.d.ts +4 -0
- package/dist/db/migrations/006_template_setup.d.ts.map +1 -0
- package/dist/db/migrations/006_template_setup.js +14 -0
- package/dist/db/migrations/006_template_setup.js.map +1 -0
- package/dist/db/migrations/007_group_chat_v2.d.ts +4 -0
- package/dist/db/migrations/007_group_chat_v2.d.ts.map +1 -0
- package/dist/db/migrations/007_group_chat_v2.js +59 -0
- package/dist/db/migrations/007_group_chat_v2.js.map +1 -0
- package/dist/db/migrations/008_default_provider_openrouter.d.ts +4 -0
- package/dist/db/migrations/008_default_provider_openrouter.d.ts.map +1 -0
- package/dist/db/migrations/008_default_provider_openrouter.js +33 -0
- package/dist/db/migrations/008_default_provider_openrouter.js.map +1 -0
- package/dist/db/migrations/009_opencode_default_provider_openrouter.d.ts +4 -0
- package/dist/db/migrations/009_opencode_default_provider_openrouter.d.ts.map +1 -0
- package/dist/db/migrations/009_opencode_default_provider_openrouter.js +33 -0
- package/dist/db/migrations/009_opencode_default_provider_openrouter.js.map +1 -0
- package/dist/db/migrations/010_fix_null_default_provider.d.ts +4 -0
- package/dist/db/migrations/010_fix_null_default_provider.d.ts.map +1 -0
- package/dist/db/migrations/010_fix_null_default_provider.js +24 -0
- package/dist/db/migrations/010_fix_null_default_provider.js.map +1 -0
- package/dist/db/migrations/011_snapshots.d.ts +4 -0
- package/dist/db/migrations/011_snapshots.d.ts.map +1 -0
- package/dist/db/migrations/011_snapshots.js +27 -0
- package/dist/db/migrations/011_snapshots.js.map +1 -0
- package/dist/db/migrations/013_official_templates.d.ts +4 -0
- package/dist/db/migrations/013_official_templates.d.ts.map +1 -0
- package/dist/db/migrations/013_official_templates.js +173 -0
- package/dist/db/migrations/013_official_templates.js.map +1 -0
- package/dist/db/migrations/014_notifications.d.ts +4 -0
- package/dist/db/migrations/014_notifications.d.ts.map +1 -0
- package/dist/db/migrations/014_notifications.js +45 -0
- package/dist/db/migrations/014_notifications.js.map +1 -0
- package/dist/db/migrations/015_security_profile.d.ts +4 -0
- package/dist/db/migrations/015_security_profile.d.ts.map +1 -0
- package/dist/db/migrations/015_security_profile.js +14 -0
- package/dist/db/migrations/015_security_profile.js.map +1 -0
- package/dist/db/migrations/016_template_security.d.ts +4 -0
- package/dist/db/migrations/016_template_security.d.ts.map +1 -0
- package/dist/db/migrations/016_template_security.js +12 -0
- package/dist/db/migrations/016_template_security.js.map +1 -0
- package/dist/db/migrations/017_auth_events.d.ts +4 -0
- package/dist/db/migrations/017_auth_events.d.ts.map +1 -0
- package/dist/db/migrations/017_auth_events.js +19 -0
- package/dist/db/migrations/017_auth_events.js.map +1 -0
- package/dist/db/migrations/018_skill_market.d.ts +4 -0
- package/dist/db/migrations/018_skill_market.d.ts.map +1 -0
- package/dist/db/migrations/018_skill_market.js +21 -0
- package/dist/db/migrations/018_skill_market.js.map +1 -0
- package/dist/db/migrations/019_credential_audit_log.d.ts +4 -0
- package/dist/db/migrations/019_credential_audit_log.d.ts.map +1 -0
- package/dist/db/migrations/019_credential_audit_log.js +19 -0
- package/dist/db/migrations/019_credential_audit_log.js.map +1 -0
- package/dist/db/migrations/020_template_security_score.d.ts +4 -0
- package/dist/db/migrations/020_template_security_score.d.ts.map +1 -0
- package/dist/db/migrations/020_template_security_score.js +31 -0
- package/dist/db/migrations/020_template_security_score.js.map +1 -0
- package/dist/db/migrations/021_credential_enhancements.d.ts +4 -0
- package/dist/db/migrations/021_credential_enhancements.d.ts.map +1 -0
- package/dist/db/migrations/021_credential_enhancements.js +15 -0
- package/dist/db/migrations/021_credential_enhancements.js.map +1 -0
- package/dist/db/migrations/021_user_roles.d.ts +4 -0
- package/dist/db/migrations/021_user_roles.d.ts.map +1 -0
- package/dist/db/migrations/021_user_roles.js +11 -0
- package/dist/db/migrations/021_user_roles.js.map +1 -0
- package/dist/db/migrations/022_config_hash.d.ts +4 -0
- package/dist/db/migrations/022_config_hash.d.ts.map +1 -0
- package/dist/db/migrations/022_config_hash.js +11 -0
- package/dist/db/migrations/022_config_hash.js.map +1 -0
- package/dist/db/migrations/023_account_security.d.ts +4 -0
- package/dist/db/migrations/023_account_security.d.ts.map +1 -0
- package/dist/db/migrations/023_account_security.js +22 -0
- package/dist/db/migrations/023_account_security.js.map +1 -0
- package/dist/db/migrations/024_wizard_configs.d.ts +4 -0
- package/dist/db/migrations/024_wizard_configs.d.ts.map +1 -0
- package/dist/db/migrations/024_wizard_configs.js +165 -0
- package/dist/db/migrations/024_wizard_configs.js.map +1 -0
- package/dist/db/migrations/025_auth_dual_mode.d.ts +4 -0
- package/dist/db/migrations/025_auth_dual_mode.d.ts.map +1 -0
- package/dist/db/migrations/025_auth_dual_mode.js +19 -0
- package/dist/db/migrations/025_auth_dual_mode.js.map +1 -0
- package/dist/db/migrations/027_add_avatar_to_instances.d.ts +4 -0
- package/dist/db/migrations/027_add_avatar_to_instances.d.ts.map +1 -0
- package/dist/db/migrations/027_add_avatar_to_instances.js +11 -0
- package/dist/db/migrations/027_add_avatar_to_instances.js.map +1 -0
- package/dist/db/migrations/027_add_clerk_id.d.ts +4 -0
- package/dist/db/migrations/027_add_clerk_id.d.ts.map +1 -0
- package/dist/db/migrations/027_add_clerk_id.js +11 -0
- package/dist/db/migrations/027_add_clerk_id.js.map +1 -0
- package/dist/db/migrations/028_template_plugin_dependencies.d.ts +4 -0
- package/dist/db/migrations/028_template_plugin_dependencies.d.ts.map +1 -0
- package/dist/db/migrations/028_template_plugin_dependencies.js +18 -0
- package/dist/db/migrations/028_template_plugin_dependencies.js.map +1 -0
- package/dist/db/migrations/029_remap_orphan_config_keys.d.ts +21 -0
- package/dist/db/migrations/029_remap_orphan_config_keys.d.ts.map +1 -0
- package/dist/db/migrations/029_remap_orphan_config_keys.js +63 -0
- package/dist/db/migrations/029_remap_orphan_config_keys.js.map +1 -0
- package/dist/db/migrations/030_extend_notification_types.d.ts +4 -0
- package/dist/db/migrations/030_extend_notification_types.d.ts.map +1 -0
- package/dist/db/migrations/030_extend_notification_types.js +10 -0
- package/dist/db/migrations/030_extend_notification_types.js.map +1 -0
- package/dist/db/migrations/031_default_security_profile_developer.d.ts +9 -0
- package/dist/db/migrations/031_default_security_profile_developer.d.ts.map +1 -0
- package/dist/db/migrations/031_default_security_profile_developer.js +22 -0
- package/dist/db/migrations/031_default_security_profile_developer.js.map +1 -0
- package/dist/db/migrations/032_geo_template.d.ts +4 -0
- package/dist/db/migrations/032_geo_template.d.ts.map +1 -0
- package/dist/db/migrations/032_geo_template.js +133 -0
- package/dist/db/migrations/032_geo_template.js.map +1 -0
- package/dist/db/migrations/033_jinko_travel_template.d.ts +4 -0
- package/dist/db/migrations/033_jinko_travel_template.d.ts.map +1 -0
- package/dist/db/migrations/033_jinko_travel_template.js +126 -0
- package/dist/db/migrations/033_jinko_travel_template.js.map +1 -0
- package/dist/db/postgres-adapter.d.ts +13 -0
- package/dist/db/postgres-adapter.d.ts.map +1 -0
- package/dist/db/postgres-adapter.js +27 -0
- package/dist/db/postgres-adapter.js.map +1 -0
- package/dist/db/run-migrations.d.ts +2 -0
- package/dist/db/run-migrations.d.ts.map +1 -0
- package/dist/db/run-migrations.js +26 -0
- package/dist/db/run-migrations.js.map +1 -0
- package/dist/db/sqlite-adapter.d.ts +13 -0
- package/dist/db/sqlite-adapter.d.ts.map +1 -0
- package/dist/db/sqlite-adapter.js +29 -0
- package/dist/db/sqlite-adapter.js.map +1 -0
- package/dist/ee/litellm/litellm-key-manager.d.ts +16 -0
- package/dist/ee/litellm/litellm-key-manager.d.ts.map +1 -0
- package/dist/ee/litellm/litellm-key-manager.js +16 -0
- package/dist/ee/litellm/litellm-key-manager.js.map +1 -0
- package/dist/ee/litellm/litellm-model-seeder.d.ts +6 -0
- package/dist/ee/litellm/litellm-model-seeder.d.ts.map +1 -0
- package/dist/ee/litellm/litellm-model-seeder.js +6 -0
- package/dist/ee/litellm/litellm-model-seeder.js.map +1 -0
- package/dist/index.ce.d.ts +2 -0
- package/dist/index.ce.d.ts.map +1 -0
- package/dist/index.ce.js +12 -0
- package/dist/index.ce.js.map +1 -0
- package/dist/middleware/auth.d.ts +30 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +86 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/dynamic-middleware.d.ts +7 -0
- package/dist/middleware/dynamic-middleware.d.ts.map +1 -0
- package/dist/middleware/dynamic-middleware.js +46 -0
- package/dist/middleware/dynamic-middleware.js.map +1 -0
- package/dist/middleware/log-redaction.d.ts +2 -0
- package/dist/middleware/log-redaction.d.ts.map +1 -0
- package/dist/middleware/log-redaction.js +56 -0
- package/dist/middleware/log-redaction.js.map +1 -0
- package/dist/routes/admin.d.ts +3 -0
- package/dist/routes/admin.d.ts.map +1 -0
- package/dist/routes/admin.js +491 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/agent-types.d.ts +3 -0
- package/dist/routes/agent-types.d.ts.map +1 -0
- package/dist/routes/agent-types.js +85 -0
- package/dist/routes/agent-types.js.map +1 -0
- package/dist/routes/auth.d.ts +3 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +242 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/channels.d.ts +3 -0
- package/dist/routes/channels.d.ts.map +1 -0
- package/dist/routes/channels.js +527 -0
- package/dist/routes/channels.js.map +1 -0
- package/dist/routes/credentials.d.ts +3 -0
- package/dist/routes/credentials.d.ts.map +1 -0
- package/dist/routes/credentials.js +81 -0
- package/dist/routes/credentials.js.map +1 -0
- package/dist/routes/dashboard.d.ts +3 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +75 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/exec-approval.d.ts +3 -0
- package/dist/routes/exec-approval.d.ts.map +1 -0
- package/dist/routes/exec-approval.js +60 -0
- package/dist/routes/exec-approval.js.map +1 -0
- package/dist/routes/group-chats.d.ts +3 -0
- package/dist/routes/group-chats.d.ts.map +1 -0
- package/dist/routes/group-chats.js +190 -0
- package/dist/routes/group-chats.js.map +1 -0
- package/dist/routes/instance-files.d.ts +3 -0
- package/dist/routes/instance-files.d.ts.map +1 -0
- package/dist/routes/instance-files.js +255 -0
- package/dist/routes/instance-files.js.map +1 -0
- package/dist/routes/instance-proxy.d.ts +40 -0
- package/dist/routes/instance-proxy.d.ts.map +1 -0
- package/dist/routes/instance-proxy.js +318 -0
- package/dist/routes/instance-proxy.js.map +1 -0
- package/dist/routes/instances.d.ts +3 -0
- package/dist/routes/instances.d.ts.map +1 -0
- package/dist/routes/instances.js +325 -0
- package/dist/routes/instances.js.map +1 -0
- package/dist/routes/metadata.d.ts +3 -0
- package/dist/routes/metadata.d.ts.map +1 -0
- package/dist/routes/metadata.js +13 -0
- package/dist/routes/metadata.js.map +1 -0
- package/dist/routes/notifications.d.ts +3 -0
- package/dist/routes/notifications.d.ts.map +1 -0
- package/dist/routes/notifications.js +104 -0
- package/dist/routes/notifications.js.map +1 -0
- package/dist/routes/oauth.d.ts +3 -0
- package/dist/routes/oauth.d.ts.map +1 -0
- package/dist/routes/oauth.js +516 -0
- package/dist/routes/oauth.js.map +1 -0
- package/dist/routes/rpc-proxy.d.ts +3 -0
- package/dist/routes/rpc-proxy.d.ts.map +1 -0
- package/dist/routes/rpc-proxy.js +116 -0
- package/dist/routes/rpc-proxy.js.map +1 -0
- package/dist/routes/security.d.ts +3 -0
- package/dist/routes/security.d.ts.map +1 -0
- package/dist/routes/security.js +43 -0
- package/dist/routes/security.js.map +1 -0
- package/dist/routes/skills.d.ts +3 -0
- package/dist/routes/skills.d.ts.map +1 -0
- package/dist/routes/skills.js +48 -0
- package/dist/routes/skills.js.map +1 -0
- package/dist/routes/snapshots.d.ts +3 -0
- package/dist/routes/snapshots.d.ts.map +1 -0
- package/dist/routes/snapshots.js +99 -0
- package/dist/routes/snapshots.js.map +1 -0
- package/dist/routes/system-config.d.ts +3 -0
- package/dist/routes/system-config.d.ts.map +1 -0
- package/dist/routes/system-config.js +75 -0
- package/dist/routes/system-config.js.map +1 -0
- package/dist/routes/templates.d.ts +3 -0
- package/dist/routes/templates.d.ts.map +1 -0
- package/dist/routes/templates.js +256 -0
- package/dist/routes/templates.js.map +1 -0
- package/dist/routes/ui-proxy.d.ts +3 -0
- package/dist/routes/ui-proxy.d.ts.map +1 -0
- package/dist/routes/ui-proxy.js +90 -0
- package/dist/routes/ui-proxy.js.map +1 -0
- package/dist/routes/user-credentials.d.ts +3 -0
- package/dist/routes/user-credentials.d.ts.map +1 -0
- package/dist/routes/user-credentials.js +85 -0
- package/dist/routes/user-credentials.js.map +1 -0
- package/dist/routes/users.d.ts +3 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +30 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/runtime/docker.d.ts +37 -0
- package/dist/runtime/docker.d.ts.map +1 -0
- package/dist/runtime/docker.js +612 -0
- package/dist/runtime/docker.js.map +1 -0
- package/dist/runtime/factory.d.ts +4 -0
- package/dist/runtime/factory.d.ts.map +1 -0
- package/dist/runtime/factory.js +21 -0
- package/dist/runtime/factory.js.map +1 -0
- package/dist/runtime/kubernetes.d.ts +34 -0
- package/dist/runtime/kubernetes.d.ts.map +1 -0
- package/dist/runtime/kubernetes.js +513 -0
- package/dist/runtime/kubernetes.js.map +1 -0
- package/dist/runtime/types.d.ts +81 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/server-core.d.ts +26 -0
- package/dist/server-core.d.ts.map +1 -0
- package/dist/server-core.js +184 -0
- package/dist/server-core.js.map +1 -0
- package/dist/services/config-diff.d.ts +6 -0
- package/dist/services/config-diff.d.ts.map +1 -0
- package/dist/services/config-diff.js +85 -0
- package/dist/services/config-diff.js.map +1 -0
- package/dist/services/config-field-meta.d.ts +22 -0
- package/dist/services/config-field-meta.d.ts.map +1 -0
- package/dist/services/config-field-meta.js +177 -0
- package/dist/services/config-field-meta.js.map +1 -0
- package/dist/services/config-validator.d.ts +8 -0
- package/dist/services/config-validator.d.ts.map +1 -0
- package/dist/services/config-validator.js +59 -0
- package/dist/services/config-validator.js.map +1 -0
- package/dist/services/credential-audit.d.ts +13 -0
- package/dist/services/credential-audit.d.ts.map +1 -0
- package/dist/services/credential-audit.js +18 -0
- package/dist/services/credential-audit.js.map +1 -0
- package/dist/services/credential-store.d.ts +28 -0
- package/dist/services/credential-store.d.ts.map +1 -0
- package/dist/services/credential-store.js +99 -0
- package/dist/services/credential-store.js.map +1 -0
- package/dist/services/dlp-scanner.d.ts +9 -0
- package/dist/services/dlp-scanner.d.ts.map +1 -0
- package/dist/services/dlp-scanner.js +90 -0
- package/dist/services/dlp-scanner.js.map +1 -0
- package/dist/services/gateway-event-relay.d.ts +53 -0
- package/dist/services/gateway-event-relay.d.ts.map +1 -0
- package/dist/services/gateway-event-relay.js +519 -0
- package/dist/services/gateway-event-relay.js.map +1 -0
- package/dist/services/group-chat-manager.d.ts +17 -0
- package/dist/services/group-chat-manager.d.ts.map +1 -0
- package/dist/services/group-chat-manager.js +613 -0
- package/dist/services/group-chat-manager.js.map +1 -0
- package/dist/services/health-monitor.d.ts +3 -0
- package/dist/services/health-monitor.d.ts.map +1 -0
- package/dist/services/health-monitor.js +342 -0
- package/dist/services/health-monitor.js.map +1 -0
- package/dist/services/instance-manager.d.ts +20 -0
- package/dist/services/instance-manager.d.ts.map +1 -0
- package/dist/services/instance-manager.js +833 -0
- package/dist/services/instance-manager.js.map +1 -0
- package/dist/services/metadata-store.d.ts +3 -0
- package/dist/services/metadata-store.d.ts.map +1 -0
- package/dist/services/metadata-store.js +34 -0
- package/dist/services/metadata-store.js.map +1 -0
- package/dist/services/notification-store.d.ts +24 -0
- package/dist/services/notification-store.d.ts.map +1 -0
- package/dist/services/notification-store.js +216 -0
- package/dist/services/notification-store.js.map +1 -0
- package/dist/services/openrouter-models.d.ts +13 -0
- package/dist/services/openrouter-models.d.ts.map +1 -0
- package/dist/services/openrouter-models.js +46 -0
- package/dist/services/openrouter-models.js.map +1 -0
- package/dist/services/output-filter.d.ts +8 -0
- package/dist/services/output-filter.d.ts.map +1 -0
- package/dist/services/output-filter.js +230 -0
- package/dist/services/output-filter.js.map +1 -0
- package/dist/services/prompt-guard.d.ts +6 -0
- package/dist/services/prompt-guard.d.ts.map +1 -0
- package/dist/services/prompt-guard.js +165 -0
- package/dist/services/prompt-guard.js.map +1 -0
- package/dist/services/security-event-service.d.ts +11 -0
- package/dist/services/security-event-service.d.ts.map +1 -0
- package/dist/services/security-event-service.js +201 -0
- package/dist/services/security-event-service.js.map +1 -0
- package/dist/services/snapshot-store.d.ts +21 -0
- package/dist/services/snapshot-store.d.ts.map +1 -0
- package/dist/services/snapshot-store.js +330 -0
- package/dist/services/snapshot-store.js.map +1 -0
- package/dist/services/system-config.d.ts +15 -0
- package/dist/services/system-config.d.ts.map +1 -0
- package/dist/services/system-config.js +80 -0
- package/dist/services/system-config.js.map +1 -0
- package/dist/services/template-file-format.d.ts +32 -0
- package/dist/services/template-file-format.d.ts.map +1 -0
- package/dist/services/template-file-format.js +125 -0
- package/dist/services/template-file-format.js.map +1 -0
- package/dist/services/template-store.d.ts +21 -0
- package/dist/services/template-store.d.ts.map +1 -0
- package/dist/services/template-store.js +701 -0
- package/dist/services/template-store.js.map +1 -0
- package/dist/services/user-credential-store.d.ts +20 -0
- package/dist/services/user-credential-store.d.ts.map +1 -0
- package/dist/services/user-credential-store.js +243 -0
- package/dist/services/user-credential-store.js.map +1 -0
- package/dist/services/wizard-config-store.d.ts +38 -0
- package/dist/services/wizard-config-store.d.ts.map +1 -0
- package/dist/services/wizard-config-store.js +70 -0
- package/dist/services/wizard-config-store.js.map +1 -0
- package/dist/web-dist/assets/AdminPage-BrAU67Dg.js +1 -0
- package/dist/web-dist/assets/AgentAvatar-BKJckc1W.js +1 -0
- package/dist/web-dist/assets/AgentAvatar-Cq-M5jMd.css +1 -0
- package/dist/web-dist/assets/AppLayout-Bf0v_2wK.css +1 -0
- package/dist/web-dist/assets/AppLayout-DXgV0atq.js +1 -0
- package/dist/web-dist/assets/AssistantChatPage-uVLgKLay.js +6 -0
- package/dist/web-dist/assets/AssistantEditPage-Bab1X-DA.js +1 -0
- package/dist/web-dist/assets/AssistantVersionsPage-BQRw3BUF.js +1 -0
- package/dist/web-dist/assets/AvatarPicker-DmnkD8Rb.js +1 -0
- package/dist/web-dist/assets/AvatarPicker-LHUepNFa.css +1 -0
- package/dist/web-dist/assets/CeAuthProvider-38_x9VGA.js +1 -0
- package/dist/web-dist/assets/ChatHubPage-2l4cKq0x.css +1 -0
- package/dist/web-dist/assets/ChatHubPage-B2WduoUM.js +1 -0
- package/dist/web-dist/assets/ChatTab-CHpjEu8M.js +6 -0
- package/dist/web-dist/assets/CreateWizardPage-DFEQ3VX3.js +47 -0
- package/dist/web-dist/assets/CreateWizardPage-IqNXDOER.css +1 -0
- package/dist/web-dist/assets/CredentialsPage-CDeXpnLG.js +1 -0
- package/dist/web-dist/assets/CredentialsPage-aI4kLoJD.css +1 -0
- package/dist/web-dist/assets/DocsAboutPage-CMbxiw1u.js +26 -0
- package/dist/web-dist/assets/DocsChannelsPage-CtmKYKK_.js +1 -0
- package/dist/web-dist/assets/DocsGettingStartedPage-CpM7o8sw.js +1 -0
- package/dist/web-dist/assets/DocsGroupChatsPage-7w-RVSJR.js +1 -0
- package/dist/web-dist/assets/DocsHomePage-BGEU5xBg.js +1 -0
- package/dist/web-dist/assets/DocsInstancesPage-Sewnw_x7.js +1 -0
- package/dist/web-dist/assets/DocsLayout-S7-ONZwP.js +1 -0
- package/dist/web-dist/assets/DocsProvidersPage-MeWneL5K.js +1 -0
- package/dist/web-dist/assets/DocsSkillsPage-CzsHPXxE.js +1 -0
- package/dist/web-dist/assets/DocsTemplatesPage-BXASAEoO.js +1 -0
- package/dist/web-dist/assets/DocsWorkspacePage-qYNeK_YS.js +24 -0
- package/dist/web-dist/assets/ExportWizardPage-BhNvovbU.js +3 -0
- package/dist/web-dist/assets/ExportWizardPage-Cp-KSYUy.css +1 -0
- package/dist/web-dist/assets/GoogleOAuthCallback-CBvLawe2.js +1 -0
- package/dist/web-dist/assets/GroupChatPage-rMfhmtsX.js +1 -0
- package/dist/web-dist/assets/GroupChatsListPage-BOwxHFfA.js +1 -0
- package/dist/web-dist/assets/InstancePage-BBL68DKB.js +1 -0
- package/dist/web-dist/assets/InstancePage-CzysRY40.css +1 -0
- package/dist/web-dist/assets/MyAssistantsPage-B808ZfHg.css +1 -0
- package/dist/web-dist/assets/MyAssistantsPage-q3-hNMth.js +1 -0
- package/dist/web-dist/assets/ProfilePage-Dx8YdU59.js +1 -0
- package/dist/web-dist/assets/ProfilePage-JMOkUDx7.css +1 -0
- package/dist/web-dist/assets/SessionDrawer-Ba7pbZDJ.css +1 -0
- package/dist/web-dist/assets/SessionDrawer-CXzEQAfF.js +1 -0
- package/dist/web-dist/assets/SystemConfigPage-4dvxADwi.js +1 -0
- package/dist/web-dist/assets/SystemConfigPage-DRqVfLGt.css +1 -0
- package/dist/web-dist/assets/TemplatesPage-DqXuG-Gy.css +1 -0
- package/dist/web-dist/assets/TemplatesPage-HMS__ODO.js +1 -0
- package/dist/web-dist/assets/TestLoginPage-xVQL0lYP.js +1 -0
- package/dist/web-dist/assets/ThemeToggle-DymKEYXG.js +1 -0
- package/dist/web-dist/assets/WorkbenchPage-Bymo4SSt.css +1 -0
- package/dist/web-dist/assets/WorkbenchPage-ST3hVrbL.js +33 -0
- package/dist/web-dist/assets/api-B5psysvQ.js +1 -0
- package/dist/web-dist/assets/clock-dRyRszad.js +1 -0
- package/dist/web-dist/assets/createLucideIcon-DiGX-lN4.js +1 -0
- package/dist/web-dist/assets/group-chat-9BaA9G_8.css +1 -0
- package/dist/web-dist/assets/index-BqzqZJ96.js +26 -0
- package/dist/web-dist/assets/index-DyrDN1Of.css +1 -0
- package/dist/web-dist/assets/index-wWimwgy7.js +1 -0
- package/dist/web-dist/assets/provider-display-BgrE7u33.js +1 -0
- package/dist/web-dist/assets/types-1lNWpzYk.js +57 -0
- package/dist/web-dist/assets/types-B6ttO-6G.css +1 -0
- package/dist/web-dist/assets/useTranslation-B-8kenfJ.js +1 -0
- package/dist/web-dist/assets/zap-CVBnETFW.js +1 -0
- package/dist/web-dist/index.html +31 -0
- package/dist/web-dist/vite.svg +1 -0
- package/dist/ws/index.d.ts +7 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +112 -0
- package/dist/ws/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,714 @@
|
|
|
1
|
+
import { DEFAULT_TOOL_PERMISSIONS } from '@aquarium/shared';
|
|
2
|
+
import { GatewayRPCClient } from './gateway-rpc.js';
|
|
3
|
+
import { getGatewayClient, connectGateway } from '../../services/gateway-event-relay.js';
|
|
4
|
+
/** Recursively deep-merge source into target (objects only; arrays are replaced). */
|
|
5
|
+
function deepMerge(target, source) {
|
|
6
|
+
const result = { ...target };
|
|
7
|
+
for (const key of Object.keys(source)) {
|
|
8
|
+
if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key]) &&
|
|
9
|
+
result[key] && typeof result[key] === 'object' && !Array.isArray(result[key])) {
|
|
10
|
+
result[key] = deepMerge(result[key], source[key]);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
result[key] = source[key];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
import { WORKSPACE_TEMPLATES } from './workspace-templates.js';
|
|
19
|
+
import { resolveCredentialPlaceholders } from '../../services/user-credential-store.js';
|
|
20
|
+
import { ProviderRegistry } from './provider-registry.js';
|
|
21
|
+
import { getSecurityConfig, getSecurityParagraph, DEFAULT_TRUST_LEVEL_INDICATORS } from './security-profiles.js';
|
|
22
|
+
import { config } from '../../config.js';
|
|
23
|
+
// Models available via the openai-codex provider (chatgpt.com backend).
|
|
24
|
+
// Used to validate and remap models when the user has an OpenAI OAuth token.
|
|
25
|
+
const OPENAI_CODEX_MODELS = [
|
|
26
|
+
'gpt-5.1',
|
|
27
|
+
'gpt-5.1-codex-max',
|
|
28
|
+
'gpt-5.1-codex-mini',
|
|
29
|
+
'gpt-5.2',
|
|
30
|
+
'gpt-5.2-codex',
|
|
31
|
+
'gpt-5.3-codex',
|
|
32
|
+
'gpt-5.3-codex-spark',
|
|
33
|
+
];
|
|
34
|
+
// Best-effort mapping from openai models to their closest openai-codex equivalents.
|
|
35
|
+
const OPENAI_TO_CODEX_MODEL_MAP = {
|
|
36
|
+
'gpt-5': 'gpt-5.1',
|
|
37
|
+
'gpt-5-mini': 'gpt-5.1-codex-mini',
|
|
38
|
+
'gpt-4.1': 'gpt-5.1',
|
|
39
|
+
'gpt-4.1-mini': 'gpt-5.1-codex-mini',
|
|
40
|
+
'gpt-4.1-nano': 'gpt-5.1-codex-mini',
|
|
41
|
+
'gpt-4o': 'gpt-5.1',
|
|
42
|
+
'gpt-4o-mini': 'gpt-5.1-codex-mini',
|
|
43
|
+
'o3': 'gpt-5.1',
|
|
44
|
+
'o3-mini': 'gpt-5.1-codex-mini',
|
|
45
|
+
'o3-pro': 'gpt-5.1-codex-max',
|
|
46
|
+
'o1': 'gpt-5.1',
|
|
47
|
+
'o1-mini': 'gpt-5.1-codex-mini',
|
|
48
|
+
'codex-mini': 'gpt-5.1-codex-mini',
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Returns true if the given Gateway image tag supports the SecretRef mechanism
|
|
52
|
+
* (keyRef / tokenRef in auth-profiles.json + secrets.providers in openclaw.json).
|
|
53
|
+
* SecretRef was merged in early March 2026; tag 2026.3.13 is confirmed to include it.
|
|
54
|
+
* Older tags (e.g. 2026.3.2-p1) may pre-date the feature and fall back to plaintext.
|
|
55
|
+
*/
|
|
56
|
+
function supportsSecretRef(imageTag) {
|
|
57
|
+
// Strip patch suffix (e.g. "-p1") for comparison
|
|
58
|
+
const base = imageTag.replace(/-p\d+$/, '');
|
|
59
|
+
const parts = base.split('.').map(Number);
|
|
60
|
+
if (parts.length < 3 || parts.some(isNaN))
|
|
61
|
+
return false;
|
|
62
|
+
const [year, month, day] = parts;
|
|
63
|
+
if (year > 2026)
|
|
64
|
+
return true;
|
|
65
|
+
if (year === 2026 && month > 3)
|
|
66
|
+
return true;
|
|
67
|
+
if (year === 2026 && month === 3 && day >= 13)
|
|
68
|
+
return true;
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const WORKSPACE_FILES = [
|
|
72
|
+
{ key: 'agentsmd', filename: 'workspace/AGENTS.md', template: 'AGENTS.md' },
|
|
73
|
+
{ key: 'soulmd', filename: 'workspace/SOUL.md', template: 'SOUL.md' },
|
|
74
|
+
{ key: 'identitymd', filename: 'workspace/IDENTITY.md', template: 'IDENTITY.md' },
|
|
75
|
+
{ key: 'usermd', filename: 'workspace/USER.md', template: 'USER.md' },
|
|
76
|
+
{ key: 'toolsmd', filename: 'workspace/TOOLS.md', template: 'TOOLS.md' },
|
|
77
|
+
{ key: 'bootstrapmd', filename: 'workspace/BOOTSTRAP.md', template: 'BOOTSTRAP.md' },
|
|
78
|
+
{ key: 'heartbeatmd', filename: 'workspace/HEARTBEAT.md', template: 'HEARTBEAT.md' },
|
|
79
|
+
{ key: 'memorymd', filename: 'workspace/MEMORY.md', template: 'MEMORY.md' },
|
|
80
|
+
];
|
|
81
|
+
export const openclawAdapter = {
|
|
82
|
+
categorizeConfigFiles(files) {
|
|
83
|
+
const alwaysOverwrite = new Map();
|
|
84
|
+
const seedIfAbsent = new Map();
|
|
85
|
+
for (const [path, content] of files) {
|
|
86
|
+
if (path === 'openclaw.json' ||
|
|
87
|
+
path.endsWith('auth-profiles.json') ||
|
|
88
|
+
path === 'workspace/SOUL.md') {
|
|
89
|
+
alwaysOverwrite.set(path, content);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
seedIfAbsent.set(path, content);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { alwaysOverwrite, seedIfAbsent };
|
|
96
|
+
},
|
|
97
|
+
async seedConfig({ instance, userConfig, credentials, litellmKey }) {
|
|
98
|
+
const files = new Map();
|
|
99
|
+
const cfg = {};
|
|
100
|
+
const agentDefaults = {};
|
|
101
|
+
{
|
|
102
|
+
let provider = userConfig.defaultProvider || userConfig.provider || 'openrouter';
|
|
103
|
+
let model = userConfig.defaultModel || userConfig.model || 'anthropic/claude-sonnet-4';
|
|
104
|
+
// Auto mode: cost-optimized smart routing where LiteLLM picks the best
|
|
105
|
+
// model based on task complexity. The gateway exposes all available models
|
|
106
|
+
// and the agent/LiteLLM router selects the appropriate tier.
|
|
107
|
+
const isAutoMode = model === 'auto';
|
|
108
|
+
// Platform mode: route through LiteLLM proxy, override provider to 'litellm'
|
|
109
|
+
// so Gateway uses the litellm:default auth profile instead of looking for
|
|
110
|
+
// a provider-specific auth profile (e.g. openrouter) that doesn't exist.
|
|
111
|
+
if (instance.billingMode === 'platform' && litellmKey) {
|
|
112
|
+
// Preserve original provider for building the LiteLLM model ID.
|
|
113
|
+
// LiteLLM model IDs use the format '<original-provider>/<model-name>'
|
|
114
|
+
// (e.g. 'anthropic/claude-sonnet-4-20250514'). The Gateway then routes
|
|
115
|
+
// via 'litellm/<litellm-model-id>'.
|
|
116
|
+
const originalProvider = provider;
|
|
117
|
+
provider = 'litellm';
|
|
118
|
+
if (isAutoMode) {
|
|
119
|
+
// Auto mode: use claude-sonnet-4 as the default primary model (standard tier).
|
|
120
|
+
// The LiteLLM proxy key has no model restrictions, so the agent can use
|
|
121
|
+
// any model. The gateway exposes all models so the agent (or LiteLLM
|
|
122
|
+
// router) can pick the appropriate tier based on task complexity:
|
|
123
|
+
// Budget: openai/gpt-4o-mini (simple tasks)
|
|
124
|
+
// Standard: anthropic/claude-sonnet-4 (medium tasks)
|
|
125
|
+
// Premium: anthropic/claude-opus-4 (complex tasks)
|
|
126
|
+
model = 'anthropic/claude-sonnet-4';
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Ensure model includes the original provider prefix for LiteLLM routing
|
|
130
|
+
if (!model.includes('/')) {
|
|
131
|
+
model = `${originalProvider}/${model}`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// The model name must match exactly what's registered in LiteLLM.
|
|
135
|
+
// Default model ID in LiteLLM typically includes a date suffix
|
|
136
|
+
// (e.g. 'anthropic/claude-sonnet-4-20250514'), but the user config
|
|
137
|
+
// may omit it. We keep whatever the user/config provides — if the
|
|
138
|
+
// model doesn't exist in LiteLLM the Gateway will surface a clear error.
|
|
139
|
+
// Build models.providers.litellm config block so Gateway knows how
|
|
140
|
+
// to reach the LiteLLM proxy and which models are available.
|
|
141
|
+
const litellmInternalUrl = config.litellm.proxyInternalUrl;
|
|
142
|
+
// Fetch available models from OpenRouter to populate the provider config.
|
|
143
|
+
// LiteLLM uses wildcard routing (openrouter/*) so any model works.
|
|
144
|
+
const { fetchOpenRouterModels } = await import('../../services/openrouter-models.js');
|
|
145
|
+
let litellmModels = [];
|
|
146
|
+
try {
|
|
147
|
+
litellmModels = await fetchOpenRouterModels();
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.warn('[adapter] Failed to fetch OpenRouter models, using configured model only:', err);
|
|
151
|
+
}
|
|
152
|
+
if (litellmModels.length === 0) {
|
|
153
|
+
litellmModels = [{ id: model, name: model }];
|
|
154
|
+
}
|
|
155
|
+
// In auto mode, ensure the three routing tiers are always present
|
|
156
|
+
// in the model list so the agent can select any tier.
|
|
157
|
+
if (isAutoMode) {
|
|
158
|
+
const autoTierModels = [
|
|
159
|
+
{ id: 'openai/gpt-4o-mini', name: 'GPT-4o Mini (Budget)', input: ['text', 'image'] },
|
|
160
|
+
{ id: 'anthropic/claude-sonnet-4', name: 'Claude Sonnet 4 (Standard)', input: ['text', 'image'] },
|
|
161
|
+
{ id: 'anthropic/claude-opus-4', name: 'Claude Opus 4 (Premium)', input: ['text', 'image'] },
|
|
162
|
+
];
|
|
163
|
+
const existingIds = new Set(litellmModels.map(m => m.id));
|
|
164
|
+
for (const tier of autoTierModels) {
|
|
165
|
+
if (!existingIds.has(tier.id)) {
|
|
166
|
+
litellmModels.push(tier);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
cfg.models = {
|
|
171
|
+
providers: {
|
|
172
|
+
litellm: {
|
|
173
|
+
baseUrl: litellmInternalUrl,
|
|
174
|
+
apiKey: litellmKey,
|
|
175
|
+
api: 'openai-completions',
|
|
176
|
+
models: litellmModels,
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// OAuth tokens route through openai-codex provider (chatgpt.com), not openai (api.openai.com)
|
|
183
|
+
const hasOpenAIOAuth = credentials.some(c => c.provider === 'openai' && c.credentialType === 'oauth_token');
|
|
184
|
+
if (provider === 'openai' && hasOpenAIOAuth) {
|
|
185
|
+
provider = 'openai-codex';
|
|
186
|
+
if (!OPENAI_CODEX_MODELS.includes(model)) {
|
|
187
|
+
const remapped = OPENAI_TO_CODEX_MODEL_MAP[model] || 'gpt-5.1-codex-mini';
|
|
188
|
+
console.warn(`[adapter] Model "${model}" unavailable on openai-codex, remapping to "${remapped}"`);
|
|
189
|
+
agentDefaults.model = { primary: `${provider}/${remapped}` };
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
agentDefaults.model = { primary: `${provider}/${model}` };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Set model if not already set by codex remapping above
|
|
197
|
+
if (!agentDefaults.model) {
|
|
198
|
+
agentDefaults.model = { primary: `${provider}/${model}` };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Always configure agents section to enable sessions_spawn for MCP skill tools
|
|
202
|
+
// (e.g. jinko-flight). Without agents.list[].subagents.allowAgents, the gateway
|
|
203
|
+
// returns: 'agentId is not allowed for sessions_spawn (allowed: none)'.
|
|
204
|
+
//
|
|
205
|
+
// Schema-valid fields only (additionalProperties: false enforced by gateway):
|
|
206
|
+
// agents.defaults.subagents: maxConcurrent | archiveAfterMinutes | model | thinking
|
|
207
|
+
// agents.list[].subagents: allowAgents | model | thinking
|
|
208
|
+
agentDefaults.subagents = { maxConcurrent: 3 };
|
|
209
|
+
cfg.agents = {
|
|
210
|
+
defaults: agentDefaults,
|
|
211
|
+
list: [
|
|
212
|
+
{
|
|
213
|
+
id: 'main',
|
|
214
|
+
default: true,
|
|
215
|
+
subagents: { allowAgents: ['*'] },
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
// Build tools config: MCP servers + tool permissions
|
|
220
|
+
const toolsCfg = {};
|
|
221
|
+
if (userConfig.mcpServers) {
|
|
222
|
+
const resolved = await resolveCredentialPlaceholders(userConfig.mcpServers, instance.id, instance.userId, { source: 'seed_config' });
|
|
223
|
+
const sanitized = {};
|
|
224
|
+
for (const [name, raw] of Object.entries(resolved)) {
|
|
225
|
+
if (!raw || typeof raw !== 'object') {
|
|
226
|
+
sanitized[name] = raw;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const srv = raw;
|
|
230
|
+
if (typeof srv.url === 'string' && srv.url.length > 0) {
|
|
231
|
+
const entry = { url: srv.url };
|
|
232
|
+
if (srv.headers && typeof srv.headers === 'object' && Object.keys(srv.headers).length > 0) {
|
|
233
|
+
entry.headers = srv.headers;
|
|
234
|
+
}
|
|
235
|
+
sanitized[name] = entry;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (typeof srv.command === 'string' && srv.command.length > 0) {
|
|
239
|
+
const entry = { command: srv.command };
|
|
240
|
+
if (Array.isArray(srv.args) && srv.args.length > 0) {
|
|
241
|
+
entry.args = srv.args;
|
|
242
|
+
}
|
|
243
|
+
if (srv.env && typeof srv.env === 'object' && Object.keys(srv.env).length > 0) {
|
|
244
|
+
entry.env = srv.env;
|
|
245
|
+
}
|
|
246
|
+
sanitized[name] = entry;
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
sanitized[name] = srv;
|
|
250
|
+
}
|
|
251
|
+
toolsCfg.mcp = sanitized;
|
|
252
|
+
}
|
|
253
|
+
// Apply tool permissions from instance config (default: full access)
|
|
254
|
+
const perms = {
|
|
255
|
+
...DEFAULT_TOOL_PERMISSIONS,
|
|
256
|
+
...userConfig.toolPermissions,
|
|
257
|
+
};
|
|
258
|
+
if (perms.profile !== 'full') {
|
|
259
|
+
toolsCfg.profile = perms.profile;
|
|
260
|
+
}
|
|
261
|
+
// Build deny list from toggles + custom deny entries
|
|
262
|
+
const denyList = [...(perms.denyList || [])];
|
|
263
|
+
if (!perms.webSearchEnabled)
|
|
264
|
+
denyList.push('web_search');
|
|
265
|
+
if (!perms.webFetchEnabled)
|
|
266
|
+
denyList.push('web_fetch');
|
|
267
|
+
if (!perms.browserEnabled)
|
|
268
|
+
denyList.push('browser');
|
|
269
|
+
if (denyList.length > 0) {
|
|
270
|
+
toolsCfg.deny = [...new Set(denyList)];
|
|
271
|
+
}
|
|
272
|
+
if (!perms.webSearchEnabled) {
|
|
273
|
+
toolsCfg.web = { ...toolsCfg.web || {}, search: { enabled: false } };
|
|
274
|
+
}
|
|
275
|
+
if (!perms.webFetchEnabled) {
|
|
276
|
+
const existing = toolsCfg.web || {};
|
|
277
|
+
toolsCfg.web = { ...existing, fetch: { enabled: false } };
|
|
278
|
+
}
|
|
279
|
+
if (!perms.elevatedEnabled) {
|
|
280
|
+
toolsCfg.elevated = { enabled: false };
|
|
281
|
+
}
|
|
282
|
+
if (Object.keys(toolsCfg).length > 0) {
|
|
283
|
+
cfg.tools = toolsCfg;
|
|
284
|
+
}
|
|
285
|
+
// Data-driven channel config: maps credential provider to channel config + plugin entry.
|
|
286
|
+
// Standard channels use env var substitution; special channels handled individually below.
|
|
287
|
+
const channelCredMap = {
|
|
288
|
+
telegram: {
|
|
289
|
+
channelKey: 'telegram',
|
|
290
|
+
envVar: 'TELEGRAM_BOT_TOKEN',
|
|
291
|
+
configBuilder: (ref) => ({ enabled: true, botToken: ref, dmPolicy: 'open', allowFrom: ['*'] }),
|
|
292
|
+
},
|
|
293
|
+
discord: {
|
|
294
|
+
channelKey: 'discord',
|
|
295
|
+
envVar: 'DISCORD_BOT_TOKEN',
|
|
296
|
+
configBuilder: (ref) => ({ enabled: true, token: ref, dm: { policy: 'open', allowFrom: ['*'] }, groupPolicy: 'open' }),
|
|
297
|
+
},
|
|
298
|
+
nostr: {
|
|
299
|
+
channelKey: 'nostr',
|
|
300
|
+
envVar: 'NOSTR_PRIVATE_KEY',
|
|
301
|
+
configBuilder: (ref) => ({
|
|
302
|
+
enabled: true,
|
|
303
|
+
privateKey: ref,
|
|
304
|
+
relays: ['wss://relay.damus.io', 'wss://nos.lol'],
|
|
305
|
+
dmPolicy: 'open',
|
|
306
|
+
allowFrom: ['*'],
|
|
307
|
+
groupPolicy: 'open',
|
|
308
|
+
}),
|
|
309
|
+
},
|
|
310
|
+
msteams: {
|
|
311
|
+
channelKey: 'msteams',
|
|
312
|
+
envVar: 'MSTEAMS_APP_ID',
|
|
313
|
+
configBuilder: (ref) => ({
|
|
314
|
+
enabled: true,
|
|
315
|
+
appId: ref,
|
|
316
|
+
appPassword: '${MSTEAMS_APP_PASSWORD}',
|
|
317
|
+
tenantId: '${MSTEAMS_TENANT_ID}',
|
|
318
|
+
webhook: { port: 3978, path: '/api/messages' },
|
|
319
|
+
dmPolicy: 'pairing',
|
|
320
|
+
allowFrom: ['*'],
|
|
321
|
+
groupPolicy: 'allowlist',
|
|
322
|
+
}),
|
|
323
|
+
},
|
|
324
|
+
zalo: {
|
|
325
|
+
channelKey: 'zalo',
|
|
326
|
+
envVar: 'ZALO_BOT_TOKEN',
|
|
327
|
+
configBuilder: (ref) => ({
|
|
328
|
+
enabled: true,
|
|
329
|
+
botToken: ref,
|
|
330
|
+
dmPolicy: 'pairing',
|
|
331
|
+
allowFrom: ['*'],
|
|
332
|
+
}),
|
|
333
|
+
},
|
|
334
|
+
line: {
|
|
335
|
+
channelKey: 'line',
|
|
336
|
+
envVar: 'LINE_CHANNEL_ACCESS_TOKEN',
|
|
337
|
+
configBuilder: (ref) => ({
|
|
338
|
+
enabled: true,
|
|
339
|
+
channelAccessToken: ref,
|
|
340
|
+
channelSecret: '${LINE_CHANNEL_SECRET}',
|
|
341
|
+
dmPolicy: 'pairing',
|
|
342
|
+
allowFrom: ['*'],
|
|
343
|
+
groupPolicy: 'allowlist',
|
|
344
|
+
}),
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
const channels = {};
|
|
348
|
+
const pluginEntries = {};
|
|
349
|
+
// WhatsApp: only configure if credentials exist (same pattern as other channels)
|
|
350
|
+
if (credentials.some(c => c.provider === 'whatsapp')) {
|
|
351
|
+
channels.whatsapp = { dmPolicy: 'open', allowFrom: ['*'], groupPolicy: 'open' };
|
|
352
|
+
pluginEntries.whatsapp = { enabled: true };
|
|
353
|
+
}
|
|
354
|
+
// Standard channels: telegram, discord, nostr (env var substitution)
|
|
355
|
+
for (const [credProvider, mapping] of Object.entries(channelCredMap)) {
|
|
356
|
+
if (credentials.some(c => c.provider === credProvider)) {
|
|
357
|
+
channels[mapping.channelKey] = mapping.configBuilder(`\${${mapping.envVar}}`);
|
|
358
|
+
pluginEntries[mapping.channelKey] = { enabled: true };
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Slack: needs both appToken and botToken for socket mode
|
|
362
|
+
const hasSlackApp = credentials.some(c => c.provider === 'slack_app');
|
|
363
|
+
const hasSlackBot = credentials.some(c => c.provider === 'slack_bot');
|
|
364
|
+
if (hasSlackApp && hasSlackBot) {
|
|
365
|
+
channels.slack = { enabled: true, mode: 'socket', appToken: '${SLACK_APP_TOKEN}', botToken: '${SLACK_BOT_TOKEN}', dm: { policy: 'open', allowFrom: ['*'] }, groupPolicy: 'open' };
|
|
366
|
+
pluginEntries.slack = { enabled: true };
|
|
367
|
+
}
|
|
368
|
+
// Signal: phone number stored as credential value (not env var substitution)
|
|
369
|
+
const signalCred = credentials.find(c => c.provider === 'signal');
|
|
370
|
+
if (signalCred) {
|
|
371
|
+
channels.signal = { enabled: true, account: signalCred.value, dmPolicy: 'open', allowFrom: ['*'], groupPolicy: 'open' };
|
|
372
|
+
pluginEntries.signal = { enabled: true };
|
|
373
|
+
}
|
|
374
|
+
// GoogleChat: service account JSON written as file, referenced by path
|
|
375
|
+
const googleChatCred = credentials.find(c => c.provider === 'googlechat');
|
|
376
|
+
if (googleChatCred) {
|
|
377
|
+
files.set('credentials/googlechat-sa.json', googleChatCred.value);
|
|
378
|
+
channels.googlechat = {
|
|
379
|
+
enabled: true,
|
|
380
|
+
serviceAccountFile: '/home/node/.openclaw/credentials/googlechat-sa.json',
|
|
381
|
+
audienceType: 'app-url',
|
|
382
|
+
dm: { policy: 'open', allowFrom: ['*'] },
|
|
383
|
+
groupPolicy: 'open',
|
|
384
|
+
};
|
|
385
|
+
pluginEntries.googlechat = { enabled: true };
|
|
386
|
+
}
|
|
387
|
+
// iMessage: config-only (cliPath, dbPath stored as JSON credential blob)
|
|
388
|
+
const imessageCred = credentials.find(c => c.provider === 'imessage');
|
|
389
|
+
if (imessageCred) {
|
|
390
|
+
try {
|
|
391
|
+
const imConfig = JSON.parse(imessageCred.value);
|
|
392
|
+
channels.imessage = { enabled: true, cliPath: imConfig.cliPath, dbPath: imConfig.dbPath, dmPolicy: 'open', allowFrom: ['*'], groupPolicy: 'open' };
|
|
393
|
+
pluginEntries.imessage = { enabled: true };
|
|
394
|
+
}
|
|
395
|
+
catch { /* skip malformed config */ }
|
|
396
|
+
}
|
|
397
|
+
// IRC: server config stored as JSON credential blob
|
|
398
|
+
const ircCred = credentials.find(c => c.provider === 'irc');
|
|
399
|
+
if (ircCred) {
|
|
400
|
+
try {
|
|
401
|
+
const ircConfig = JSON.parse(ircCred.value);
|
|
402
|
+
channels.irc = {
|
|
403
|
+
enabled: true,
|
|
404
|
+
host: ircConfig.host,
|
|
405
|
+
port: ircConfig.port || 6667,
|
|
406
|
+
nick: ircConfig.nick,
|
|
407
|
+
tls: ircConfig.tls ?? false,
|
|
408
|
+
channels: ircConfig.channels || [],
|
|
409
|
+
dmPolicy: 'open',
|
|
410
|
+
allowFrom: ['*'],
|
|
411
|
+
groupPolicy: 'open',
|
|
412
|
+
};
|
|
413
|
+
if (ircConfig.password) {
|
|
414
|
+
channels.irc.nickserv = { password: ircConfig.password };
|
|
415
|
+
}
|
|
416
|
+
pluginEntries.irc = { enabled: true };
|
|
417
|
+
}
|
|
418
|
+
catch { /* skip malformed IRC config */ }
|
|
419
|
+
}
|
|
420
|
+
// Matrix: homeserver + accessToken stored as JSON credential blob
|
|
421
|
+
const matrixCred = credentials.find(c => c.provider === 'matrix');
|
|
422
|
+
if (matrixCred) {
|
|
423
|
+
try {
|
|
424
|
+
const matrixConfig = JSON.parse(matrixCred.value);
|
|
425
|
+
channels.matrix = {
|
|
426
|
+
enabled: true,
|
|
427
|
+
homeserver: matrixConfig.homeserver,
|
|
428
|
+
accessToken: matrixConfig.accessToken,
|
|
429
|
+
...(matrixConfig.userId ? { userId: matrixConfig.userId } : {}),
|
|
430
|
+
dm: { policy: 'open', allowFrom: ['*'] },
|
|
431
|
+
groupPolicy: 'open',
|
|
432
|
+
};
|
|
433
|
+
pluginEntries.matrix = { enabled: true };
|
|
434
|
+
}
|
|
435
|
+
catch { /* skip malformed config */ }
|
|
436
|
+
}
|
|
437
|
+
// BlueBubbles: serverUrl + password stored as JSON credential blob
|
|
438
|
+
const bluebubblesCred = credentials.find(c => c.provider === 'bluebubbles');
|
|
439
|
+
if (bluebubblesCred) {
|
|
440
|
+
try {
|
|
441
|
+
const bbConfig = JSON.parse(bluebubblesCred.value);
|
|
442
|
+
channels.bluebubbles = {
|
|
443
|
+
enabled: true,
|
|
444
|
+
serverUrl: bbConfig.serverUrl,
|
|
445
|
+
password: bbConfig.password,
|
|
446
|
+
dmPolicy: 'open',
|
|
447
|
+
allowFrom: ['*'],
|
|
448
|
+
};
|
|
449
|
+
pluginEntries.bluebubbles = { enabled: true };
|
|
450
|
+
}
|
|
451
|
+
catch { /* skip malformed config */ }
|
|
452
|
+
}
|
|
453
|
+
// Only include channels section if at least one channel is configured.
|
|
454
|
+
// An empty `channels: {}` causes the Gateway Dashboard (v2026.3.13+) to show
|
|
455
|
+
// "Unsupported type: . Use Raw mode." because the schema renderer can't infer
|
|
456
|
+
// field types from an empty object.
|
|
457
|
+
if (Object.keys(channels).length > 0) {
|
|
458
|
+
cfg.channels = channels;
|
|
459
|
+
}
|
|
460
|
+
// Gateway controlUi: when OPENCLAW_GATEWAY_BIND=lan, the gateway requires
|
|
461
|
+
// allowedOrigins or it refuses to start with:
|
|
462
|
+
// "non-loopback Control UI requires gateway.controlUi.allowedOrigins"
|
|
463
|
+
cfg.gateway = {
|
|
464
|
+
bind: 'lan',
|
|
465
|
+
auth: {
|
|
466
|
+
mode: 'token',
|
|
467
|
+
},
|
|
468
|
+
controlUi: {
|
|
469
|
+
allowedOrigins: ['*'],
|
|
470
|
+
allowInsecureAuth: true,
|
|
471
|
+
dangerouslyDisableDeviceAuth: true,
|
|
472
|
+
},
|
|
473
|
+
http: {
|
|
474
|
+
endpoints: {
|
|
475
|
+
chatCompletions: { enabled: true },
|
|
476
|
+
responses: { enabled: true },
|
|
477
|
+
},
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
// OpenClaw schema: plugins.entries is Record<id, {enabled, config}>, load.paths for external
|
|
481
|
+
const pluginsCfg = { entries: pluginEntries };
|
|
482
|
+
cfg.plugins = pluginsCfg;
|
|
483
|
+
const securityCfg = getSecurityConfig(instance.securityProfile ?? 'standard');
|
|
484
|
+
cfg.gateway = deepMerge(cfg.gateway || {}, securityCfg.gateway);
|
|
485
|
+
cfg.tools = deepMerge(cfg.tools || {}, securityCfg.tools);
|
|
486
|
+
cfg.session = securityCfg.session;
|
|
487
|
+
cfg.discovery = securityCfg.discovery;
|
|
488
|
+
if (securityCfg.plugins) {
|
|
489
|
+
cfg.plugins = deepMerge(cfg.plugins || {}, securityCfg.plugins);
|
|
490
|
+
}
|
|
491
|
+
cfg.skills = securityCfg.skills;
|
|
492
|
+
// SecretRef: when the Gateway image supports it, inject a secrets provider
|
|
493
|
+
// so that keyRef/tokenRef entries in auth-profiles.json can resolve env vars.
|
|
494
|
+
const useSecretRef = supportsSecretRef(instance.imageTag);
|
|
495
|
+
if (useSecretRef) {
|
|
496
|
+
cfg.secrets = { providers: { default: { source: 'env' } } };
|
|
497
|
+
}
|
|
498
|
+
files.set('openclaw.json', JSON.stringify(cfg, null, 2));
|
|
499
|
+
// Generate auth-profiles.json (single file, OpenClaw auth store format)
|
|
500
|
+
const authProfiles = {};
|
|
501
|
+
const secretRef = (envId) => ({ source: 'env', provider: 'default', id: envId });
|
|
502
|
+
if (instance.billingMode === 'platform' && litellmKey) {
|
|
503
|
+
// Platform Mode: single litellm:default profile pointing to LiteLLM proxy
|
|
504
|
+
const litellmProfile = {
|
|
505
|
+
type: 'api_key',
|
|
506
|
+
provider: 'litellm',
|
|
507
|
+
baseUrl: config.litellm.proxyInternalUrl + '/v1',
|
|
508
|
+
};
|
|
509
|
+
if (useSecretRef) {
|
|
510
|
+
litellmProfile.keyRef = secretRef('LITELLM_API_KEY');
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
litellmProfile.apiKey = litellmKey;
|
|
514
|
+
}
|
|
515
|
+
authProfiles['litellm:default'] = litellmProfile;
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
// BYOK Mode (or fallback): credential-injection logic
|
|
519
|
+
const registry = new ProviderRegistry();
|
|
520
|
+
for (const cred of credentials) {
|
|
521
|
+
if (cred.credentialType === 'api_key') {
|
|
522
|
+
const profileKey = registry.getProfileKey(cred.provider);
|
|
523
|
+
const profile = {
|
|
524
|
+
type: 'api_key',
|
|
525
|
+
provider: cred.provider,
|
|
526
|
+
};
|
|
527
|
+
if (useSecretRef) {
|
|
528
|
+
const envVar = registry.getEnvVarName(cred.provider);
|
|
529
|
+
profile.keyRef = secretRef(envVar || `${cred.provider.toUpperCase().replace(/-/g, '_')}_API_KEY`);
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
profile.apiKey = cred.value;
|
|
533
|
+
}
|
|
534
|
+
authProfiles[profileKey] = profile;
|
|
535
|
+
}
|
|
536
|
+
else if (cred.credentialType === 'oauth_token') {
|
|
537
|
+
const concreteProvider = registry.resolveAuthProvider(cred.provider, cred.credentialType);
|
|
538
|
+
const profileKey = registry.getProfileKey(concreteProvider);
|
|
539
|
+
if (cred.provider === 'github-copilot') {
|
|
540
|
+
const profile = {
|
|
541
|
+
type: 'token',
|
|
542
|
+
provider: concreteProvider,
|
|
543
|
+
};
|
|
544
|
+
if (useSecretRef) {
|
|
545
|
+
profile.tokenRef = secretRef('COPILOT_GITHUB_TOKEN');
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
profile.token = cred.value;
|
|
549
|
+
}
|
|
550
|
+
authProfiles[profileKey] = profile;
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
// OAuth tokens (e.g., openai device-code flow) — SecretRef unsupported for oauth type
|
|
554
|
+
const metadata = cred.metadata;
|
|
555
|
+
const expiresMs = metadata?.expiresIn
|
|
556
|
+
? Date.now() + metadata.expiresIn * 1000
|
|
557
|
+
: Date.now() + 864_000_000;
|
|
558
|
+
authProfiles[profileKey] = {
|
|
559
|
+
type: 'oauth',
|
|
560
|
+
provider: concreteProvider,
|
|
561
|
+
access: cred.value,
|
|
562
|
+
refresh: metadata?.refreshToken ?? '',
|
|
563
|
+
expires: expiresMs,
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
if (Object.keys(authProfiles).length > 0) {
|
|
570
|
+
const authProfilesJson = JSON.stringify({
|
|
571
|
+
version: 1,
|
|
572
|
+
profiles: authProfiles,
|
|
573
|
+
}, null, 2);
|
|
574
|
+
files.set('auth-profiles.json', authProfilesJson);
|
|
575
|
+
files.set('agents/main/agent/auth-profiles.json', authProfilesJson);
|
|
576
|
+
}
|
|
577
|
+
for (const wf of WORKSPACE_FILES) {
|
|
578
|
+
const userContent = userConfig[wf.key];
|
|
579
|
+
let content = userContent || WORKSPACE_TEMPLATES[wf.template] || '';
|
|
580
|
+
if (wf.key === 'soulmd' && content) {
|
|
581
|
+
const templateSecurity = userConfig.__templateSecurity;
|
|
582
|
+
const securityParagraph = getSecurityParagraph(instance.securityProfile ?? "standard", templateSecurity, DEFAULT_TRUST_LEVEL_INDICATORS);
|
|
583
|
+
if (securityParagraph) {
|
|
584
|
+
content = content.replace(/<!-- SECURITY SECTION[\s\S]*?<!-- END SECURITY SECTION -->\n*/g, '');
|
|
585
|
+
content = securityParagraph + '\n\n' + content.trim();
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
if (content) {
|
|
589
|
+
files.set(wf.filename, content);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
// GEO integration: inject geo-query tool description if user has a GEO credential
|
|
593
|
+
const hasGeoCredential = credentials.some(c => c.provider === 'geo' && c.credentialType === 'api_key');
|
|
594
|
+
if (hasGeoCredential) {
|
|
595
|
+
const geoToolSection = `\n\n## GEO Brand Intelligence Tool\n\nUse this tool to fetch brand data from the GEO platform when the user asks about brand performance, visibility, or analytics.\n\n**Endpoint:** POST ${config.publicAppUrl}/instances/${instance.id}/tools/geo-query\n**Auth:** Bearer <your platform JWT (the same token you use for all platform API calls)>\n\n**Request body (JSON):**\n\`\`\`\n{\n "type": "brands" | "brand_overview" | "brand_analytics",\n "workspaceId": <number>,\n "brandId": <number> // required for brand_overview and brand_analytics\n}\n\`\`\`\n\n**Examples:**\n- List brands in workspace 42: \`{ "type": "brands", "workspaceId": 42 }\`\n- Get overview for brand 7: \`{ "type": "brand_overview", "workspaceId": 42, "brandId": 7 }\`\n- Get analytics for brand 7: \`{ "type": "brand_analytics", "workspaceId": 42, "brandId": 7 }\`\n`;
|
|
596
|
+
const existingTools = files.get('workspace/TOOLS.md') ?? '';
|
|
597
|
+
files.set('workspace/TOOLS.md', existingTools + geoToolSection);
|
|
598
|
+
}
|
|
599
|
+
// Seed empty memory directory so the agent doesn't error on first boot
|
|
600
|
+
// when BOOTSTRAP.md instructs it to read memory/YYYY-MM-DD.md
|
|
601
|
+
files.set('workspace/memory/.gitkeep', '');
|
|
602
|
+
return files;
|
|
603
|
+
},
|
|
604
|
+
async translateRPC({ method, params, endpoint, token, instanceId }) {
|
|
605
|
+
const timeoutMs = method === 'web.login.wait' ? 180_000 : method.startsWith('web.login.') ? 60_000 : 30_000;
|
|
606
|
+
// Try persistent client first (if instanceId provided and client connected)
|
|
607
|
+
if (instanceId) {
|
|
608
|
+
const persistent = getGatewayClient(instanceId);
|
|
609
|
+
if (persistent) {
|
|
610
|
+
return await persistent.call(method, params, timeoutMs);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
// Fallback to ephemeral connection with retry.
|
|
614
|
+
// The gateway WS server may not be ready yet (takes ~47-150s after container start),
|
|
615
|
+
// so transient connection failures (close code 1006, ECONNREFUSED) are retried.
|
|
616
|
+
const MAX_RETRIES = 2;
|
|
617
|
+
const RETRY_DELAY_MS = 2_000;
|
|
618
|
+
let lastError;
|
|
619
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
620
|
+
if (attempt > 0) {
|
|
621
|
+
await new Promise(r => setTimeout(r, RETRY_DELAY_MS));
|
|
622
|
+
// Re-check persistent client — it may have connected during the delay
|
|
623
|
+
if (instanceId) {
|
|
624
|
+
const persistent = getGatewayClient(instanceId);
|
|
625
|
+
if (persistent) {
|
|
626
|
+
return await persistent.call(method, params, timeoutMs);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
const client = new GatewayRPCClient(endpoint, token);
|
|
631
|
+
try {
|
|
632
|
+
const result = await client.call(method, params, timeoutMs);
|
|
633
|
+
// If we reached the gateway via ephemeral but the persistent client isn't
|
|
634
|
+
// connected, force-reconnect it now. Event-producing RPCs like chat.send
|
|
635
|
+
// need the persistent WebSocket to relay streaming events back to the browser.
|
|
636
|
+
if (instanceId && !getGatewayClient(instanceId)) {
|
|
637
|
+
connectGateway(instanceId, endpoint, token);
|
|
638
|
+
}
|
|
639
|
+
return result;
|
|
640
|
+
}
|
|
641
|
+
catch (err) {
|
|
642
|
+
client.close();
|
|
643
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
644
|
+
// Only retry on transient connection errors, not on RPC-level errors
|
|
645
|
+
const msg = lastError.message;
|
|
646
|
+
const isTransient = msg.includes('closed unexpectedly') ||
|
|
647
|
+
msg.includes('ECONNREFUSED') ||
|
|
648
|
+
msg.includes('socket hang up') ||
|
|
649
|
+
msg.includes('connect failed');
|
|
650
|
+
if (!isTransient)
|
|
651
|
+
throw lastError;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
throw lastError;
|
|
655
|
+
},
|
|
656
|
+
async resolveEnv({ instance, credentials, litellmKey }) {
|
|
657
|
+
const env = {
|
|
658
|
+
OPENCLAW_GATEWAY_TOKEN: instance.authToken,
|
|
659
|
+
OPENCLAW_GATEWAY_BIND: 'lan',
|
|
660
|
+
OPENCLAW_GATEWAY_PORT: '18789',
|
|
661
|
+
NODE_OPTIONS: '--max-old-space-size=1536',
|
|
662
|
+
};
|
|
663
|
+
// Dual-mode: platform mode injects LiteLLM proxy URL only, BYOK injects provider keys
|
|
664
|
+
const registry = new ProviderRegistry();
|
|
665
|
+
if (instance.billingMode === 'platform' && litellmKey) {
|
|
666
|
+
env['LITELLM_PROXY_URL'] = config.litellm.proxyInternalUrl;
|
|
667
|
+
env['LITELLM_API_KEY'] = litellmKey;
|
|
668
|
+
}
|
|
669
|
+
else {
|
|
670
|
+
// BYOK Mode: inject provider API keys as env vars
|
|
671
|
+
for (const cred of credentials) {
|
|
672
|
+
if (cred.credentialType === 'oauth_token') {
|
|
673
|
+
// github-copilot tokenRef needs its oauth_token as an env var for SecretRef resolution
|
|
674
|
+
if (supportsSecretRef(instance.imageTag) && cred.provider === 'github-copilot') {
|
|
675
|
+
env['COPILOT_GITHUB_TOKEN'] = cred.value;
|
|
676
|
+
}
|
|
677
|
+
continue;
|
|
678
|
+
}
|
|
679
|
+
const envVar = registry.getEnvVarName(cred.provider);
|
|
680
|
+
if (envVar) {
|
|
681
|
+
env[envVar] = cred.value;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
// Always inject non-provider credentials (brave, telegram, etc.)
|
|
686
|
+
// regardless of billing mode — these are tool/channel keys, not AI provider keys.
|
|
687
|
+
for (const cred of credentials) {
|
|
688
|
+
if (registry.isNonProviderCredential(cred.provider)) {
|
|
689
|
+
const envVar = registry.getEnvVarName(cred.provider);
|
|
690
|
+
if (envVar && !(envVar in env)) {
|
|
691
|
+
env[envVar] = cred.value;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
return env;
|
|
696
|
+
},
|
|
697
|
+
async checkReady({ instance, endpoint }) {
|
|
698
|
+
try {
|
|
699
|
+
const persistent = getGatewayClient(instance.id);
|
|
700
|
+
if (persistent) {
|
|
701
|
+
const result = await persistent.call('platform.ping', {}, 5_000);
|
|
702
|
+
return result !== null;
|
|
703
|
+
}
|
|
704
|
+
const client = new GatewayRPCClient(endpoint, instance.authToken);
|
|
705
|
+
const result = await client.call('platform.ping', {});
|
|
706
|
+
client.close();
|
|
707
|
+
return result !== null;
|
|
708
|
+
}
|
|
709
|
+
catch {
|
|
710
|
+
return false;
|
|
711
|
+
}
|
|
712
|
+
},
|
|
713
|
+
};
|
|
714
|
+
//# sourceMappingURL=adapter.js.map
|