From 20cca8f526a23f1864703660ac1aa0611d84919d Mon Sep 17 00:00:00 2001 From: Dominic Cooney Date: Mon, 13 Apr 2026 20:42:09 +0900 Subject: [PATCH] Step 1: Foundation & Cutover - SDK adapter layer - Add @clinebot/core, @clinebot/llms, @clinebot/shared, @clinebot/agents as dependencies via file: protocol (linked to ../sdk-wip) - Create src/sdk/ directory with SdkController stub and barrel export - Replace src/core/controller/index.ts with re-export from SDK adapter (classic Controller accessible via origin/main) - Extract getStateToPostToWebview() to standalone function for reuse - Add vitest.config.sdk.ts for SDK adapter tests - Fix implicit any types in handler modules - Extension compiles and builds successfully (tsc + esbuild pass) - Single entry point: no CLINE_SDK flag, SDK adapter is the only codepath Replaces classic src/core/controller/index.ts (see origin/main) --- package-lock.json | 119 ++ package.json | 4 + sdk-migration/PROBLEMS.md | 25 +- .../account/getOrganizationCredits.ts | 2 +- .../account/getUserOrganizations.ts | 2 +- .../controller/file/openFocusChainFile.ts | 2 +- src/core/controller/index.ts | 1053 +---------------- .../state/getStateToPostToWebview.ts | 197 +++ src/sdk/SdkController.ts | 240 ++++ src/sdk/index.ts | 8 + vitest.config.sdk.ts | 20 + 11 files changed, 621 insertions(+), 1051 deletions(-) create mode 100644 src/core/controller/state/getStateToPostToWebview.ts create mode 100644 src/sdk/SdkController.ts create mode 100644 src/sdk/index.ts create mode 100644 vitest.config.sdk.ts diff --git a/package-lock.json b/package-lock.json index 18b7ef7ff4..598375f34f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,10 @@ "@azure/identity": "^4.13.0", "@bufbuild/protobuf": "^2.2.5", "@cerebras/cerebras_cloud_sdk": "^1.35.0", + "@clinebot/agents": "file:../sdk-wip/packages/agents", + "@clinebot/core": "file:../sdk-wip/packages/core", + "@clinebot/llms": "file:../sdk-wip/packages/llms", + "@clinebot/shared": "file:../sdk-wip/packages/shared", "@google-cloud/vertexai": "^1.9.3", "@google/genai": "^1.30.0", "@grpc/grpc-js": "^1.9.15", @@ -160,6 +164,105 @@ "vscode": "^1.84.0" } }, + "../sdk-wip/packages/agents": { + "name": "@clinebot/agents", + "version": "0.0.28", + "license": "Apache-2.0", + "dependencies": { + "@clinebot/llms": "workspace:*", + "zod": "^4.3.6" + }, + "devDependencies": { + "@clinebot/shared": "workspace:*" + }, + "engines": { + "node": ">=20" + } + }, + "../sdk-wip/packages/core": { + "name": "@clinebot/core", + "version": "0.0.28", + "dependencies": { + "@clinebot/agents": "workspace:*", + "@clinebot/llms": "workspace:*", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.214.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.214.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.214.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.214.0", + "@opentelemetry/resources": "^2.6.1", + "@opentelemetry/sdk-logs": "^0.214.0", + "@opentelemetry/sdk-metrics": "^2.6.1", + "@opentelemetry/sdk-trace-base": "^2.6.1", + "@opentelemetry/sdk-trace-node": "^2.6.1", + "@opentelemetry/semantic-conventions": "^1.40.0", + "jiti": "^1.21.7", + "nanoid": "^5.1.7", + "node-machine-id": "^1.1.12", + "simple-git": "^3.32.3", + "yaml": "^2.8.2", + "zod": "^4.3.6" + }, + "devDependencies": { + "@clinebot/rpc": "workspace:*", + "@clinebot/shared": "workspace:*" + }, + "engines": { + "node": ">=20" + } + }, + "../sdk-wip/packages/llms": { + "name": "@clinebot/llms", + "version": "0.0.28", + "dependencies": { + "@ai-sdk/amazon-bedrock": "^4.0.89", + "@ai-sdk/anthropic": "^3.0.68", + "@ai-sdk/google": "^3.0.60", + "@ai-sdk/google-vertex": "^4.0.100", + "@ai-sdk/mistral": "^3.0.28", + "@ai-sdk/openai": "^3.0.52", + "@ai-sdk/openai-compatible": "^2.0.38", + "@aws-sdk/credential-providers": "^3.922.0", + "@clinebot/shared": "workspace:*", + "@langfuse/otel": "^4.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/sdk-trace-node": "^2.6.1", + "@streamparser/json": "^0.0.21", + "ai": "^6.0.144", + "ai-sdk-provider-claude-code": "^3.4.3", + "ai-sdk-provider-codex-cli": "^1.1.0", + "ai-sdk-provider-opencode-sdk": "^3.0.1", + "dify-ai-provider": "^1.1.0", + "nanoid": "^5.1.7", + "zod": "^4.3.6" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@aws-sdk/client-bedrock-runtime": "^3.0.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-bedrock-runtime": { + "optional": true + } + } + }, + "../sdk-wip/packages/shared": { + "name": "@clinebot/shared", + "version": "0.0.28", + "dependencies": { + "jsonrepair": "^3.13.2", + "zod": "^4.3.6", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "better-sqlite3": "^12.8.0" + } + }, "cli": { "name": "cline", "version": "2.15.0", @@ -2184,6 +2287,22 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "license": "MIT" }, + "node_modules/@clinebot/agents": { + "resolved": "../sdk-wip/packages/agents", + "link": true + }, + "node_modules/@clinebot/core": { + "resolved": "../sdk-wip/packages/core", + "link": true + }, + "node_modules/@clinebot/llms": { + "resolved": "../sdk-wip/packages/llms", + "link": true + }, + "node_modules/@clinebot/shared": { + "resolved": "../sdk-wip/packages/shared", + "link": true + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", diff --git a/package.json b/package.json index ab083a4d51..35ecd96888 100644 --- a/package.json +++ b/package.json @@ -506,6 +506,10 @@ "typescript": "^5.4.5" }, "dependencies": { + "@clinebot/core": "file:../sdk-wip/packages/core", + "@clinebot/llms": "file:../sdk-wip/packages/llms", + "@clinebot/shared": "file:../sdk-wip/packages/shared", + "@clinebot/agents": "file:../sdk-wip/packages/agents", "@anthropic-ai/sdk": "^0.37.0", "@anthropic-ai/vertex-sdk": "^0.6.4", "@aws-sdk/client-bedrock-runtime": "^3.922.0", diff --git a/sdk-migration/PROBLEMS.md b/sdk-migration/PROBLEMS.md index 99380828a9..b09c39d470 100644 --- a/sdk-migration/PROBLEMS.md +++ b/sdk-migration/PROBLEMS.md @@ -65,7 +65,30 @@ underlying patterns that caused them are relevant. ## New Issues -*Add issues found during this attempt below this line.* +### Step 1: Foundation & Cutover — Completed + +- **Status**: 🟢 Verified Fixed +- **Description**: SDK adapter layer created as single entry point. Extension compiles and builds. +- **Verification**: `npx tsc --noEmit` returns 0 errors. `node esbuild.mjs` produces `dist/extension.js`. +- **Evidence**: Commit `3dec59fe9` on `sdk-migration-v3` branch. + +### S1-1: SdkController stubs log warnings at runtime +- **Status**: 🟡 Minor +- **Description**: All unimplemented Controller methods log `[SdkController] STUB: not yet implemented`. This is expected — functionality is added in Steps 4-8. +- **Root cause**: By design — stub pattern for incremental migration. +- **Fix**: Implement each method in its corresponding step. + +### S1-2: Services not initialized (mcpHub, authService, etc.) +- **Status**: 🟡 Minor +- **Description**: The SdkController sets `mcpHub`, `accountService`, `authService`, `ocaAuthService` to `undefined`. Handler modules that access these will throw "not available" errors at runtime. +- **Root cause**: Services will be properly initialized in Steps 6-7. +- **Fix**: Wire up services as part of their respective migration steps. + +### S1-3: Extension loads but sidebar shows errors +- **Status**: 🟢 Verified Fixed +- **Description**: Extension loads, sidebar renders correctly with full UI (chat input, model selector, announcements, auto-approve settings). No error elements in the webview. +- **Verification**: Debug harness launched with `--auto-launch`, sidebar opened, `document.querySelectorAll("[data-testid=error], .error, .codicon-error").length` returns 0. Sending a message via `ui.send_message` returns `{"sent": true, "method": "newTask"}` without crash. Task doesn't start (expected — `initTask` is a stub). +- **Evidence**: Debug harness session on 2026-04-13, commit `3dec59fe9`.