From e215d3d91cccdebd9894417536371701ea418f5e Mon Sep 17 00:00:00 2001 From: Renee Huang <100229782+reneehuang1@users.noreply.github.com> Date: Thu, 7 May 2026 20:38:04 -0700 Subject: [PATCH] chore: rename example folders; fix references (#60) * rename folders * fix examples reorg references * move over files * having agent fixing and validating all examples are still working * fix sidecar paths --------- Co-authored-by: abeatrix --- sdk/.gitignore | 2 + sdk/.vscode/launch.json | 8 +- sdk/.vscode/tasks.json | 6 +- sdk/CONTRIBUTING.md | 9 +- sdk/README.md | 11 +- sdk/apps/cli/src/commands/doctor.test.ts | 2 +- sdk/apps/cli/src/commands/doctor.ts | 4 + sdk/apps/code/tsconfig.dev.json | 21 - .../{code => examples/desktop-app}/README.md | 21 +- .../{code => examples/desktop-app}/bun.mts | 3 +- .../desktop-app}/global.d.ts | 0 .../desktop-app}/package.json | 2 +- .../desktop-app/scripts/build-sidecar-bin.ts | 32 ++ .../desktop-app}/sidecar/ARCHITECTURE.md | 0 .../desktop-app}/sidecar/chat-session.ts | 0 .../desktop-app}/sidecar/chat-test.ts | 0 .../desktop-app}/sidecar/commands.ts | 0 .../desktop-app}/sidecar/context.test.ts | 0 .../desktop-app}/sidecar/context.ts | 0 .../desktop-app}/sidecar/index.ts | 0 .../desktop-app}/sidecar/paths.ts | 0 .../desktop-app}/sidecar/server.ts | 0 .../sidecar/session-data/artifacts.ts | 0 .../sidecar/session-data/common.ts | 0 .../sidecar/session-data/discovery.ts | 0 .../sidecar/session-data/messages.ts | 0 .../sidecar/session-data/search.ts | 0 .../desktop-app}/sidecar/types.ts | 0 .../desktop-app}/src-tauri/Cargo.lock | 0 .../desktop-app}/src-tauri/Cargo.toml | 0 .../desktop-app}/src-tauri/build.rs | 0 .../desktop-app}/src-tauri/icons/128x128.png | Bin .../src-tauri/icons/128x128@2x.png | Bin .../desktop-app}/src-tauri/icons/32x32.png | Bin .../desktop-app}/src-tauri/icons/64x64.png | Bin .../src-tauri/icons/Square107x107Logo.png | Bin .../src-tauri/icons/Square142x142Logo.png | Bin .../src-tauri/icons/Square150x150Logo.png | Bin .../src-tauri/icons/Square284x284Logo.png | Bin .../src-tauri/icons/Square30x30Logo.png | Bin .../src-tauri/icons/Square310x310Logo.png | Bin .../src-tauri/icons/Square44x44Logo.png | Bin .../src-tauri/icons/Square71x71Logo.png | Bin .../src-tauri/icons/Square89x89Logo.png | Bin .../src-tauri/icons/StoreLogo.png | Bin .../android/mipmap-anydpi-v26/ic_launcher.xml | 0 .../icons/android/mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_foreground.png | Bin .../android/mipmap-hdpi/ic_launcher_round.png | Bin .../icons/android/mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_foreground.png | Bin .../android/mipmap-mdpi/ic_launcher_round.png | Bin .../android/mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_foreground.png | Bin .../mipmap-xhdpi/ic_launcher_round.png | Bin .../android/mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin .../mipmap-xxhdpi/ic_launcher_round.png | Bin .../android/mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin .../mipmap-xxxhdpi/ic_launcher_round.png | Bin .../android/values/ic_launcher_background.xml | 0 .../desktop-app}/src-tauri/icons/icon.icns | Bin .../desktop-app}/src-tauri/icons/icon.ico | Bin .../desktop-app}/src-tauri/icons/icon.png | Bin .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin .../icons/ios/AppIcon-20x20@2x-1.png | Bin .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin .../icons/ios/AppIcon-29x29@2x-1.png | Bin .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin .../icons/ios/AppIcon-40x40@2x-1.png | Bin .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin .../src-tauri/icons/ios/AppIcon-512@2x.png | Bin .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin .../desktop-app}/src-tauri/src/main.rs | 37 +- .../desktop-app}/src-tauri/tauri.conf.json | 3 +- .../desktop-app/tsconfig.dev.json} | 13 +- .../desktop-app}/tsconfig.json | 20 +- .../desktop-app}/webview/app/globals.css | 0 .../desktop-app}/webview/app/layout.tsx | 0 .../desktop-app}/webview/app/page.tsx | 0 .../desktop-app}/webview/components.json | 0 .../webview/components/agent-header.tsx | 0 .../webview/components/agent-sidebar.tsx | 0 .../webview/components/theme-provider.tsx | 0 .../webview/components/ui/accordion.tsx | 0 .../webview/components/ui/alert-dialog.tsx | 0 .../webview/components/ui/alert.tsx | 0 .../webview/components/ui/aspect-ratio.tsx | 0 .../webview/components/ui/avatar.tsx | 0 .../webview/components/ui/badge.tsx | 0 .../webview/components/ui/breadcrumb.tsx | 0 .../webview/components/ui/button-group.tsx | 0 .../webview/components/ui/button.tsx | 0 .../webview/components/ui/calendar.tsx | 0 .../webview/components/ui/card.tsx | 0 .../webview/components/ui/carousel.tsx | 0 .../webview/components/ui/chart.tsx | 0 .../webview/components/ui/checkbox.tsx | 0 .../webview/components/ui/collapsible.tsx | 0 .../webview/components/ui/combobox.tsx | 0 .../webview/components/ui/command.tsx | 0 .../webview/components/ui/context-menu.tsx | 0 .../webview/components/ui/dialog.tsx | 0 .../webview/components/ui/drawer.tsx | 0 .../webview/components/ui/dropdown-menu.tsx | 0 .../webview/components/ui/empty.tsx | 0 .../webview/components/ui/field.tsx | 0 .../webview/components/ui/form.tsx | 0 .../webview/components/ui/hover-card.tsx | 0 .../webview/components/ui/input-group.tsx | 0 .../webview/components/ui/input-otp.tsx | 0 .../webview/components/ui/input.tsx | 0 .../webview/components/ui/item.tsx | 0 .../webview/components/ui/kbd.tsx | 0 .../webview/components/ui/label.tsx | 0 .../webview/components/ui/markdown.tsx | 0 .../webview/components/ui/menubar.tsx | 0 .../webview/components/ui/navigation-menu.tsx | 0 .../webview/components/ui/pagination.tsx | 0 .../webview/components/ui/popover.tsx | 0 .../webview/components/ui/progress.tsx | 0 .../webview/components/ui/radio-group.tsx | 0 .../webview/components/ui/resizable.tsx | 0 .../webview/components/ui/scroll-area.tsx | 0 .../webview/components/ui/select.tsx | 0 .../webview/components/ui/separator.tsx | 0 .../webview/components/ui/sheet.tsx | 0 .../webview/components/ui/sidebar.tsx | 0 .../webview/components/ui/skeleton.tsx | 0 .../webview/components/ui/slider.tsx | 0 .../webview/components/ui/sonner.tsx | 0 .../webview/components/ui/spinner.tsx | 0 .../webview/components/ui/switch.tsx | 0 .../webview/components/ui/table.tsx | 0 .../webview/components/ui/tabs.tsx | 0 .../webview/components/ui/textarea.tsx | 0 .../webview/components/ui/toast.tsx | 0 .../webview/components/ui/toaster.tsx | 0 .../webview/components/ui/toggle-group.tsx | 0 .../webview/components/ui/toggle.tsx | 0 .../webview/components/ui/tooltip.tsx | 0 .../webview/components/ui/use-mobile.tsx | 0 .../webview/components/ui/use-toast.ts | 0 .../desktop-app}/webview/components/utils.ts | 0 .../components/views/chat/chat-input-bar.tsx | 0 .../components/views/chat/chat-messages.tsx | 0 .../components/views/chat/diff-view.tsx | 0 .../components/views/chat/welcome-chat.tsx | 0 .../views/chat/workspace-selector.tsx | 0 .../views/settings/account-view.tsx | 0 .../views/settings/add-provider.tsx | 0 .../views/settings/extensions-view.tsx | 0 .../components/views/settings/mcp-view.tsx | 0 .../views/settings/provider-list-view.tsx | 0 .../views/settings/routine-view.tsx | 0 .../views/settings/settings-view.tsx | 0 .../webview/contexts/workspace-context.tsx | 0 .../webview/hooks/chat-session/attachments.ts | 0 .../webview/hooks/chat-session/constants.ts | 0 .../webview/hooks/chat-session/helpers.ts | 0 .../webview/hooks/chat-session/types.ts | 0 .../webview/hooks/use-chat-session.ts | 0 .../desktop-app}/webview/hooks/use-mobile.ts | 0 .../desktop-app}/webview/hooks/use-toast.ts | 0 .../desktop-app}/webview/lib/chat-schema.ts | 0 .../webview/lib/desktop-client.ts | 0 .../webview/lib/desktop-transport.ts | 0 .../webview/lib/model-selection.ts | 0 .../desktop-app}/webview/lib/provider-id.ts | 0 .../webview/lib/provider-model-catalog.ts | 0 .../webview/lib/provider-schema.ts | 0 .../desktop-app}/webview/lib/session-diff.ts | 0 .../webview/lib/session-history.ts | 0 .../desktop-app}/webview/lib/utils.ts | 0 .../desktop-app}/webview/next.config.mjs | 2 +- .../desktop-app}/webview/postcss.config.mjs | 0 .../desktop-app}/webview/public/32x32.png | Bin .../desktop-app}/webview/public/icon.png | Bin .../desktop-app}/webview/public/icon.svg | 0 .../desktop-app}/webview/styles/globals.css | 0 .../desktop-app/webview/tsconfig.json | 28 + sdk/apps/{ => examples}/menubar/README.md | 4 +- sdk/apps/{ => examples}/menubar/package.json | 2 +- .../menubar/scripts/build-sidecar-bin.ts | 32 ++ .../{ => examples}/menubar/sidecar/index.ts | 0 .../menubar/src-tauri/Cargo.lock | 0 .../menubar/src-tauri/Cargo.toml | 0 .../{ => examples}/menubar/src-tauri/build.rs | 0 .../menubar/src-tauri/icons/128x128.png | Bin .../menubar/src-tauri/icons/128x128@2x.png | Bin .../menubar/src-tauri/icons/32x32.png | Bin .../menubar/src-tauri/icons/64x64.png | Bin .../src-tauri/icons/Square107x107Logo.png | Bin .../src-tauri/icons/Square142x142Logo.png | Bin .../src-tauri/icons/Square150x150Logo.png | Bin .../src-tauri/icons/Square284x284Logo.png | Bin .../src-tauri/icons/Square30x30Logo.png | Bin .../src-tauri/icons/Square310x310Logo.png | Bin .../src-tauri/icons/Square44x44Logo.png | Bin .../src-tauri/icons/Square71x71Logo.png | Bin .../src-tauri/icons/Square89x89Logo.png | Bin .../menubar/src-tauri/icons/StoreLogo.png | Bin .../android/mipmap-anydpi-v26/ic_launcher.xml | 0 .../icons/android/mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_foreground.png | Bin .../android/mipmap-hdpi/ic_launcher_round.png | Bin .../icons/android/mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_foreground.png | Bin .../android/mipmap-mdpi/ic_launcher_round.png | Bin .../android/mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_foreground.png | Bin .../mipmap-xhdpi/ic_launcher_round.png | Bin .../android/mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin .../mipmap-xxhdpi/ic_launcher_round.png | Bin .../android/mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin .../mipmap-xxxhdpi/ic_launcher_round.png | Bin .../android/values/ic_launcher_background.xml | 0 .../menubar/src-tauri/icons/icon.icns | Bin .../menubar/src-tauri/icons/icon.ico | Bin .../menubar/src-tauri/icons/icon.png | Bin .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin .../icons/ios/AppIcon-20x20@2x-1.png | Bin .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin .../icons/ios/AppIcon-29x29@2x-1.png | Bin .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin .../icons/ios/AppIcon-40x40@2x-1.png | Bin .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin .../src-tauri/icons/ios/AppIcon-512@2x.png | Bin .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin .../menubar/src-tauri/src/main.rs | 19 +- .../menubar/src-tauri/tauri.conf.json | 3 +- sdk/apps/examples/menubar/tsconfig.json | 35 ++ sdk/apps/examples/slack-bot/README.md | 223 -------- sdk/apps/examples/slack-bot/package.json | 15 - sdk/apps/examples/slack-bot/src/index.ts | 505 ------------------ .../{ => examples}/vscode/.vscode/launch.json | 0 .../{ => examples}/vscode/.vscode/tasks.json | 0 sdk/apps/{ => examples}/vscode/README.md | 4 +- sdk/apps/{ => examples}/vscode/package.json | 0 .../{ => examples}/vscode/src/extension.ts | 0 .../{ => examples}/vscode/src/hub-daemon.ts | 0 .../vscode/src/runtime-capabilities.test.ts | 0 .../vscode/src/runtime-capabilities.ts | 0 .../{ => examples}/vscode/src/telemetry.ts | 0 .../vscode/src/webview-protocol.ts | 0 .../vscode/src/webview/.gitignore | 0 .../vscode/src/webview/README.md | 0 .../vscode/src/webview/components.json | 0 .../vscode/src/webview/eslint.config.js | 0 .../vscode/src/webview/index.html | 0 .../vscode/src/webview/package.json | 0 .../vscode/src/webview/public/32x32.png | Bin .../vscode/src/webview/public/favicon.svg | 0 .../vscode/src/webview/public/icon.ico | Bin .../vscode/src/webview/public/icon.png | Bin .../vscode/src/webview/public/icon.svg | 0 .../vscode/src/webview/src/App.css | 0 .../vscode/src/webview/src/App.tsx | 0 .../vscode/src/webview/src/Chat.tsx | 0 .../src/webview/src/components/Composer.tsx | 0 .../src/webview/src/components/TeamTasks.tsx | 0 .../src/components/ai-elements/agent.tsx | 0 .../src/components/ai-elements/artifact.tsx | 0 .../components/ai-elements/attachments.tsx | 0 .../components/ai-elements/audio-player.tsx | 0 .../src/components/ai-elements/canvas.tsx | 0 .../ai-elements/chain-of-thought.tsx | 0 .../src/components/ai-elements/checkpoint.tsx | 0 .../src/components/ai-elements/code-block.tsx | 0 .../src/components/ai-elements/commit.tsx | 0 .../components/ai-elements/confirmation.tsx | 0 .../src/components/ai-elements/connection.tsx | 0 .../src/components/ai-elements/context.tsx | 0 .../src/components/ai-elements/controls.tsx | 0 .../components/ai-elements/conversation.tsx | 0 .../src/components/ai-elements/edge.tsx | 0 .../ai-elements/environment-variables.tsx | 0 .../src/components/ai-elements/file-tree.tsx | 0 .../src/components/ai-elements/image.tsx | 0 .../ai-elements/inline-citation.tsx | 0 .../components/ai-elements/jsx-preview.tsx | 0 .../src/components/ai-elements/message.tsx | 0 .../components/ai-elements/mic-selector.tsx | 0 .../components/ai-elements/model-selector.tsx | 0 .../src/components/ai-elements/node.tsx | 0 .../components/ai-elements/open-in-chat.tsx | 0 .../components/ai-elements/package-info.tsx | 0 .../src/components/ai-elements/panel.tsx | 0 .../src/components/ai-elements/persona.tsx | 0 .../src/components/ai-elements/plan.tsx | 0 .../components/ai-elements/prompt-input.tsx | 0 .../src/components/ai-elements/queue.tsx | 0 .../src/components/ai-elements/reasoning.tsx | 0 .../src/components/ai-elements/sandbox.tsx | 0 .../components/ai-elements/schema-display.tsx | 0 .../src/components/ai-elements/shimmer.tsx | 0 .../src/components/ai-elements/snippet.tsx | 0 .../src/components/ai-elements/sources.tsx | 0 .../components/ai-elements/speech-input.tsx | 0 .../components/ai-elements/stack-trace.tsx | 0 .../components/ai-elements/status-badge.tsx | 0 .../src/components/ai-elements/suggestion.tsx | 0 .../src/components/ai-elements/task.tsx | 0 .../src/components/ai-elements/terminal.tsx | 0 .../components/ai-elements/test-results.tsx | 0 .../src/components/ai-elements/tool.tsx | 0 .../src/components/ai-elements/toolbar.tsx | 0 .../components/ai-elements/transcription.tsx | 0 .../components/ai-elements/voice-selector.tsx | 0 .../components/ai-elements/web-preview.tsx | 0 .../webview/src/components/ui/accordion.tsx | 0 .../src/components/ui/alert-dialog.tsx | 0 .../src/webview/src/components/ui/alert.tsx | 0 .../src/webview/src/components/ui/avatar.tsx | 0 .../src/webview/src/components/ui/badge.tsx | 0 .../src/components/ui/button-group.tsx | 0 .../src/webview/src/components/ui/button.tsx | 0 .../src/webview/src/components/ui/card.tsx | 0 .../webview/src/components/ui/carousel.tsx | 0 .../src/webview/src/components/ui/chart.tsx | 0 .../webview/src/components/ui/checkbox.tsx | 0 .../webview/src/components/ui/collapsible.tsx | 0 .../webview/src/components/ui/combobox.tsx | 0 .../src/webview/src/components/ui/command.tsx | 0 .../src/webview/src/components/ui/dialog.tsx | 0 .../src/components/ui/dropdown-menu.tsx | 0 .../webview/src/components/ui/hover-card.tsx | 0 .../webview/src/components/ui/input-group.tsx | 0 .../src/webview/src/components/ui/input.tsx | 0 .../src/webview/src/components/ui/label.tsx | 0 .../src/webview/src/components/ui/menubar.tsx | 0 .../src/components/ui/native-select.tsx | 0 .../src/webview/src/components/ui/popover.tsx | 0 .../webview/src/components/ui/progress.tsx | 0 .../webview/src/components/ui/radio-group.tsx | 0 .../webview/src/components/ui/scroll-area.tsx | 0 .../src/webview/src/components/ui/select.tsx | 0 .../webview/src/components/ui/separator.tsx | 0 .../src/webview/src/components/ui/sonner.tsx | 0 .../src/webview/src/components/ui/spinner.tsx | 0 .../src/webview/src/components/ui/switch.tsx | 0 .../src/webview/src/components/ui/table.tsx | 0 .../src/webview/src/components/ui/tabs.tsx | 0 .../webview/src/components/ui/textarea.tsx | 0 .../src/webview/src/components/ui/tooltip.tsx | 0 .../vscode/src/webview/src/index.css | 0 .../vscode/src/webview/src/lib/utils.ts | 0 .../vscode/src/webview/src/main.tsx | 0 .../vscode/src/webview/src/vscode.ts | 0 .../vscode/src/webview/tsconfig.app.json | 0 .../vscode/src/webview/tsconfig.json | 0 .../vscode/src/webview/tsconfig.node.json | 0 .../vscode/src/webview/vite.config.ts | 0 sdk/apps/{ => examples}/vscode/tsconfig.json | 2 +- sdk/apps/menubar/tsconfig.json | 11 - sdk/bun.lock | 69 +-- sdk/{apps => }/examples/README.md | 57 +- sdk/{apps => }/examples/cron/README.md | 18 +- .../examples/cron/changelog-generator.cron.md | 0 .../examples/cron/code-style-audit.cron.md | 0 .../examples/cron/daily-code-review.cron.md | 0 .../examples/cron/dead-code-finder.cron.md | 0 .../examples/cron/dependency-check.cron.md | 0 .../examples/cron/documentation-check.cron.md | 0 .../cron/events/local-manual-test.event.md | 0 .../cron/events/local-plugin-event.event.md | 2 +- .../cron/events/pr-changelog-check.event.md | 0 .../examples/cron/events/pr-review.event.md | 0 .../cron/events/pr-test-coverage.event.md | 0 .../cron/performance-baseline.cron.md | 0 .../cron/test-coverage-report.cron.md | 0 .../examples/cron/type-check-strict.cron.md | 0 .../cron/weekly-metrics-summary.cron.md | 0 sdk/{apps => }/examples/hooks/PostToolUse.py | 0 sdk/{apps => }/examples/hooks/PostToolUse.sh | 0 sdk/{apps => }/examples/hooks/PostToolUse.ts | 0 sdk/{apps => }/examples/hooks/PreToolUse.py | 0 sdk/{apps => }/examples/hooks/PreToolUse.sh | 0 sdk/{apps => }/examples/hooks/PreToolUse.ts | 0 .../hooks/PreToolUse_BlockDestructive.sh | 0 .../hooks/PreToolUse_InjectContext.py | 0 .../hooks/PreToolUse_InjectFileContext.sh | 0 .../examples/hooks/PreToolUse_ModifyInput.ts | 0 .../hooks/PreToolUse_RequireReview.sh | 0 sdk/{apps => }/examples/hooks/README.md | 44 +- .../examples/hooks/SessionShutdown.sh | 0 sdk/{apps => }/examples/hooks/TaskComplete.sh | 2 +- sdk/{apps => }/examples/hooks/TaskStart.sh | 0 .../hooks/custom-compaction-hook.example.ts | 2 +- sdk/{apps => }/examples/package.json | 4 + sdk/{apps => }/examples/plugins/README.md | 16 +- .../examples/plugins/automation-events.ts | 4 +- .../examples/plugins/background-terminal.ts | 2 +- .../examples/plugins/custom-compaction.ts | 2 +- sdk/{apps => }/examples/plugins/mac-notify.ts | 2 +- .../plugins/subagent-plugin/README.md | 2 +- .../plugins/subagent-plugin/agents/anvil.md | 0 .../subagent-plugin/agents/inquisitor.md | 0 .../plugins/subagent-plugin/agents/oracle.md | 0 .../plugins/subagent-plugin/agents/phantom.md | 0 .../examples/plugins/subagent-plugin/index.ts | 6 +- .../plugins/subagent-plugin/package.json | 4 + .../subagent-plugin/skills/api-design.md | 0 .../subagent-plugin/skills/code-review.md | 0 .../subagent-plugin/skills/debugging.md | 0 .../subagent-plugin/skills/documentation.md | 0 .../subagent-plugin/skills/migration.md | 0 .../subagent-plugin/skills/refactoring.md | 0 .../subagent-plugin/skills/test-generation.md | 0 .../plugins/subagent-plugin/tsconfig.json | 4 + .../plugins/typescript-lsp-plugin/README.md | 4 +- .../plugins/typescript-lsp-plugin/index.ts | 4 +- .../plugins/weather-plugin.example.ts | 4 +- sdk/{apps => }/examples/tsconfig.json | 4 +- sdk/package.json | 5 +- sdk/packages/agents/README.md | 5 +- sdk/packages/core/README.md | 2 +- 438 files changed, 372 insertions(+), 975 deletions(-) delete mode 100644 sdk/apps/code/tsconfig.dev.json rename sdk/apps/{code => examples/desktop-app}/README.md (77%) rename sdk/apps/{code => examples/desktop-app}/bun.mts (59%) rename sdk/apps/{code => examples/desktop-app}/global.d.ts (100%) rename sdk/apps/{code => examples/desktop-app}/package.json (95%) create mode 100644 sdk/apps/examples/desktop-app/scripts/build-sidecar-bin.ts rename sdk/apps/{code => examples/desktop-app}/sidecar/ARCHITECTURE.md (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/chat-session.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/chat-test.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/commands.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/context.test.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/context.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/index.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/paths.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/server.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/session-data/artifacts.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/session-data/common.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/session-data/discovery.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/session-data/messages.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/session-data/search.ts (100%) rename sdk/apps/{code => examples/desktop-app}/sidecar/types.ts (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/Cargo.lock (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/Cargo.toml (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/build.rs (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/128x128.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/128x128@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/32x32.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/64x64.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square107x107Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square142x142Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square150x150Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square284x284Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square30x30Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square310x310Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square44x44Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square71x71Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/Square89x89Logo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/StoreLogo.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/android/values/ic_launcher_background.xml (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/icon.icns (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/icon.ico (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/icon.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-20x20@1x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-20x20@2x-1.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-20x20@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-20x20@3x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-29x29@1x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-29x29@2x-1.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-29x29@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-29x29@3x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-40x40@1x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-40x40@2x-1.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-40x40@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-40x40@3x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-512@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-60x60@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-60x60@3x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-76x76@1x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-76x76@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png (100%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/src/main.rs (93%) rename sdk/apps/{code => examples/desktop-app}/src-tauri/tauri.conf.json (85%) rename sdk/apps/{code/webview/tsconfig.json => examples/desktop-app/tsconfig.dev.json} (72%) rename sdk/apps/{code => examples/desktop-app}/tsconfig.json (51%) rename sdk/apps/{code => examples/desktop-app}/webview/app/globals.css (100%) rename sdk/apps/{code => examples/desktop-app}/webview/app/layout.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/app/page.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components.json (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/agent-header.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/agent-sidebar.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/theme-provider.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/accordion.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/alert-dialog.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/alert.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/aspect-ratio.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/avatar.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/badge.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/breadcrumb.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/button-group.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/button.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/calendar.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/card.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/carousel.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/chart.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/checkbox.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/collapsible.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/combobox.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/command.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/context-menu.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/dialog.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/drawer.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/dropdown-menu.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/empty.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/field.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/form.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/hover-card.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/input-group.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/input-otp.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/input.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/item.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/kbd.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/label.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/markdown.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/menubar.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/navigation-menu.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/pagination.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/popover.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/progress.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/radio-group.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/resizable.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/scroll-area.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/select.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/separator.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/sheet.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/sidebar.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/skeleton.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/slider.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/sonner.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/spinner.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/switch.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/table.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/tabs.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/textarea.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/toast.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/toaster.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/toggle-group.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/toggle.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/tooltip.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/use-mobile.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/ui/use-toast.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/utils.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/chat/chat-input-bar.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/chat/chat-messages.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/chat/diff-view.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/chat/welcome-chat.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/chat/workspace-selector.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/settings/account-view.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/settings/add-provider.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/settings/extensions-view.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/settings/mcp-view.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/settings/provider-list-view.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/settings/routine-view.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/components/views/settings/settings-view.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/contexts/workspace-context.tsx (100%) rename sdk/apps/{code => examples/desktop-app}/webview/hooks/chat-session/attachments.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/hooks/chat-session/constants.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/hooks/chat-session/helpers.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/hooks/chat-session/types.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/hooks/use-chat-session.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/hooks/use-mobile.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/hooks/use-toast.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/chat-schema.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/desktop-client.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/desktop-transport.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/model-selection.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/provider-id.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/provider-model-catalog.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/provider-schema.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/session-diff.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/session-history.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/lib/utils.ts (100%) rename sdk/apps/{code => examples/desktop-app}/webview/next.config.mjs (88%) rename sdk/apps/{code => examples/desktop-app}/webview/postcss.config.mjs (100%) rename sdk/apps/{code => examples/desktop-app}/webview/public/32x32.png (100%) rename sdk/apps/{code => examples/desktop-app}/webview/public/icon.png (100%) rename sdk/apps/{code => examples/desktop-app}/webview/public/icon.svg (100%) rename sdk/apps/{code => examples/desktop-app}/webview/styles/globals.css (100%) create mode 100644 sdk/apps/examples/desktop-app/webview/tsconfig.json rename sdk/apps/{ => examples}/menubar/README.md (83%) rename sdk/apps/{ => examples}/menubar/package.json (77%) create mode 100644 sdk/apps/examples/menubar/scripts/build-sidecar-bin.ts rename sdk/apps/{ => examples}/menubar/sidecar/index.ts (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/Cargo.lock (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/Cargo.toml (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/build.rs (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/128x128.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/128x128@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/32x32.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/64x64.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square107x107Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square142x142Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square150x150Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square284x284Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square30x30Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square310x310Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square44x44Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square71x71Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/Square89x89Logo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/StoreLogo.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/android/values/ic_launcher_background.xml (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/icon.icns (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/icon.ico (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/icon.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-20x20@1x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-20x20@2x-1.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-20x20@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-20x20@3x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-29x29@1x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-29x29@2x-1.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-29x29@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-29x29@3x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-40x40@1x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-40x40@2x-1.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-40x40@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-40x40@3x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-512@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-60x60@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-60x60@3x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-76x76@1x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-76x76@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png (100%) rename sdk/apps/{ => examples}/menubar/src-tauri/src/main.rs (97%) rename sdk/apps/{ => examples}/menubar/src-tauri/tauri.conf.json (87%) create mode 100644 sdk/apps/examples/menubar/tsconfig.json delete mode 100644 sdk/apps/examples/slack-bot/README.md delete mode 100644 sdk/apps/examples/slack-bot/package.json delete mode 100644 sdk/apps/examples/slack-bot/src/index.ts rename sdk/apps/{ => examples}/vscode/.vscode/launch.json (100%) rename sdk/apps/{ => examples}/vscode/.vscode/tasks.json (100%) rename sdk/apps/{ => examples}/vscode/README.md (91%) rename sdk/apps/{ => examples}/vscode/package.json (100%) rename sdk/apps/{ => examples}/vscode/src/extension.ts (100%) rename sdk/apps/{ => examples}/vscode/src/hub-daemon.ts (100%) rename sdk/apps/{ => examples}/vscode/src/runtime-capabilities.test.ts (100%) rename sdk/apps/{ => examples}/vscode/src/runtime-capabilities.ts (100%) rename sdk/apps/{ => examples}/vscode/src/telemetry.ts (100%) rename sdk/apps/{ => examples}/vscode/src/webview-protocol.ts (100%) rename sdk/apps/{ => examples}/vscode/src/webview/.gitignore (100%) rename sdk/apps/{ => examples}/vscode/src/webview/README.md (100%) rename sdk/apps/{ => examples}/vscode/src/webview/components.json (100%) rename sdk/apps/{ => examples}/vscode/src/webview/eslint.config.js (100%) rename sdk/apps/{ => examples}/vscode/src/webview/index.html (100%) rename sdk/apps/{ => examples}/vscode/src/webview/package.json (100%) rename sdk/apps/{ => examples}/vscode/src/webview/public/32x32.png (100%) rename sdk/apps/{ => examples}/vscode/src/webview/public/favicon.svg (100%) rename sdk/apps/{ => examples}/vscode/src/webview/public/icon.ico (100%) rename sdk/apps/{ => examples}/vscode/src/webview/public/icon.png (100%) rename sdk/apps/{ => examples}/vscode/src/webview/public/icon.svg (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/App.css (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/App.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/Chat.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/Composer.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/TeamTasks.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/agent.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/artifact.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/attachments.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/audio-player.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/canvas.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/chain-of-thought.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/checkpoint.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/code-block.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/commit.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/confirmation.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/connection.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/context.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/controls.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/conversation.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/edge.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/environment-variables.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/file-tree.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/image.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/inline-citation.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/jsx-preview.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/message.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/mic-selector.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/model-selector.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/node.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/open-in-chat.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/package-info.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/panel.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/persona.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/plan.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/prompt-input.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/queue.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/reasoning.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/sandbox.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/schema-display.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/shimmer.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/snippet.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/sources.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/speech-input.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/stack-trace.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/status-badge.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/suggestion.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/task.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/terminal.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/test-results.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/tool.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/toolbar.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/transcription.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/voice-selector.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ai-elements/web-preview.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/accordion.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/alert-dialog.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/alert.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/avatar.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/badge.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/button-group.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/button.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/card.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/carousel.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/chart.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/checkbox.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/collapsible.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/combobox.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/command.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/dialog.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/dropdown-menu.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/hover-card.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/input-group.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/input.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/label.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/menubar.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/native-select.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/popover.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/progress.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/radio-group.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/scroll-area.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/select.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/separator.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/sonner.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/spinner.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/switch.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/table.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/tabs.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/textarea.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/components/ui/tooltip.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/index.css (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/lib/utils.ts (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/main.tsx (100%) rename sdk/apps/{ => examples}/vscode/src/webview/src/vscode.ts (100%) rename sdk/apps/{ => examples}/vscode/src/webview/tsconfig.app.json (100%) rename sdk/apps/{ => examples}/vscode/src/webview/tsconfig.json (100%) rename sdk/apps/{ => examples}/vscode/src/webview/tsconfig.node.json (100%) rename sdk/apps/{ => examples}/vscode/src/webview/vite.config.ts (100%) rename sdk/apps/{ => examples}/vscode/tsconfig.json (93%) delete mode 100644 sdk/apps/menubar/tsconfig.json rename sdk/{apps => }/examples/README.md (73%) rename sdk/{apps => }/examples/cron/README.md (95%) rename sdk/{apps => }/examples/cron/changelog-generator.cron.md (100%) rename sdk/{apps => }/examples/cron/code-style-audit.cron.md (100%) rename sdk/{apps => }/examples/cron/daily-code-review.cron.md (100%) rename sdk/{apps => }/examples/cron/dead-code-finder.cron.md (100%) rename sdk/{apps => }/examples/cron/dependency-check.cron.md (100%) rename sdk/{apps => }/examples/cron/documentation-check.cron.md (100%) rename sdk/{apps => }/examples/cron/events/local-manual-test.event.md (100%) rename sdk/{apps => }/examples/cron/events/local-plugin-event.event.md (83%) rename sdk/{apps => }/examples/cron/events/pr-changelog-check.event.md (100%) rename sdk/{apps => }/examples/cron/events/pr-review.event.md (100%) rename sdk/{apps => }/examples/cron/events/pr-test-coverage.event.md (100%) rename sdk/{apps => }/examples/cron/performance-baseline.cron.md (100%) rename sdk/{apps => }/examples/cron/test-coverage-report.cron.md (100%) rename sdk/{apps => }/examples/cron/type-check-strict.cron.md (100%) rename sdk/{apps => }/examples/cron/weekly-metrics-summary.cron.md (100%) rename sdk/{apps => }/examples/hooks/PostToolUse.py (100%) rename sdk/{apps => }/examples/hooks/PostToolUse.sh (100%) rename sdk/{apps => }/examples/hooks/PostToolUse.ts (100%) rename sdk/{apps => }/examples/hooks/PreToolUse.py (100%) rename sdk/{apps => }/examples/hooks/PreToolUse.sh (100%) rename sdk/{apps => }/examples/hooks/PreToolUse.ts (100%) rename sdk/{apps => }/examples/hooks/PreToolUse_BlockDestructive.sh (100%) rename sdk/{apps => }/examples/hooks/PreToolUse_InjectContext.py (100%) rename sdk/{apps => }/examples/hooks/PreToolUse_InjectFileContext.sh (100%) rename sdk/{apps => }/examples/hooks/PreToolUse_ModifyInput.ts (100%) rename sdk/{apps => }/examples/hooks/PreToolUse_RequireReview.sh (100%) rename sdk/{apps => }/examples/hooks/README.md (87%) rename sdk/{apps => }/examples/hooks/SessionShutdown.sh (100%) rename sdk/{apps => }/examples/hooks/TaskComplete.sh (91%) rename sdk/{apps => }/examples/hooks/TaskStart.sh (100%) rename sdk/{apps => }/examples/hooks/custom-compaction-hook.example.ts (98%) rename sdk/{apps => }/examples/package.json (75%) rename sdk/{apps => }/examples/plugins/README.md (91%) rename sdk/{apps => }/examples/plugins/automation-events.ts (92%) rename sdk/{apps => }/examples/plugins/background-terminal.ts (99%) rename sdk/{apps => }/examples/plugins/custom-compaction.ts (98%) rename sdk/{apps => }/examples/plugins/mac-notify.ts (95%) rename sdk/{apps => }/examples/plugins/subagent-plugin/README.md (99%) rename sdk/{apps => }/examples/plugins/subagent-plugin/agents/anvil.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/agents/inquisitor.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/agents/oracle.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/agents/phantom.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/index.ts (99%) rename sdk/{apps => }/examples/plugins/subagent-plugin/package.json (86%) rename sdk/{apps => }/examples/plugins/subagent-plugin/skills/api-design.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/skills/code-review.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/skills/debugging.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/skills/documentation.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/skills/migration.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/skills/refactoring.md (100%) rename sdk/{apps => }/examples/plugins/subagent-plugin/skills/test-generation.md (100%) create mode 100644 sdk/examples/plugins/subagent-plugin/tsconfig.json rename sdk/{apps => }/examples/plugins/typescript-lsp-plugin/README.md (95%) rename sdk/{apps => }/examples/plugins/typescript-lsp-plugin/index.ts (97%) rename sdk/{apps => }/examples/plugins/weather-plugin.example.ts (96%) rename sdk/{apps => }/examples/tsconfig.json (89%) diff --git a/sdk/.gitignore b/sdk/.gitignore index 671e4981a1..b592cbb0ad 100644 --- a/sdk/.gitignore +++ b/sdk/.gitignore @@ -52,6 +52,8 @@ packages/rpc/src/proto/generated # Tauri generated code apps/*/src-tauri/gen apps/*/src-tauri/bin +apps/examples/*/src-tauri/gen +apps/examples/*/src-tauri/bin # Tauri UI test snapshots apps/*/src/tests/.tui-test apps/*/src/tests/tui-traces diff --git a/sdk/.vscode/launch.json b/sdk/.vscode/launch.json index edd10d7c4d..62a4aeb907 100644 --- a/sdk/.vscode/launch.json +++ b/sdk/.vscode/launch.json @@ -6,10 +6,10 @@ "type": "extensionHost", "request": "launch", "args": [ - "--extensionDevelopmentPath=${workspaceFolder}/apps/vscode", + "--extensionDevelopmentPath=${workspaceFolder}/apps/examples/vscode", "--disable-extensions" ], - "outFiles": ["${workspaceFolder}/apps/vscode/dist/**/*.js"], + "outFiles": ["${workspaceFolder}/apps/examples/vscode/dist/**/*.js"], "preLaunchTask": "build-vscode-extension" }, { @@ -17,10 +17,10 @@ "type": "extensionHost", "request": "launch", "args": [ - "--extensionDevelopmentPath=${workspaceFolder}/apps/vscode", + "--extensionDevelopmentPath=${workspaceFolder}/apps/examples/vscode", "--disable-extensions" ], - "outFiles": ["${workspaceFolder}/apps/vscode/dist/**/*.js"], + "outFiles": ["${workspaceFolder}/apps/examples/vscode/dist/**/*.js"], "env": { "VITE_DEV_SERVER_URL": "http://localhost:5173" }, diff --git a/sdk/.vscode/tasks.json b/sdk/.vscode/tasks.json index 6ce40a027c..e05862c689 100644 --- a/sdk/.vscode/tasks.json +++ b/sdk/.vscode/tasks.json @@ -21,7 +21,7 @@ "dependsOn": ["build-sdk"], "problemMatcher": ["$tsc"], "options": { - "cwd": "${workspaceFolder}/apps/vscode" + "cwd": "${workspaceFolder}/apps/examples/vscode" } }, { @@ -44,7 +44,7 @@ } }, "options": { - "cwd": "${workspaceFolder}/apps/vscode" + "cwd": "${workspaceFolder}/apps/examples/vscode" } }, { @@ -66,7 +66,7 @@ } }, "options": { - "cwd": "${workspaceFolder}/apps/vscode" + "cwd": "${workspaceFolder}/apps/examples/vscode" } }, { diff --git a/sdk/CONTRIBUTING.md b/sdk/CONTRIBUTING.md index 711c107d5d..3b61fab138 100644 --- a/sdk/CONTRIBUTING.md +++ b/sdk/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing to the Cline SDK -This document covers onboarding, development workflow, and publishing. For package boundaries and change routing during development, see [AGENTS.md](./AGENTS.md). For architecture and runtime flows, see [ARCHITECTURE.md](./ARCHITECTURE.md). For API details, see [DOC.md](./DOC.md). +This document covers onboarding, development workflow, and publishing. For package boundaries and change routing during development, see [AGENTS.md](./AGENTS.md). For architecture and runtime flows, see [ARCHITECTURE.md](./ARCHITECTURE.md). This repo is a WIP framework for building and orchestrating AI agents. Full refactors are acceptable when they improve the architecture and all call sites are updated. @@ -22,9 +22,10 @@ This repo is a WIP framework for building and orchestrating AI agents. Full refa ### Apps - `apps/cli`: CLI host and local hub management -- `apps/code`: Tauri + Next.js desktop app -- `apps/vscode`: VS Code extension -- `apps/examples`: sample consumers and integration examples +- `apps/examples/desktop-app`: Tauri + Next.js desktop app example +- `apps/examples/vscode`: VS Code extension example +- `apps/examples/menubar`: hub notification menubar example +- `examples`: plugin, hook, and cron automation examples (customizations upon Cline SDK) ## Development Workflow diff --git a/sdk/README.md b/sdk/README.md index 36aa0d9a01..07d0b64090 100644 --- a/sdk/README.md +++ b/sdk/README.md @@ -73,13 +73,16 @@ async function handleMessage(threadId: string, message: string) { } ``` -Explore full working examples in [`apps/examples/`](apps/examples): +Explore full working examples in [`examples/`](examples) and app examples in [`apps/examples/`](apps/examples): | Example | Description | |---------|-------------| -| [Plugin](apps/examples/cline-plugin) | Custom tools with workspace-aware context, lifecycle hooks, and branch-level safety policies | -| [Subagent Orchestration](apps/examples/subagent-plugin) | Spawn and manage background agents with presets, skills, and cross-agent handoffs | -| [Slack Bot](apps/examples/slack-bot) | Production Slack bot with per-thread agent memory, OAuth, and slash commands | +| [Plugins](examples/plugins) | Custom tools with workspace-aware context, lifecycle hooks, and branch-level safety policies | +| [Subagent Orchestration](examples/plugins/subagent-plugin) | Spawn and manage background agents with presets, skills, and cross-agent handoffs | +| [Hooks](examples/hooks) | File-based and runtime hooks for logging, review gates, context injection, and lifecycle automation | +| [Cron Automations](examples/cron) | Recurring and event-driven automation specs for scheduled quality checks and PR workflows | +| [Desktop App](apps/examples/desktop-app) | Tauri desktop shell with a Bun sidecar backend and Next.js UI | +| [VS Code Extension App](apps/examples/vscode) | VS Code extension example that runs Cline sessions over the RPC runtime | ## Custom Tools diff --git a/sdk/apps/cli/src/commands/doctor.test.ts b/sdk/apps/cli/src/commands/doctor.test.ts index 0babe9037e..6a7d905616 100644 --- a/sdk/apps/cli/src/commands/doctor.test.ts +++ b/sdk/apps/cli/src/commands/doctor.test.ts @@ -266,7 +266,7 @@ describe("runDoctorCommand", () => { return { status: 0, stdout: - "60123 /Users/example/dev/sdk/apps/code/src-tauri/bin/code-sidecar\n", + "60123 /Users/example/dev/sdk/apps/examples/desktop-app/src-tauri/bin/code-sidecar\n", }; } return { status: 1, stdout: "" }; diff --git a/sdk/apps/cli/src/commands/doctor.ts b/sdk/apps/cli/src/commands/doctor.ts index aec0b5c620..770e266c2c 100644 --- a/sdk/apps/cli/src/commands/doctor.ts +++ b/sdk/apps/cli/src/commands/doctor.ts @@ -159,6 +159,10 @@ function listStaleCliPids(): number[] { function listStaleSidecarPids(): number[] { const patterns = [ + "/apps/examples/desktop-app/sidecar/index.ts", + "/apps/examples/desktop-app/dist/sidecar/index.js", + // Keep the pre-example-reorg paths so `doctor --fix` can still clean up + // stale sidecars that were launched from older checkouts. "/apps/code/sidecar/index.ts", "/apps/code/dist/sidecar/index.js", "/src-tauri/bin/code-sidecar", diff --git a/sdk/apps/code/tsconfig.dev.json b/sdk/apps/code/tsconfig.dev.json deleted file mode 100644 index f4dc329a6f..0000000000 --- a/sdk/apps/code/tsconfig.dev.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "paths": { - "@/*": ["./*"], - "@cline/agents": ["../../packages/agents/src/index.ts"], - "@cline/core": ["../../packages/core/src/index.ts"], - "@cline/core/hub": ["../../packages/core/src/hub/index.ts"], - "@cline/llms": ["../../packages/llms/src/index.ts"], - "@cline/shared": ["../../packages/shared/src/index.ts"], - "@cline/shared/storage": ["../../packages/shared/src/storage/index.ts"], - "@cline/shared/db": ["../../packages/shared/src/db/index.ts"], - "@cline/shared/*": [ - "../../packages/shared/src/*", - "../../packages/shared/src/*/index.ts" - ] - } - }, - "include": ["sidecar/**/*.ts", "scripts/**/*.ts", "global.d.ts", "bun.mts"], - "exclude": ["node_modules", "webview"] -} diff --git a/sdk/apps/code/README.md b/sdk/apps/examples/desktop-app/README.md similarity index 77% rename from sdk/apps/code/README.md rename to sdk/apps/examples/desktop-app/README.md index 3788d05e39..c14f15e23b 100644 --- a/sdk/apps/code/README.md +++ b/sdk/apps/examples/desktop-app/README.md @@ -1,10 +1,10 @@ -# @cline/code +# Desktop App Example Tauri desktop shell + Bun sidecar backend + Next.js UI for running and inspecting Cline chat sessions. ## Dev Commands -From `apps/code/`: +From `apps/examples/desktop-app/`: - `bun run dev:web` - Next.js UI only (`http://localhost:3125`) - `bun run dev:sidecar` - sidecar backend only @@ -40,14 +40,13 @@ Desktop transport envelope: ## Key Files -- [`src-tauri/src/main.rs`](./apps/code/src-tauri/src/main.rs) - Tauri shell lifecycle, backend launch, and native-only commands -- [`sidecar/index.ts`](./apps/code/sidecar/index.ts) - persistent Bun sidecar backend -- [`sidecar/chat-session.ts`](./apps/code/sidecar/chat-session.ts) - in-process chat session runtime -- [`scripts/routine-schedules.ts`](./apps/code/scripts/routine-schedules.ts) - Routine action bridge for Settings > Routine -- [`lib/desktop-client.ts`](./apps/code/lib/desktop-client.ts) - typed desktop websocket client -- [`hooks/use-chat-session.ts`](./apps/code/hooks/use-chat-session.ts) - UI chat session state + backend subscriptions -- [`lib/chat-schema.ts`](./apps/code/lib/chat-schema.ts) - chat message schema used by the UI -- [`components/views/settings/routine-view.tsx`](./apps/code/components/views/settings/routine-view.tsx) - Routine schedules UI +- [`src-tauri/src/main.rs`](./src-tauri/src/main.rs) - Tauri shell lifecycle, backend launch, and native-only commands +- [`sidecar/index.ts`](./sidecar/index.ts) - persistent Bun sidecar backend +- [`sidecar/chat-session.ts`](./sidecar/chat-session.ts) - in-process chat session runtime +- [`webview/lib/desktop-client.ts`](./webview/lib/desktop-client.ts) - typed desktop websocket client +- [`webview/hooks/use-chat-session.ts`](./webview/hooks/use-chat-session.ts) - UI chat session state + backend subscriptions +- [`webview/lib/chat-schema.ts`](./webview/lib/chat-schema.ts) - chat message schema used by the UI +- [`webview/components/views/settings/routine-view.tsx`](./webview/components/views/settings/routine-view.tsx) - Routine schedules UI ## Data + Storage @@ -55,7 +54,7 @@ Desktop transport envelope: - Canonical replay/export artifact: `.messages.json`. - `.messages.json` is expected to contain ordered messages plus assistant `modelInfo` and `metrics` (including cache token fields when provided by the model runtime). - `.hooks.jsonl` is observability/debug telemetry and should not be required for normal history replay/export flows. -- Full v1 schema for the persisted messages file, including failure/retry semantics and golden fixtures, is documented in [`packages/core/docs/messages-contract-v1.md`](../../packages/core/docs/messages-contract-v1.md). +- Full v1 schema for the persisted messages file, including failure/retry semantics and golden fixtures, is documented in [`packages/core/docs/messages-contract-v1.md`](../../../packages/core/docs/messages-contract-v1.md). ## Troubleshooting diff --git a/sdk/apps/code/bun.mts b/sdk/apps/examples/desktop-app/bun.mts similarity index 59% rename from sdk/apps/code/bun.mts rename to sdk/apps/examples/desktop-app/bun.mts index 83b71092c9..ec8dc25459 100644 --- a/sdk/apps/code/bun.mts +++ b/sdk/apps/examples/desktop-app/bun.mts @@ -2,8 +2,7 @@ import { $ } from "bun"; const main = async () => { await $`next build`.cwd("webview"); - await $`mkdir -p dist/sidecar`; - await $`bun build ./sidecar/index.ts --outfile ./dist/sidecar/index.js --target bun`; + await $`bun run build:sidecar:bin`; }; main().catch((error: unknown) => { diff --git a/sdk/apps/code/global.d.ts b/sdk/apps/examples/desktop-app/global.d.ts similarity index 100% rename from sdk/apps/code/global.d.ts rename to sdk/apps/examples/desktop-app/global.d.ts diff --git a/sdk/apps/code/package.json b/sdk/apps/examples/desktop-app/package.json similarity index 95% rename from sdk/apps/code/package.json rename to sdk/apps/examples/desktop-app/package.json index 5e0010d428..751e487ab8 100644 --- a/sdk/apps/code/package.json +++ b/sdk/apps/examples/desktop-app/package.json @@ -8,7 +8,7 @@ "dev": "tauri dev", "build": "bun run bun.mts", "build:sidecar": "mkdir -p dist/sidecar && bun build ./sidecar/index.ts --outfile ./dist/sidecar/index.js --target bun", - "build:sidecar:bin": "mkdir -p src-tauri/bin && bun build ./sidecar/index.ts --compile --outfile ./src-tauri/bin/code-sidecar", + "build:sidecar:bin": "bun run scripts/build-sidecar-bin.ts", "build:binary": "tauri build", "start": "next start webview", "typecheck": "tsc -p tsconfig.dev.json --noEmit", diff --git a/sdk/apps/examples/desktop-app/scripts/build-sidecar-bin.ts b/sdk/apps/examples/desktop-app/scripts/build-sidecar-bin.ts new file mode 100644 index 0000000000..bd21fea6c2 --- /dev/null +++ b/sdk/apps/examples/desktop-app/scripts/build-sidecar-bin.ts @@ -0,0 +1,32 @@ +import { $ } from "bun"; + +const resolveTargetTriple = async (): Promise => { + const fromEnv = process.env.TAURI_ENV_TARGET_TRIPLE ?? process.env.TARGET; + if (fromEnv?.trim()) { + return fromEnv.trim(); + } + + const rustcVersion = await $`rustc -vV`.text(); + const hostLine = rustcVersion + .split("\n") + .find((line) => line.startsWith("host: ")); + const host = hostLine?.slice("host: ".length).trim(); + if (!host) { + throw new Error("failed to resolve Rust host target triple"); + } + return host; +}; + +const main = async () => { + const targetTriple = await resolveTargetTriple(); + const extension = targetTriple.includes("windows") ? ".exe" : ""; + const outfile = `./src-tauri/bin/code-sidecar-${targetTriple}${extension}`; + + await $`mkdir -p src-tauri/bin`; + await $`bun build ./sidecar/index.ts --compile --outfile ${outfile}`; +}; + +main().catch((error: unknown) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/sdk/apps/code/sidecar/ARCHITECTURE.md b/sdk/apps/examples/desktop-app/sidecar/ARCHITECTURE.md similarity index 100% rename from sdk/apps/code/sidecar/ARCHITECTURE.md rename to sdk/apps/examples/desktop-app/sidecar/ARCHITECTURE.md diff --git a/sdk/apps/code/sidecar/chat-session.ts b/sdk/apps/examples/desktop-app/sidecar/chat-session.ts similarity index 100% rename from sdk/apps/code/sidecar/chat-session.ts rename to sdk/apps/examples/desktop-app/sidecar/chat-session.ts diff --git a/sdk/apps/code/sidecar/chat-test.ts b/sdk/apps/examples/desktop-app/sidecar/chat-test.ts similarity index 100% rename from sdk/apps/code/sidecar/chat-test.ts rename to sdk/apps/examples/desktop-app/sidecar/chat-test.ts diff --git a/sdk/apps/code/sidecar/commands.ts b/sdk/apps/examples/desktop-app/sidecar/commands.ts similarity index 100% rename from sdk/apps/code/sidecar/commands.ts rename to sdk/apps/examples/desktop-app/sidecar/commands.ts diff --git a/sdk/apps/code/sidecar/context.test.ts b/sdk/apps/examples/desktop-app/sidecar/context.test.ts similarity index 100% rename from sdk/apps/code/sidecar/context.test.ts rename to sdk/apps/examples/desktop-app/sidecar/context.test.ts diff --git a/sdk/apps/code/sidecar/context.ts b/sdk/apps/examples/desktop-app/sidecar/context.ts similarity index 100% rename from sdk/apps/code/sidecar/context.ts rename to sdk/apps/examples/desktop-app/sidecar/context.ts diff --git a/sdk/apps/code/sidecar/index.ts b/sdk/apps/examples/desktop-app/sidecar/index.ts similarity index 100% rename from sdk/apps/code/sidecar/index.ts rename to sdk/apps/examples/desktop-app/sidecar/index.ts diff --git a/sdk/apps/code/sidecar/paths.ts b/sdk/apps/examples/desktop-app/sidecar/paths.ts similarity index 100% rename from sdk/apps/code/sidecar/paths.ts rename to sdk/apps/examples/desktop-app/sidecar/paths.ts diff --git a/sdk/apps/code/sidecar/server.ts b/sdk/apps/examples/desktop-app/sidecar/server.ts similarity index 100% rename from sdk/apps/code/sidecar/server.ts rename to sdk/apps/examples/desktop-app/sidecar/server.ts diff --git a/sdk/apps/code/sidecar/session-data/artifacts.ts b/sdk/apps/examples/desktop-app/sidecar/session-data/artifacts.ts similarity index 100% rename from sdk/apps/code/sidecar/session-data/artifacts.ts rename to sdk/apps/examples/desktop-app/sidecar/session-data/artifacts.ts diff --git a/sdk/apps/code/sidecar/session-data/common.ts b/sdk/apps/examples/desktop-app/sidecar/session-data/common.ts similarity index 100% rename from sdk/apps/code/sidecar/session-data/common.ts rename to sdk/apps/examples/desktop-app/sidecar/session-data/common.ts diff --git a/sdk/apps/code/sidecar/session-data/discovery.ts b/sdk/apps/examples/desktop-app/sidecar/session-data/discovery.ts similarity index 100% rename from sdk/apps/code/sidecar/session-data/discovery.ts rename to sdk/apps/examples/desktop-app/sidecar/session-data/discovery.ts diff --git a/sdk/apps/code/sidecar/session-data/messages.ts b/sdk/apps/examples/desktop-app/sidecar/session-data/messages.ts similarity index 100% rename from sdk/apps/code/sidecar/session-data/messages.ts rename to sdk/apps/examples/desktop-app/sidecar/session-data/messages.ts diff --git a/sdk/apps/code/sidecar/session-data/search.ts b/sdk/apps/examples/desktop-app/sidecar/session-data/search.ts similarity index 100% rename from sdk/apps/code/sidecar/session-data/search.ts rename to sdk/apps/examples/desktop-app/sidecar/session-data/search.ts diff --git a/sdk/apps/code/sidecar/types.ts b/sdk/apps/examples/desktop-app/sidecar/types.ts similarity index 100% rename from sdk/apps/code/sidecar/types.ts rename to sdk/apps/examples/desktop-app/sidecar/types.ts diff --git a/sdk/apps/code/src-tauri/Cargo.lock b/sdk/apps/examples/desktop-app/src-tauri/Cargo.lock similarity index 100% rename from sdk/apps/code/src-tauri/Cargo.lock rename to sdk/apps/examples/desktop-app/src-tauri/Cargo.lock diff --git a/sdk/apps/code/src-tauri/Cargo.toml b/sdk/apps/examples/desktop-app/src-tauri/Cargo.toml similarity index 100% rename from sdk/apps/code/src-tauri/Cargo.toml rename to sdk/apps/examples/desktop-app/src-tauri/Cargo.toml diff --git a/sdk/apps/code/src-tauri/build.rs b/sdk/apps/examples/desktop-app/src-tauri/build.rs similarity index 100% rename from sdk/apps/code/src-tauri/build.rs rename to sdk/apps/examples/desktop-app/src-tauri/build.rs diff --git a/sdk/apps/code/src-tauri/icons/128x128.png b/sdk/apps/examples/desktop-app/src-tauri/icons/128x128.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/128x128.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/128x128.png diff --git a/sdk/apps/code/src-tauri/icons/128x128@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/128x128@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/128x128@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/128x128@2x.png diff --git a/sdk/apps/code/src-tauri/icons/32x32.png b/sdk/apps/examples/desktop-app/src-tauri/icons/32x32.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/32x32.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/32x32.png diff --git a/sdk/apps/code/src-tauri/icons/64x64.png b/sdk/apps/examples/desktop-app/src-tauri/icons/64x64.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/64x64.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/64x64.png diff --git a/sdk/apps/code/src-tauri/icons/Square107x107Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square107x107Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square107x107Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square142x142Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square142x142Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square142x142Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square150x150Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square150x150Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square150x150Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square284x284Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square284x284Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square284x284Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square30x30Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square30x30Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square30x30Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square310x310Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square310x310Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square310x310Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square44x44Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square44x44Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square44x44Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square71x71Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square71x71Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square71x71Logo.png diff --git a/sdk/apps/code/src-tauri/icons/Square89x89Logo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/Square89x89Logo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/Square89x89Logo.png diff --git a/sdk/apps/code/src-tauri/icons/StoreLogo.png b/sdk/apps/examples/desktop-app/src-tauri/icons/StoreLogo.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/StoreLogo.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/StoreLogo.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/sdk/apps/code/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/sdk/apps/code/src-tauri/icons/android/values/ic_launcher_background.xml b/sdk/apps/examples/desktop-app/src-tauri/icons/android/values/ic_launcher_background.xml similarity index 100% rename from sdk/apps/code/src-tauri/icons/android/values/ic_launcher_background.xml rename to sdk/apps/examples/desktop-app/src-tauri/icons/android/values/ic_launcher_background.xml diff --git a/sdk/apps/code/src-tauri/icons/icon.icns b/sdk/apps/examples/desktop-app/src-tauri/icons/icon.icns similarity index 100% rename from sdk/apps/code/src-tauri/icons/icon.icns rename to sdk/apps/examples/desktop-app/src-tauri/icons/icon.icns diff --git a/sdk/apps/code/src-tauri/icons/icon.ico b/sdk/apps/examples/desktop-app/src-tauri/icons/icon.ico similarity index 100% rename from sdk/apps/code/src-tauri/icons/icon.ico rename to sdk/apps/examples/desktop-app/src-tauri/icons/icon.ico diff --git a/sdk/apps/code/src-tauri/icons/icon.png b/sdk/apps/examples/desktop-app/src-tauri/icons/icon.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/icon.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/icon.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@1x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@1x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@1x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@1x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@2x-1.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@2x-1.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@2x-1.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@2x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@3x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@3x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-20x20@3x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-20x20@3x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@1x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@1x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@1x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@1x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@2x-1.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@2x-1.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@2x-1.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@2x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@3x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@3x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-29x29@3x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-29x29@3x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@1x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@1x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@1x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@1x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@2x-1.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@2x-1.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@2x-1.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@2x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@3x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@3x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-40x40@3x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-40x40@3x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-512@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-512@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-512@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-512@2x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-60x60@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-60x60@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-60x60@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-60x60@2x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-60x60@3x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-60x60@3x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-60x60@3x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-60x60@3x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-76x76@1x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-76x76@1x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-76x76@1x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-76x76@1x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-76x76@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-76x76@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-76x76@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-76x76@2x.png diff --git a/sdk/apps/code/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png similarity index 100% rename from sdk/apps/code/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png rename to sdk/apps/examples/desktop-app/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png diff --git a/sdk/apps/code/src-tauri/src/main.rs b/sdk/apps/examples/desktop-app/src-tauri/src/main.rs similarity index 93% rename from sdk/apps/code/src-tauri/src/main.rs rename to sdk/apps/examples/desktop-app/src-tauri/src/main.rs index 6a1e79692b..b4cda5b69e 100644 --- a/sdk/apps/code/src-tauri/src/main.rs +++ b/sdk/apps/examples/desktop-app/src-tauri/src/main.rs @@ -156,28 +156,44 @@ fn request_desktop_backend_shutdown(endpoint: &str) { } fn resolve_desktop_backend_script_path(context: &AppContext) -> Option { + let launch_cwd = PathBuf::from(&context.launch_cwd); let candidates = [ PathBuf::from(&context.workspace_root) .join("apps") - .join("code") + .join("examples") + .join("desktop-app") .join("sidecar") .join("index.ts"), - PathBuf::from(&context.launch_cwd) - .join("sidecar") - .join("index.ts"), - PathBuf::from(&context.launch_cwd) + launch_cwd.join("sidecar").join("index.ts"), + launch_cwd + .parent() + .map(|parent| parent.join("sidecar").join("index.ts")) + .unwrap_or_else(|| PathBuf::from("")), + launch_cwd .join("apps") - .join("code") + .join("examples") + .join("desktop-app") .join("sidecar") .join("index.ts"), ]; candidates.into_iter().find(|path| path.exists()) } +fn desktop_backend_binary_name() -> String { + let target_triple = option_env!("TAURI_ENV_TARGET_TRIPLE").unwrap_or("").trim(); + if target_triple.is_empty() { + return "code-sidecar".to_string(); + } + + let extension = if cfg!(windows) { ".exe" } else { "" }; + format!("code-sidecar-{target_triple}{extension}") +} + fn resolve_desktop_backend_binary_path(context: &AppContext) -> Option { if cfg!(debug_assertions) { return None; } + let binary_name = desktop_backend_binary_name(); let explicit = std::env::var("CLINE_CODE_SIDECAR_BIN") .ok() .map(|value| value.trim().to_string()) @@ -189,18 +205,19 @@ fn resolve_desktop_backend_binary_path(context: &AppContext) -> Option Some( PathBuf::from(&context.workspace_root) .join("apps") - .join("code") + .join("examples") + .join("desktop-app") .join("src-tauri") .join("bin") - .join("code-sidecar"), + .join(&binary_name), ), current_exe .as_ref() - .and_then(|path| path.parent().map(|parent| parent.join("code-sidecar"))), + .and_then(|path| path.parent().map(|parent| parent.join(&binary_name))), current_exe.as_ref().and_then(|path| { path.parent() .and_then(|parent| parent.parent()) - .map(|parent| parent.join("Resources").join("code-sidecar")) + .map(|parent| parent.join("Resources").join(&binary_name)) }), ]; candidates.into_iter().flatten().find(|path| path.exists()) diff --git a/sdk/apps/code/src-tauri/tauri.conf.json b/sdk/apps/examples/desktop-app/src-tauri/tauri.conf.json similarity index 85% rename from sdk/apps/code/src-tauri/tauri.conf.json rename to sdk/apps/examples/desktop-app/src-tauri/tauri.conf.json index 755437af5b..a5f5951cff 100644 --- a/sdk/apps/code/src-tauri/tauri.conf.json +++ b/sdk/apps/examples/desktop-app/src-tauri/tauri.conf.json @@ -4,7 +4,7 @@ "version": "0.1.0", "identifier": "bot.cline.app", "build": { - "beforeDevCommand": "bun run dev:web", + "beforeDevCommand": "bun run build:sidecar:bin && bun run dev:web", "devUrl": "http://localhost:3125", "beforeBuildCommand": "bun run build", "frontendDist": "../webview/out" @@ -26,6 +26,7 @@ "bundle": { "active": true, "targets": "all", + "externalBin": ["bin/code-sidecar"], "icon": [ "icons/32x32.png", "icons/128x128.png", diff --git a/sdk/apps/code/webview/tsconfig.json b/sdk/apps/examples/desktop-app/tsconfig.dev.json similarity index 72% rename from sdk/apps/code/webview/tsconfig.json rename to sdk/apps/examples/desktop-app/tsconfig.dev.json index 5bd2bcb956..1f2c04e216 100644 --- a/sdk/apps/code/webview/tsconfig.json +++ b/sdk/apps/examples/desktop-app/tsconfig.dev.json @@ -1,10 +1,11 @@ { - "extends": "../tsconfig.json", + "extends": "./tsconfig.json", "compilerOptions": { "paths": { "@/*": ["./*"], "@cline/agents": ["../../../packages/agents/src/index.ts"], "@cline/core": ["../../../packages/core/src/index.ts"], + "@cline/core/hub": ["../../../packages/core/src/hub/index.ts"], "@cline/llms": ["../../../packages/llms/src/index.ts"], "@cline/shared": ["../../../packages/shared/src/index.ts"], "@cline/shared/storage": [ @@ -17,12 +18,6 @@ ] } }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts" - ], - "exclude": ["node_modules"] + "include": ["sidecar/**/*.ts", "scripts/**/*.ts", "global.d.ts", "bun.mts"], + "exclude": ["node_modules", "webview"] } diff --git a/sdk/apps/code/tsconfig.json b/sdk/apps/examples/desktop-app/tsconfig.json similarity index 51% rename from sdk/apps/code/tsconfig.json rename to sdk/apps/examples/desktop-app/tsconfig.json index 0b4d9437a0..5af15e980f 100644 --- a/sdk/apps/code/tsconfig.json +++ b/sdk/apps/examples/desktop-app/tsconfig.json @@ -20,16 +20,18 @@ ], "paths": { "@/*": ["./*"], - "@cline/agents": ["../../packages/agents/src/index.ts"], - "@cline/core": ["../../packages/core/src/index.ts"], - "@cline/core/hub": ["../../packages/core/src/hub/index.ts"], - "@cline/llms": ["../../packages/llms/src/index.ts"], - "@cline/shared": ["../../packages/shared/src/index.ts"], - "@cline/shared/storage": ["../../packages/shared/src/storage/index.ts"], - "@cline/shared/db": ["../../packages/shared/src/db/index.ts"], + "@cline/agents": ["../../../packages/agents/src/index.ts"], + "@cline/core": ["../../../packages/core/src/index.ts"], + "@cline/core/hub": ["../../../packages/core/src/hub/index.ts"], + "@cline/llms": ["../../../packages/llms/src/index.ts"], + "@cline/shared": ["../../../packages/shared/src/index.ts"], + "@cline/shared/storage": [ + "../../../packages/shared/src/storage/index.ts" + ], + "@cline/shared/db": ["../../../packages/shared/src/db/index.ts"], "@cline/shared/*": [ - "../../packages/shared/src/*", - "../../packages/shared/src/*/index.ts" + "../../../packages/shared/src/*", + "../../../packages/shared/src/*/index.ts" ] } }, diff --git a/sdk/apps/code/webview/app/globals.css b/sdk/apps/examples/desktop-app/webview/app/globals.css similarity index 100% rename from sdk/apps/code/webview/app/globals.css rename to sdk/apps/examples/desktop-app/webview/app/globals.css diff --git a/sdk/apps/code/webview/app/layout.tsx b/sdk/apps/examples/desktop-app/webview/app/layout.tsx similarity index 100% rename from sdk/apps/code/webview/app/layout.tsx rename to sdk/apps/examples/desktop-app/webview/app/layout.tsx diff --git a/sdk/apps/code/webview/app/page.tsx b/sdk/apps/examples/desktop-app/webview/app/page.tsx similarity index 100% rename from sdk/apps/code/webview/app/page.tsx rename to sdk/apps/examples/desktop-app/webview/app/page.tsx diff --git a/sdk/apps/code/webview/components.json b/sdk/apps/examples/desktop-app/webview/components.json similarity index 100% rename from sdk/apps/code/webview/components.json rename to sdk/apps/examples/desktop-app/webview/components.json diff --git a/sdk/apps/code/webview/components/agent-header.tsx b/sdk/apps/examples/desktop-app/webview/components/agent-header.tsx similarity index 100% rename from sdk/apps/code/webview/components/agent-header.tsx rename to sdk/apps/examples/desktop-app/webview/components/agent-header.tsx diff --git a/sdk/apps/code/webview/components/agent-sidebar.tsx b/sdk/apps/examples/desktop-app/webview/components/agent-sidebar.tsx similarity index 100% rename from sdk/apps/code/webview/components/agent-sidebar.tsx rename to sdk/apps/examples/desktop-app/webview/components/agent-sidebar.tsx diff --git a/sdk/apps/code/webview/components/theme-provider.tsx b/sdk/apps/examples/desktop-app/webview/components/theme-provider.tsx similarity index 100% rename from sdk/apps/code/webview/components/theme-provider.tsx rename to sdk/apps/examples/desktop-app/webview/components/theme-provider.tsx diff --git a/sdk/apps/code/webview/components/ui/accordion.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/accordion.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/accordion.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/accordion.tsx diff --git a/sdk/apps/code/webview/components/ui/alert-dialog.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/alert-dialog.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/alert-dialog.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/alert-dialog.tsx diff --git a/sdk/apps/code/webview/components/ui/alert.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/alert.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/alert.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/alert.tsx diff --git a/sdk/apps/code/webview/components/ui/aspect-ratio.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/aspect-ratio.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/aspect-ratio.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/aspect-ratio.tsx diff --git a/sdk/apps/code/webview/components/ui/avatar.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/avatar.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/avatar.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/avatar.tsx diff --git a/sdk/apps/code/webview/components/ui/badge.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/badge.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/badge.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/badge.tsx diff --git a/sdk/apps/code/webview/components/ui/breadcrumb.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/breadcrumb.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/breadcrumb.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/breadcrumb.tsx diff --git a/sdk/apps/code/webview/components/ui/button-group.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/button-group.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/button-group.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/button-group.tsx diff --git a/sdk/apps/code/webview/components/ui/button.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/button.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/button.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/button.tsx diff --git a/sdk/apps/code/webview/components/ui/calendar.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/calendar.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/calendar.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/calendar.tsx diff --git a/sdk/apps/code/webview/components/ui/card.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/card.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/card.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/card.tsx diff --git a/sdk/apps/code/webview/components/ui/carousel.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/carousel.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/carousel.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/carousel.tsx diff --git a/sdk/apps/code/webview/components/ui/chart.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/chart.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/chart.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/chart.tsx diff --git a/sdk/apps/code/webview/components/ui/checkbox.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/checkbox.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/checkbox.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/checkbox.tsx diff --git a/sdk/apps/code/webview/components/ui/collapsible.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/collapsible.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/collapsible.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/collapsible.tsx diff --git a/sdk/apps/code/webview/components/ui/combobox.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/combobox.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/combobox.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/combobox.tsx diff --git a/sdk/apps/code/webview/components/ui/command.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/command.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/command.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/command.tsx diff --git a/sdk/apps/code/webview/components/ui/context-menu.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/context-menu.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/context-menu.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/context-menu.tsx diff --git a/sdk/apps/code/webview/components/ui/dialog.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/dialog.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/dialog.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/dialog.tsx diff --git a/sdk/apps/code/webview/components/ui/drawer.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/drawer.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/drawer.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/drawer.tsx diff --git a/sdk/apps/code/webview/components/ui/dropdown-menu.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/dropdown-menu.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/dropdown-menu.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/dropdown-menu.tsx diff --git a/sdk/apps/code/webview/components/ui/empty.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/empty.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/empty.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/empty.tsx diff --git a/sdk/apps/code/webview/components/ui/field.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/field.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/field.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/field.tsx diff --git a/sdk/apps/code/webview/components/ui/form.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/form.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/form.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/form.tsx diff --git a/sdk/apps/code/webview/components/ui/hover-card.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/hover-card.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/hover-card.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/hover-card.tsx diff --git a/sdk/apps/code/webview/components/ui/input-group.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/input-group.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/input-group.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/input-group.tsx diff --git a/sdk/apps/code/webview/components/ui/input-otp.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/input-otp.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/input-otp.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/input-otp.tsx diff --git a/sdk/apps/code/webview/components/ui/input.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/input.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/input.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/input.tsx diff --git a/sdk/apps/code/webview/components/ui/item.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/item.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/item.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/item.tsx diff --git a/sdk/apps/code/webview/components/ui/kbd.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/kbd.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/kbd.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/kbd.tsx diff --git a/sdk/apps/code/webview/components/ui/label.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/label.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/label.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/label.tsx diff --git a/sdk/apps/code/webview/components/ui/markdown.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/markdown.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/markdown.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/markdown.tsx diff --git a/sdk/apps/code/webview/components/ui/menubar.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/menubar.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/menubar.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/menubar.tsx diff --git a/sdk/apps/code/webview/components/ui/navigation-menu.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/navigation-menu.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/navigation-menu.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/navigation-menu.tsx diff --git a/sdk/apps/code/webview/components/ui/pagination.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/pagination.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/pagination.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/pagination.tsx diff --git a/sdk/apps/code/webview/components/ui/popover.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/popover.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/popover.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/popover.tsx diff --git a/sdk/apps/code/webview/components/ui/progress.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/progress.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/progress.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/progress.tsx diff --git a/sdk/apps/code/webview/components/ui/radio-group.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/radio-group.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/radio-group.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/radio-group.tsx diff --git a/sdk/apps/code/webview/components/ui/resizable.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/resizable.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/resizable.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/resizable.tsx diff --git a/sdk/apps/code/webview/components/ui/scroll-area.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/scroll-area.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/scroll-area.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/scroll-area.tsx diff --git a/sdk/apps/code/webview/components/ui/select.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/select.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/select.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/select.tsx diff --git a/sdk/apps/code/webview/components/ui/separator.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/separator.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/separator.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/separator.tsx diff --git a/sdk/apps/code/webview/components/ui/sheet.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/sheet.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/sheet.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/sheet.tsx diff --git a/sdk/apps/code/webview/components/ui/sidebar.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/sidebar.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/sidebar.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/sidebar.tsx diff --git a/sdk/apps/code/webview/components/ui/skeleton.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/skeleton.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/skeleton.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/skeleton.tsx diff --git a/sdk/apps/code/webview/components/ui/slider.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/slider.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/slider.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/slider.tsx diff --git a/sdk/apps/code/webview/components/ui/sonner.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/sonner.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/sonner.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/sonner.tsx diff --git a/sdk/apps/code/webview/components/ui/spinner.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/spinner.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/spinner.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/spinner.tsx diff --git a/sdk/apps/code/webview/components/ui/switch.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/switch.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/switch.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/switch.tsx diff --git a/sdk/apps/code/webview/components/ui/table.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/table.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/table.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/table.tsx diff --git a/sdk/apps/code/webview/components/ui/tabs.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/tabs.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/tabs.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/tabs.tsx diff --git a/sdk/apps/code/webview/components/ui/textarea.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/textarea.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/textarea.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/textarea.tsx diff --git a/sdk/apps/code/webview/components/ui/toast.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/toast.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/toast.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/toast.tsx diff --git a/sdk/apps/code/webview/components/ui/toaster.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/toaster.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/toaster.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/toaster.tsx diff --git a/sdk/apps/code/webview/components/ui/toggle-group.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/toggle-group.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/toggle-group.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/toggle-group.tsx diff --git a/sdk/apps/code/webview/components/ui/toggle.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/toggle.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/toggle.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/toggle.tsx diff --git a/sdk/apps/code/webview/components/ui/tooltip.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/tooltip.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/tooltip.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/tooltip.tsx diff --git a/sdk/apps/code/webview/components/ui/use-mobile.tsx b/sdk/apps/examples/desktop-app/webview/components/ui/use-mobile.tsx similarity index 100% rename from sdk/apps/code/webview/components/ui/use-mobile.tsx rename to sdk/apps/examples/desktop-app/webview/components/ui/use-mobile.tsx diff --git a/sdk/apps/code/webview/components/ui/use-toast.ts b/sdk/apps/examples/desktop-app/webview/components/ui/use-toast.ts similarity index 100% rename from sdk/apps/code/webview/components/ui/use-toast.ts rename to sdk/apps/examples/desktop-app/webview/components/ui/use-toast.ts diff --git a/sdk/apps/code/webview/components/utils.ts b/sdk/apps/examples/desktop-app/webview/components/utils.ts similarity index 100% rename from sdk/apps/code/webview/components/utils.ts rename to sdk/apps/examples/desktop-app/webview/components/utils.ts diff --git a/sdk/apps/code/webview/components/views/chat/chat-input-bar.tsx b/sdk/apps/examples/desktop-app/webview/components/views/chat/chat-input-bar.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/chat/chat-input-bar.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/chat/chat-input-bar.tsx diff --git a/sdk/apps/code/webview/components/views/chat/chat-messages.tsx b/sdk/apps/examples/desktop-app/webview/components/views/chat/chat-messages.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/chat/chat-messages.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/chat/chat-messages.tsx diff --git a/sdk/apps/code/webview/components/views/chat/diff-view.tsx b/sdk/apps/examples/desktop-app/webview/components/views/chat/diff-view.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/chat/diff-view.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/chat/diff-view.tsx diff --git a/sdk/apps/code/webview/components/views/chat/welcome-chat.tsx b/sdk/apps/examples/desktop-app/webview/components/views/chat/welcome-chat.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/chat/welcome-chat.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/chat/welcome-chat.tsx diff --git a/sdk/apps/code/webview/components/views/chat/workspace-selector.tsx b/sdk/apps/examples/desktop-app/webview/components/views/chat/workspace-selector.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/chat/workspace-selector.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/chat/workspace-selector.tsx diff --git a/sdk/apps/code/webview/components/views/settings/account-view.tsx b/sdk/apps/examples/desktop-app/webview/components/views/settings/account-view.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/settings/account-view.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/settings/account-view.tsx diff --git a/sdk/apps/code/webview/components/views/settings/add-provider.tsx b/sdk/apps/examples/desktop-app/webview/components/views/settings/add-provider.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/settings/add-provider.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/settings/add-provider.tsx diff --git a/sdk/apps/code/webview/components/views/settings/extensions-view.tsx b/sdk/apps/examples/desktop-app/webview/components/views/settings/extensions-view.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/settings/extensions-view.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/settings/extensions-view.tsx diff --git a/sdk/apps/code/webview/components/views/settings/mcp-view.tsx b/sdk/apps/examples/desktop-app/webview/components/views/settings/mcp-view.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/settings/mcp-view.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/settings/mcp-view.tsx diff --git a/sdk/apps/code/webview/components/views/settings/provider-list-view.tsx b/sdk/apps/examples/desktop-app/webview/components/views/settings/provider-list-view.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/settings/provider-list-view.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/settings/provider-list-view.tsx diff --git a/sdk/apps/code/webview/components/views/settings/routine-view.tsx b/sdk/apps/examples/desktop-app/webview/components/views/settings/routine-view.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/settings/routine-view.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/settings/routine-view.tsx diff --git a/sdk/apps/code/webview/components/views/settings/settings-view.tsx b/sdk/apps/examples/desktop-app/webview/components/views/settings/settings-view.tsx similarity index 100% rename from sdk/apps/code/webview/components/views/settings/settings-view.tsx rename to sdk/apps/examples/desktop-app/webview/components/views/settings/settings-view.tsx diff --git a/sdk/apps/code/webview/contexts/workspace-context.tsx b/sdk/apps/examples/desktop-app/webview/contexts/workspace-context.tsx similarity index 100% rename from sdk/apps/code/webview/contexts/workspace-context.tsx rename to sdk/apps/examples/desktop-app/webview/contexts/workspace-context.tsx diff --git a/sdk/apps/code/webview/hooks/chat-session/attachments.ts b/sdk/apps/examples/desktop-app/webview/hooks/chat-session/attachments.ts similarity index 100% rename from sdk/apps/code/webview/hooks/chat-session/attachments.ts rename to sdk/apps/examples/desktop-app/webview/hooks/chat-session/attachments.ts diff --git a/sdk/apps/code/webview/hooks/chat-session/constants.ts b/sdk/apps/examples/desktop-app/webview/hooks/chat-session/constants.ts similarity index 100% rename from sdk/apps/code/webview/hooks/chat-session/constants.ts rename to sdk/apps/examples/desktop-app/webview/hooks/chat-session/constants.ts diff --git a/sdk/apps/code/webview/hooks/chat-session/helpers.ts b/sdk/apps/examples/desktop-app/webview/hooks/chat-session/helpers.ts similarity index 100% rename from sdk/apps/code/webview/hooks/chat-session/helpers.ts rename to sdk/apps/examples/desktop-app/webview/hooks/chat-session/helpers.ts diff --git a/sdk/apps/code/webview/hooks/chat-session/types.ts b/sdk/apps/examples/desktop-app/webview/hooks/chat-session/types.ts similarity index 100% rename from sdk/apps/code/webview/hooks/chat-session/types.ts rename to sdk/apps/examples/desktop-app/webview/hooks/chat-session/types.ts diff --git a/sdk/apps/code/webview/hooks/use-chat-session.ts b/sdk/apps/examples/desktop-app/webview/hooks/use-chat-session.ts similarity index 100% rename from sdk/apps/code/webview/hooks/use-chat-session.ts rename to sdk/apps/examples/desktop-app/webview/hooks/use-chat-session.ts diff --git a/sdk/apps/code/webview/hooks/use-mobile.ts b/sdk/apps/examples/desktop-app/webview/hooks/use-mobile.ts similarity index 100% rename from sdk/apps/code/webview/hooks/use-mobile.ts rename to sdk/apps/examples/desktop-app/webview/hooks/use-mobile.ts diff --git a/sdk/apps/code/webview/hooks/use-toast.ts b/sdk/apps/examples/desktop-app/webview/hooks/use-toast.ts similarity index 100% rename from sdk/apps/code/webview/hooks/use-toast.ts rename to sdk/apps/examples/desktop-app/webview/hooks/use-toast.ts diff --git a/sdk/apps/code/webview/lib/chat-schema.ts b/sdk/apps/examples/desktop-app/webview/lib/chat-schema.ts similarity index 100% rename from sdk/apps/code/webview/lib/chat-schema.ts rename to sdk/apps/examples/desktop-app/webview/lib/chat-schema.ts diff --git a/sdk/apps/code/webview/lib/desktop-client.ts b/sdk/apps/examples/desktop-app/webview/lib/desktop-client.ts similarity index 100% rename from sdk/apps/code/webview/lib/desktop-client.ts rename to sdk/apps/examples/desktop-app/webview/lib/desktop-client.ts diff --git a/sdk/apps/code/webview/lib/desktop-transport.ts b/sdk/apps/examples/desktop-app/webview/lib/desktop-transport.ts similarity index 100% rename from sdk/apps/code/webview/lib/desktop-transport.ts rename to sdk/apps/examples/desktop-app/webview/lib/desktop-transport.ts diff --git a/sdk/apps/code/webview/lib/model-selection.ts b/sdk/apps/examples/desktop-app/webview/lib/model-selection.ts similarity index 100% rename from sdk/apps/code/webview/lib/model-selection.ts rename to sdk/apps/examples/desktop-app/webview/lib/model-selection.ts diff --git a/sdk/apps/code/webview/lib/provider-id.ts b/sdk/apps/examples/desktop-app/webview/lib/provider-id.ts similarity index 100% rename from sdk/apps/code/webview/lib/provider-id.ts rename to sdk/apps/examples/desktop-app/webview/lib/provider-id.ts diff --git a/sdk/apps/code/webview/lib/provider-model-catalog.ts b/sdk/apps/examples/desktop-app/webview/lib/provider-model-catalog.ts similarity index 100% rename from sdk/apps/code/webview/lib/provider-model-catalog.ts rename to sdk/apps/examples/desktop-app/webview/lib/provider-model-catalog.ts diff --git a/sdk/apps/code/webview/lib/provider-schema.ts b/sdk/apps/examples/desktop-app/webview/lib/provider-schema.ts similarity index 100% rename from sdk/apps/code/webview/lib/provider-schema.ts rename to sdk/apps/examples/desktop-app/webview/lib/provider-schema.ts diff --git a/sdk/apps/code/webview/lib/session-diff.ts b/sdk/apps/examples/desktop-app/webview/lib/session-diff.ts similarity index 100% rename from sdk/apps/code/webview/lib/session-diff.ts rename to sdk/apps/examples/desktop-app/webview/lib/session-diff.ts diff --git a/sdk/apps/code/webview/lib/session-history.ts b/sdk/apps/examples/desktop-app/webview/lib/session-history.ts similarity index 100% rename from sdk/apps/code/webview/lib/session-history.ts rename to sdk/apps/examples/desktop-app/webview/lib/session-history.ts diff --git a/sdk/apps/code/webview/lib/utils.ts b/sdk/apps/examples/desktop-app/webview/lib/utils.ts similarity index 100% rename from sdk/apps/code/webview/lib/utils.ts rename to sdk/apps/examples/desktop-app/webview/lib/utils.ts diff --git a/sdk/apps/code/webview/next.config.mjs b/sdk/apps/examples/desktop-app/webview/next.config.mjs similarity index 88% rename from sdk/apps/code/webview/next.config.mjs rename to sdk/apps/examples/desktop-app/webview/next.config.mjs index b06826d8c6..bd14e64eb3 100644 --- a/sdk/apps/code/webview/next.config.mjs +++ b/sdk/apps/examples/desktop-app/webview/next.config.mjs @@ -2,7 +2,7 @@ import path from "node:path"; import { fileURLToPath } from "node:url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const workspaceRoot = path.join(__dirname, "../../.."); +const workspaceRoot = path.join(__dirname, "../../../.."); /** @type {import('next').NextConfig} */ const nextConfig = { diff --git a/sdk/apps/code/webview/postcss.config.mjs b/sdk/apps/examples/desktop-app/webview/postcss.config.mjs similarity index 100% rename from sdk/apps/code/webview/postcss.config.mjs rename to sdk/apps/examples/desktop-app/webview/postcss.config.mjs diff --git a/sdk/apps/code/webview/public/32x32.png b/sdk/apps/examples/desktop-app/webview/public/32x32.png similarity index 100% rename from sdk/apps/code/webview/public/32x32.png rename to sdk/apps/examples/desktop-app/webview/public/32x32.png diff --git a/sdk/apps/code/webview/public/icon.png b/sdk/apps/examples/desktop-app/webview/public/icon.png similarity index 100% rename from sdk/apps/code/webview/public/icon.png rename to sdk/apps/examples/desktop-app/webview/public/icon.png diff --git a/sdk/apps/code/webview/public/icon.svg b/sdk/apps/examples/desktop-app/webview/public/icon.svg similarity index 100% rename from sdk/apps/code/webview/public/icon.svg rename to sdk/apps/examples/desktop-app/webview/public/icon.svg diff --git a/sdk/apps/code/webview/styles/globals.css b/sdk/apps/examples/desktop-app/webview/styles/globals.css similarity index 100% rename from sdk/apps/code/webview/styles/globals.css rename to sdk/apps/examples/desktop-app/webview/styles/globals.css diff --git a/sdk/apps/examples/desktop-app/webview/tsconfig.json b/sdk/apps/examples/desktop-app/webview/tsconfig.json new file mode 100644 index 0000000000..679effa59d --- /dev/null +++ b/sdk/apps/examples/desktop-app/webview/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "paths": { + "@/*": ["./*"], + "@cline/agents": ["../../../../packages/agents/src/index.ts"], + "@cline/core": ["../../../../packages/core/src/index.ts"], + "@cline/llms": ["../../../../packages/llms/src/index.ts"], + "@cline/shared": ["../../../../packages/shared/src/index.ts"], + "@cline/shared/storage": [ + "../../../../packages/shared/src/storage/index.ts" + ], + "@cline/shared/db": ["../../../../packages/shared/src/db/index.ts"], + "@cline/shared/*": [ + "../../../../packages/shared/src/*", + "../../../../packages/shared/src/*/index.ts" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": ["node_modules"] +} diff --git a/sdk/apps/menubar/README.md b/sdk/apps/examples/menubar/README.md similarity index 83% rename from sdk/apps/menubar/README.md rename to sdk/apps/examples/menubar/README.md index 4e68a59dc3..7855a08d39 100644 --- a/sdk/apps/menubar/README.md +++ b/sdk/apps/examples/menubar/README.md @@ -9,11 +9,11 @@ Hub WebSocket Server (@cline/core/hub/server.ts) │ │ broadcasts ui.notify / ui.show_window events to ALL subscribers ▼ -Menu Bar Sidecar (apps/menubar/sidecar/index.ts) ← TypeScript/Bun process +Menu Bar Sidecar (apps/examples/menubar/sidecar/index.ts) ← TypeScript/Bun process │ │ JSON lines on stdout: hub_state / notification / ready ▼ -Rust Tauri App (apps/menubar/src-tauri/src/main.rs) +Rust Tauri App (apps/examples/menubar/src-tauri/src/main.rs) │ ├── System Tray Icon with dynamic menu │ ● Hub Connected — 3 clients, 2 sessions diff --git a/sdk/apps/menubar/package.json b/sdk/apps/examples/menubar/package.json similarity index 77% rename from sdk/apps/menubar/package.json rename to sdk/apps/examples/menubar/package.json index be49ea28a8..61ec00bd1b 100644 --- a/sdk/apps/menubar/package.json +++ b/sdk/apps/examples/menubar/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "tauri dev", "build": "tauri build", - "build:sidecar:bin": "mkdir -p src-tauri/bin && bun build ./sidecar/index.ts --compile --outfile ./src-tauri/bin/menubar-sidecar", + "build:sidecar:bin": "bun run scripts/build-sidecar-bin.ts", "typecheck": "tsc --noEmit", "clean": "rm -rf node_modules dist src-tauri/target" }, diff --git a/sdk/apps/examples/menubar/scripts/build-sidecar-bin.ts b/sdk/apps/examples/menubar/scripts/build-sidecar-bin.ts new file mode 100644 index 0000000000..f79bd13ade --- /dev/null +++ b/sdk/apps/examples/menubar/scripts/build-sidecar-bin.ts @@ -0,0 +1,32 @@ +import { $ } from "bun"; + +const resolveTargetTriple = async (): Promise => { + const fromEnv = process.env.TAURI_ENV_TARGET_TRIPLE ?? process.env.TARGET; + if (fromEnv?.trim()) { + return fromEnv.trim(); + } + + const rustcVersion = await $`rustc -vV`.text(); + const hostLine = rustcVersion + .split("\n") + .find((line) => line.startsWith("host: ")); + const host = hostLine?.slice("host: ".length).trim(); + if (!host) { + throw new Error("failed to resolve Rust host target triple"); + } + return host; +}; + +const main = async () => { + const targetTriple = await resolveTargetTriple(); + const extension = targetTriple.includes("windows") ? ".exe" : ""; + const outfile = `./src-tauri/bin/menubar-sidecar-${targetTriple}${extension}`; + + await $`mkdir -p src-tauri/bin`; + await $`bun build ./sidecar/index.ts --compile --outfile ${outfile}`; +}; + +main().catch((error: unknown) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/sdk/apps/menubar/sidecar/index.ts b/sdk/apps/examples/menubar/sidecar/index.ts similarity index 100% rename from sdk/apps/menubar/sidecar/index.ts rename to sdk/apps/examples/menubar/sidecar/index.ts diff --git a/sdk/apps/menubar/src-tauri/Cargo.lock b/sdk/apps/examples/menubar/src-tauri/Cargo.lock similarity index 100% rename from sdk/apps/menubar/src-tauri/Cargo.lock rename to sdk/apps/examples/menubar/src-tauri/Cargo.lock diff --git a/sdk/apps/menubar/src-tauri/Cargo.toml b/sdk/apps/examples/menubar/src-tauri/Cargo.toml similarity index 100% rename from sdk/apps/menubar/src-tauri/Cargo.toml rename to sdk/apps/examples/menubar/src-tauri/Cargo.toml diff --git a/sdk/apps/menubar/src-tauri/build.rs b/sdk/apps/examples/menubar/src-tauri/build.rs similarity index 100% rename from sdk/apps/menubar/src-tauri/build.rs rename to sdk/apps/examples/menubar/src-tauri/build.rs diff --git a/sdk/apps/menubar/src-tauri/icons/128x128.png b/sdk/apps/examples/menubar/src-tauri/icons/128x128.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/128x128.png rename to sdk/apps/examples/menubar/src-tauri/icons/128x128.png diff --git a/sdk/apps/menubar/src-tauri/icons/128x128@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/128x128@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/128x128@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/128x128@2x.png diff --git a/sdk/apps/menubar/src-tauri/icons/32x32.png b/sdk/apps/examples/menubar/src-tauri/icons/32x32.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/32x32.png rename to sdk/apps/examples/menubar/src-tauri/icons/32x32.png diff --git a/sdk/apps/menubar/src-tauri/icons/64x64.png b/sdk/apps/examples/menubar/src-tauri/icons/64x64.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/64x64.png rename to sdk/apps/examples/menubar/src-tauri/icons/64x64.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square107x107Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square107x107Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square107x107Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square142x142Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square142x142Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square142x142Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square150x150Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square150x150Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square150x150Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square284x284Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square284x284Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square284x284Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square30x30Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square30x30Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square30x30Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square310x310Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square310x310Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square310x310Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square44x44Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square44x44Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square44x44Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square71x71Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square71x71Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square71x71Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/Square89x89Logo.png b/sdk/apps/examples/menubar/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/Square89x89Logo.png rename to sdk/apps/examples/menubar/src-tauri/icons/Square89x89Logo.png diff --git a/sdk/apps/menubar/src-tauri/icons/StoreLogo.png b/sdk/apps/examples/menubar/src-tauri/icons/StoreLogo.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/StoreLogo.png rename to sdk/apps/examples/menubar/src-tauri/icons/StoreLogo.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png rename to sdk/apps/examples/menubar/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/sdk/apps/menubar/src-tauri/icons/android/values/ic_launcher_background.xml b/sdk/apps/examples/menubar/src-tauri/icons/android/values/ic_launcher_background.xml similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/android/values/ic_launcher_background.xml rename to sdk/apps/examples/menubar/src-tauri/icons/android/values/ic_launcher_background.xml diff --git a/sdk/apps/menubar/src-tauri/icons/icon.icns b/sdk/apps/examples/menubar/src-tauri/icons/icon.icns similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/icon.icns rename to sdk/apps/examples/menubar/src-tauri/icons/icon.icns diff --git a/sdk/apps/menubar/src-tauri/icons/icon.ico b/sdk/apps/examples/menubar/src-tauri/icons/icon.ico similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/icon.ico rename to sdk/apps/examples/menubar/src-tauri/icons/icon.ico diff --git a/sdk/apps/menubar/src-tauri/icons/icon.png b/sdk/apps/examples/menubar/src-tauri/icons/icon.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/icon.png rename to sdk/apps/examples/menubar/src-tauri/icons/icon.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@1x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@1x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@1x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@1x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@2x-1.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@2x-1.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@2x-1.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@2x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@3x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@3x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-20x20@3x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-20x20@3x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@1x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@1x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@1x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@1x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@2x-1.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@2x-1.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@2x-1.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@2x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@3x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@3x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-29x29@3x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-29x29@3x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@1x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@1x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@1x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@1x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@2x-1.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@2x-1.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@2x-1.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@2x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@3x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@3x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-40x40@3x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-40x40@3x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-512@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-512@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-512@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-512@2x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-60x60@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-60x60@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-60x60@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-60x60@2x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-60x60@3x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-60x60@3x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-60x60@3x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-60x60@3x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-76x76@1x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-76x76@1x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-76x76@1x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-76x76@1x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-76x76@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-76x76@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-76x76@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-76x76@2x.png diff --git a/sdk/apps/menubar/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png similarity index 100% rename from sdk/apps/menubar/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png rename to sdk/apps/examples/menubar/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png diff --git a/sdk/apps/menubar/src-tauri/src/main.rs b/sdk/apps/examples/menubar/src-tauri/src/main.rs similarity index 97% rename from sdk/apps/menubar/src-tauri/src/main.rs rename to sdk/apps/examples/menubar/src-tauri/src/main.rs index 7bd88eaee7..32721d61fd 100644 --- a/sdk/apps/menubar/src-tauri/src/main.rs +++ b/sdk/apps/examples/menubar/src-tauri/src/main.rs @@ -135,6 +135,7 @@ fn resolve_sidecar_script(workspace_root: &str, launch_cwd: &str) -> Option Option String { + let target_triple = option_env!("TAURI_ENV_TARGET_TRIPLE").unwrap_or("").trim(); + if target_triple.is_empty() { + return "menubar-sidecar".to_string(); + } + + let extension = if cfg!(windows) { ".exe" } else { "" }; + format!("menubar-sidecar-{target_triple}{extension}") +} + fn resolve_sidecar_binary(workspace_root: &str) -> Option { if cfg!(debug_assertions) { return None; } + let binary_name = sidecar_binary_name(); let current_exe = std::env::current_exe().ok(); let candidates = [ Some( PathBuf::from(workspace_root) .join("apps") + .join("examples") .join("menubar") .join("src-tauri") .join("bin") - .join("menubar-sidecar"), + .join(&binary_name), ), current_exe .as_ref() - .and_then(|p| p.parent().map(|parent| parent.join("menubar-sidecar"))), + .and_then(|p| p.parent().map(|parent| parent.join(&binary_name))), current_exe.as_ref().and_then(|p| { p.parent() .and_then(|parent| parent.parent()) - .map(|parent| parent.join("Resources").join("menubar-sidecar")) + .map(|parent| parent.join("Resources").join(&binary_name)) }), ]; candidates.into_iter().flatten().find(|p| p.exists()) diff --git a/sdk/apps/menubar/src-tauri/tauri.conf.json b/sdk/apps/examples/menubar/src-tauri/tauri.conf.json similarity index 87% rename from sdk/apps/menubar/src-tauri/tauri.conf.json rename to sdk/apps/examples/menubar/src-tauri/tauri.conf.json index 271000d7e3..d5c5dda37a 100644 --- a/sdk/apps/menubar/src-tauri/tauri.conf.json +++ b/sdk/apps/examples/menubar/src-tauri/tauri.conf.json @@ -4,7 +4,7 @@ "version": "0.0.0", "identifier": "bot.cline.menubar", "build": { - "beforeDevCommand": "", + "beforeDevCommand": "bun run build:sidecar:bin", "beforeBuildCommand": "bun run build:sidecar:bin", "beforeBundleCommand": "[ \"$(uname)\" = \"Darwin\" ] && [ -e ./target/release/bundle/macos/Cline\\ Hub.app ] && xattr -d com.apple.quarantine ./target/release/bundle/macos/Cline\\ Hub.app || true" }, @@ -17,6 +17,7 @@ "bundle": { "active": true, "targets": "all", + "externalBin": ["bin/menubar-sidecar"], "icon": [ "icons/32x32.png", "icons/128x128.png", diff --git a/sdk/apps/examples/menubar/tsconfig.json b/sdk/apps/examples/menubar/tsconfig.json new file mode 100644 index 0000000000..4e298848c4 --- /dev/null +++ b/sdk/apps/examples/menubar/tsconfig.json @@ -0,0 +1,35 @@ +{ + "extends": "../../../packages/tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "module": "ESNext", + "moduleResolution": "Bundler", + "target": "ESNext", + "paths": { + "@cline/agents": ["../../../packages/agents/src/index.ts"], + "@cline/agents/*": [ + "../../../packages/agents/src/*", + "../../../packages/agents/src/*/index.ts" + ], + "@cline/core": ["../../../packages/core/src/index.ts"], + "@cline/core/hub/daemon-entry": [ + "../../../packages/core/src/hub/daemon/entry.ts" + ], + "@cline/core/*": [ + "../../../packages/core/src/*", + "../../../packages/core/src/*/index.ts" + ], + "@cline/llms": ["../../../packages/llms/src/index.ts"], + "@cline/shared": ["../../../packages/shared/src/index.ts"], + "@cline/shared/storage": [ + "../../../packages/shared/src/storage/index.ts" + ], + "@cline/shared/db": ["../../../packages/shared/src/db/index.ts"], + "@cline/shared/*": [ + "../../../packages/shared/src/*", + "../../../packages/shared/src/*/index.ts" + ] + } + }, + "include": ["sidecar/**/*.ts"] +} diff --git a/sdk/apps/examples/slack-bot/README.md b/sdk/apps/examples/slack-bot/README.md deleted file mode 100644 index cf074bd2b9..0000000000 --- a/sdk/apps/examples/slack-bot/README.md +++ /dev/null @@ -1,223 +0,0 @@ -# Slack Bot Example (Chat SDK + Cline Agents SDK) - -This example wires the [chat](https://www.npmjs.com/package/chat) Slack adapter to a Cline agent runtime. - -It supports: - -- Single-workspace Slack apps (`SLACK_BOT_TOKEN` + `SLACK_SIGNING_SECRET`) -- Multi-workspace OAuth installs (`SLACK_CLIENT_ID` + `SLACK_CLIENT_SECRET`) -- Thread-level Cline conversation memory -- Optional Slack Assistants API suggested prompts -- `/clear` slash command to clear per-thread agent history - -Code entrypoint: - -- [src/index.ts](./apps/examples/slack-bot/src/index.ts) - -## 1. Install Dependencies - -From workspace root: - -```bash -bun install -``` - -## 2. Create Your Slack App - -1. Go to [api.slack.com/apps](https://api.slack.com/apps) -2. Create a new app from manifest -3. Paste this manifest (replace `https://your-domain.com`): - -```yaml -display_information: - name: Cline Slack Bot - description: Slack bot powered by chat-sdk + Cline agents - -features: - bot_user: - display_name: Cline Bot - always_online: true - -oauth_config: - scopes: - bot: - - app_mentions:read - - channels:history - - channels:read - - chat:write - - groups:history - - groups:read - - im:history - - im:read - - mpim:history - - mpim:read - - reactions:read - - reactions:write - - users:read - - assistant:write - -settings: - event_subscriptions: - request_url: https://your-domain.com/api/webhooks/slack - bot_events: - - app_mention - - message.channels - - message.groups - - message.im - - message.mpim - - assistant_thread_started - - assistant_thread_context_changed - interactivity: - is_enabled: true - request_url: https://your-domain.com/api/webhooks/slack - org_deploy_enabled: false - socket_mode_enabled: false - token_rotation_enabled: false -``` - -4. (Optional) Add slash command `/clear` with the same request URL (`/api/webhooks/slack`) - -## 3. Configure Environment Variables - -Create `apps/examples/slack-bot/.env` (or export in shell): - -```bash -# Slack (single-workspace mode) -SLACK_BOT_TOKEN=xoxb-... -SLACK_SIGNING_SECRET=... - -# Slack (multi-workspace OAuth mode, optional) -# SLACK_CLIENT_ID=... -# SLACK_CLIENT_SECRET=... - -# Server -PORT=8787 -BASE_URL=http://localhost:8787 - -# Cline provider settings file (required) -CLINE_SLACK_BOT_PROVIDER_CONFIG=/absolute/path/to/providers.json - -# Optional overrides -# CLINE_SYSTEM_PROMPT=You are a concise, practical Slack assistant. -# BOT_USERNAME=cline -# LOG_LEVEL=info -``` - -Notes: - -- If both `SLACK_CLIENT_ID` and `SLACK_CLIENT_SECRET` are set, the bot runs in OAuth mode. -- Otherwise it runs in single-workspace mode with `SLACK_BOT_TOKEN`. -- The bot loads model/provider/auth from `CLINE_SLACK_BOT_PROVIDER_CONFIG` using the same provider settings schema used by Cline. -- For stored `providers.json` format, it uses `lastUsedProvider` when present; otherwise it falls back to the first provider entry. - -### Provider config file format - -The bot accepts any of these: - -1. Stored `providers.json` shape (recommended): - -```json -{ - "version": 1, - "lastUsedProvider": "openai-native", - "providers": { - "openai-native": { - "settings": { - "provider": "openai-native", - "model": "gpt-5-mini", - "apiKey": "sk-..." - }, - "updatedAt": "2026-03-06T00:00:00.000Z", - "tokenSource": "manual" - } - } -} -``` - -2. Array of provider settings entries: - -```json -[ - { - "provider": "openai-native", - "model": "gpt-5-mini", - "apiKey": "sk-..." - } -] -``` - -3. Single provider settings object: - -```json -{ - "provider": "openai-native", - "model": "gpt-5-mini", - "apiKey": "sk-..." -} -``` - -## 4. Run The Bot - -From workspace root: - -```bash -bun --env-file apps/examples/slack-bot/.env apps/examples/slack-bot/src/index.ts -``` - -Endpoints exposed by this example: - -- `POST /api/webhooks/slack` -- `GET /api/slack/install/callback` (OAuth mode only) -- `GET /health` - -## 5. Point Slack To Your Webhook - -For local development you need a public tunnel URL: - -```bash -ngrok http 8787 -``` - -Then update your Slack app URLs to: - -- Event Subscriptions request URL: `https:///api/webhooks/slack` -- Interactivity request URL: `https:///api/webhooks/slack` -- OAuth Redirect URL (multi-workspace): `https:///api/slack/install/callback` - -## 6. Install And Test - -Single workspace: - -1. Slack app settings -> OAuth & Permissions -> Install to Workspace -2. Invite bot to channel -3. Mention it: `@Cline Bot summarize this thread` - -Multi-workspace: - -1. Enable distribution and configure redirect URL -2. Start OAuth install flow for your app -3. Callback route stores installation automatically -4. Mention the bot in a channel - -## Implementation Details - -- Incoming messages are handled by `chat` webhook routing. -- The bot subscribes to threads when first mentioned, then continues on follow-ups. -- Each Slack thread gets one in-memory `Agent` instance from the `@cline/core` app-facing export. -- Agent provider/model/auth are read from `CLINE_SLACK_BOT_PROVIDER_CONFIG`. -- The agent uses plain LLM calls (`tools: []`) by default. -- `/clear` clears thread memory by dropping that thread's agent runtime. - -## Troubleshooting - -- `Missing required environment variable: SLACK_SIGNING_SECRET` - - Set `SLACK_SIGNING_SECRET` for webhook verification. -- `Missing required environment variable: CLINE_SLACK_BOT_PROVIDER_CONFIG` - - Set it to an absolute path to your provider settings JSON. -- Provider config parse error - - Ensure JSON matches `ProviderSettings` schema (`provider`, `model`, and auth fields like `apiKey` / `auth.accessToken`). -- Bot does not respond - - Confirm request URL is reachable from Slack and app is installed. - - Ensure bot is invited to the channel. -- OAuth callback returns 400 in single-workspace mode - - This is expected unless `SLACK_CLIENT_ID` and `SLACK_CLIENT_SECRET` are set. diff --git a/sdk/apps/examples/slack-bot/package.json b/sdk/apps/examples/slack-bot/package.json deleted file mode 100644 index db773cfa0b..0000000000 --- a/sdk/apps/examples/slack-bot/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "cline-sdk-slack-bot-example", - "version": "0.1.0", - "private": true, - "description": "Slack bot example for the Cline SDK", - "type": "module", - "scripts": { - "start": "bun run src/index.ts" - }, - "dependencies": { - "@chat-adapter/slack": "^4.16.1", - "@cline/core": "workspace:*", - "chat": "^4.16.1" - } -} diff --git a/sdk/apps/examples/slack-bot/src/index.ts b/sdk/apps/examples/slack-bot/src/index.ts deleted file mode 100644 index 5c6ce63d8e..0000000000 --- a/sdk/apps/examples/slack-bot/src/index.ts +++ /dev/null @@ -1,505 +0,0 @@ -/** - * Slack Bot Example (Chat SDK + Cline Agents SDK) - * - * A production-ready Slack bot that connects Cline agent intelligence to Slack. - * - * This example shows how to: - * - Wire a Chat SDK Slack adapter to a Cline Agent runtime - * - Support single-workspace and multi-workspace OAuth Slack installs - * - Maintain per-thread agent conversation memory - * - Serialize concurrent messages per thread to avoid race conditions - * - Handle slash commands (/clear) to clear agent state - * - Use the Slack Assistants API for suggested prompts - * - * Prerequisites: - * - A configured Slack app (see README.md for manifest) - * - Environment variables: SLACK_BOT_TOKEN + SLACK_SIGNING_SECRET (or OAuth creds) - * - A provider config file pointed to by CLINE_SLACK_BOT_PROVIDER_CONFIG - * - * Run: bun --env-file apps/examples/slack-bot/.env apps/examples/slack-bot/src/index.ts - */ - -import { readFileSync } from "node:fs"; -import path from "node:path"; -import { createSlackAdapter, type SlackAdapter } from "@chat-adapter/slack"; -import { Agent, ProviderSettingsSchema, toProviderConfig } from "@cline/core"; -import { - Chat, - ConsoleLogger, - type Lock, - type LogLevel, - type QueueEntry, - type StateAdapter, - type Thread, -} from "chat"; - -// --------------------------------------------------------------------------- -// Step 1: State adapter — Chat SDK needs a StateAdapter for subscriptions, -// message queues, and lock management. This in-memory implementation works -// for single-process deployments. Swap with Redis/DB for multi-instance. -// --------------------------------------------------------------------------- - -class InMemoryStateAdapter implements StateAdapter { - private readonly values = new Map< - string, - { expiresAt?: number; value: unknown } - >(); - private readonly queues = new Map(); - private readonly subscriptions = new Set(); - private readonly locks = new Map(); - - private getActiveQueue(threadId: string): QueueEntry[] { - const queue = this.queues.get(threadId) ?? []; - const now = Date.now(); - const activeQueue = queue.filter((entry) => entry.expiresAt > now); - if (activeQueue.length > 0) { - this.queues.set(threadId, activeQueue); - } else { - this.queues.delete(threadId); - } - return activeQueue; - } - - async connect(): Promise {} - - async disconnect(): Promise {} - - async get(key: string): Promise { - const entry = this.values.get(key); - if (!entry) { - return null; - } - if (entry.expiresAt && entry.expiresAt <= Date.now()) { - this.values.delete(key); - return null; - } - return entry.value as T; - } - - async set(key: string, value: T, ttlMs?: number): Promise { - this.values.set(key, { - value, - expiresAt: ttlMs ? Date.now() + ttlMs : undefined, - }); - } - - async delete(key: string): Promise { - this.values.delete(key); - } - - async dequeue(threadId: string): Promise { - const queue = this.getActiveQueue(threadId); - const next = queue.shift() ?? null; - if (queue.length > 0) { - this.queues.set(threadId, queue); - } else { - this.queues.delete(threadId); - } - return next; - } - - async enqueue( - threadId: string, - entry: QueueEntry, - maxSize: number, - ): Promise { - const queue = [...this.getActiveQueue(threadId), entry]; - const trimmed = - maxSize > 0 && queue.length > maxSize - ? queue.slice(queue.length - maxSize) - : queue; - this.queues.set(threadId, trimmed); - return trimmed.length; - } - - async subscribe(threadId: string): Promise { - this.subscriptions.add(threadId); - } - - async unsubscribe(threadId: string): Promise { - this.subscriptions.delete(threadId); - } - - async isSubscribed(threadId: string): Promise { - return this.subscriptions.has(threadId); - } - - async queueDepth(threadId: string): Promise { - return this.getActiveQueue(threadId).length; - } - - async acquireLock(threadId: string, ttlMs: number): Promise { - const existing = this.locks.get(threadId); - if (existing && existing.expiresAt > Date.now()) { - return null; - } - const lock: Lock = { - threadId, - token: crypto.randomUUID(), - expiresAt: Date.now() + ttlMs, - }; - this.locks.set(threadId, lock); - return lock; - } - - async extendLock(lock: Lock, ttlMs: number): Promise { - const existing = this.locks.get(lock.threadId); - if (!existing || existing.token !== lock.token) { - return false; - } - existing.expiresAt = Date.now() + ttlMs; - return true; - } - - async releaseLock(lock: Lock): Promise { - const existing = this.locks.get(lock.threadId); - if (existing?.token === lock.token) { - this.locks.delete(lock.threadId); - } - } - - async forceReleaseLock(threadId: string): Promise { - this.locks.delete(threadId); - } - - async appendToList( - key: string, - value: unknown, - options?: { maxLength?: number; ttlMs?: number }, - ): Promise { - const entry = this.values.get(key); - const list: unknown[] = Array.isArray(entry?.value) - ? (entry.value as unknown[]) - : []; - list.push(value); - if (options?.maxLength && list.length > options.maxLength) { - list.splice(0, list.length - options.maxLength); - } - await this.set(key, list, options?.ttlMs); - } - - async getList(key: string): Promise { - const value = await this.get(key); - return Array.isArray(value) ? value : []; - } - - async setIfNotExists( - key: string, - value: unknown, - ttlMs?: number, - ): Promise { - const existing = await this.get(key); - if (existing !== null) { - return false; - } - await this.set(key, value, ttlMs); - return true; - } -} - -// --------------------------------------------------------------------------- -// Step 2: Environment helpers — validate required env vars up front so -// errors surface at startup, not at request time. -// --------------------------------------------------------------------------- - -function getRequiredEnv(name: string): string { - const value = process.env[name]; - if (!value) { - throw new Error(`Missing required environment variable: ${name}`); - } - return value; -} - -// --------------------------------------------------------------------------- -// Step 3: Provider config loader — reads the model/provider/auth from a JSON -// file on disk. Accepts three formats: -// 1. Stored providers.json (with lastUsedProvider + providers map) -// 2. Array of provider settings (uses first entry) -// 3. Single provider settings object -// See README.md for examples of each format. -// --------------------------------------------------------------------------- - -type StoredProviderSettingsEntryLike = { settings?: unknown }; -type StoredProviderSettingsLike = { - lastUsedProvider?: string; - providers?: Record; -}; - -function parseProviderConfigFromDisk(filePathInput: string): { - modelId: string; - providerId: string; - apiKey?: string; - baseUrl?: string; - headers?: Record; -} { - const filePath = path.resolve(filePathInput); - const raw = readFileSync(filePath, "utf8"); - const parsed = JSON.parse(raw) as unknown; - - const asStored = parsed as StoredProviderSettingsLike; - if (asStored.providers && typeof asStored.providers === "object") { - const entries = Object.entries(asStored.providers); - if (!entries.length) { - throw new Error(`No providers found in ${filePath}.`); - } - const firstEntry = entries[0]; - if (!firstEntry) { - throw new Error(`No providers found in ${filePath}.`); - } - const chosenValue = - (asStored.lastUsedProvider && - asStored.providers[asStored.lastUsedProvider]) || - firstEntry[1]; - const maybeStoredEntry = chosenValue as StoredProviderSettingsEntryLike; - const rawSettings = maybeStoredEntry.settings ?? chosenValue; - const settings = ProviderSettingsSchema.parse(rawSettings); - const config = toProviderConfig(settings); - return { - providerId: config.providerId, - modelId: config.modelId, - apiKey: config.apiKey, - baseUrl: config.baseUrl, - headers: config.headers, - }; - } - - if (Array.isArray(parsed)) { - if (!parsed.length) { - throw new Error(`Provider settings array is empty in ${filePath}.`); - } - const settings = ProviderSettingsSchema.parse(parsed[0]); - const config = toProviderConfig(settings); - return { - providerId: config.providerId, - modelId: config.modelId, - apiKey: config.apiKey, - baseUrl: config.baseUrl, - headers: config.headers, - }; - } - - const settings = ProviderSettingsSchema.parse(parsed); - const config = toProviderConfig(settings); - return { - providerId: config.providerId, - modelId: config.modelId, - apiKey: config.apiKey, - baseUrl: config.baseUrl, - headers: config.headers, - }; -} - -// --------------------------------------------------------------------------- -// Step 4: Bootstrap — set up logging, load provider config, create the -// Slack adapter (single-workspace or OAuth), and initialize the Chat bot. -// --------------------------------------------------------------------------- - -type ThreadAgentRuntime = { - agent: Agent; - hasRun: boolean; -}; - -const requestedLogLevel = process.env.LOG_LEVEL; -const logLevel: LogLevel = - requestedLogLevel === "debug" || - requestedLogLevel === "info" || - requestedLogLevel === "warn" || - requestedLogLevel === "error" || - requestedLogLevel === "silent" - ? requestedLogLevel - : "info"; -const logger = new ConsoleLogger(logLevel, "slack-bot"); -const providerConfigPath = getRequiredEnv("CLINE_SLACK_BOT_PROVIDER_CONFIG"); -const providerConfig = parseProviderConfigFromDisk(providerConfigPath); -const systemPrompt = - process.env.CLINE_SYSTEM_PROMPT ?? - "You are a concise, practical Slack assistant. Prefer short, actionable answers."; - -if (!providerConfig.apiKey) { - logger.warn( - `No API key resolved from provider settings for "${providerConfig.providerId}".`, - ); -} - -// Decide between single-workspace mode (bot token) and multi-workspace OAuth -const useOAuthMode = - Boolean(process.env.SLACK_CLIENT_ID) && - Boolean(process.env.SLACK_CLIENT_SECRET); - -const slackAdapter = useOAuthMode - ? createSlackAdapter({ - clientId: getRequiredEnv("SLACK_CLIENT_ID"), - clientSecret: getRequiredEnv("SLACK_CLIENT_SECRET"), - }) - : createSlackAdapter(); - -// Create the Chat bot — this ties the Slack adapter, state, and logger together -const bot = new Chat({ - userName: process.env.BOT_USERNAME ?? "cline", - adapters: { - slack: slackAdapter, - }, - state: new InMemoryStateAdapter(), - logger, -}); - -// --------------------------------------------------------------------------- -// Step 5: Per-thread agent management — each Slack thread gets its own Agent -// instance so conversation history stays isolated. The `hasRun` flag tracks -// whether to call agent.run() (first message) or agent.continue() (follow-ups). -// --------------------------------------------------------------------------- - -const runtimes = new Map(); -const threadQueues = new Map>(); - -// Lazily create an Agent for each thread on first message -function getThreadRuntime(threadId: string): ThreadAgentRuntime { - const existing = runtimes.get(threadId); - if (existing) { - return existing; - } - const created: ThreadAgentRuntime = { - agent: new Agent({ - providerId: providerConfig.providerId, - modelId: providerConfig.modelId, - apiKey: providerConfig.apiKey, - baseUrl: providerConfig.baseUrl, - headers: providerConfig.headers, - systemPrompt, - tools: [], // No tools — pure LLM conversation; add tools here to give the agent capabilities - maxIterations: 8, // Safety limit on agent loop iterations - }), - hasRun: false, - }; - runtimes.set(threadId, created); - return created; -} - -// Serialize turns per thread — Slack can deliver multiple messages quickly; -// this queue ensures the agent processes them one at a time per thread. -async function enqueueThreadTurn( - threadId: string, - work: () => Promise, -): Promise { - const previous = threadQueues.get(threadId) ?? Promise.resolve(); - const current = previous - .catch(() => {}) - .then(work) - .finally(() => { - if (threadQueues.get(threadId) === current) { - threadQueues.delete(threadId); - } - }); - threadQueues.set(threadId, current); - return current; -} - -// Core message handler — sends text to the agent and posts the response -async function handleUserTurn(thread: Thread, text: string): Promise { - const input = text.trim(); - if (!input) { - return; - } - // Show a typing indicator while the agent processes - await thread.startTyping("Thinking..."); - const runtime = getThreadRuntime(thread.id); - - // First message in a thread uses run(); follow-ups use continue() - const result = runtime.hasRun - ? await runtime.agent.continue(input) - : await runtime.agent.run(input); - runtime.hasRun = true; - const answer = - result.outputText.trim() || - "I could not produce a response. Please try rephrasing your request."; - await thread.post(answer); -} - -// --------------------------------------------------------------------------- -// Step 6: Event handlers — wire Chat SDK events to the agent runtime. -// --------------------------------------------------------------------------- - -// When the bot is @mentioned in a channel, subscribe to the thread and respond -bot.onNewMention(async (thread, message) => { - await thread.subscribe(); - await enqueueThreadTurn(thread.id, async () => { - await handleUserTurn(thread, message.text); - }); -}); - -// Follow-up messages in a thread the bot is already subscribed to -bot.onSubscribedMessage(async (thread, message) => { - await enqueueThreadTurn(thread.id, async () => { - await handleUserTurn(thread, message.text); - }); -}); - -// /clear slash command — clears all agent thread history in the channel -bot.onSlashCommand("/clear", async (event) => { - const channelPrefix = `${event.channel.id}:`; - for (const threadId of runtimes.keys()) { - if (threadId.startsWith(channelPrefix)) { - runtimes.delete(threadId); - } - } - await event.channel.post( - "Cleared this channel's Cline agent thread history.", - ); -}); - -// Slack Assistants API — suggest prompts when a user opens an assistant thread -bot.onAssistantThreadStarted(async (event) => { - const adapter = bot.getAdapter("slack") as SlackAdapter; - await adapter.setSuggestedPrompts(event.channelId, event.threadTs, [ - { title: "Summarize", message: "Summarize this channel context." }, - { title: "Draft reply", message: "Draft a reply for the latest message." }, - { title: "Action items", message: "List concrete next steps and owners." }, - ]); -}); - -// --------------------------------------------------------------------------- -// Step 7: Start the HTTP server — expose webhook, OAuth callback, and health -// endpoints. Chat SDK handles Slack event verification and routing internally. -// --------------------------------------------------------------------------- - -const port = Number(process.env.PORT ?? 8787); -const baseUrl = process.env.BASE_URL ?? `http://localhost:${port}`; - -// Initialize the Chat SDK (connects adapters and state) -await bot.initialize(); - -// Start a Bun HTTP server with route handlers -Bun.serve({ - port, - routes: { - // All Slack events (messages, mentions, slash commands) arrive here - "/api/webhooks/slack": async (request) => bot.webhooks.slack(request), - - // OAuth install callback (only used in multi-workspace mode) - "/api/slack/install/callback": async (request) => { - if (!useOAuthMode) { - return new Response( - "OAuth callback route is disabled in single-workspace mode.", - { status: 400 }, - ); - } - if (request.method !== "GET") { - return new Response("Method Not Allowed", { status: 405 }); - } - const { teamId } = await slackAdapter.handleOAuthCallback(request); - return new Response(`Slack app installed for team ${teamId}.`); - }, - "/health": () => new Response("ok"), - "/": () => - new Response( - [ - "Slack bot is running.", - `Webhook URL: ${baseUrl}/api/webhooks/slack`, - `OAuth callback: ${baseUrl}/api/slack/install/callback`, - ].join("\n"), - ), - }, - fetch: () => new Response("Not Found", { status: 404 }), -}); - -logger.info(`Slack bot listening on ${baseUrl}`); diff --git a/sdk/apps/vscode/.vscode/launch.json b/sdk/apps/examples/vscode/.vscode/launch.json similarity index 100% rename from sdk/apps/vscode/.vscode/launch.json rename to sdk/apps/examples/vscode/.vscode/launch.json diff --git a/sdk/apps/vscode/.vscode/tasks.json b/sdk/apps/examples/vscode/.vscode/tasks.json similarity index 100% rename from sdk/apps/vscode/.vscode/tasks.json rename to sdk/apps/examples/vscode/.vscode/tasks.json diff --git a/sdk/apps/vscode/README.md b/sdk/apps/examples/vscode/README.md similarity index 91% rename from sdk/apps/vscode/README.md rename to sdk/apps/examples/vscode/README.md index b1247b88cb..e33f604ed1 100644 --- a/sdk/apps/vscode/README.md +++ b/sdk/apps/examples/vscode/README.md @@ -1,4 +1,4 @@ -# `apps/vscode` (`@cline/vscode`) +# `apps/examples/vscode` (`@cline/vscode`) VS Code extension that opens a chat webview and runs Cline sessions over the RPC runtime. @@ -27,6 +27,6 @@ bun -F @cline/vscode typecheck To run locally in VS Code: 1. Build the extension: `bun -F @cline/vscode build`. -2. Open `apps/vscode` in VS Code. +2. Open `apps/examples/vscode` in VS Code. 3. Press `F5` to launch the Extension Development Host. 4. Run command `Cline: Open RPC Chat`. diff --git a/sdk/apps/vscode/package.json b/sdk/apps/examples/vscode/package.json similarity index 100% rename from sdk/apps/vscode/package.json rename to sdk/apps/examples/vscode/package.json diff --git a/sdk/apps/vscode/src/extension.ts b/sdk/apps/examples/vscode/src/extension.ts similarity index 100% rename from sdk/apps/vscode/src/extension.ts rename to sdk/apps/examples/vscode/src/extension.ts diff --git a/sdk/apps/vscode/src/hub-daemon.ts b/sdk/apps/examples/vscode/src/hub-daemon.ts similarity index 100% rename from sdk/apps/vscode/src/hub-daemon.ts rename to sdk/apps/examples/vscode/src/hub-daemon.ts diff --git a/sdk/apps/vscode/src/runtime-capabilities.test.ts b/sdk/apps/examples/vscode/src/runtime-capabilities.test.ts similarity index 100% rename from sdk/apps/vscode/src/runtime-capabilities.test.ts rename to sdk/apps/examples/vscode/src/runtime-capabilities.test.ts diff --git a/sdk/apps/vscode/src/runtime-capabilities.ts b/sdk/apps/examples/vscode/src/runtime-capabilities.ts similarity index 100% rename from sdk/apps/vscode/src/runtime-capabilities.ts rename to sdk/apps/examples/vscode/src/runtime-capabilities.ts diff --git a/sdk/apps/vscode/src/telemetry.ts b/sdk/apps/examples/vscode/src/telemetry.ts similarity index 100% rename from sdk/apps/vscode/src/telemetry.ts rename to sdk/apps/examples/vscode/src/telemetry.ts diff --git a/sdk/apps/vscode/src/webview-protocol.ts b/sdk/apps/examples/vscode/src/webview-protocol.ts similarity index 100% rename from sdk/apps/vscode/src/webview-protocol.ts rename to sdk/apps/examples/vscode/src/webview-protocol.ts diff --git a/sdk/apps/vscode/src/webview/.gitignore b/sdk/apps/examples/vscode/src/webview/.gitignore similarity index 100% rename from sdk/apps/vscode/src/webview/.gitignore rename to sdk/apps/examples/vscode/src/webview/.gitignore diff --git a/sdk/apps/vscode/src/webview/README.md b/sdk/apps/examples/vscode/src/webview/README.md similarity index 100% rename from sdk/apps/vscode/src/webview/README.md rename to sdk/apps/examples/vscode/src/webview/README.md diff --git a/sdk/apps/vscode/src/webview/components.json b/sdk/apps/examples/vscode/src/webview/components.json similarity index 100% rename from sdk/apps/vscode/src/webview/components.json rename to sdk/apps/examples/vscode/src/webview/components.json diff --git a/sdk/apps/vscode/src/webview/eslint.config.js b/sdk/apps/examples/vscode/src/webview/eslint.config.js similarity index 100% rename from sdk/apps/vscode/src/webview/eslint.config.js rename to sdk/apps/examples/vscode/src/webview/eslint.config.js diff --git a/sdk/apps/vscode/src/webview/index.html b/sdk/apps/examples/vscode/src/webview/index.html similarity index 100% rename from sdk/apps/vscode/src/webview/index.html rename to sdk/apps/examples/vscode/src/webview/index.html diff --git a/sdk/apps/vscode/src/webview/package.json b/sdk/apps/examples/vscode/src/webview/package.json similarity index 100% rename from sdk/apps/vscode/src/webview/package.json rename to sdk/apps/examples/vscode/src/webview/package.json diff --git a/sdk/apps/vscode/src/webview/public/32x32.png b/sdk/apps/examples/vscode/src/webview/public/32x32.png similarity index 100% rename from sdk/apps/vscode/src/webview/public/32x32.png rename to sdk/apps/examples/vscode/src/webview/public/32x32.png diff --git a/sdk/apps/vscode/src/webview/public/favicon.svg b/sdk/apps/examples/vscode/src/webview/public/favicon.svg similarity index 100% rename from sdk/apps/vscode/src/webview/public/favicon.svg rename to sdk/apps/examples/vscode/src/webview/public/favicon.svg diff --git a/sdk/apps/vscode/src/webview/public/icon.ico b/sdk/apps/examples/vscode/src/webview/public/icon.ico similarity index 100% rename from sdk/apps/vscode/src/webview/public/icon.ico rename to sdk/apps/examples/vscode/src/webview/public/icon.ico diff --git a/sdk/apps/vscode/src/webview/public/icon.png b/sdk/apps/examples/vscode/src/webview/public/icon.png similarity index 100% rename from sdk/apps/vscode/src/webview/public/icon.png rename to sdk/apps/examples/vscode/src/webview/public/icon.png diff --git a/sdk/apps/vscode/src/webview/public/icon.svg b/sdk/apps/examples/vscode/src/webview/public/icon.svg similarity index 100% rename from sdk/apps/vscode/src/webview/public/icon.svg rename to sdk/apps/examples/vscode/src/webview/public/icon.svg diff --git a/sdk/apps/vscode/src/webview/src/App.css b/sdk/apps/examples/vscode/src/webview/src/App.css similarity index 100% rename from sdk/apps/vscode/src/webview/src/App.css rename to sdk/apps/examples/vscode/src/webview/src/App.css diff --git a/sdk/apps/vscode/src/webview/src/App.tsx b/sdk/apps/examples/vscode/src/webview/src/App.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/App.tsx rename to sdk/apps/examples/vscode/src/webview/src/App.tsx diff --git a/sdk/apps/vscode/src/webview/src/Chat.tsx b/sdk/apps/examples/vscode/src/webview/src/Chat.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/Chat.tsx rename to sdk/apps/examples/vscode/src/webview/src/Chat.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/Composer.tsx b/sdk/apps/examples/vscode/src/webview/src/components/Composer.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/Composer.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/Composer.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/TeamTasks.tsx b/sdk/apps/examples/vscode/src/webview/src/components/TeamTasks.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/TeamTasks.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/TeamTasks.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/agent.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/agent.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/agent.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/agent.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/artifact.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/artifact.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/artifact.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/artifact.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/attachments.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/attachments.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/attachments.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/attachments.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/audio-player.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/audio-player.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/audio-player.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/audio-player.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/canvas.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/canvas.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/canvas.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/canvas.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/chain-of-thought.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/chain-of-thought.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/chain-of-thought.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/chain-of-thought.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/checkpoint.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/checkpoint.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/checkpoint.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/checkpoint.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/code-block.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/code-block.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/code-block.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/code-block.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/commit.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/commit.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/commit.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/commit.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/confirmation.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/confirmation.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/confirmation.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/confirmation.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/connection.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/connection.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/connection.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/connection.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/context.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/context.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/context.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/context.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/controls.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/controls.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/controls.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/controls.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/conversation.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/conversation.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/conversation.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/conversation.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/edge.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/edge.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/edge.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/edge.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/environment-variables.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/environment-variables.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/environment-variables.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/environment-variables.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/file-tree.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/file-tree.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/file-tree.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/file-tree.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/image.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/image.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/image.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/image.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/inline-citation.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/inline-citation.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/inline-citation.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/inline-citation.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/jsx-preview.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/jsx-preview.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/jsx-preview.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/jsx-preview.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/message.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/message.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/message.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/message.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/mic-selector.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/mic-selector.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/mic-selector.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/mic-selector.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/model-selector.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/model-selector.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/model-selector.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/model-selector.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/node.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/node.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/node.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/node.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/open-in-chat.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/open-in-chat.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/open-in-chat.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/open-in-chat.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/package-info.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/package-info.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/package-info.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/package-info.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/panel.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/panel.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/panel.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/panel.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/persona.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/persona.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/persona.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/persona.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/plan.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/plan.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/plan.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/plan.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/prompt-input.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/prompt-input.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/prompt-input.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/prompt-input.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/queue.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/queue.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/queue.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/queue.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/reasoning.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/reasoning.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/reasoning.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/reasoning.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/sandbox.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/sandbox.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/sandbox.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/sandbox.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/schema-display.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/schema-display.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/schema-display.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/schema-display.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/shimmer.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/shimmer.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/shimmer.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/shimmer.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/snippet.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/snippet.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/snippet.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/snippet.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/sources.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/sources.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/sources.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/sources.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/speech-input.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/speech-input.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/speech-input.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/speech-input.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/stack-trace.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/stack-trace.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/stack-trace.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/stack-trace.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/status-badge.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/status-badge.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/status-badge.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/status-badge.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/suggestion.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/suggestion.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/suggestion.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/suggestion.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/task.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/task.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/task.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/task.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/terminal.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/terminal.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/terminal.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/terminal.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/test-results.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/test-results.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/test-results.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/test-results.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/tool.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/tool.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/tool.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/tool.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/toolbar.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/toolbar.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/toolbar.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/toolbar.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/transcription.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/transcription.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/transcription.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/transcription.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/voice-selector.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/voice-selector.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/voice-selector.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/voice-selector.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ai-elements/web-preview.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ai-elements/web-preview.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ai-elements/web-preview.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ai-elements/web-preview.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/accordion.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/accordion.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/accordion.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/accordion.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/alert-dialog.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/alert-dialog.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/alert-dialog.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/alert-dialog.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/alert.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/alert.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/alert.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/alert.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/avatar.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/avatar.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/avatar.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/avatar.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/badge.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/badge.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/badge.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/badge.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/button-group.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/button-group.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/button-group.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/button-group.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/button.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/button.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/button.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/button.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/card.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/card.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/card.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/card.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/carousel.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/carousel.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/carousel.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/carousel.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/chart.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/chart.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/chart.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/chart.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/checkbox.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/checkbox.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/checkbox.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/checkbox.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/collapsible.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/collapsible.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/collapsible.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/collapsible.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/combobox.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/combobox.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/combobox.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/combobox.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/command.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/command.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/command.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/command.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/dialog.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/dialog.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/dialog.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/dialog.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/dropdown-menu.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/dropdown-menu.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/dropdown-menu.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/dropdown-menu.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/hover-card.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/hover-card.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/hover-card.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/hover-card.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/input-group.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/input-group.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/input-group.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/input-group.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/input.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/input.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/input.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/input.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/label.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/label.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/label.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/label.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/menubar.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/menubar.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/menubar.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/menubar.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/native-select.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/native-select.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/native-select.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/native-select.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/popover.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/popover.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/popover.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/popover.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/progress.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/progress.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/progress.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/progress.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/radio-group.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/radio-group.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/radio-group.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/radio-group.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/scroll-area.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/scroll-area.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/scroll-area.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/scroll-area.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/select.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/select.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/select.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/select.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/separator.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/separator.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/separator.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/separator.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/sonner.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/sonner.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/sonner.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/sonner.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/spinner.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/spinner.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/spinner.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/spinner.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/switch.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/switch.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/switch.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/switch.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/table.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/table.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/table.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/table.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/tabs.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/tabs.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/tabs.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/tabs.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/textarea.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/textarea.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/textarea.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/textarea.tsx diff --git a/sdk/apps/vscode/src/webview/src/components/ui/tooltip.tsx b/sdk/apps/examples/vscode/src/webview/src/components/ui/tooltip.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/components/ui/tooltip.tsx rename to sdk/apps/examples/vscode/src/webview/src/components/ui/tooltip.tsx diff --git a/sdk/apps/vscode/src/webview/src/index.css b/sdk/apps/examples/vscode/src/webview/src/index.css similarity index 100% rename from sdk/apps/vscode/src/webview/src/index.css rename to sdk/apps/examples/vscode/src/webview/src/index.css diff --git a/sdk/apps/vscode/src/webview/src/lib/utils.ts b/sdk/apps/examples/vscode/src/webview/src/lib/utils.ts similarity index 100% rename from sdk/apps/vscode/src/webview/src/lib/utils.ts rename to sdk/apps/examples/vscode/src/webview/src/lib/utils.ts diff --git a/sdk/apps/vscode/src/webview/src/main.tsx b/sdk/apps/examples/vscode/src/webview/src/main.tsx similarity index 100% rename from sdk/apps/vscode/src/webview/src/main.tsx rename to sdk/apps/examples/vscode/src/webview/src/main.tsx diff --git a/sdk/apps/vscode/src/webview/src/vscode.ts b/sdk/apps/examples/vscode/src/webview/src/vscode.ts similarity index 100% rename from sdk/apps/vscode/src/webview/src/vscode.ts rename to sdk/apps/examples/vscode/src/webview/src/vscode.ts diff --git a/sdk/apps/vscode/src/webview/tsconfig.app.json b/sdk/apps/examples/vscode/src/webview/tsconfig.app.json similarity index 100% rename from sdk/apps/vscode/src/webview/tsconfig.app.json rename to sdk/apps/examples/vscode/src/webview/tsconfig.app.json diff --git a/sdk/apps/vscode/src/webview/tsconfig.json b/sdk/apps/examples/vscode/src/webview/tsconfig.json similarity index 100% rename from sdk/apps/vscode/src/webview/tsconfig.json rename to sdk/apps/examples/vscode/src/webview/tsconfig.json diff --git a/sdk/apps/vscode/src/webview/tsconfig.node.json b/sdk/apps/examples/vscode/src/webview/tsconfig.node.json similarity index 100% rename from sdk/apps/vscode/src/webview/tsconfig.node.json rename to sdk/apps/examples/vscode/src/webview/tsconfig.node.json diff --git a/sdk/apps/vscode/src/webview/vite.config.ts b/sdk/apps/examples/vscode/src/webview/vite.config.ts similarity index 100% rename from sdk/apps/vscode/src/webview/vite.config.ts rename to sdk/apps/examples/vscode/src/webview/vite.config.ts diff --git a/sdk/apps/vscode/tsconfig.json b/sdk/apps/examples/vscode/tsconfig.json similarity index 93% rename from sdk/apps/vscode/tsconfig.json rename to sdk/apps/examples/vscode/tsconfig.json index 91a3e8df4c..87bf0d600b 100644 --- a/sdk/apps/vscode/tsconfig.json +++ b/sdk/apps/examples/vscode/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.apps.json", + "extends": "../../tsconfig.apps.json", "compilerOptions": { "target": "ES2022", "module": "ESNext", diff --git a/sdk/apps/menubar/tsconfig.json b/sdk/apps/menubar/tsconfig.json deleted file mode 100644 index cea614cf54..0000000000 --- a/sdk/apps/menubar/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../packages/tsconfig.base.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": ".", - "module": "ESNext", - "moduleResolution": "Bundler", - "target": "ESNext" - }, - "include": ["sidecar/**/*.ts"] -} diff --git a/sdk/bun.lock b/sdk/bun.lock index 205ffc7dd8..278c2b1523 100644 --- a/sdk/bun.lock +++ b/sdk/bun.lock @@ -19,7 +19,7 @@ }, "apps/cli": { "name": "@cline/cli", - "version": "0.0.11", + "version": "0.0.13", "bin": { "clite": "src/index.ts", }, @@ -56,7 +56,7 @@ "@types/react": "19.2.14", }, }, - "apps/code": { + "apps/examples/desktop-app": { "name": "@cline/code", "version": "0.0.0", "dependencies": { @@ -131,28 +131,7 @@ "typescript": "5.7.3", }, }, - "apps/examples": { - "name": "examples", - "dependencies": { - "@cline/core": "workspace:*", - }, - "devDependencies": { - "@types/bun": "^1.3.10", - }, - "peerDependencies": { - "typescript": "^5", - }, - }, - "apps/examples/slack-bot": { - "name": "cline-sdk-slack-bot-example", - "version": "0.1.0", - "dependencies": { - "@chat-adapter/slack": "^4.16.1", - "@cline/core": "workspace:*", - "chat": "^4.16.1", - }, - }, - "apps/menubar": { + "apps/examples/menubar": { "name": "@cline/menubar", "version": "0.1.0", "dependencies": { @@ -166,7 +145,7 @@ "typescript": "^5.9.3", }, }, - "apps/vscode": { + "apps/examples/vscode": { "name": "@cline/vscode", "version": "0.0.0", "dependencies": { @@ -182,7 +161,7 @@ "typescript": "^5.9.3", }, }, - "apps/vscode/src/webview": { + "apps/examples/vscode/src/webview": { "name": "webview", "version": "0.0.0", "dependencies": { @@ -239,6 +218,32 @@ "vite": "^8.0.0", }, }, + "examples": { + "name": "examples", + "dependencies": { + "@cline/core": "workspace:*", + }, + "devDependencies": { + "@types/bun": "^1.3.10", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + "examples/plugins/subagent-plugin": { + "name": "cline-sdk-portable-agents", + "version": "0.1.0", + "dependencies": { + "yaml": "^2.8.1", + "zod": "^4.1.5", + }, + "peerDependencies": { + "@cline/core": "*", + }, + "optionalPeers": [ + "@cline/core", + ], + }, "packages/agents": { "name": "@cline/agents", "version": "0.0.38", @@ -568,7 +573,7 @@ "@cline/cli": ["@cline/cli@workspace:apps/cli"], - "@cline/code": ["@cline/code@workspace:apps/code"], + "@cline/code": ["@cline/code@workspace:apps/examples/desktop-app"], "@cline/core": ["@cline/core@workspace:packages/core"], @@ -576,13 +581,13 @@ "@cline/llms": ["@cline/llms@workspace:packages/llms"], - "@cline/menubar": ["@cline/menubar@workspace:apps/menubar"], + "@cline/menubar": ["@cline/menubar@workspace:apps/examples/menubar"], "@cline/sdk": ["@cline/sdk@workspace:packages/sdk"], "@cline/shared": ["@cline/shared@workspace:packages/shared"], - "@cline/vscode": ["@cline/vscode@workspace:apps/vscode"], + "@cline/vscode": ["@cline/vscode@workspace:apps/examples/vscode"], "@date-fns/tz": ["@date-fns/tz@1.4.1", "", {}, "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA=="], @@ -1714,7 +1719,7 @@ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], - "cline-sdk-slack-bot-example": ["cline-sdk-slack-bot-example@workspace:apps/examples/slack-bot"], + "cline-sdk-portable-agents": ["cline-sdk-portable-agents@workspace:examples/plugins/subagent-plugin"], "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], @@ -1982,7 +1987,7 @@ "eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], - "examples": ["examples@workspace:apps/examples"], + "examples": ["examples@workspace:examples"], "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], @@ -3070,7 +3075,7 @@ "web-tree-sitter": ["web-tree-sitter@0.25.10", "", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="], - "webview": ["webview@workspace:apps/vscode/src/webview"], + "webview": ["webview@workspace:apps/examples/vscode/src/webview"], "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], diff --git a/sdk/apps/examples/README.md b/sdk/examples/README.md similarity index 73% rename from sdk/apps/examples/README.md rename to sdk/examples/README.md index ccf679f52b..f833870617 100644 --- a/sdk/apps/examples/README.md +++ b/sdk/examples/README.md @@ -2,11 +2,11 @@ Learn how to build with the Cline SDK through practical, runnable examples. -## 📁 Plugin Examples +## 📁 Plugin, Hook, and Automation Examples Plugins extend the CLI and SDK with custom capabilities. Install them in `~/.cline/plugins/`: -### [`plugins/`](./plugins/) +### [`../../examples/plugins/`](../../examples/plugins/) **Plugin module examples** showing how to extend the CLI and SDK with custom capabilities: @@ -23,11 +23,11 @@ Examples include: ```bash mkdir -p ~/.cline/plugins -cp apps/examples/plugins/weather-plugin.example.ts ~/.cline/plugins/weather-metrics.ts +cp examples/plugins/weather-plugin.example.ts ~/.cline/plugins/weather-metrics.ts cline -i "What's the weather like in Tokyo and Paris?" ``` -### [`plugins/typescript-lsp-plugin/`](./plugins/typescript-lsp-plugin) +### [`../../examples/plugins/typescript-lsp-plugin/`](../../examples/plugins/typescript-lsp-plugin) TypeScript LSP plugin that gives the agent a `goto_definition` tool powered by the TypeScript Language Service API. Resolves through imports, re-exports, and type aliases -- much more precise than text search. @@ -37,11 +37,11 @@ TypeScript LSP plugin that gives the agent a `goto_definition` tool powered by t - Zero extra dependencies -- resolves `typescript` from the target project ```bash -cp apps/examples/plugins/typescript-lsp-plugin/index.ts ~/.cline/plugins/typescript-lsp.ts +cp examples/plugins/typescript-lsp-plugin/index.ts ~/.cline/plugins/typescript-lsp.ts cline -i "Find where createTool is defined" ``` -### [`plugins/subagent-plugin/`](./plugins/subagent-plugin) +### [`../../examples/plugins/subagent-plugin/`](../../examples/plugins/subagent-plugin) **Portable subagent plugin** that adds background agent orchestration tools to the CLI and SDK: @@ -60,7 +60,7 @@ Skills available: ```bash mkdir -p ~/.cline/plugins -cp apps/examples/plugins/subagent-plugin/index.ts ~/.cline/plugins/portable-subagents.ts +cp examples/plugins/subagent-plugin/index.ts ~/.cline/plugins/portable-subagents.ts cline -i "Use subagents to inspect this repository and report back." ``` @@ -68,22 +68,7 @@ Once loaded, the agent can call tools like `start_subagent`, `message_subagent`, ## 📁 App Examples -### [`slack-bot/`](./slack-bot) - -**Production Slack bot** integrating the chat SDK with Cline agents: - -- Single and multi-workspace support -- Thread-level conversation memory -- Slash commands and OAuth flows -- Deployment-ready architecture - -```bash -cd apps/examples/slack-bot -# Configure .env with Slack credentials -bun run src/index.ts -``` - -### [`cron/`](./cron) +### [`../../examples/cron/`](../../examples/cron) **Example file-based and event-driven automation specs** for global `~/.cline/cron/`: @@ -104,14 +89,14 @@ Event-driven jobs for PR workflows: ```bash mkdir -p ~/.cline/cron -cp apps/examples/cron/changelog-generator.cron.md ~/.cline/cron/ +cp examples/cron/changelog-generator.cron.md ~/.cline/cron/ mkdir -p ~/.cline/cron/events -cp apps/examples/cron/events/pr-changelog-check.event.md ~/.cline/cron/events/ +cp examples/cron/events/pr-changelog-check.event.md ~/.cline/cron/events/ ``` -See [cron/README.md](./cron/README.md) for full descriptions and usage patterns. +See [cron/README.md](../../examples/cron/README.md) for full descriptions and usage patterns. -### [`hooks/`](./hooks) +### [`../../examples/hooks/`](../../examples/hooks) **Lifecycle hooks** written in bash, Python, or TypeScript that intercept agent actions at key points: @@ -127,15 +112,15 @@ Hooks live in `.cline/hooks/` and are named after the event they handle (PreTool mkdir -p ~/.cline/hooks # Bash hook -cp apps/examples/hooks/PreToolUse.sh ~/.cline/hooks/ +cp examples/hooks/PreToolUse.sh ~/.cline/hooks/ chmod +x ~/.cline/hooks/PreToolUse.sh # Or Python -cp apps/examples/hooks/PreToolUse.py ~/.cline/hooks/PreToolUse.py +cp examples/hooks/PreToolUse.py ~/.cline/hooks/PreToolUse.py chmod +x ~/.cline/hooks/PreToolUse.py # Or TypeScript (runs via bun) -cp apps/examples/hooks/PreToolUse.ts ~/.cline/hooks/PreToolUse.ts +cp examples/hooks/PreToolUse.ts ~/.cline/hooks/PreToolUse.ts chmod +x ~/.cline/hooks/PreToolUse.ts cline -i "do something" # Hooks will execute automatically @@ -160,16 +145,16 @@ Current SDK layering: ## 📚 Learning Path **Building plugins?** -- Start with [`plugins/`](./plugins/) for basic tool and event patterns -- Explore [`plugins/typescript-lsp-plugin/`](./plugins/typescript-lsp-plugin) for integration with language services -- See [`plugins/subagent-plugin/`](./plugins/subagent-plugin) for advanced agent orchestration +- Start with [`../../examples/plugins/`](../../examples/plugins/) for basic tool and event patterns +- Explore [`../../examples/plugins/typescript-lsp-plugin/`](../../examples/plugins/typescript-lsp-plugin) for integration with language services +- See [`../../examples/plugins/subagent-plugin/`](../../examples/plugins/subagent-plugin) for advanced agent orchestration **Building integrations?** -- Check out [`slack-bot/`](./slack-bot) for production patterns and best practices -- Review [`cron/`](./cron) for automation and event-driven workflows +- Review [`../../examples/cron/`](../../examples/cron) for automation and event-driven workflows +- Explore [`desktop-app/`](./desktop-app), [`vscode/`](./vscode), and [`menubar/`](./menubar) for app integration patterns **Controlling agent behavior?** -- Explore [`hooks/`](./hooks) to intercept and modify tool execution, log actions, or enforce policies +- Explore [`../../examples/hooks/`](../../examples/hooks) to intercept and modify tool execution, log actions, or enforce policies ## 📖 Documentation diff --git a/sdk/apps/examples/cron/README.md b/sdk/examples/cron/README.md similarity index 95% rename from sdk/apps/examples/cron/README.md rename to sdk/examples/cron/README.md index 930f9edefe..ed58694bdf 100644 --- a/sdk/apps/examples/cron/README.md +++ b/sdk/examples/cron/README.md @@ -46,7 +46,7 @@ A production-ready example that runs a code review automation on weekday morning **Usage:** ```bash mkdir -p ~/.cline/cron -cp apps/examples/cron/daily-code-review.cron.md ~/.cline/cron/ +cp examples/cron/daily-code-review.cron.md ~/.cline/cron/ # Edit the spec: set workspaceRoot, model, etc. # Spec is reconciled on startup; next run enqueued automatically ``` @@ -147,7 +147,7 @@ Runs a pull request review whenever a new PR opens on the `main` branch. **Usage:** ```bash mkdir -p ~/.cline/cron/events -cp apps/examples/cron/events/pr-review.event.md ~/.cline/cron/events/ +cp examples/cron/events/pr-review.event.md ~/.cline/cron/events/ # Configure your repository, branch, and workspace # Wire up GitHub App or webhook to ingest events ``` @@ -155,7 +155,7 @@ cp apps/examples/cron/events/pr-review.event.md ~/.cline/cron/events/ **Ingesting events:** Events are ingested via: - GitHub App or webhook receiver -- Plugin-emitted events (see `plugins/cline-plugin/automation-events.ts`) +- Plugin-emitted events (see `plugins/automation-events.ts`) - Connector adapters - `cline.automation.ingestEvent()` in the SDK @@ -172,7 +172,7 @@ Local test spec for verifying event-driven automation without external services. **Usage:** ```bash mkdir -p ~/.cline/cron/events -cp apps/examples/cron/events/local-manual-test.event.md ~/.cline/cron/events/ +cp examples/cron/events/local-manual-test.event.md ~/.cline/cron/events/ # Start the hub with automation enabled # In another shell, ingest a test event @@ -188,7 +188,7 @@ node -e " ### [`events/local-plugin-event.event.md`](./events/local-plugin-event.event.md) -Test spec for plugin-emitted events. Pairs with `plugins/cline-plugin/automation-events.ts`. +Test spec for plugin-emitted events. Pairs with `plugins/automation-events.ts`. ### Additional Event-Driven Examples @@ -220,11 +220,11 @@ Triggers when a PR is opened or updated. Runs test coverage against the PR branc **Usage:** ```bash mkdir -p ~/.cline/cron/events -cp apps/examples/cron/events/local-plugin-event.event.md ~/.cline/cron/events/ +cp examples/cron/events/local-plugin-event.event.md ~/.cline/cron/events/ # Load the plugin that emits these events mkdir -p ~/.cline/plugins -cp apps/examples/plugins/cline-plugin/automation-events.ts ~/.cline/plugins/ +cp examples/plugins/automation-events.ts ~/.cline/plugins/ # Run CLI with automation enabled; the plugin emits events clite --enable-automation -i "Test automation events" @@ -415,6 +415,6 @@ Summarize the changes, check for security risks, and recommend approval or chang ## 🔗 See Also -- [Automation Documentation](../../DOC.md#automation) — Full spec details -- [`plugins/cline-plugin/automation-events.ts`](../plugins/cline-plugin/automation-events.ts) — Plugin event emission +- [Architecture automation overview](../../ARCHITECTURE.md#automation) — Runtime architecture and flow details +- [`plugins/automation-events.ts`](../plugins/automation-events.ts) — Plugin event emission - [Cline SDK Examples](../) — Other integration examples diff --git a/sdk/apps/examples/cron/changelog-generator.cron.md b/sdk/examples/cron/changelog-generator.cron.md similarity index 100% rename from sdk/apps/examples/cron/changelog-generator.cron.md rename to sdk/examples/cron/changelog-generator.cron.md diff --git a/sdk/apps/examples/cron/code-style-audit.cron.md b/sdk/examples/cron/code-style-audit.cron.md similarity index 100% rename from sdk/apps/examples/cron/code-style-audit.cron.md rename to sdk/examples/cron/code-style-audit.cron.md diff --git a/sdk/apps/examples/cron/daily-code-review.cron.md b/sdk/examples/cron/daily-code-review.cron.md similarity index 100% rename from sdk/apps/examples/cron/daily-code-review.cron.md rename to sdk/examples/cron/daily-code-review.cron.md diff --git a/sdk/apps/examples/cron/dead-code-finder.cron.md b/sdk/examples/cron/dead-code-finder.cron.md similarity index 100% rename from sdk/apps/examples/cron/dead-code-finder.cron.md rename to sdk/examples/cron/dead-code-finder.cron.md diff --git a/sdk/apps/examples/cron/dependency-check.cron.md b/sdk/examples/cron/dependency-check.cron.md similarity index 100% rename from sdk/apps/examples/cron/dependency-check.cron.md rename to sdk/examples/cron/dependency-check.cron.md diff --git a/sdk/apps/examples/cron/documentation-check.cron.md b/sdk/examples/cron/documentation-check.cron.md similarity index 100% rename from sdk/apps/examples/cron/documentation-check.cron.md rename to sdk/examples/cron/documentation-check.cron.md diff --git a/sdk/apps/examples/cron/events/local-manual-test.event.md b/sdk/examples/cron/events/local-manual-test.event.md similarity index 100% rename from sdk/apps/examples/cron/events/local-manual-test.event.md rename to sdk/examples/cron/events/local-manual-test.event.md diff --git a/sdk/apps/examples/cron/events/local-plugin-event.event.md b/sdk/examples/cron/events/local-plugin-event.event.md similarity index 83% rename from sdk/apps/examples/cron/events/local-plugin-event.event.md rename to sdk/examples/cron/events/local-plugin-event.event.md index 6e45fe2136..ec10e41816 100644 --- a/sdk/apps/examples/cron/events/local-plugin-event.event.md +++ b/sdk/examples/cron/events/local-plugin-event.event.md @@ -14,7 +14,7 @@ tags: - plugin - automation metadata: - source: apps/examples/plugin-examples/cline-plugin/automation-events.ts + source: examples/plugins/automation-events.ts --- Summarize the local plugin event and report the event subject, topic, and message payload. diff --git a/sdk/apps/examples/cron/events/pr-changelog-check.event.md b/sdk/examples/cron/events/pr-changelog-check.event.md similarity index 100% rename from sdk/apps/examples/cron/events/pr-changelog-check.event.md rename to sdk/examples/cron/events/pr-changelog-check.event.md diff --git a/sdk/apps/examples/cron/events/pr-review.event.md b/sdk/examples/cron/events/pr-review.event.md similarity index 100% rename from sdk/apps/examples/cron/events/pr-review.event.md rename to sdk/examples/cron/events/pr-review.event.md diff --git a/sdk/apps/examples/cron/events/pr-test-coverage.event.md b/sdk/examples/cron/events/pr-test-coverage.event.md similarity index 100% rename from sdk/apps/examples/cron/events/pr-test-coverage.event.md rename to sdk/examples/cron/events/pr-test-coverage.event.md diff --git a/sdk/apps/examples/cron/performance-baseline.cron.md b/sdk/examples/cron/performance-baseline.cron.md similarity index 100% rename from sdk/apps/examples/cron/performance-baseline.cron.md rename to sdk/examples/cron/performance-baseline.cron.md diff --git a/sdk/apps/examples/cron/test-coverage-report.cron.md b/sdk/examples/cron/test-coverage-report.cron.md similarity index 100% rename from sdk/apps/examples/cron/test-coverage-report.cron.md rename to sdk/examples/cron/test-coverage-report.cron.md diff --git a/sdk/apps/examples/cron/type-check-strict.cron.md b/sdk/examples/cron/type-check-strict.cron.md similarity index 100% rename from sdk/apps/examples/cron/type-check-strict.cron.md rename to sdk/examples/cron/type-check-strict.cron.md diff --git a/sdk/apps/examples/cron/weekly-metrics-summary.cron.md b/sdk/examples/cron/weekly-metrics-summary.cron.md similarity index 100% rename from sdk/apps/examples/cron/weekly-metrics-summary.cron.md rename to sdk/examples/cron/weekly-metrics-summary.cron.md diff --git a/sdk/apps/examples/hooks/PostToolUse.py b/sdk/examples/hooks/PostToolUse.py similarity index 100% rename from sdk/apps/examples/hooks/PostToolUse.py rename to sdk/examples/hooks/PostToolUse.py diff --git a/sdk/apps/examples/hooks/PostToolUse.sh b/sdk/examples/hooks/PostToolUse.sh similarity index 100% rename from sdk/apps/examples/hooks/PostToolUse.sh rename to sdk/examples/hooks/PostToolUse.sh diff --git a/sdk/apps/examples/hooks/PostToolUse.ts b/sdk/examples/hooks/PostToolUse.ts similarity index 100% rename from sdk/apps/examples/hooks/PostToolUse.ts rename to sdk/examples/hooks/PostToolUse.ts diff --git a/sdk/apps/examples/hooks/PreToolUse.py b/sdk/examples/hooks/PreToolUse.py similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse.py rename to sdk/examples/hooks/PreToolUse.py diff --git a/sdk/apps/examples/hooks/PreToolUse.sh b/sdk/examples/hooks/PreToolUse.sh similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse.sh rename to sdk/examples/hooks/PreToolUse.sh diff --git a/sdk/apps/examples/hooks/PreToolUse.ts b/sdk/examples/hooks/PreToolUse.ts similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse.ts rename to sdk/examples/hooks/PreToolUse.ts diff --git a/sdk/apps/examples/hooks/PreToolUse_BlockDestructive.sh b/sdk/examples/hooks/PreToolUse_BlockDestructive.sh similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse_BlockDestructive.sh rename to sdk/examples/hooks/PreToolUse_BlockDestructive.sh diff --git a/sdk/apps/examples/hooks/PreToolUse_InjectContext.py b/sdk/examples/hooks/PreToolUse_InjectContext.py similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse_InjectContext.py rename to sdk/examples/hooks/PreToolUse_InjectContext.py diff --git a/sdk/apps/examples/hooks/PreToolUse_InjectFileContext.sh b/sdk/examples/hooks/PreToolUse_InjectFileContext.sh similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse_InjectFileContext.sh rename to sdk/examples/hooks/PreToolUse_InjectFileContext.sh diff --git a/sdk/apps/examples/hooks/PreToolUse_ModifyInput.ts b/sdk/examples/hooks/PreToolUse_ModifyInput.ts similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse_ModifyInput.ts rename to sdk/examples/hooks/PreToolUse_ModifyInput.ts diff --git a/sdk/apps/examples/hooks/PreToolUse_RequireReview.sh b/sdk/examples/hooks/PreToolUse_RequireReview.sh similarity index 100% rename from sdk/apps/examples/hooks/PreToolUse_RequireReview.sh rename to sdk/examples/hooks/PreToolUse_RequireReview.sh diff --git a/sdk/apps/examples/hooks/README.md b/sdk/examples/hooks/README.md similarity index 87% rename from sdk/apps/examples/hooks/README.md rename to sdk/examples/hooks/README.md index a1048de50f..328075fe27 100644 --- a/sdk/apps/examples/hooks/README.md +++ b/sdk/examples/hooks/README.md @@ -43,7 +43,7 @@ Log every tool call and its inputs. Useful for auditing what the agent is about ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse.sh .cline/hooks/ +cp examples/hooks/PreToolUse.sh .cline/hooks/ chmod +x .cline/hooks/PreToolUse.sh cline -i "do something" # See tool calls logged to stderr ``` @@ -54,7 +54,7 @@ Inspect tool results and add supplementary context. ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PostToolUse.sh .cline/hooks/ +cp examples/hooks/PostToolUse.sh .cline/hooks/ chmod +x .cline/hooks/PostToolUse.sh cline -i "do something" # See tool results logged and enriched ``` @@ -65,7 +65,7 @@ Prevent destructive operations like force pushes or bulk deletes. ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse_BlockDestructive.sh .cline/hooks/PreToolUse.sh +cp examples/hooks/PreToolUse_BlockDestructive.sh .cline/hooks/PreToolUse.sh chmod +x .cline/hooks/PreToolUse.sh cline -i "clean up the repo" # Destructive operations will be blocked ``` @@ -76,7 +76,7 @@ Require user review before certain operations (file writes to critical files). ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse_RequireReview.sh .cline/hooks/PreToolUse.sh +cp examples/hooks/PreToolUse_RequireReview.sh .cline/hooks/PreToolUse.sh chmod +x .cline/hooks/PreToolUse.sh cline -i "update dependencies" # Critical file writes will pause for review ``` @@ -87,7 +87,7 @@ Extract and inject file context before tool execution (related test files, lock ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse_InjectFileContext.sh .cline/hooks/PreToolUse.sh +cp examples/hooks/PreToolUse_InjectFileContext.sh .cline/hooks/PreToolUse.sh chmod +x .cline/hooks/PreToolUse.sh cline -i "review the configuration" # Related files will be mentioned automatically ``` @@ -98,9 +98,9 @@ Track agent session lifecycle events (start, end, shutdown). ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/TaskStart.sh .cline/hooks/ -cp apps/examples/hooks/TaskComplete.sh .cline/hooks/ -cp apps/examples/hooks/SessionShutdown.sh .cline/hooks/ +cp examples/hooks/TaskStart.sh .cline/hooks/ +cp examples/hooks/TaskComplete.sh .cline/hooks/ +cp examples/hooks/SessionShutdown.sh .cline/hooks/ chmod +x .cline/hooks/Task*.sh .cline/hooks/SessionShutdown.sh cline -i "do something" # Session lifecycle will be logged ``` @@ -113,7 +113,7 @@ Python-based hook to log and filter tool calls. ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse.py .cline/hooks/ +cp examples/hooks/PreToolUse.py .cline/hooks/ chmod +x .cline/hooks/PreToolUse.py cline -i "do something" # Python hook will log tool calls ``` @@ -124,7 +124,7 @@ Python-based post-tool-use hook for result enrichment. ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PostToolUse.py .cline/hooks/ +cp examples/hooks/PostToolUse.py .cline/hooks/ chmod +x .cline/hooks/PostToolUse.py cline -i "do something" # Python hook will enrich tool results ``` @@ -135,7 +135,7 @@ Python-based context injection with file analysis (test files, config files, loc ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse_InjectContext.py .cline/hooks/PreToolUse.py +cp examples/hooks/PreToolUse_InjectContext.py .cline/hooks/PreToolUse.py chmod +x .cline/hooks/PreToolUse.py cline -i "add a new feature" # Related files and environment will be injected ``` @@ -148,7 +148,7 @@ TypeScript hook for advanced tool call filtering and logging. ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse.ts .cline/hooks/ +cp examples/hooks/PreToolUse.ts .cline/hooks/ chmod +x .cline/hooks/PreToolUse.ts cline -i "do something" # TypeScript hook will execute via bun ``` @@ -159,7 +159,7 @@ TypeScript hook for post-execution actions. ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PostToolUse.ts .cline/hooks/ +cp examples/hooks/PostToolUse.ts .cline/hooks/ chmod +x .cline/hooks/PostToolUse.ts cline -i "do something" # TypeScript hook will execute via bun ``` @@ -170,7 +170,7 @@ Modify tool inputs before execution (normalize paths, add defaults, sanitize). ```bash mkdir -p .cline/hooks -cp apps/examples/hooks/PreToolUse_ModifyInput.ts .cline/hooks/PreToolUse.ts +cp examples/hooks/PreToolUse_ModifyInput.ts .cline/hooks/PreToolUse.ts chmod +x .cline/hooks/PreToolUse.ts cline -i "install dependencies" # npm install will have --save-exact added automatically ``` @@ -185,14 +185,14 @@ cline -i "install dependencies" # npm install will have --save-exact added auto mkdir -p .cline/hooks # Copy PreToolUse example (pick your language) -cp apps/examples/hooks/PreToolUse.sh .cline/hooks/PreToolUse.sh # Bash -cp apps/examples/hooks/PreToolUse.py .cline/hooks/PreToolUse.py # Python -cp apps/examples/hooks/PreToolUse.ts .cline/hooks/PreToolUse.ts # TypeScript +cp examples/hooks/PreToolUse.sh .cline/hooks/PreToolUse.sh # Bash +cp examples/hooks/PreToolUse.py .cline/hooks/PreToolUse.py # Python +cp examples/hooks/PreToolUse.ts .cline/hooks/PreToolUse.ts # TypeScript # Copy PostToolUse example -cp apps/examples/hooks/PostToolUse.sh .cline/hooks/PostToolUse.sh # Bash -cp apps/examples/hooks/PostToolUse.py .cline/hooks/PostToolUse.py # Python -cp apps/examples/hooks/PostToolUse.ts .cline/hooks/PostToolUse.ts # TypeScript +cp examples/hooks/PostToolUse.sh .cline/hooks/PostToolUse.sh # Bash +cp examples/hooks/PostToolUse.py .cline/hooks/PostToolUse.py # Python +cp examples/hooks/PostToolUse.ts .cline/hooks/PostToolUse.ts # TypeScript ``` ### 2. Make it executable @@ -410,7 +410,7 @@ File hooks observe lifecycle events. For more advanced use cases like message co ```bash mkdir -p .cline/plugins -cp apps/examples/hooks/custom-compaction-hook.example.ts .cline/plugins/custom-compaction-hook.ts +cp examples/hooks/custom-compaction-hook.example.ts .cline/plugins/custom-compaction-hook.ts cline -i "Search the codebase for dispatcher usage, then summarize it" ``` @@ -422,7 +422,7 @@ This example uses `hooks.beforeModel` to estimate request size and replace older | Example | Extension Point | Message Shape | Best For | | ------- | --------------- | ------------- | -------- | | `custom-compaction-hook.example.ts` (in `.cline/plugins/`) | `hooks.beforeModel` runtime hook | Agent runtime request messages with runtime parts such as `tool-call`, `tool-result`, `reasoning`, `image`, and `file` | Cases needing runtime-hook context, current runtime snapshot, or direct request mutation | -| `plugin-examples/cline-plugin/custom-compaction.example.ts` | `api.registerMessageBuilder()` | SDK/provider-bound `Message[]` after runtime messages are converted for model delivery | Most reusable plugin-owned message rewrites and compaction policies | +| `plugins/custom-compaction.ts` | `api.registerMessageBuilder()` | SDK/provider-bound `Message[]` after runtime messages are converted for model delivery | Most reusable plugin-owned message rewrites and compaction policies | **Prefer `registerMessageBuilder()`** for normal plugin-owned provider-message rewrites because it runs in the core message pipeline before the built-in provider-safety builder. **Use `beforeModel`** when the compaction logic needs runtime hook context or needs to inspect the exact runtime request object. diff --git a/sdk/apps/examples/hooks/SessionShutdown.sh b/sdk/examples/hooks/SessionShutdown.sh similarity index 100% rename from sdk/apps/examples/hooks/SessionShutdown.sh rename to sdk/examples/hooks/SessionShutdown.sh diff --git a/sdk/apps/examples/hooks/TaskComplete.sh b/sdk/examples/hooks/TaskComplete.sh similarity index 91% rename from sdk/apps/examples/hooks/TaskComplete.sh rename to sdk/examples/hooks/TaskComplete.sh index cbec08ff80..443590ff9d 100755 --- a/sdk/apps/examples/hooks/TaskComplete.sh +++ b/sdk/examples/hooks/TaskComplete.sh @@ -5,7 +5,7 @@ set -euo pipefail # # Install: # mkdir -p .cline/hooks -# cp apps/examples/hooks/agent_end.sh .cline/hooks/agent_end.sh +# cp examples/hooks/agent_end.sh .cline/hooks/agent_end.sh # chmod +x .cline/hooks/agent_end.sh payload="$(cat)" diff --git a/sdk/apps/examples/hooks/TaskStart.sh b/sdk/examples/hooks/TaskStart.sh similarity index 100% rename from sdk/apps/examples/hooks/TaskStart.sh rename to sdk/examples/hooks/TaskStart.sh diff --git a/sdk/apps/examples/hooks/custom-compaction-hook.example.ts b/sdk/examples/hooks/custom-compaction-hook.example.ts similarity index 98% rename from sdk/apps/examples/hooks/custom-compaction-hook.example.ts rename to sdk/examples/hooks/custom-compaction-hook.example.ts index 1892c5d7f2..cb07596d40 100644 --- a/sdk/apps/examples/hooks/custom-compaction-hook.example.ts +++ b/sdk/examples/hooks/custom-compaction-hook.example.ts @@ -8,7 +8,7 @@ * * Installation: * mkdir -p .cline/plugins - * cp apps/examples/hooks/custom-compaction-hook.example.ts .cline/plugins/custom-compaction-hook.ts + * cp examples/hooks/custom-compaction-hook.example.ts .cline/plugins/custom-compaction-hook.ts * * Usage: * cline -i "Search the codebase for dispatcher usage, then summarize it" diff --git a/sdk/apps/examples/package.json b/sdk/examples/package.json similarity index 75% rename from sdk/apps/examples/package.json rename to sdk/examples/package.json index 578b7c68e4..b4f3b9b098 100644 --- a/sdk/apps/examples/package.json +++ b/sdk/examples/package.json @@ -3,6 +3,10 @@ "description": "Example apps for the Cline SDK", "type": "module", "private": true, + "scripts": { + "typecheck": "tsc --noEmit", + "clean": "rm -rf node_modules dist" + }, "devDependencies": { "@types/bun": "^1.3.10" }, diff --git a/sdk/apps/examples/plugins/README.md b/sdk/examples/plugins/README.md similarity index 91% rename from sdk/apps/examples/plugins/README.md rename to sdk/examples/plugins/README.md index cd0373bf3b..54dd758248 100644 --- a/sdk/apps/examples/plugins/README.md +++ b/sdk/examples/plugins/README.md @@ -13,7 +13,7 @@ Example plugins: - [mac-notify.ts](./mac-notify.ts) - macOS Notification Center alert on successful run completion - [automation-events.ts](./automation-events.ts) - local plugin-emitted automation event example - [custom-compaction.ts](./custom-compaction.ts) - custom summary-based message compaction -- [../../hooks/custom-compaction-hook.ts](../../hooks/custom-compaction-hook.example.ts) - equivalent compaction using a runtime `beforeModel` hook +- [../hooks/custom-compaction-hook.example.ts](../hooks/custom-compaction-hook.example.ts) - equivalent compaction using a runtime `beforeModel` hook - [background-terminal.ts](./background-terminal.ts) - detached background shell jobs with persisted logs and optional session steering ## Use It With The CLI @@ -22,7 +22,7 @@ The CLI does not have a `--plugin` flag yet. It discovers plugin modules from `. ```bash mkdir -p .cline/plugins -cp apps/examples/plugins/weather-plugin.example.ts .cline/plugins/weather-metrics.ts +cp examples/plugins/weather-plugin.example.ts .cline/plugins/weather-metrics.ts cline -i "What's the weather like in Tokyo and Paris?" ``` @@ -33,7 +33,7 @@ To send a macOS Notification Center alert when a run completes successfully: ```bash mkdir -p .cline/plugins -cp apps/examples/plugins/mac-notify.ts .cline/plugins/mac-notify.ts +cp examples/plugins/mac-notify.ts .cline/plugins/mac-notify.ts cline -i "Run the test suite" ``` @@ -44,7 +44,7 @@ To add custom provider-message compaction before each model call: ```bash mkdir -p .cline/plugins -cp apps/examples/plugins/custom-compaction.ts .cline/plugins/custom-compaction.ts +cp examples/plugins/custom-compaction.ts .cline/plugins/custom-compaction.ts cline -i "Search the codebase for dispatcher usage, then summarize it" ``` @@ -53,7 +53,7 @@ To add background shell jobs that keep running after the tool call returns: ```bash mkdir -p .cline/plugins -cp apps/examples/plugins/background-terminal.ts .cline/plugins/background-terminal.ts +cp examples/plugins/background-terminal.ts .cline/plugins/background-terminal.ts cline -i "Start the dev server in the background, then continue with the next task" ``` @@ -74,7 +74,7 @@ commands without blocking the original tool call. ## Run The Demo Directly ```bash -ANTHROPIC_API_KEY=sk-... bun run apps/examples/plugins/weather-plugin.example.ts +ANTHROPIC_API_KEY=sk-... bun run examples/plugins/weather-plugin.example.ts ``` ## How it works @@ -247,13 +247,13 @@ plugin that estimates context size, preserves the first user message and recent working context, and replaces older middle history with one continuation summary. There is also a runtime-hook version at -[`../../hooks/custom-compaction-hook.example.ts`](../../hooks/custom-compaction-hook.example.ts). +[`../hooks/custom-compaction-hook.example.ts`](../hooks/custom-compaction-hook.example.ts). Both examples perform similar compaction, but they run at different layers: | Example | Extension point | Message shape | Best for | | ------- | --------------- | ------------- | -------- | | `custom-compaction.ts` | `api.registerMessageBuilder()` | SDK/provider-bound `Message[]` after runtime messages are converted for model delivery | most reusable plugin-owned message rewrites and compaction policies | -| `../../hooks/custom-compaction-hook.example.ts` | `hooks.beforeModel` runtime hook | Agent runtime request messages with runtime parts such as `tool-call`, `tool-result`, `reasoning`, `image`, and `file` | cases that need runtime-hook context, the current runtime snapshot, or direct request mutation | +| `../hooks/custom-compaction-hook.example.ts` | `hooks.beforeModel` runtime hook | Agent runtime request messages with runtime parts such as `tool-call`, `tool-result`, `reasoning`, `image`, and `file` | cases that need runtime-hook context, the current runtime snapshot, or direct request mutation | Prefer the message-builder version for normal plugin-owned compaction because it runs in the core message pipeline before the built-in provider-safety diff --git a/sdk/apps/examples/plugins/automation-events.ts b/sdk/examples/plugins/automation-events.ts similarity index 92% rename from sdk/apps/examples/plugins/automation-events.ts rename to sdk/examples/plugins/automation-events.ts index 8d87d6fbc6..2789df2487 100644 --- a/sdk/apps/examples/plugins/automation-events.ts +++ b/sdk/examples/plugins/automation-events.ts @@ -6,8 +6,8 @@ * * Local demo: * mkdir -p .cline/plugins .cline/cron/events - * cp apps/examples/plugins/automation-events.ts .cline/plugins/automation-events.ts - * cp apps/examples/cron/events/local-plugin-event.event.md .cline/cron/events/local-plugin-event.event.md + * cp examples/plugins/automation-events.ts .cline/plugins/automation-events.ts + * cp examples/cron/events/local-plugin-event.event.md .cline/cron/events/local-plugin-event.event.md * perl -0pi -e "s#/absolute/path/to/repo#$PWD#g" .cline/cron/events/local-plugin-event.event.md * CLINE_LOCAL_EVENT_INTERVAL_MS=2000 cline -i "wait for the plugin event" */ diff --git a/sdk/apps/examples/plugins/background-terminal.ts b/sdk/examples/plugins/background-terminal.ts similarity index 99% rename from sdk/apps/examples/plugins/background-terminal.ts rename to sdk/examples/plugins/background-terminal.ts index e6fb0859ab..9a2e42e3fc 100644 --- a/sdk/apps/examples/plugins/background-terminal.ts +++ b/sdk/examples/plugins/background-terminal.ts @@ -25,7 +25,7 @@ import { * * CLI usage: * mkdir -p .cline/plugins - * cp apps/examples/plugins/background-terminal.ts .cline/plugins/background-terminal.ts + * cp examples/plugins/background-terminal.ts .cline/plugins/background-terminal.ts * cline -i "Start the dev server in the background and keep working" */ diff --git a/sdk/apps/examples/plugins/custom-compaction.ts b/sdk/examples/plugins/custom-compaction.ts similarity index 98% rename from sdk/apps/examples/plugins/custom-compaction.ts rename to sdk/examples/plugins/custom-compaction.ts index bfe84937e6..a9b253e405 100644 --- a/sdk/apps/examples/plugins/custom-compaction.ts +++ b/sdk/examples/plugins/custom-compaction.ts @@ -12,7 +12,7 @@ * * CLI usage: * mkdir -p .cline/plugins - * cp apps/examples/plugins/custom-compaction.ts .cline/plugins/custom-compaction.ts + * cp examples/plugins/custom-compaction.ts .cline/plugins/custom-compaction.ts * cline -i "Search the codebase for dispatcher usage, then summarize it" */ diff --git a/sdk/apps/examples/plugins/mac-notify.ts b/sdk/examples/plugins/mac-notify.ts similarity index 95% rename from sdk/apps/examples/plugins/mac-notify.ts rename to sdk/examples/plugins/mac-notify.ts index ce21226877..b3874e2ec7 100644 --- a/sdk/apps/examples/plugins/mac-notify.ts +++ b/sdk/examples/plugins/mac-notify.ts @@ -5,7 +5,7 @@ * * CLI usage: * mkdir -p .cline/plugins - * cp apps/examples/plugins/mac-notify.ts .cline/plugins/mac-notify.ts + * cp examples/plugins/mac-notify.ts .cline/plugins/mac-notify.ts * cline -i "Run the test suite" */ diff --git a/sdk/apps/examples/plugins/subagent-plugin/README.md b/sdk/examples/plugins/subagent-plugin/README.md similarity index 99% rename from sdk/apps/examples/plugins/subagent-plugin/README.md rename to sdk/examples/plugins/subagent-plugin/README.md index fc2b4c06fa..5bf6eb3460 100644 --- a/sdk/apps/examples/plugins/subagent-plugin/README.md +++ b/sdk/examples/plugins/subagent-plugin/README.md @@ -18,7 +18,7 @@ await cline.start({ cwd: process.cwd(), enableTools: true, systemPrompt: "You are a coding assistant with access to subagents.", - pluginPaths: ["./apps/examples/plugins/subagent-plugin"], + pluginPaths: ["./examples/plugins/subagent-plugin"], }, prompt: "Use subagents to investigate and refactor this repo.", interactive: true, diff --git a/sdk/apps/examples/plugins/subagent-plugin/agents/anvil.md b/sdk/examples/plugins/subagent-plugin/agents/anvil.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/agents/anvil.md rename to sdk/examples/plugins/subagent-plugin/agents/anvil.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/agents/inquisitor.md b/sdk/examples/plugins/subagent-plugin/agents/inquisitor.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/agents/inquisitor.md rename to sdk/examples/plugins/subagent-plugin/agents/inquisitor.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/agents/oracle.md b/sdk/examples/plugins/subagent-plugin/agents/oracle.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/agents/oracle.md rename to sdk/examples/plugins/subagent-plugin/agents/oracle.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/agents/phantom.md b/sdk/examples/plugins/subagent-plugin/agents/phantom.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/agents/phantom.md rename to sdk/examples/plugins/subagent-plugin/agents/phantom.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/index.ts b/sdk/examples/plugins/subagent-plugin/index.ts similarity index 99% rename from sdk/apps/examples/plugins/subagent-plugin/index.ts rename to sdk/examples/plugins/subagent-plugin/index.ts index 369ae65b2a..e720acf3a9 100644 --- a/sdk/apps/examples/plugins/subagent-plugin/index.ts +++ b/sdk/examples/plugins/subagent-plugin/index.ts @@ -284,7 +284,11 @@ function sanitizeConversationId(conversationId: string): string { } function handoffsDir(ctx: AgentToolContext): string { - const safeId = sanitizeConversationId(ctx.conversationId); + const conversationId = ctx.conversationId ?? parentSessionId(ctx); + if (!conversationId) { + throw new Error("Missing conversation ID for handoff storage"); + } + const safeId = sanitizeConversationId(conversationId); const dir = join(HANDOFFS_DIR, safeId); mkdirSync(dir, { recursive: true }); return dir; diff --git a/sdk/apps/examples/plugins/subagent-plugin/package.json b/sdk/examples/plugins/subagent-plugin/package.json similarity index 86% rename from sdk/apps/examples/plugins/subagent-plugin/package.json rename to sdk/examples/plugins/subagent-plugin/package.json index ef3991a56e..9a53667071 100644 --- a/sdk/apps/examples/plugins/subagent-plugin/package.json +++ b/sdk/examples/plugins/subagent-plugin/package.json @@ -4,6 +4,10 @@ "private": true, "description": "SDK-native background subagents plugin for the Cline SDK", "type": "module", + "scripts": { + "typecheck": "tsc --noEmit", + "clean": "rm -rf node_modules dist" + }, "exports": { ".": "./index.ts" }, diff --git a/sdk/apps/examples/plugins/subagent-plugin/skills/api-design.md b/sdk/examples/plugins/subagent-plugin/skills/api-design.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/skills/api-design.md rename to sdk/examples/plugins/subagent-plugin/skills/api-design.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/skills/code-review.md b/sdk/examples/plugins/subagent-plugin/skills/code-review.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/skills/code-review.md rename to sdk/examples/plugins/subagent-plugin/skills/code-review.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/skills/debugging.md b/sdk/examples/plugins/subagent-plugin/skills/debugging.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/skills/debugging.md rename to sdk/examples/plugins/subagent-plugin/skills/debugging.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/skills/documentation.md b/sdk/examples/plugins/subagent-plugin/skills/documentation.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/skills/documentation.md rename to sdk/examples/plugins/subagent-plugin/skills/documentation.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/skills/migration.md b/sdk/examples/plugins/subagent-plugin/skills/migration.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/skills/migration.md rename to sdk/examples/plugins/subagent-plugin/skills/migration.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/skills/refactoring.md b/sdk/examples/plugins/subagent-plugin/skills/refactoring.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/skills/refactoring.md rename to sdk/examples/plugins/subagent-plugin/skills/refactoring.md diff --git a/sdk/apps/examples/plugins/subagent-plugin/skills/test-generation.md b/sdk/examples/plugins/subagent-plugin/skills/test-generation.md similarity index 100% rename from sdk/apps/examples/plugins/subagent-plugin/skills/test-generation.md rename to sdk/examples/plugins/subagent-plugin/skills/test-generation.md diff --git a/sdk/examples/plugins/subagent-plugin/tsconfig.json b/sdk/examples/plugins/subagent-plugin/tsconfig.json new file mode 100644 index 0000000000..c313580d4d --- /dev/null +++ b/sdk/examples/plugins/subagent-plugin/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["index.ts"] +} diff --git a/sdk/apps/examples/plugins/typescript-lsp-plugin/README.md b/sdk/examples/plugins/typescript-lsp-plugin/README.md similarity index 95% rename from sdk/apps/examples/plugins/typescript-lsp-plugin/README.md rename to sdk/examples/plugins/typescript-lsp-plugin/README.md index 7a34f50a64..4ed061bf56 100644 --- a/sdk/apps/examples/plugins/typescript-lsp-plugin/README.md +++ b/sdk/examples/plugins/typescript-lsp-plugin/README.md @@ -28,7 +28,7 @@ The same pattern applies for enterprise use cases: you can build plugins that wr ## Use it with the CLI ```bash -cp apps/examples/plugins/typescript-lsp-plugin/index.ts ~/.cline/plugins/typescript-lsp.ts +cp examples/plugins/typescript-lsp-plugin/index.ts ~/.cline/plugins/typescript-lsp.ts cline -i "Find where createTool is defined" ``` @@ -37,7 +37,7 @@ The plugin resolves `typescript` from the target project's own `node_modules` at ## Run the demo directly ```bash -ANTHROPIC_API_KEY=sk-... bun run apps/examples/plugins/typescript-lsp-plugin/index.ts +ANTHROPIC_API_KEY=sk-... bun run examples/plugins/typescript-lsp-plugin/index.ts ``` ## How it works diff --git a/sdk/apps/examples/plugins/typescript-lsp-plugin/index.ts b/sdk/examples/plugins/typescript-lsp-plugin/index.ts similarity index 97% rename from sdk/apps/examples/plugins/typescript-lsp-plugin/index.ts rename to sdk/examples/plugins/typescript-lsp-plugin/index.ts index 7ea343b7f0..9dfe5b9646 100644 --- a/sdk/apps/examples/plugins/typescript-lsp-plugin/index.ts +++ b/sdk/examples/plugins/typescript-lsp-plugin/index.ts @@ -9,11 +9,11 @@ * at runtime, so it has zero dependencies beyond Node builtins. * * CLI usage: - * cp apps/examples/plugin-examples/typescript-lsp-plugin/index.ts ~/.cline/plugins/typescript-lsp.ts + * cp examples/plugins/typescript-lsp-plugin/index.ts ~/.cline/plugins/typescript-lsp.ts * cline -i "Find where createTool is defined" * * Direct demo usage: - * ANTHROPIC_API_KEY=sk-... bun run apps/examples/plugin-examples/typescript-lsp-plugin/index.ts + * ANTHROPIC_API_KEY=sk-... bun run examples/plugins/typescript-lsp-plugin/index.ts */ import { existsSync } from "node:fs"; diff --git a/sdk/apps/examples/plugins/weather-plugin.example.ts b/sdk/examples/plugins/weather-plugin.example.ts similarity index 96% rename from sdk/apps/examples/plugins/weather-plugin.example.ts rename to sdk/examples/plugins/weather-plugin.example.ts index 666b1d3bf5..6b4dac8741 100644 --- a/sdk/apps/examples/plugins/weather-plugin.example.ts +++ b/sdk/examples/plugins/weather-plugin.example.ts @@ -10,11 +10,11 @@ * * CLI usage: * mkdir -p .cline/plugins - * cp apps/examples/plugin-examples/cline-plugin/weather-plugin.example.ts .cline/plugins/weather-metrics.ts + * cp examples/plugins/weather-plugin.example.ts .cline/plugins/weather-metrics.ts * cline -i "What's the weather like in Tokyo and Paris?" * * Direct demo usage: - * ANTHROPIC_API_KEY=sk-... bun run apps/examples/plugin-examples/cline-plugin/weather-plugin.example.ts + * ANTHROPIC_API_KEY=sk-... bun run examples/plugins/weather-plugin.example.ts */ import { type AgentPlugin, ClineCore, createTool } from "@cline/core"; diff --git a/sdk/apps/examples/tsconfig.json b/sdk/examples/tsconfig.json similarity index 89% rename from sdk/apps/examples/tsconfig.json rename to sdk/examples/tsconfig.json index a926530592..ffb642462f 100644 --- a/sdk/apps/examples/tsconfig.json +++ b/sdk/examples/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.apps.json", + "extends": "../apps/tsconfig.apps.json", "compilerOptions": { // Environment setup & latest features "lib": ["ESNext"], @@ -20,7 +20,7 @@ "strict": true, "skipLibCheck": true, "noFallthroughCasesInSwitch": true, - "noUncheckedIndexedAccess": true, + "noUncheckedIndexedAccess": false, "noImplicitOverride": true, // Some stricter flags (disabled by default) diff --git a/sdk/package.json b/sdk/package.json index dfd991662d..adbadd5a34 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -5,8 +5,9 @@ "packages/*", "apps/*", "apps/examples/*", - "apps/examples/plugin-examples/*", - "apps/vscode/src/webview" + "apps/examples/vscode/src/webview", + "examples", + "examples/plugins/*" ], "scripts": { "prepare": "husky", diff --git a/sdk/packages/agents/README.md b/sdk/packages/agents/README.md index 06756902d0..54e3b1333b 100644 --- a/sdk/packages/agents/README.md +++ b/sdk/packages/agents/README.md @@ -269,8 +269,9 @@ mailboxes, task management, and outcome convergence. ## More Examples - Repo examples: - [apps/examples/cline-sdk](https://github.com/cline/sdk/tree/main/apps/examples/cline-sdk), - [apps/examples/slack-bot](https://github.com/cline/sdk/tree/main/apps/examples/slack-bot) + [examples/plugins](https://github.com/cline/sdk/tree/main/examples/plugins), + [examples/hooks](https://github.com/cline/sdk/tree/main/examples/hooks), + [examples/cron](https://github.com/cline/sdk/tree/main/examples/cron) - Workspace overview: [README.md](https://github.com/cline/sdk/blob/main/README.md) - API and architecture references: [DOC.md](https://github.com/cline/sdk/blob/main/DOC.md), diff --git a/sdk/packages/core/README.md b/sdk/packages/core/README.md index fbd20d1b9b..5fe503a131 100644 --- a/sdk/packages/core/README.md +++ b/sdk/packages/core/README.md @@ -103,6 +103,6 @@ The package also exports storage and settings helpers such as: ## More Examples -- Repo examples: [apps/examples/cline-sdk](https://github.com/cline/cline/tree/main/apps/examples/cline-sdk) +- Repo examples: [examples](https://github.com/cline/sdk/tree/main/examples), [apps/examples](https://github.com/cline/sdk/tree/main/apps/examples) - Workspace overview: [README.md](https://github.com/cline/cline/blob/main/README.md) - API and architecture references: [DOC.md](https://github.com/cline/cline/blob/main/DOC.md), [ARCHITECTURE.md](https://github.com/cline/cline/blob/main/ARCHITECTURE.md)