Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
a2dfb64
feat(collaboration): unify agent capabilities across clients
qdaxb Sep 20, 2026
bb8c411
Merge branch 'feature/unified-agent-form' into feature/collaboration-…
qdaxb Sep 20, 2026
53091dd
fix(collaboration): separate agent source from executor type
qdaxb Sep 20, 2026
24aa973
Merge remote-tracking branch 'origin/main' into feature/unified-agent…
qdaxb Sep 20, 2026
27c59cd
docs(collaboration): clarify agent source and executor type
qdaxb Sep 20, 2026
2f69588
test(wework): complete agent device service fixture
qdaxb Sep 20, 2026
c67b7e2
ci(wework): register local agent capability checkpoint
qdaxb Sep 20, 2026
4fd2416
test(wework): select manual agent capabilities in automation flow
qdaxb Sep 20, 2026
39463c9
feat(collaboration): complete first-use agent onboarding
qdaxb Sep 20, 2026
7b5412a
fix(executor-manager): surface failed docker submissions
qdaxb Sep 20, 2026
f40b644
test(collaboration): verify agent capability execution
qdaxb Sep 20, 2026
48737e2
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 20, 2026
76a17b0
test(frontend): build agent plugin fixture without zip cli
qdaxb Sep 20, 2026
66875c5
docs(wework): explain device assistant onboarding
qdaxb Sep 20, 2026
f24e547
fix(collaboration): stabilize onboarding verification
qdaxb Sep 20, 2026
8430fdb
test(frontend): publish agent plugin through submission flow
qdaxb Sep 20, 2026
9857493
fix(collaboration): separate agent hosting from source
qdaxb Sep 20, 2026
f732af1
Merge remote-tracking branch 'origin/main' into feature/unified-agent…
qdaxb Sep 20, 2026
00b0f80
test(wework): complete device service fixture
qdaxb Sep 21, 2026
395c6c7
fix(ci): register collaboration agent checkpoints
qdaxb Sep 21, 2026
b2f39ce
fix(collaboration): align agent capability execution
qdaxb Sep 21, 2026
74779d0
test(wework): align project automation agent setup
qdaxb Sep 21, 2026
009d08c
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 21, 2026
c12104e
fix(collaboration): simplify unified agent creation
qdaxb Sep 21, 2026
c4fb5fa
Merge remote-tracking branch 'origin/main' into feature/unified-agent…
qdaxb Sep 21, 2026
24020d7
fix(ci): align collaboration desktop e2e flows
qdaxb Sep 21, 2026
906ac90
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 21, 2026
7a41b29
fix(collaboration): keep resource filters on one line
qdaxb Sep 21, 2026
cfb4f7b
fix(collaboration): deploy local agent capabilities
qdaxb Sep 21, 2026
e7ab520
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 21, 2026
a7f8f99
fix(executor): preserve remote skill auth boundary
qdaxb Sep 21, 2026
b205bcc
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 21, 2026
14d8810
fix(collaboration): stabilize agent capability e2e
qdaxb Sep 21, 2026
a027c42
Merge remote-tracking branch 'origin/main' into feature/unified-agent…
qdaxb Sep 21, 2026
9f08251
fix(collaboration): deploy local agent skills
qdaxb Sep 21, 2026
45771e2
fix(ci): provision plugin storage for executor e2e
qdaxb Sep 21, 2026
7202a21
fix(collaboration): close capability picker after selection
qdaxb Sep 21, 2026
f11acd9
test(collaboration): verify agent capabilities through UI
qdaxb Sep 21, 2026
4c241ed
Merge remote-tracking branch 'origin/main' into feature/unified-agent…
qdaxb Sep 21, 2026
feb2ac8
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 21, 2026
fd05c99
Merge remote-tracking branch 'origin/feature/unified-agent-form' into…
qdaxb Sep 21, 2026
e468831
test(wework): align project automation capability setup
qdaxb Sep 21, 2026
8199e68
fix(wework): stabilize memory and agent e2e
qdaxb Sep 21, 2026
72d7c5a
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 21, 2026
21f02d9
fix(wework): preserve streamed code blocks
qdaxb Sep 21, 2026
e9fdf6e
feat(collaboration): complete first-use resource lifecycle
qdaxb Sep 21, 2026
2e11ed9
fix(wework): measure stable concurrent memory
qdaxb Sep 21, 2026
754e1c4
Merge remote-tracking branch 'origin/main' into feature/collaboration…
qdaxb Sep 21, 2026
92ac71f
fix(collaboration): serialize default agent initialization
qdaxb Sep 21, 2026
ab0b6b8
test(wework): locate lifecycle scroll marker by text
qdaxb Sep 21, 2026
58c9822
test(wework): target lifecycle marker paragraph
qdaxb Sep 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion .github/scripts/classify-wework-desktop-e2e.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ core_segments=(
workspace-tabs
collaboration-shared-core
collaboration-settings-matrix
collaboration-first-use
collaboration-local-agent-capabilities
collaboration-agent-automation-chain
cloud-space-mention
priority-filter
Expand Down Expand Up @@ -145,7 +147,7 @@ core_shards=(
claude-runtime,workspace-tabs,task-attachments
task-status-sync,task-board-association,core-task-flow,change-request-status,context-compaction
window-lifecycle,browser-toolbar-actions,browser-annotation-anchors
project-automation,collaboration-agent-automation-chain
project-automation,collaboration-first-use,collaboration-local-agent-capabilities,collaboration-agent-automation-chain
resilience,environment-panel-scroll
workspace-attachments,automation-lifecycle
project-assignment-notification,split-workbench,priority-filter,project-event-sources,board-focus-view
Expand Down Expand Up @@ -522,6 +524,14 @@ classify_wework_path() {
select_target "core:collaboration-settings-matrix"
return
;;
wework/e2e/desktop/scenarios/collaboration-first-use.scenario.mjs)
select_target "core:collaboration-first-use"
return
;;
wework/e2e/desktop/scenarios/collaboration-local-agent-capabilities.scenario.mjs)
select_target "core:collaboration-local-agent-capabilities"
return
;;
wework/e2e/desktop/scenarios/collaboration-agent-automation-chain.scenario.mjs)
select_target "core:collaboration-agent-automation-chain"
return
Expand Down Expand Up @@ -551,6 +561,13 @@ classify_wework_path() {
wework/src/features/todo/WorkItemComposerGuide*)
select_target "core:task-status-sync"
select_target "core:task-board-association"
if [[ "$path" == wework/src/api/local/localDelivery* ]]; then
select_target "core:collaboration-local-agent-capabilities"
fi
if [[ "$path" == wework/src/features/todo/CloudTodoWorkspace* || \
"$path" == wework/src/features/todo/WorkItemComposerGuide* ]]; then
select_target "core:collaboration-first-use"
fi
if [[ "$path" == wework/src/components/layout/useWorkbenchCloudProjectContext* ]]; then
select_target "core:cloud-context-resilience"
fi
Expand Down Expand Up @@ -927,12 +944,16 @@ classify_path() {
select_target "core:remote-device-onboarding"
select_target "core:collaboration-shared-core"
select_target "core:collaboration-settings-matrix"
select_target "core:collaboration-first-use"
select_target "core:collaboration-local-agent-capabilities"
select_target "core:collaboration-agent-automation-chain"
select_target "cloud:cloud-device-lifecycle"
;;
packages/collaboration/*)
select_target "core:collaboration-shared-core"
select_target "core:collaboration-settings-matrix"
select_target "core:collaboration-first-use"
select_target "core:collaboration-local-agent-capabilities"
select_target "core:collaboration-agent-automation-chain"
;;
executor/* | packages/chat-core/* | package.json | pnpm-lock.yaml | pnpm-workspace.yaml)
Expand Down
10 changes: 10 additions & 0 deletions .github/scripts/test-ci-cache-policy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,16 @@ fi
if ! sed -n '/^ executor-e2e-tests:/,/^ merge-reports:/p' \
"$workflow_dir/e2e-tests.yml" |
grep -F 'prepare-platform-e2e-image' >/dev/null ||
! sed -n '/^ executor-e2e-tests:/,/^ merge-reports:/p' \
"$workflow_dir/e2e-tests.yml" |
grep -F 'node scripts/prepare-codex-binary.mjs --materialize' >/dev/null ||
! sed -n '/^ executor-e2e-tests:/,/^ merge-reports:/p' \
"$workflow_dir/e2e-tests.yml" |
grep -F 'CODEX_BINARY_PATH: ${{ github.workspace }}/wework/resources/binaries/codex/x86_64-unknown-linux-gnu/vendor/x86_64-unknown-linux-musl/bin/codex' \
>/dev/null ||
! sed -n '/^ executor-e2e-tests:/,/^ merge-reports:/p' \
"$workflow_dir/e2e-tests.yml" |
grep -F 'test -x "$CODEX_BINARY_PATH"' >/dev/null ||
! sed -n '/^ executor-e2e-tests:/,/^ merge-reports:/p' \
"$workflow_dir/e2e-tests.yml" |
grep -F \
Expand Down
22 changes: 19 additions & 3 deletions .github/scripts/test-classify-ci-changes.sh
Original file line number Diff line number Diff line change
Expand Up @@ -430,15 +430,15 @@ wework_desktop_other_e2e_matrix={"include":[]}' \
assert_desktop_case "shared collaboration package selects its desktop checkpoint" \
'wework_desktop_e2e=true
wework_desktop_core_e2e=true
wework_desktop_core_e2e_matrix={"include":[{"id":"core-5","name":"Core / shard 5","segments":"collaboration-shared-core,collaboration-settings-matrix"},{"id":"core-9","name":"Core / shard 9","segments":"collaboration-agent-automation-chain"}]}
wework_desktop_core_e2e_matrix={"include":[{"id":"core-5","name":"Core / shard 5","segments":"collaboration-shared-core,collaboration-settings-matrix"},{"id":"core-9","name":"Core / shard 9","segments":"collaboration-first-use,collaboration-local-agent-capabilities,collaboration-agent-automation-chain"}]}
wework_desktop_other_e2e=false
wework_desktop_other_e2e_matrix={"include":[]}' \
"packages/collaboration/src/CollaborationApp.tsx"

assert_desktop_case "collaboration execution environment changes select onboarding and lifecycle coverage" \
'wework_desktop_e2e=true
wework_desktop_core_e2e=true
wework_desktop_core_e2e_matrix={"include":[{"id":"core-2","name":"Core / shard 2","segments":"remote-device-onboarding"},{"id":"core-5","name":"Core / shard 5","segments":"collaboration-shared-core,collaboration-settings-matrix"},{"id":"core-9","name":"Core / shard 9","segments":"collaboration-agent-automation-chain"}]}
wework_desktop_core_e2e_matrix={"include":[{"id":"core-2","name":"Core / shard 2","segments":"remote-device-onboarding"},{"id":"core-5","name":"Core / shard 5","segments":"collaboration-shared-core,collaboration-settings-matrix"},{"id":"core-9","name":"Core / shard 9","segments":"collaboration-first-use,collaboration-local-agent-capabilities,collaboration-agent-automation-chain"}]}
wework_desktop_cloud_e2e=true
wework_desktop_cloud_e2e_matrix={"include":[{"id":"cloud-13","name":"Cloud / shard 13","segments":"cloud-device-lifecycle"}]}
wework_desktop_other_e2e=false
Expand Down Expand Up @@ -575,7 +575,7 @@ wework_desktop_other_e2e=true
wework_desktop_other_e2e_matrix={"include":[{"id":"plugins","name":"Plugins","command":"e2e:desktop:plugins","segment":""}]}
wework_desktop_macos_inspector_e2e=true'
full_desktop_expected="${full_desktop_expected/\"segments\":\"resilience\"/\"segments\":\"resilience,environment-panel-scroll\"}"
full_desktop_expected="${full_desktop_expected/\"segments\":\"project-automation\"/\"segments\":\"project-automation,collaboration-agent-automation-chain\"}"
full_desktop_expected="${full_desktop_expected/\"segments\":\"project-automation\"/\"segments\":\"project-automation,collaboration-first-use,collaboration-local-agent-capabilities,collaboration-agent-automation-chain\"}"
full_desktop_expected="${full_desktop_expected/\"segments\":\"project-assignment-notification,split-workbench,priority-filter,board-focus-view\"/\"segments\":\"project-assignment-notification,split-workbench,priority-filter,project-event-sources,board-focus-view\"}"

assert_desktop_case "runner-only changes retain full coverage" \
Expand Down Expand Up @@ -737,6 +737,22 @@ wework_desktop_other_e2e=false
wework_desktop_other_e2e_matrix={"include":[]}' \
"wework/e2e/desktop/scenarios/collaboration-agent-automation-chain.scenario.mjs"

assert_desktop_case "collaboration first-use scenario selects its core shard" \
'wework_desktop_e2e=true
wework_desktop_core_e2e=true
wework_desktop_core_e2e_matrix={"include":[{"id":"core-9","name":"Core / shard 9","segments":"collaboration-first-use"}]}
wework_desktop_other_e2e=false
wework_desktop_other_e2e_matrix={"include":[]}' \
"wework/e2e/desktop/scenarios/collaboration-first-use.scenario.mjs"

assert_desktop_case "collaboration local agent capabilities scenario selects its core shard" \
'wework_desktop_e2e=true
wework_desktop_core_e2e=true
wework_desktop_core_e2e_matrix={"include":[{"id":"core-9","name":"Core / shard 9","segments":"collaboration-local-agent-capabilities"}]}
wework_desktop_other_e2e=false
wework_desktop_other_e2e_matrix={"include":[]}' \
"wework/e2e/desktop/scenarios/collaboration-local-agent-capabilities.scenario.mjs"

assert_desktop_case "collaboration settings matrix scenario selects its core shard" \
'wework_desktop_e2e=true
wework_desktop_core_e2e=true
Expand Down
37 changes: 36 additions & 1 deletion .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,7 @@ jobs:
ENVIRONMENT: development
DB_AUTO_MIGRATE: "false"
INIT_DATA_ENABLED: "true"
PLUGIN_LEGACY_UPLOAD_ENABLED: "true"
RAG_RUNTIME_MODE: remote
KNOWLEDGE_RUNTIME_URL: http://localhost:8200
CHUNK_STORAGE_ENABLED: "true"
Expand Down Expand Up @@ -654,6 +655,20 @@ jobs:
--health-timeout=5s
--health-retries=3

minio:
image: bitnamilegacy/minio:2025.7.23-debian-12-r0
ports:
- 9000:9000
env:
MINIO_ROOT_USER: wegent-e2e
MINIO_ROOT_PASSWORD: wegent-e2e-secret
options: >-
--health-cmd="curl -f http://localhost:9000/minio/health/live"
--health-interval=10s
--health-timeout=5s
--health-start-period=20s
--health-retries=6

steps:
- name: Generate internal service token
run: |
Expand Down Expand Up @@ -717,6 +732,17 @@ jobs:
- name: Set up Node workspace
uses: ./.github/actions/setup-node-workspace

- name: Restore bundled Codex cache
id: bundled-codex-cache
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: ~/.cache/wegent/codex
key: ${{ runner.os }}-wework-codex-v1-${{ hashFiles('wework/codex-binaries.lock.json') }}

- name: Prepare bundled Codex for local Executor
working-directory: ./wework
run: node scripts/prepare-codex-binary.mjs --materialize

- name: Add local harness CLIs to PATH
run: echo "$GITHUB_WORKSPACE/.github/claude-code-cli/node_modules/.bin" >> "$GITHUB_PATH"

Expand Down Expand Up @@ -835,6 +861,11 @@ jobs:
ENVIRONMENT: development
DB_AUTO_MIGRATE: "false"
INIT_DATA_ENABLED: "true"
PLUGIN_LEGACY_UPLOAD_ENABLED: "true"
ATTACHMENT_S3_ENDPOINT: localhost:9000
ATTACHMENT_S3_ACCESS_KEY: wegent-e2e
ATTACHMENT_S3_SECRET_KEY: wegent-e2e-secret
ATTACHMENT_S3_USE_SSL: "false"
run: |
source .venv/bin/activate
nohup uvicorn app.main:app --host 0.0.0.0 --port 8000 > backend.log 2>&1 &
Expand Down Expand Up @@ -867,7 +898,7 @@ jobs:
pnpm exec tsx e2e/utils/mock-model-server.ts > mock-model-server.log 2>&1 &
echo $! > mock-server.pid

- name: Start Local ClaudeCode Executor
- name: Start Local Executor
env:
EXECUTOR_MODE: local
WEGENT_BACKEND_URL: http://localhost:8000
Expand All @@ -880,6 +911,9 @@ jobs:
WORKSPACE_ROOT: ${{ runner.temp }}/wegent-workspace
LOCAL_HEARTBEAT_INTERVAL: "5"
LOG_LEVEL: info
CODEX_BINARY_PATH: ${{ github.workspace }}/wework/resources/binaries/codex/x86_64-unknown-linux-gnu/vendor/x86_64-unknown-linux-musl/bin/codex
CODEX_HOME: ${{ runner.temp }}/wegent-executor/codex
WEGENT_CODEX_HOME: ${{ runner.temp }}/wegent-executor/codex
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY: "1"
CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: "1"
Expand Down Expand Up @@ -940,6 +974,7 @@ jobs:
PY
)
test -x executor/target/release/wegent-executor
test -x "$CODEX_BINARY_PATH"
nohup env \
-u GIT_TOKEN_AES_KEY \
-u GIT_TOKEN_AES_IV \
Expand Down
8 changes: 8 additions & 0 deletions backend/app/schemas/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class BotCreate(BaseModel):
agent_config: dict[str, Any]
system_prompt: Optional[str] = None
mcp_servers: Optional[dict[str, Any]] = None
plugins: Optional[List[dict[str, Any]]] = None
capability_mode: Optional[str] = None
default_knowledge_base_refs: Optional[List[KnowledgeBaseDefaultRef]] = None
skills: Optional[List[str]] = None
skill_refs: Optional[Dict[str, SkillRefMeta]] = None
Expand All @@ -43,6 +45,8 @@ class BotUpdate(BaseModel):
agent_config: Optional[dict[str, Any]] = None
system_prompt: Optional[str] = None
mcp_servers: Optional[dict[str, Any]] = None
plugins: Optional[List[dict[str, Any]]] = None
capability_mode: Optional[str] = None
default_knowledge_base_refs: Optional[List[KnowledgeBaseDefaultRef]] = None
skills: Optional[List[str]] = None
skill_refs: Optional[Dict[str, SkillRefMeta]] = None
Expand All @@ -69,6 +73,8 @@ class BotInDB(BaseModel):
agent_config: dict[str, Any]
system_prompt: Optional[str] = None
mcp_servers: Optional[dict[str, Any]] = None
plugins: Optional[List[dict[str, Any]]] = None
capability_mode: str = "follow_device"
default_knowledge_base_refs: Optional[List[KnowledgeBaseDefaultRef]] = None
skills: Optional[List[str]] = None
skill_refs: Optional[Dict[str, SkillRefMeta]] = None
Expand Down Expand Up @@ -97,6 +103,8 @@ class BotDetail(BaseModel):
agent_config: dict[str, Any]
system_prompt: Optional[str] = None
mcp_servers: Optional[dict[str, Any]] = None
plugins: Optional[List[dict[str, Any]]] = None
capability_mode: str = "follow_device"
default_knowledge_base_refs: Optional[List[KnowledgeBaseDefaultRef]] = None
skills: Optional[List[str]] = None
skill_refs: Optional[Dict[str, SkillRefMeta]] = None
Expand Down
2 changes: 2 additions & 0 deletions backend/app/schemas/kind.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ class GhostSpec(BaseModel):

systemPrompt: str
mcpServers: Optional[Dict[str, Any]] = None
plugins: Optional[List[Dict[str, Any]]] = None
defaultKnowledgeBaseRefs: Optional[List[KnowledgeBaseDefaultRef]] = None
skills: Optional[List[str]] = None # Skill names list
preload_skills: Optional[List[str]] = Field(
Expand Down Expand Up @@ -462,6 +463,7 @@ class BotSpec(BaseModel):
ghostRef: GhostRef
shellRef: ShellRef
modelRef: Optional[ModelRef] = None
capability_mode: str = "follow_device"
secondaryModelRef: Optional[ModelRef] = Field(
None,
description="Secondary LLM model for auxiliary tasks. "
Expand Down
35 changes: 35 additions & 0 deletions backend/app/services/adapters/bot_kinds.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,20 @@ class BotKindsService(BaseService[Kind, BotCreate, BotUpdate]):
# Add more sensitive keys here as needed
]

@staticmethod
def _resolve_create_capability_mode(obj_in: BotCreate) -> str:
if obj_in.capability_mode is not None:
return obj_in.capability_mode
has_explicit_capabilities = any(
(
obj_in.mcp_servers,
obj_in.plugins,
obj_in.skills,
obj_in.preload_skills,
)
)
return "manual" if has_explicit_capabilities else "follow_device"

def _require_bot_permission(
self,
db: Session,
Expand Down Expand Up @@ -428,6 +442,7 @@ def create_with_user(
ghost_spec = {
"systemPrompt": obj_in.system_prompt or "",
"mcpServers": obj_in.mcp_servers or {},
"plugins": obj_in.plugins or [],
}
if obj_in.default_knowledge_base_refs is not None:
ghost_spec["defaultKnowledgeBaseRefs"] = [
Expand Down Expand Up @@ -555,6 +570,7 @@ def create_with_user(
"ghostRef": {"name": ghost_name, "namespace": namespace},
"shellRef": {"name": shell_ref_name, "namespace": shell_ref_namespace},
"modelRef": {"name": model_ref_name, "namespace": model_ref_namespace},
"capability_mode": self._resolve_create_capability_mode(obj_in),
}
if obj_in.secondary_model_name:
bot_spec["secondaryModelRef"] = {
Expand Down Expand Up @@ -1123,6 +1139,12 @@ def update_with_user(
bot.json = bot_crd.model_dump()
flag_modified(bot, "json")

if "capability_mode" in update_data:
bot_crd = Bot.model_validate(bot.json)
bot_crd.spec.capability_mode = update_data["capability_mode"]
bot.json = bot_crd.model_dump()
flag_modified(bot, "json")

if "system_prompt" in update_data and ghost:
ghost_crd = Ghost.model_validate(ghost.json)
ghost_crd.spec.systemPrompt = update_data["system_prompt"] or ""
Expand All @@ -1136,6 +1158,13 @@ def update_with_user(
flag_modified(ghost, "json") # Mark JSON field as modified
db.add(ghost) # Add to session

if "plugins" in update_data and ghost:
ghost_crd = Ghost.model_validate(ghost.json)
ghost_crd.spec.plugins = update_data["plugins"] or []
ghost.json = ghost_crd.model_dump()
flag_modified(ghost, "json")
db.add(ghost)

if "default_knowledge_base_refs" in update_data and ghost:
ghost_crd = Ghost.model_validate(ghost.json)
ghost_crd.spec.defaultKnowledgeBaseRefs = (
Expand Down Expand Up @@ -1697,6 +1726,7 @@ def _convert_to_bot_dict(
# Extract data from components
system_prompt = ""
mcp_servers = {}
plugins = []
shell_type = ""
shell_name = ""
agent_config = {}
Expand All @@ -1709,6 +1739,7 @@ def _convert_to_bot_dict(
ghost_crd = Ghost.model_validate(ghost.json)
system_prompt = ghost_crd.spec.systemPrompt
mcp_servers = ghost_crd.spec.mcpServers or {}
plugins = ghost_crd.spec.plugins or []

if shell and shell.json:
shell_crd = Shell.model_validate(shell.json)
Expand Down Expand Up @@ -1861,6 +1892,8 @@ def _convert_to_bot_dict(
"agent_config": agent_config,
"system_prompt": system_prompt,
"mcp_servers": mcp_servers,
"plugins": plugins,
"capability_mode": bot_crd.spec.capability_mode,
"default_knowledge_base_refs": default_knowledge_base_refs,
"skills": skills,
"skill_refs": skill_refs,
Expand Down Expand Up @@ -2428,6 +2461,8 @@ def clone_bot(
skill_refs=skill_refs_meta,
preload_skills=bot_dict.get("preload_skills"),
preload_skill_refs=preload_skill_refs_meta,
plugins=bot_dict.get("plugins"),
capability_mode=bot_dict.get("capability_mode", "follow_device"),
namespace=namespace,
)

Expand Down
Loading
Loading