kanban 0.1.40 → 0.1.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cline-sdk/cline-mcp-runtime-service.d.ts.map +1 -1
- package/dist/cline-sdk/cline-mcp-runtime-service.js +35 -10
- package/dist/cline-sdk/cline-mcp-runtime-service.js.map +1 -1
- package/dist/cline-sdk/cline-session-runtime.d.ts +20 -2
- package/dist/cline-sdk/cline-session-runtime.d.ts.map +1 -1
- package/dist/cline-sdk/cline-session-runtime.js +68 -10
- package/dist/cline-sdk/cline-session-runtime.js.map +1 -1
- package/dist/cline-sdk/cline-session-state.d.ts +1 -0
- package/dist/cline-sdk/cline-session-state.d.ts.map +1 -1
- package/dist/cline-sdk/cline-session-state.js +12 -3
- package/dist/cline-sdk/cline-session-state.js.map +1 -1
- package/dist/cline-sdk/cline-task-session-service.d.ts +1 -0
- package/dist/cline-sdk/cline-task-session-service.d.ts.map +1 -1
- package/dist/cline-sdk/cline-task-session-service.js +76 -23
- package/dist/cline-sdk/cline-task-session-service.js.map +1 -1
- package/dist/cline-sdk/sdk-provider-boundary.d.ts.map +1 -1
- package/dist/cline-sdk/sdk-provider-boundary.js +5 -8
- package/dist/cline-sdk/sdk-provider-boundary.js.map +1 -1
- package/dist/core/api-contract.d.ts +72 -0
- package/dist/core/api-contract.d.ts.map +1 -1
- package/dist/core/api-contract.js +3 -2
- package/dist/core/api-contract.js.map +1 -1
- package/dist/server/browser.d.ts +1 -4
- package/dist/server/browser.d.ts.map +1 -1
- package/dist/server/browser.js +13 -53
- package/dist/server/browser.js.map +1 -1
- package/dist/trpc/app-router.d.ts +10 -0
- package/dist/trpc/app-router.d.ts.map +1 -1
- package/dist/trpc/runtime-api.js +3 -3
- package/dist/trpc/runtime-api.js.map +1 -1
- package/dist/web-ui/assets/{index-WG8Dagzd.css → index-CuBw4lTr.css} +30 -0
- package/dist/web-ui/assets/{index-BX9vGYEO.js → index-OpsLqYwc.js} +6104 -6101
- package/dist/web-ui/assets/{index-BX9vGYEO.js.map → index-OpsLqYwc.js.map} +1 -1
- package/dist/web-ui/index.html +2 -2
- package/dist/workspace/git-utils.d.ts.map +1 -1
- package/dist/workspace/git-utils.js +17 -4
- package/dist/workspace/git-utils.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cline-mcp-runtime-service.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-mcp-runtime-service.ts"],"names":[],"mappings":"AAoBA,OAAO,EAMN,KAAK,UAAU,EACf,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"cline-mcp-runtime-service.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-mcp-runtime-service.ts"],"names":[],"mappings":"AAoBA,OAAO,EAMN,KAAK,UAAU,EACf,MAAM,4BAA4B,CAAC;AAsDpC,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACtC,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChD,eAAe,IAAI,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACvD,eAAe,CAAC,KAAK,EAAE;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;KAC3C,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,6BAA6B;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mCAAmC;IACnD,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,wBAAwB,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAscD,wBAAsB,2BAA2B,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,6BAA6B,GAAG,IAAI,CAAC,CAkEhH;AAED,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC,CA+CD;AAED,wBAAgB,4BAA4B,CAC3C,OAAO,GAAE,mCAAwC,GAC/C,sBAAsB,CA0LxB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0bee55d2-c64b-532c-8380-d425ee1f779a")}catch(e){}}();
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
import { existsSync, readFileSync } from "node:fs";
|
|
5
5
|
import { dirname, join, resolve } from "node:path";
|
|
@@ -14,6 +14,7 @@ import { lockedFileSystem } from "../fs/locked-file-system.js";
|
|
|
14
14
|
import { createClineMcpSettingsService, resolveMcpSettingsPath } from "./cline-mcp-settings-service.js";
|
|
15
15
|
import { createSdkInMemoryMcpManager, createSdkMcpTools, } from "./sdk-provider-boundary.js";
|
|
16
16
|
const DEFAULT_AUTH_TIMEOUT_MS = 3 * 60 * 1000;
|
|
17
|
+
const COMPLETED_CALLBACK_RETENTION_MS = 5 * 60 * 1000;
|
|
17
18
|
const OAUTH_CALLBACK_PATH = "/kanban-mcp/mcp-oauth-callback";
|
|
18
19
|
const OAUTH_CALLBACK_REQUEST_ID_PARAM = "requestId";
|
|
19
20
|
const CALLBACK_RESPONSE_HTML = {
|
|
@@ -24,6 +25,7 @@ const CALLBACK_RESPONSE_HTML = {
|
|
|
24
25
|
missingRequestId: "<html><body><h1>Invalid authorization callback</h1><p>Return to Cline and run Connect OAuth again.</p></body></html>",
|
|
25
26
|
};
|
|
26
27
|
const pendingOauthCallbacksByRequestId = new Map();
|
|
28
|
+
const completedOauthCallbacksByRequestId = new Map();
|
|
27
29
|
const oauthServerStateSchema = z.object({
|
|
28
30
|
clientInformation: z.record(z.string(), z.unknown()).optional(),
|
|
29
31
|
tokens: z.record(z.string(), z.unknown()).optional(),
|
|
@@ -415,6 +417,19 @@ function buildMcpOauthCallbackUrl(requestId) {
|
|
|
415
417
|
callbackUrl.searchParams.set(OAUTH_CALLBACK_REQUEST_ID_PARAM, requestId);
|
|
416
418
|
return callbackUrl.toString();
|
|
417
419
|
}
|
|
420
|
+
function rememberCompletedOauthCallback(requestId, response) {
|
|
421
|
+
const existing = completedOauthCallbacksByRequestId.get(requestId);
|
|
422
|
+
if (existing) {
|
|
423
|
+
clearTimeout(existing.timeoutHandle);
|
|
424
|
+
}
|
|
425
|
+
const timeoutHandle = setTimeout(() => {
|
|
426
|
+
completedOauthCallbacksByRequestId.delete(requestId);
|
|
427
|
+
}, COMPLETED_CALLBACK_RETENTION_MS);
|
|
428
|
+
completedOauthCallbacksByRequestId.set(requestId, {
|
|
429
|
+
response,
|
|
430
|
+
timeoutHandle,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
418
433
|
export async function handleClineMcpOauthCallback(requestUrl) {
|
|
419
434
|
if (requestUrl.pathname !== OAUTH_CALLBACK_PATH) {
|
|
420
435
|
return null;
|
|
@@ -426,6 +441,10 @@ export async function handleClineMcpOauthCallback(requestUrl) {
|
|
|
426
441
|
body: CALLBACK_RESPONSE_HTML.missingRequestId,
|
|
427
442
|
};
|
|
428
443
|
}
|
|
444
|
+
const completed = completedOauthCallbacksByRequestId.get(requestId);
|
|
445
|
+
if (completed) {
|
|
446
|
+
return completed.response;
|
|
447
|
+
}
|
|
429
448
|
const pending = pendingOauthCallbacksByRequestId.get(requestId);
|
|
430
449
|
if (!pending) {
|
|
431
450
|
return {
|
|
@@ -439,26 +458,32 @@ export async function handleClineMcpOauthCallback(requestUrl) {
|
|
|
439
458
|
const errorDescription = requestUrl.searchParams.get("error_description")?.trim();
|
|
440
459
|
const code = requestUrl.searchParams.get("code")?.trim();
|
|
441
460
|
if (errorValue) {
|
|
442
|
-
|
|
443
|
-
? `OAuth authorization failed: ${errorValue} (${errorDescription})`
|
|
444
|
-
: `OAuth authorization failed: ${errorValue}`));
|
|
445
|
-
return {
|
|
461
|
+
const response = {
|
|
446
462
|
statusCode: 400,
|
|
447
463
|
body: CALLBACK_RESPONSE_HTML.failure,
|
|
448
464
|
};
|
|
465
|
+
rememberCompletedOauthCallback(requestId, response);
|
|
466
|
+
pending.rejectCode(new Error(errorDescription
|
|
467
|
+
? `OAuth authorization failed: ${errorValue} (${errorDescription})`
|
|
468
|
+
: `OAuth authorization failed: ${errorValue}`));
|
|
469
|
+
return response;
|
|
449
470
|
}
|
|
450
471
|
if (!code) {
|
|
451
|
-
|
|
452
|
-
return {
|
|
472
|
+
const response = {
|
|
453
473
|
statusCode: 400,
|
|
454
474
|
body: CALLBACK_RESPONSE_HTML.missingCode,
|
|
455
475
|
};
|
|
476
|
+
rememberCompletedOauthCallback(requestId, response);
|
|
477
|
+
pending.rejectCode(new Error("OAuth callback did not include an authorization code."));
|
|
478
|
+
return response;
|
|
456
479
|
}
|
|
457
|
-
|
|
458
|
-
return {
|
|
480
|
+
const response = {
|
|
459
481
|
statusCode: 200,
|
|
460
482
|
body: CALLBACK_RESPONSE_HTML.success,
|
|
461
483
|
};
|
|
484
|
+
rememberCompletedOauthCallback(requestId, response);
|
|
485
|
+
pending.resolveCode(code);
|
|
486
|
+
return response;
|
|
462
487
|
}
|
|
463
488
|
export async function startOauthCallbackListener(timeoutMs) {
|
|
464
489
|
let resolveCode = null;
|
|
@@ -675,4 +700,4 @@ export function createClineMcpRuntimeService(options = {}) {
|
|
|
675
700
|
};
|
|
676
701
|
}
|
|
677
702
|
//# sourceMappingURL=cline-mcp-runtime-service.js.map
|
|
678
|
-
//# debugId=
|
|
703
|
+
//# debugId=0bee55d2-c64b-532c-8380-d425ee1f779a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cline-mcp-runtime-service.js","sources":["../../src/cline-sdk/cline-mcp-runtime-service.ts"],"sourceRoot":"","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { OAuthClientProvider, OAuthDiscoveryState } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type {\n\tOAuthClientInformationMixed,\n\tOAuthClientMetadata,\n\tOAuthTokens,\n} from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport { z } from \"zod\";\n\nimport type { RuntimeClineMcpServer } from \"../core/api-contract.js\";\nimport { buildKanbanRuntimeUrl } from \"../core/runtime-endpoint.js\";\nimport { lockedFileSystem } from \"../fs/locked-file-system.js\";\nimport { createClineMcpSettingsService, resolveMcpSettingsPath } from \"./cline-mcp-settings-service.js\";\nimport {\n\tcreateSdkInMemoryMcpManager,\n\tcreateSdkMcpTools,\n\ttype SdkMcpManager,\n\ttype SdkMcpServerClient,\n\ttype SdkMcpServerRegistration,\n\ttype SdkMcpTool,\n} from \"./sdk-provider-boundary.js\";\n\nconst DEFAULT_AUTH_TIMEOUT_MS = 3 * 60 * 1000;\nconst OAUTH_CALLBACK_PATH = \"/kanban-mcp/mcp-oauth-callback\";\nconst OAUTH_CALLBACK_REQUEST_ID_PARAM = \"requestId\";\n\nconst CALLBACK_RESPONSE_HTML = {\n\tsuccess:\n\t\t\"<html><body><h1>Authorization complete</h1><p>You can close this tab and return to Cline.</p></body></html>\",\n\tfailure: \"<html><body><h1>OAuth failed</h1><p>You can close this tab.</p></body></html>\",\n\tmissingCode: \"<html><body><h1>Missing authorization code</h1><p>You can close this tab.</p></body></html>\",\n\texpired:\n\t\t\"<html><body><h1>Authorization session expired</h1><p>Return to Cline and run Connect OAuth again.</p></body></html>\",\n\tmissingRequestId:\n\t\t\"<html><body><h1>Invalid authorization callback</h1><p>Return to Cline and run Connect OAuth again.</p></body></html>\",\n} as const;\n\nconst pendingOauthCallbacksByRequestId = new Map<\n\tstring,\n\t{\n\t\tresolveCode: (code: string) => void;\n\t\trejectCode: (error: Error) => void;\n\t\ttimeoutHandle: NodeJS.Timeout;\n\t}\n>();\n\nconst oauthServerStateSchema = z.object({\n\tclientInformation: z.record(z.string(), z.unknown()).optional(),\n\ttokens: z.record(z.string(), z.unknown()).optional(),\n\tcodeVerifier: z.string().optional(),\n\tdiscoveryState: z.record(z.string(), z.unknown()).optional(),\n\tredirectUrl: z.string().url().optional(),\n\tlastError: z.string().optional(),\n\tlastAuthenticatedAt: z.number().int().positive().optional(),\n});\n\nconst oauthSettingsSchema = z.object({\n\tservers: z.record(z.string(), oauthServerStateSchema).default({}),\n});\n\ntype ClineMcpOauthServerState = z.infer<typeof oauthServerStateSchema>;\ntype ClineMcpOauthSettings = z.infer<typeof oauthSettingsSchema>;\n\ntype AuthCapableTransport = SSEClientTransport | StreamableHTTPClientTransport;\ntype SdkTransport = StdioClientTransport | AuthCapableTransport;\n\nexport interface ClineMcpServerAuthStatus {\n\tserverName: string;\n\toauthSupported: boolean;\n\toauthConfigured: boolean;\n\tlastError: string | null;\n\tlastAuthenticatedAt: number | null;\n}\n\nexport interface ClineMcpServerAuthResult {\n\tserverName: string;\n\tauthorized: true;\n\tmessage: string;\n}\n\nexport interface ClineMcpToolBundle {\n\ttools: SdkMcpTool[];\n\twarnings: string[];\n\tdispose: () => Promise<void>;\n}\n\nexport interface ClineMcpRuntimeService {\n\tcreateToolBundle(): Promise<ClineMcpToolBundle>;\n\tgetAuthStatuses(): Promise<ClineMcpServerAuthStatus[]>;\n\tauthorizeServer(input: {\n\t\tserverName: string;\n\t\ttimeoutMs?: number;\n\t\tonAuthorizationUrl?: (url: string) => void;\n\t}): Promise<ClineMcpServerAuthResult>;\n}\n\nexport interface ClineMcpOauthCallbackResponse {\n\tstatusCode: number;\n\tbody: string;\n}\n\nexport interface CreateClineMcpRuntimeServiceOptions {\n\tonAuthStatusesChanged?: (statuses: ClineMcpServerAuthStatus[]) => void | Promise<void>;\n}\n\nfunction toErrorMessage(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tconst message = error.message.trim();\n\t\tif (message.length > 0) {\n\t\t\treturn message;\n\t\t}\n\t}\n\treturn String(error);\n}\n\nfunction resolveMcpOauthSettingsPath(): string {\n\tconst configuredPath = process.env.CLINE_MCP_OAUTH_SETTINGS_PATH?.trim();\n\tif (configuredPath) {\n\t\treturn resolve(configuredPath);\n\t}\n\treturn join(dirname(resolveMcpSettingsPath()), \"cline_mcp_oauth_settings.json\");\n}\n\nfunction normalizeOauthServerState(value: ClineMcpOauthServerState): ClineMcpOauthServerState {\n\treturn {\n\t\t...(value.clientInformation ? { clientInformation: value.clientInformation } : {}),\n\t\t...(value.tokens ? { tokens: value.tokens } : {}),\n\t\t...(value.codeVerifier ? { codeVerifier: value.codeVerifier } : {}),\n\t\t...(value.discoveryState ? { discoveryState: value.discoveryState } : {}),\n\t\t...(value.redirectUrl ? { redirectUrl: value.redirectUrl } : {}),\n\t\t...(value.lastError ? { lastError: value.lastError } : {}),\n\t\t...(value.lastAuthenticatedAt ? { lastAuthenticatedAt: value.lastAuthenticatedAt } : {}),\n\t};\n}\n\nfunction isEmptyOauthServerState(value: ClineMcpOauthServerState): boolean {\n\treturn Object.keys(value).length === 0;\n}\n\nfunction parseOauthSettings(path: string): ClineMcpOauthSettings {\n\tif (!existsSync(path)) {\n\t\treturn {\n\t\t\tservers: {},\n\t\t};\n\t}\n\n\tlet parsedJson: unknown;\n\ttry {\n\t\tparsedJson = JSON.parse(readFileSync(path, \"utf8\"));\n\t} catch (error) {\n\t\tthrow new Error(`Failed to parse MCP OAuth settings JSON at \"${path}\": ${toErrorMessage(error)}`);\n\t}\n\n\tconst parsed = oauthSettingsSchema.safeParse(parsedJson);\n\tif (!parsed.success) {\n\t\tconst details = parsed.error.issues\n\t\t\t.map((issue) => {\n\t\t\t\tconst issuePath = issue.path.join(\".\");\n\t\t\t\treturn issuePath.length > 0 ? `${issuePath}: ${issue.message}` : issue.message;\n\t\t\t})\n\t\t\t.join(\"; \");\n\t\tthrow new Error(`Invalid MCP OAuth settings at \"${path}\": ${details}`);\n\t}\n\n\treturn {\n\t\tservers: Object.fromEntries(\n\t\t\tObject.entries(parsed.data.servers).map(([name, state]) => [name, normalizeOauthServerState(state)]),\n\t\t),\n\t};\n}\n\nasync function writeOauthSettings(path: string, settings: ClineMcpOauthSettings): Promise<void> {\n\tawait lockedFileSystem.writeJsonFileAtomic(path, settings, {\n\t\tlock: {\n\t\t\tpath,\n\t\t\ttype: \"file\",\n\t\t},\n\t});\n}\n\nasync function updateOauthServerState(input: {\n\tpath: string;\n\tserverName: string;\n\tupdater: (current: ClineMcpOauthServerState) => ClineMcpOauthServerState;\n}): Promise<ClineMcpOauthServerState> {\n\tconst settings = parseOauthSettings(input.path);\n\tconst current = settings.servers[input.serverName] ?? {};\n\tconst updated = normalizeOauthServerState(input.updater(current));\n\n\tif (isEmptyOauthServerState(updated)) {\n\t\tdelete settings.servers[input.serverName];\n\t} else {\n\t\tsettings.servers[input.serverName] = updated;\n\t}\n\n\tawait writeOauthSettings(input.path, settings);\n\treturn updated;\n}\n\nfunction hasAccessToken(tokens: Record<string, unknown> | undefined): boolean {\n\tif (!tokens) {\n\t\treturn false;\n\t}\n\tconst accessToken = tokens.access_token;\n\treturn typeof accessToken === \"string\" && accessToken.trim().length > 0;\n}\n\nfunction toMcpRegistration(server: RuntimeClineMcpServer): SdkMcpServerRegistration {\n\tif (server.type === \"stdio\") {\n\t\treturn {\n\t\t\tname: server.name,\n\t\t\tdisabled: server.disabled,\n\t\t\ttransport: {\n\t\t\t\ttype: \"stdio\",\n\t\t\t\tcommand: server.command,\n\t\t\t\targs: server.args,\n\t\t\t\tcwd: server.cwd,\n\t\t\t\tenv: server.env,\n\t\t\t},\n\t\t};\n\t}\n\treturn {\n\t\tname: server.name,\n\t\tdisabled: server.disabled,\n\t\ttransport: {\n\t\t\ttype: server.type,\n\t\t\turl: server.url,\n\t\t\theaders: server.headers,\n\t\t},\n\t};\n}\n\nfunction createTransport(input: { server: RuntimeClineMcpServer; oauthProvider?: OAuthClientProvider }): SdkTransport {\n\tif (input.server.type === \"stdio\") {\n\t\treturn new StdioClientTransport({\n\t\t\tcommand: input.server.command,\n\t\t\t...(input.server.args ? { args: input.server.args } : {}),\n\t\t\t...(input.server.cwd ? { cwd: input.server.cwd } : {}),\n\t\t\t...(input.server.env ? { env: input.server.env } : {}),\n\t\t\tstderr: \"ignore\",\n\t\t});\n\t}\n\n\tif (input.server.type === \"sse\") {\n\t\treturn new SSEClientTransport(new URL(input.server.url), {\n\t\t\tauthProvider: input.oauthProvider,\n\t\t\trequestInit: input.server.headers\n\t\t\t\t? {\n\t\t\t\t\t\theaders: input.server.headers,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t});\n\t}\n\n\treturn new StreamableHTTPClientTransport(new URL(input.server.url), {\n\t\tauthProvider: input.oauthProvider,\n\t\trequestInit: input.server.headers\n\t\t\t? {\n\t\t\t\t\theaders: input.server.headers,\n\t\t\t\t}\n\t\t\t: undefined,\n\t});\n}\n\nfunction isAuthCapableTransport(transport: SdkTransport): transport is AuthCapableTransport {\n\treturn transport instanceof SSEClientTransport || transport instanceof StreamableHTTPClientTransport;\n}\n\nfunction createOauthClientMetadata(redirectUrl: string): OAuthClientMetadata {\n\treturn {\n\t\tclient_name: \"Cline\",\n\t\tredirect_uris: [redirectUrl],\n\t\tgrant_types: [\"authorization_code\", \"refresh_token\"],\n\t\tresponse_types: [\"code\"],\n\t\ttoken_endpoint_auth_method: \"none\",\n\t};\n}\n\nasync function createOauthProviderContext(input: {\n\tsettingsPath: string;\n\tserverName: string;\n\tredirectUrl: string;\n\tonAuthorizationUrl?: (url: string) => void;\n}) {\n\tlet state = parseOauthSettings(input.settingsPath).servers[input.serverName] ?? {};\n\tlet lastAuthorizationUrl: string | null = null;\n\n\tconst persist = async (nextState: ClineMcpOauthServerState): Promise<void> => {\n\t\tstate = await updateOauthServerState({\n\t\t\tpath: input.settingsPath,\n\t\t\tserverName: input.serverName,\n\t\t\tupdater: () => nextState,\n\t\t});\n\t};\n\n\tconst patch = async (updater: (current: ClineMcpOauthServerState) => ClineMcpOauthServerState): Promise<void> => {\n\t\tstate = await updateOauthServerState({\n\t\t\tpath: input.settingsPath,\n\t\t\tserverName: input.serverName,\n\t\t\tupdater,\n\t\t});\n\t};\n\n\tconst provider: OAuthClientProvider = {\n\t\tget redirectUrl() {\n\t\t\treturn state.redirectUrl ?? input.redirectUrl;\n\t\t},\n\t\tget clientMetadata() {\n\t\t\treturn createOauthClientMetadata(state.redirectUrl ?? input.redirectUrl);\n\t\t},\n\t\tstate: () => randomUUID(),\n\t\tclientInformation: () => state.clientInformation as OAuthClientInformationMixed | undefined,\n\t\tsaveClientInformation: async (clientInformation) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tclientInformation: clientInformation as Record<string, unknown>,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t\tlastError: undefined,\n\t\t\t}));\n\t\t},\n\t\ttokens: () => state.tokens as OAuthTokens | undefined,\n\t\tsaveTokens: async (tokens) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\ttokens: tokens as Record<string, unknown>,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t\tlastError: undefined,\n\t\t\t\tlastAuthenticatedAt: Date.now(),\n\t\t\t}));\n\t\t},\n\t\tredirectToAuthorization: async (authorizationUrl: URL) => {\n\t\t\tlastAuthorizationUrl = authorizationUrl.toString();\n\t\t\tif (input.onAuthorizationUrl) {\n\t\t\t\tinput.onAuthorizationUrl(lastAuthorizationUrl);\n\t\t\t}\n\t\t},\n\t\tsaveCodeVerifier: async (codeVerifier: string) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t}));\n\t\t},\n\t\tcodeVerifier: () => {\n\t\t\tif (!state.codeVerifier) {\n\t\t\t\tthrow new Error(`Missing OAuth code verifier for MCP server \"${input.serverName}\".`);\n\t\t\t}\n\t\t\treturn state.codeVerifier;\n\t\t},\n\t\tinvalidateCredentials: async (scope) => {\n\t\t\tawait patch((current) => {\n\t\t\t\tif (scope === \"all\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tlastError: current.lastError,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...current,\n\t\t\t\t\t...(scope === \"client\" ? { clientInformation: undefined } : {}),\n\t\t\t\t\t...(scope === \"tokens\" ? { tokens: undefined, lastAuthenticatedAt: undefined } : {}),\n\t\t\t\t\t...(scope === \"verifier\" ? { codeVerifier: undefined } : {}),\n\t\t\t\t\t...(scope === \"discovery\" ? { discoveryState: undefined } : {}),\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tsaveDiscoveryState: async (discoveryState) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tdiscoveryState: discoveryState as unknown as Record<string, unknown>,\n\t\t\t}));\n\t\t},\n\t\tdiscoveryState: () => state.discoveryState as OAuthDiscoveryState | undefined,\n\t};\n\n\tif (state.redirectUrl !== input.redirectUrl) {\n\t\tawait persist({\n\t\t\t...state,\n\t\t\tredirectUrl: input.redirectUrl,\n\t\t});\n\t}\n\n\treturn {\n\t\tprovider,\n\t\tgetLastAuthorizationUrl: () => lastAuthorizationUrl,\n\t\tresetInteractiveState: async () => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tclientInformation: undefined,\n\t\t\t\tcodeVerifier: undefined,\n\t\t\t\tdiscoveryState: undefined,\n\t\t\t\tlastError: undefined,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t}));\n\t\t},\n\t\tmarkError: async (errorMessage: string) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tlastError: errorMessage,\n\t\t\t}));\n\t\t},\n\t\tclearError: async () => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tlastError: undefined,\n\t\t\t}));\n\t\t},\n\t};\n}\n\nclass RuntimeMcpServerClient implements SdkMcpServerClient {\n\tprivate client: Client | null = null;\n\tprivate transport: SdkTransport | null = null;\n\n\tconstructor(\n\t\tprivate readonly server: RuntimeClineMcpServer,\n\t\tprivate readonly oauthSettingsPath: string,\n\t) {}\n\n\tprivate async createAuthProviderContext() {\n\t\tif (this.server.type === \"stdio\") {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn await createOauthProviderContext({\n\t\t\tsettingsPath: this.oauthSettingsPath,\n\t\t\tserverName: this.server.name,\n\t\t\tredirectUrl:\n\t\t\t\tparseOauthSettings(this.oauthSettingsPath).servers[this.server.name]?.redirectUrl ??\n\t\t\t\tbuildKanbanRuntimeUrl(OAUTH_CALLBACK_PATH),\n\t\t});\n\t}\n\n\tprivate formatUnauthorizedMessage(authUrl: string | null): string {\n\t\tif (authUrl) {\n\t\t\treturn `MCP server \"${this.server.name}\" requires OAuth authorization. Open Settings, run Connect OAuth, and complete this URL: ${authUrl}`;\n\t\t}\n\t\treturn `MCP server \"${this.server.name}\" requires OAuth authorization. Open Settings and run Connect OAuth.`;\n\t}\n\n\tprivate async withErrorHandling<T>(\n\t\toperation: (context: {\n\t\t\tauthContext: Awaited<ReturnType<RuntimeMcpServerClient[\"createAuthProviderContext\"]>>;\n\t\t}) => Promise<T>,\n\t): Promise<T> {\n\t\tconst authContext = await this.createAuthProviderContext();\n\t\ttry {\n\t\t\tconst value = await operation({ authContext });\n\t\t\tawait authContext?.clearError();\n\t\t\treturn value;\n\t\t} catch (error) {\n\t\t\tif (error instanceof UnauthorizedError) {\n\t\t\t\tconst message = this.formatUnauthorizedMessage(authContext?.getLastAuthorizationUrl() ?? null);\n\t\t\t\tawait authContext?.markError(message);\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\t\t\tconst message = toErrorMessage(error);\n\t\t\tawait authContext?.markError(message);\n\t\t\tthrow new Error(`MCP server \"${this.server.name}\" failed: ${message}`);\n\t\t}\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.client) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.withErrorHandling(async ({ authContext }) => {\n\t\t\tconst transport = createTransport({\n\t\t\t\tserver: this.server,\n\t\t\t\toauthProvider: authContext?.provider,\n\t\t\t});\n\t\t\tconst client = new Client({\n\t\t\t\tname: \"kanban-mcp-runtime-client\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t});\n\n\t\t\tawait client.connect(transport);\n\t\t\tthis.transport = transport;\n\t\t\tthis.client = client;\n\t\t});\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tconst activeClient = this.client;\n\t\tthis.client = null;\n\t\tthis.transport = null;\n\t\tif (!activeClient) {\n\t\t\treturn;\n\t\t}\n\t\tawait activeClient.close();\n\t}\n\n\tasync listTools() {\n\t\tif (!this.client) {\n\t\t\tawait this.connect();\n\t\t}\n\n\t\tconst client = this.client;\n\t\tif (!client) {\n\t\t\tthrow new Error(`MCP server \"${this.server.name}\" is not connected.`);\n\t\t}\n\n\t\treturn await this.withErrorHandling(async () => {\n\t\t\tconst result = await client.listTools();\n\t\t\treturn result.tools.map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tinputSchema:\n\t\t\t\t\ttool.inputSchema && typeof tool.inputSchema === \"object\" && !Array.isArray(tool.inputSchema)\n\t\t\t\t\t\t? (tool.inputSchema as Record<string, unknown>)\n\t\t\t\t\t\t: {},\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync callTool(request: { name: string; arguments?: Record<string, unknown> }): Promise<unknown> {\n\t\tif (!this.client) {\n\t\t\tawait this.connect();\n\t\t}\n\n\t\tconst client = this.client;\n\t\tif (!client) {\n\t\t\tthrow new Error(`MCP server \"${this.server.name}\" is not connected.`);\n\t\t}\n\n\t\treturn await this.withErrorHandling(\n\t\t\tasync () =>\n\t\t\t\tawait client.callTool({\n\t\t\t\t\tname: request.name,\n\t\t\t\t\t...(request.arguments ? { arguments: request.arguments } : {}),\n\t\t\t\t}),\n\t\t);\n\t}\n}\n\nfunction buildMcpOauthCallbackUrl(requestId: string): string {\n\tconst callbackUrl = new URL(buildKanbanRuntimeUrl(OAUTH_CALLBACK_PATH));\n\tcallbackUrl.searchParams.set(OAUTH_CALLBACK_REQUEST_ID_PARAM, requestId);\n\treturn callbackUrl.toString();\n}\n\nexport async function handleClineMcpOauthCallback(requestUrl: URL): Promise<ClineMcpOauthCallbackResponse | null> {\n\tif (requestUrl.pathname !== OAUTH_CALLBACK_PATH) {\n\t\treturn null;\n\t}\n\n\tconst requestId = requestUrl.searchParams.get(OAUTH_CALLBACK_REQUEST_ID_PARAM)?.trim();\n\tif (!requestId) {\n\t\treturn {\n\t\t\tstatusCode: 400,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.missingRequestId,\n\t\t};\n\t}\n\n\tconst pending = pendingOauthCallbacksByRequestId.get(requestId);\n\tif (!pending) {\n\t\treturn {\n\t\t\tstatusCode: 410,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.expired,\n\t\t};\n\t}\n\n\tpendingOauthCallbacksByRequestId.delete(requestId);\n\tclearTimeout(pending.timeoutHandle);\n\n\tconst errorValue = requestUrl.searchParams.get(\"error\")?.trim();\n\tconst errorDescription = requestUrl.searchParams.get(\"error_description\")?.trim();\n\tconst code = requestUrl.searchParams.get(\"code\")?.trim();\n\n\tif (errorValue) {\n\t\tpending.rejectCode(\n\t\t\tnew Error(\n\t\t\t\terrorDescription\n\t\t\t\t\t? `OAuth authorization failed: ${errorValue} (${errorDescription})`\n\t\t\t\t\t: `OAuth authorization failed: ${errorValue}`,\n\t\t\t),\n\t\t);\n\t\treturn {\n\t\t\tstatusCode: 400,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.failure,\n\t\t};\n\t}\n\n\tif (!code) {\n\t\tpending.rejectCode(new Error(\"OAuth callback did not include an authorization code.\"));\n\t\treturn {\n\t\t\tstatusCode: 400,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.missingCode,\n\t\t};\n\t}\n\n\tpending.resolveCode(code);\n\treturn {\n\t\tstatusCode: 200,\n\t\tbody: CALLBACK_RESPONSE_HTML.success,\n\t};\n}\n\nexport async function startOauthCallbackListener(timeoutMs: number): Promise<{\n\tredirectUrl: string;\n\tawaitAuthorizationCode: () => Promise<string>;\n\tclose: () => Promise<void>;\n}> {\n\tlet resolveCode: ((code: string) => void) | null = null;\n\tlet rejectCode: ((error: Error) => void) | null = null;\n\tlet timeoutHandle: NodeJS.Timeout | null = null;\n\tconst requestId = randomUUID();\n\n\tconst codePromise = new Promise<string>((resolve, reject) => {\n\t\tresolveCode = resolve;\n\t\trejectCode = (error: Error) => {\n\t\t\treject(error);\n\t\t};\n\t});\n\n\ttimeoutHandle = setTimeout(() => {\n\t\tif (!pendingOauthCallbacksByRequestId.delete(requestId)) {\n\t\t\treturn;\n\t\t}\n\t\trejectCode?.(new Error(\"Timed out waiting for MCP OAuth authorization callback.\"));\n\t}, timeoutMs);\n\tpendingOauthCallbacksByRequestId.set(requestId, {\n\t\tresolveCode: (code) => {\n\t\t\tresolveCode?.(code);\n\t\t},\n\t\trejectCode: (error) => {\n\t\t\trejectCode?.(error);\n\t\t},\n\t\ttimeoutHandle,\n\t});\n\n\tlet closed = false;\n\tconst close = async () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tclosed = true;\n\t\tif (timeoutHandle) {\n\t\t\tclearTimeout(timeoutHandle);\n\t\t\ttimeoutHandle = null;\n\t\t}\n\t\tpendingOauthCallbacksByRequestId.delete(requestId);\n\t};\n\n\treturn {\n\t\tredirectUrl: buildMcpOauthCallbackUrl(requestId),\n\t\tawaitAuthorizationCode: async () => await codePromise,\n\t\tclose,\n\t};\n}\n\nexport function createClineMcpRuntimeService(\n\toptions: CreateClineMcpRuntimeServiceOptions = {},\n): ClineMcpRuntimeService {\n\tconst settingsService = createClineMcpSettingsService();\n\tconst oauthSettingsPath = resolveMcpOauthSettingsPath();\n\n\tconst createMcpClient = (registration: SdkMcpServerRegistration): SdkMcpServerClient => {\n\t\tconst loaded = settingsService.loadSettings().servers.find((server) => server.name === registration.name);\n\t\tif (!loaded) {\n\t\t\tthrow new Error(`Unknown MCP server \"${registration.name}\".`);\n\t\t}\n\t\treturn new RuntimeMcpServerClient(loaded, oauthSettingsPath);\n\t};\n\n\tconst collectAuthStatuses = (): ClineMcpServerAuthStatus[] => {\n\t\tconst loadedSettings = settingsService.loadSettings();\n\t\tconst oauthSettings = parseOauthSettings(oauthSettingsPath);\n\n\t\treturn loadedSettings.servers\n\t\t\t.map((server) => {\n\t\t\t\tconst authState = oauthSettings.servers[server.name];\n\t\t\t\tconst oauthSupported = server.type !== \"stdio\";\n\t\t\t\treturn {\n\t\t\t\t\tserverName: server.name,\n\t\t\t\t\toauthSupported,\n\t\t\t\t\toauthConfigured: oauthSupported ? hasAccessToken(authState?.tokens) : false,\n\t\t\t\t\tlastError: authState?.lastError ?? null,\n\t\t\t\t\tlastAuthenticatedAt: authState?.lastAuthenticatedAt ?? null,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.sort((left, right) => left.serverName.localeCompare(right.serverName));\n\t};\n\n\tconst broadcastAuthStatuses = async () => {\n\t\tawait options.onAuthStatusesChanged?.(collectAuthStatuses());\n\t};\n\n\treturn {\n\t\tasync createToolBundle(): Promise<ClineMcpToolBundle> {\n\t\t\tconst loadedSettings = settingsService.loadSettings();\n\t\t\tif (loadedSettings.servers.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\ttools: [],\n\t\t\t\t\twarnings: [],\n\t\t\t\t\tdispose: async () => {},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst manager: SdkMcpManager = createSdkInMemoryMcpManager({\n\t\t\t\tclientFactory: createMcpClient,\n\t\t\t});\n\n\t\t\tfor (const server of loadedSettings.servers) {\n\t\t\t\tawait manager.registerServer(toMcpRegistration(server));\n\t\t\t}\n\n\t\t\tconst tools: SdkMcpTool[] = [];\n\t\t\tconst warnings: string[] = [];\n\n\t\t\tfor (const server of loadedSettings.servers) {\n\t\t\t\tif (server.disabled) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst serverTools = await createSdkMcpTools({\n\t\t\t\t\t\tserverName: server.name,\n\t\t\t\t\t\tprovider: manager,\n\t\t\t\t\t});\n\t\t\t\t\ttools.push(...serverTools);\n\t\t\t\t} catch (error) {\n\t\t\t\t\twarnings.push(`Failed to load MCP server \"${server.name}\": ${toErrorMessage(error)}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttools,\n\t\t\t\twarnings,\n\t\t\t\tdispose: async () => {\n\t\t\t\t\tawait manager.dispose();\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tasync getAuthStatuses(): Promise<ClineMcpServerAuthStatus[]> {\n\t\t\treturn collectAuthStatuses();\n\t\t},\n\n\t\tasync authorizeServer(input): Promise<ClineMcpServerAuthResult> {\n\t\t\tconst serverName = input.serverName.trim();\n\t\t\tif (!serverName) {\n\t\t\t\tthrow new Error(\"MCP server name cannot be empty.\");\n\t\t\t}\n\n\t\t\tconst loadedSettings = settingsService.loadSettings();\n\t\t\tconst server = loadedSettings.servers.find((entry) => entry.name === serverName);\n\t\t\tif (!server) {\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" is not configured.`);\n\t\t\t}\n\t\t\tif (server.disabled) {\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" is disabled. Enable it before running OAuth.`);\n\t\t\t}\n\t\t\tif (server.type === \"stdio\") {\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" uses stdio transport and does not support OAuth browser flow.`);\n\t\t\t}\n\n\t\t\tconst callbackListener = await startOauthCallbackListener(input.timeoutMs ?? DEFAULT_AUTH_TIMEOUT_MS);\n\t\t\tconst oauthContext = await createOauthProviderContext({\n\t\t\t\tsettingsPath: oauthSettingsPath,\n\t\t\t\tserverName,\n\t\t\t\tredirectUrl: callbackListener.redirectUrl,\n\t\t\t\tonAuthorizationUrl: (url) => {\n\t\t\t\t\tinput.onAuthorizationUrl?.(url);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait oauthContext.resetInteractiveState();\n\n\t\t\tconst transport = createTransport({\n\t\t\t\tserver,\n\t\t\t\toauthProvider: oauthContext.provider,\n\t\t\t});\n\t\t\tif (!isAuthCapableTransport(transport)) {\n\t\t\t\tawait callbackListener.close();\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" transport does not support OAuth.`);\n\t\t\t}\n\n\t\t\tconst client = new Client({\n\t\t\t\tname: \"kanban-mcp-oauth-client\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t});\n\t\t\tlet retryClient: Client | null = null;\n\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tawait client.connect(transport);\n\t\t\t\t\tawait client.listTools();\n\t\t\t\t\tawait oauthContext.clearError();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tserverName,\n\t\t\t\t\t\tauthorized: true,\n\t\t\t\t\t\tmessage: `MCP server \"${serverName}\" is already authorized.`,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof UnauthorizedError)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authUrl = oauthContext.getLastAuthorizationUrl();\n\t\t\t\t\tif (!authUrl) {\n\t\t\t\t\t\tthrow new Error(`MCP server \"${serverName}\" did not provide an authorization URL.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authorizationCode = await callbackListener.awaitAuthorizationCode();\n\t\t\t\t\tawait transport.finishAuth(authorizationCode);\n\t\t\t\t\tawait broadcastAuthStatuses();\n\n\t\t\t\t\tretryClient = new Client({\n\t\t\t\t\t\tname: \"kanban-mcp-oauth-client\",\n\t\t\t\t\t\tversion: \"1.0.0\",\n\t\t\t\t\t});\n\t\t\t\t\tconst retryTransport = createTransport({\n\t\t\t\t\t\tserver,\n\t\t\t\t\t\toauthProvider: oauthContext.provider,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isAuthCapableTransport(retryTransport)) {\n\t\t\t\t\t\tthrow new Error(`MCP server \"${serverName}\" transport does not support OAuth.`);\n\t\t\t\t\t}\n\t\t\t\t\tawait retryClient.connect(retryTransport);\n\t\t\t\t\tawait retryClient.listTools();\n\t\t\t\t\tawait oauthContext.clearError();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tserverName,\n\t\t\t\t\t\tauthorized: true,\n\t\t\t\t\t\tmessage: `MCP server \"${serverName}\" OAuth authorization completed.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = toErrorMessage(error);\n\t\t\t\tawait oauthContext.markError(message);\n\t\t\t\tawait broadcastAuthStatuses().catch(() => undefined);\n\t\t\t\tthrow new Error(message);\n\t\t\t} finally {\n\t\t\t\tawait client.close().catch(() => undefined);\n\t\t\t\tawait retryClient?.close().catch(() => undefined);\n\t\t\t\tawait callbackListener.close();\n\t\t\t}\n\t\t},\n\t};\n}\n"],"names":[],"mappings":"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","debugId":"aa9ef6d7-5e15-520c-a7d1-fd18b80f07e0"}
|
|
1
|
+
{"version":3,"file":"cline-mcp-runtime-service.js","sources":["../../src/cline-sdk/cline-mcp-runtime-service.ts"],"sourceRoot":"","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { OAuthClientProvider, OAuthDiscoveryState } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type {\n\tOAuthClientInformationMixed,\n\tOAuthClientMetadata,\n\tOAuthTokens,\n} from \"@modelcontextprotocol/sdk/shared/auth.js\";\nimport { z } from \"zod\";\n\nimport type { RuntimeClineMcpServer } from \"../core/api-contract.js\";\nimport { buildKanbanRuntimeUrl } from \"../core/runtime-endpoint.js\";\nimport { lockedFileSystem } from \"../fs/locked-file-system.js\";\nimport { createClineMcpSettingsService, resolveMcpSettingsPath } from \"./cline-mcp-settings-service.js\";\nimport {\n\tcreateSdkInMemoryMcpManager,\n\tcreateSdkMcpTools,\n\ttype SdkMcpManager,\n\ttype SdkMcpServerClient,\n\ttype SdkMcpServerRegistration,\n\ttype SdkMcpTool,\n} from \"./sdk-provider-boundary.js\";\n\nconst DEFAULT_AUTH_TIMEOUT_MS = 3 * 60 * 1000;\nconst COMPLETED_CALLBACK_RETENTION_MS = 5 * 60 * 1000;\nconst OAUTH_CALLBACK_PATH = \"/kanban-mcp/mcp-oauth-callback\";\nconst OAUTH_CALLBACK_REQUEST_ID_PARAM = \"requestId\";\n\nconst CALLBACK_RESPONSE_HTML = {\n\tsuccess:\n\t\t\"<html><body><h1>Authorization complete</h1><p>You can close this tab and return to Cline.</p></body></html>\",\n\tfailure: \"<html><body><h1>OAuth failed</h1><p>You can close this tab.</p></body></html>\",\n\tmissingCode: \"<html><body><h1>Missing authorization code</h1><p>You can close this tab.</p></body></html>\",\n\texpired:\n\t\t\"<html><body><h1>Authorization session expired</h1><p>Return to Cline and run Connect OAuth again.</p></body></html>\",\n\tmissingRequestId:\n\t\t\"<html><body><h1>Invalid authorization callback</h1><p>Return to Cline and run Connect OAuth again.</p></body></html>\",\n} as const;\n\nconst pendingOauthCallbacksByRequestId = new Map<\n\tstring,\n\t{\n\t\tresolveCode: (code: string) => void;\n\t\trejectCode: (error: Error) => void;\n\t\ttimeoutHandle: NodeJS.Timeout;\n\t}\n>();\nconst completedOauthCallbacksByRequestId = new Map<\n\tstring,\n\t{\n\t\tresponse: ClineMcpOauthCallbackResponse;\n\t\ttimeoutHandle: NodeJS.Timeout;\n\t}\n>();\n\nconst oauthServerStateSchema = z.object({\n\tclientInformation: z.record(z.string(), z.unknown()).optional(),\n\ttokens: z.record(z.string(), z.unknown()).optional(),\n\tcodeVerifier: z.string().optional(),\n\tdiscoveryState: z.record(z.string(), z.unknown()).optional(),\n\tredirectUrl: z.string().url().optional(),\n\tlastError: z.string().optional(),\n\tlastAuthenticatedAt: z.number().int().positive().optional(),\n});\n\nconst oauthSettingsSchema = z.object({\n\tservers: z.record(z.string(), oauthServerStateSchema).default({}),\n});\n\ntype ClineMcpOauthServerState = z.infer<typeof oauthServerStateSchema>;\ntype ClineMcpOauthSettings = z.infer<typeof oauthSettingsSchema>;\n\ntype AuthCapableTransport = SSEClientTransport | StreamableHTTPClientTransport;\ntype SdkTransport = StdioClientTransport | AuthCapableTransport;\n\nexport interface ClineMcpServerAuthStatus {\n\tserverName: string;\n\toauthSupported: boolean;\n\toauthConfigured: boolean;\n\tlastError: string | null;\n\tlastAuthenticatedAt: number | null;\n}\n\nexport interface ClineMcpServerAuthResult {\n\tserverName: string;\n\tauthorized: true;\n\tmessage: string;\n}\n\nexport interface ClineMcpToolBundle {\n\ttools: SdkMcpTool[];\n\twarnings: string[];\n\tdispose: () => Promise<void>;\n}\n\nexport interface ClineMcpRuntimeService {\n\tcreateToolBundle(): Promise<ClineMcpToolBundle>;\n\tgetAuthStatuses(): Promise<ClineMcpServerAuthStatus[]>;\n\tauthorizeServer(input: {\n\t\tserverName: string;\n\t\ttimeoutMs?: number;\n\t\tonAuthorizationUrl?: (url: string) => void;\n\t}): Promise<ClineMcpServerAuthResult>;\n}\n\nexport interface ClineMcpOauthCallbackResponse {\n\tstatusCode: number;\n\tbody: string;\n}\n\nexport interface CreateClineMcpRuntimeServiceOptions {\n\tonAuthStatusesChanged?: (statuses: ClineMcpServerAuthStatus[]) => void | Promise<void>;\n}\n\nfunction toErrorMessage(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tconst message = error.message.trim();\n\t\tif (message.length > 0) {\n\t\t\treturn message;\n\t\t}\n\t}\n\treturn String(error);\n}\n\nfunction resolveMcpOauthSettingsPath(): string {\n\tconst configuredPath = process.env.CLINE_MCP_OAUTH_SETTINGS_PATH?.trim();\n\tif (configuredPath) {\n\t\treturn resolve(configuredPath);\n\t}\n\treturn join(dirname(resolveMcpSettingsPath()), \"cline_mcp_oauth_settings.json\");\n}\n\nfunction normalizeOauthServerState(value: ClineMcpOauthServerState): ClineMcpOauthServerState {\n\treturn {\n\t\t...(value.clientInformation ? { clientInformation: value.clientInformation } : {}),\n\t\t...(value.tokens ? { tokens: value.tokens } : {}),\n\t\t...(value.codeVerifier ? { codeVerifier: value.codeVerifier } : {}),\n\t\t...(value.discoveryState ? { discoveryState: value.discoveryState } : {}),\n\t\t...(value.redirectUrl ? { redirectUrl: value.redirectUrl } : {}),\n\t\t...(value.lastError ? { lastError: value.lastError } : {}),\n\t\t...(value.lastAuthenticatedAt ? { lastAuthenticatedAt: value.lastAuthenticatedAt } : {}),\n\t};\n}\n\nfunction isEmptyOauthServerState(value: ClineMcpOauthServerState): boolean {\n\treturn Object.keys(value).length === 0;\n}\n\nfunction parseOauthSettings(path: string): ClineMcpOauthSettings {\n\tif (!existsSync(path)) {\n\t\treturn {\n\t\t\tservers: {},\n\t\t};\n\t}\n\n\tlet parsedJson: unknown;\n\ttry {\n\t\tparsedJson = JSON.parse(readFileSync(path, \"utf8\"));\n\t} catch (error) {\n\t\tthrow new Error(`Failed to parse MCP OAuth settings JSON at \"${path}\": ${toErrorMessage(error)}`);\n\t}\n\n\tconst parsed = oauthSettingsSchema.safeParse(parsedJson);\n\tif (!parsed.success) {\n\t\tconst details = parsed.error.issues\n\t\t\t.map((issue) => {\n\t\t\t\tconst issuePath = issue.path.join(\".\");\n\t\t\t\treturn issuePath.length > 0 ? `${issuePath}: ${issue.message}` : issue.message;\n\t\t\t})\n\t\t\t.join(\"; \");\n\t\tthrow new Error(`Invalid MCP OAuth settings at \"${path}\": ${details}`);\n\t}\n\n\treturn {\n\t\tservers: Object.fromEntries(\n\t\t\tObject.entries(parsed.data.servers).map(([name, state]) => [name, normalizeOauthServerState(state)]),\n\t\t),\n\t};\n}\n\nasync function writeOauthSettings(path: string, settings: ClineMcpOauthSettings): Promise<void> {\n\tawait lockedFileSystem.writeJsonFileAtomic(path, settings, {\n\t\tlock: {\n\t\t\tpath,\n\t\t\ttype: \"file\",\n\t\t},\n\t});\n}\n\nasync function updateOauthServerState(input: {\n\tpath: string;\n\tserverName: string;\n\tupdater: (current: ClineMcpOauthServerState) => ClineMcpOauthServerState;\n}): Promise<ClineMcpOauthServerState> {\n\tconst settings = parseOauthSettings(input.path);\n\tconst current = settings.servers[input.serverName] ?? {};\n\tconst updated = normalizeOauthServerState(input.updater(current));\n\n\tif (isEmptyOauthServerState(updated)) {\n\t\tdelete settings.servers[input.serverName];\n\t} else {\n\t\tsettings.servers[input.serverName] = updated;\n\t}\n\n\tawait writeOauthSettings(input.path, settings);\n\treturn updated;\n}\n\nfunction hasAccessToken(tokens: Record<string, unknown> | undefined): boolean {\n\tif (!tokens) {\n\t\treturn false;\n\t}\n\tconst accessToken = tokens.access_token;\n\treturn typeof accessToken === \"string\" && accessToken.trim().length > 0;\n}\n\nfunction toMcpRegistration(server: RuntimeClineMcpServer): SdkMcpServerRegistration {\n\tif (server.type === \"stdio\") {\n\t\treturn {\n\t\t\tname: server.name,\n\t\t\tdisabled: server.disabled,\n\t\t\ttransport: {\n\t\t\t\ttype: \"stdio\",\n\t\t\t\tcommand: server.command,\n\t\t\t\targs: server.args,\n\t\t\t\tcwd: server.cwd,\n\t\t\t\tenv: server.env,\n\t\t\t},\n\t\t};\n\t}\n\treturn {\n\t\tname: server.name,\n\t\tdisabled: server.disabled,\n\t\ttransport: {\n\t\t\ttype: server.type,\n\t\t\turl: server.url,\n\t\t\theaders: server.headers,\n\t\t},\n\t};\n}\n\nfunction createTransport(input: { server: RuntimeClineMcpServer; oauthProvider?: OAuthClientProvider }): SdkTransport {\n\tif (input.server.type === \"stdio\") {\n\t\treturn new StdioClientTransport({\n\t\t\tcommand: input.server.command,\n\t\t\t...(input.server.args ? { args: input.server.args } : {}),\n\t\t\t...(input.server.cwd ? { cwd: input.server.cwd } : {}),\n\t\t\t...(input.server.env ? { env: input.server.env } : {}),\n\t\t\tstderr: \"ignore\",\n\t\t});\n\t}\n\n\tif (input.server.type === \"sse\") {\n\t\treturn new SSEClientTransport(new URL(input.server.url), {\n\t\t\tauthProvider: input.oauthProvider,\n\t\t\trequestInit: input.server.headers\n\t\t\t\t? {\n\t\t\t\t\t\theaders: input.server.headers,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t});\n\t}\n\n\treturn new StreamableHTTPClientTransport(new URL(input.server.url), {\n\t\tauthProvider: input.oauthProvider,\n\t\trequestInit: input.server.headers\n\t\t\t? {\n\t\t\t\t\theaders: input.server.headers,\n\t\t\t\t}\n\t\t\t: undefined,\n\t});\n}\n\nfunction isAuthCapableTransport(transport: SdkTransport): transport is AuthCapableTransport {\n\treturn transport instanceof SSEClientTransport || transport instanceof StreamableHTTPClientTransport;\n}\n\nfunction createOauthClientMetadata(redirectUrl: string): OAuthClientMetadata {\n\treturn {\n\t\tclient_name: \"Cline\",\n\t\tredirect_uris: [redirectUrl],\n\t\tgrant_types: [\"authorization_code\", \"refresh_token\"],\n\t\tresponse_types: [\"code\"],\n\t\ttoken_endpoint_auth_method: \"none\",\n\t};\n}\n\nasync function createOauthProviderContext(input: {\n\tsettingsPath: string;\n\tserverName: string;\n\tredirectUrl: string;\n\tonAuthorizationUrl?: (url: string) => void;\n}) {\n\tlet state = parseOauthSettings(input.settingsPath).servers[input.serverName] ?? {};\n\tlet lastAuthorizationUrl: string | null = null;\n\n\tconst persist = async (nextState: ClineMcpOauthServerState): Promise<void> => {\n\t\tstate = await updateOauthServerState({\n\t\t\tpath: input.settingsPath,\n\t\t\tserverName: input.serverName,\n\t\t\tupdater: () => nextState,\n\t\t});\n\t};\n\n\tconst patch = async (updater: (current: ClineMcpOauthServerState) => ClineMcpOauthServerState): Promise<void> => {\n\t\tstate = await updateOauthServerState({\n\t\t\tpath: input.settingsPath,\n\t\t\tserverName: input.serverName,\n\t\t\tupdater,\n\t\t});\n\t};\n\n\tconst provider: OAuthClientProvider = {\n\t\tget redirectUrl() {\n\t\t\treturn state.redirectUrl ?? input.redirectUrl;\n\t\t},\n\t\tget clientMetadata() {\n\t\t\treturn createOauthClientMetadata(state.redirectUrl ?? input.redirectUrl);\n\t\t},\n\t\tstate: () => randomUUID(),\n\t\tclientInformation: () => state.clientInformation as OAuthClientInformationMixed | undefined,\n\t\tsaveClientInformation: async (clientInformation) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tclientInformation: clientInformation as Record<string, unknown>,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t\tlastError: undefined,\n\t\t\t}));\n\t\t},\n\t\ttokens: () => state.tokens as OAuthTokens | undefined,\n\t\tsaveTokens: async (tokens) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\ttokens: tokens as Record<string, unknown>,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t\tlastError: undefined,\n\t\t\t\tlastAuthenticatedAt: Date.now(),\n\t\t\t}));\n\t\t},\n\t\tredirectToAuthorization: async (authorizationUrl: URL) => {\n\t\t\tlastAuthorizationUrl = authorizationUrl.toString();\n\t\t\tif (input.onAuthorizationUrl) {\n\t\t\t\tinput.onAuthorizationUrl(lastAuthorizationUrl);\n\t\t\t}\n\t\t},\n\t\tsaveCodeVerifier: async (codeVerifier: string) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t}));\n\t\t},\n\t\tcodeVerifier: () => {\n\t\t\tif (!state.codeVerifier) {\n\t\t\t\tthrow new Error(`Missing OAuth code verifier for MCP server \"${input.serverName}\".`);\n\t\t\t}\n\t\t\treturn state.codeVerifier;\n\t\t},\n\t\tinvalidateCredentials: async (scope) => {\n\t\t\tawait patch((current) => {\n\t\t\t\tif (scope === \"all\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tlastError: current.lastError,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...current,\n\t\t\t\t\t...(scope === \"client\" ? { clientInformation: undefined } : {}),\n\t\t\t\t\t...(scope === \"tokens\" ? { tokens: undefined, lastAuthenticatedAt: undefined } : {}),\n\t\t\t\t\t...(scope === \"verifier\" ? { codeVerifier: undefined } : {}),\n\t\t\t\t\t...(scope === \"discovery\" ? { discoveryState: undefined } : {}),\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tsaveDiscoveryState: async (discoveryState) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tdiscoveryState: discoveryState as unknown as Record<string, unknown>,\n\t\t\t}));\n\t\t},\n\t\tdiscoveryState: () => state.discoveryState as OAuthDiscoveryState | undefined,\n\t};\n\n\tif (state.redirectUrl !== input.redirectUrl) {\n\t\tawait persist({\n\t\t\t...state,\n\t\t\tredirectUrl: input.redirectUrl,\n\t\t});\n\t}\n\n\treturn {\n\t\tprovider,\n\t\tgetLastAuthorizationUrl: () => lastAuthorizationUrl,\n\t\tresetInteractiveState: async () => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tclientInformation: undefined,\n\t\t\t\tcodeVerifier: undefined,\n\t\t\t\tdiscoveryState: undefined,\n\t\t\t\tlastError: undefined,\n\t\t\t\tredirectUrl: input.redirectUrl,\n\t\t\t}));\n\t\t},\n\t\tmarkError: async (errorMessage: string) => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tlastError: errorMessage,\n\t\t\t}));\n\t\t},\n\t\tclearError: async () => {\n\t\t\tawait patch((current) => ({\n\t\t\t\t...current,\n\t\t\t\tlastError: undefined,\n\t\t\t}));\n\t\t},\n\t};\n}\n\nclass RuntimeMcpServerClient implements SdkMcpServerClient {\n\tprivate client: Client | null = null;\n\tprivate transport: SdkTransport | null = null;\n\n\tconstructor(\n\t\tprivate readonly server: RuntimeClineMcpServer,\n\t\tprivate readonly oauthSettingsPath: string,\n\t) {}\n\n\tprivate async createAuthProviderContext() {\n\t\tif (this.server.type === \"stdio\") {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn await createOauthProviderContext({\n\t\t\tsettingsPath: this.oauthSettingsPath,\n\t\t\tserverName: this.server.name,\n\t\t\tredirectUrl:\n\t\t\t\tparseOauthSettings(this.oauthSettingsPath).servers[this.server.name]?.redirectUrl ??\n\t\t\t\tbuildKanbanRuntimeUrl(OAUTH_CALLBACK_PATH),\n\t\t});\n\t}\n\n\tprivate formatUnauthorizedMessage(authUrl: string | null): string {\n\t\tif (authUrl) {\n\t\t\treturn `MCP server \"${this.server.name}\" requires OAuth authorization. Open Settings, run Connect OAuth, and complete this URL: ${authUrl}`;\n\t\t}\n\t\treturn `MCP server \"${this.server.name}\" requires OAuth authorization. Open Settings and run Connect OAuth.`;\n\t}\n\n\tprivate async withErrorHandling<T>(\n\t\toperation: (context: {\n\t\t\tauthContext: Awaited<ReturnType<RuntimeMcpServerClient[\"createAuthProviderContext\"]>>;\n\t\t}) => Promise<T>,\n\t): Promise<T> {\n\t\tconst authContext = await this.createAuthProviderContext();\n\t\ttry {\n\t\t\tconst value = await operation({ authContext });\n\t\t\tawait authContext?.clearError();\n\t\t\treturn value;\n\t\t} catch (error) {\n\t\t\tif (error instanceof UnauthorizedError) {\n\t\t\t\tconst message = this.formatUnauthorizedMessage(authContext?.getLastAuthorizationUrl() ?? null);\n\t\t\t\tawait authContext?.markError(message);\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\t\t\tconst message = toErrorMessage(error);\n\t\t\tawait authContext?.markError(message);\n\t\t\tthrow new Error(`MCP server \"${this.server.name}\" failed: ${message}`);\n\t\t}\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.client) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.withErrorHandling(async ({ authContext }) => {\n\t\t\tconst transport = createTransport({\n\t\t\t\tserver: this.server,\n\t\t\t\toauthProvider: authContext?.provider,\n\t\t\t});\n\t\t\tconst client = new Client({\n\t\t\t\tname: \"kanban-mcp-runtime-client\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t});\n\n\t\t\tawait client.connect(transport);\n\t\t\tthis.transport = transport;\n\t\t\tthis.client = client;\n\t\t});\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tconst activeClient = this.client;\n\t\tthis.client = null;\n\t\tthis.transport = null;\n\t\tif (!activeClient) {\n\t\t\treturn;\n\t\t}\n\t\tawait activeClient.close();\n\t}\n\n\tasync listTools() {\n\t\tif (!this.client) {\n\t\t\tawait this.connect();\n\t\t}\n\n\t\tconst client = this.client;\n\t\tif (!client) {\n\t\t\tthrow new Error(`MCP server \"${this.server.name}\" is not connected.`);\n\t\t}\n\n\t\treturn await this.withErrorHandling(async () => {\n\t\t\tconst result = await client.listTools();\n\t\t\treturn result.tools.map((tool) => ({\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tinputSchema:\n\t\t\t\t\ttool.inputSchema && typeof tool.inputSchema === \"object\" && !Array.isArray(tool.inputSchema)\n\t\t\t\t\t\t? (tool.inputSchema as Record<string, unknown>)\n\t\t\t\t\t\t: {},\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync callTool(request: { name: string; arguments?: Record<string, unknown> }): Promise<unknown> {\n\t\tif (!this.client) {\n\t\t\tawait this.connect();\n\t\t}\n\n\t\tconst client = this.client;\n\t\tif (!client) {\n\t\t\tthrow new Error(`MCP server \"${this.server.name}\" is not connected.`);\n\t\t}\n\n\t\treturn await this.withErrorHandling(\n\t\t\tasync () =>\n\t\t\t\tawait client.callTool({\n\t\t\t\t\tname: request.name,\n\t\t\t\t\t...(request.arguments ? { arguments: request.arguments } : {}),\n\t\t\t\t}),\n\t\t);\n\t}\n}\n\nfunction buildMcpOauthCallbackUrl(requestId: string): string {\n\tconst callbackUrl = new URL(buildKanbanRuntimeUrl(OAUTH_CALLBACK_PATH));\n\tcallbackUrl.searchParams.set(OAUTH_CALLBACK_REQUEST_ID_PARAM, requestId);\n\treturn callbackUrl.toString();\n}\n\nfunction rememberCompletedOauthCallback(requestId: string, response: ClineMcpOauthCallbackResponse): void {\n\tconst existing = completedOauthCallbacksByRequestId.get(requestId);\n\tif (existing) {\n\t\tclearTimeout(existing.timeoutHandle);\n\t}\n\n\tconst timeoutHandle = setTimeout(() => {\n\t\tcompletedOauthCallbacksByRequestId.delete(requestId);\n\t}, COMPLETED_CALLBACK_RETENTION_MS);\n\n\tcompletedOauthCallbacksByRequestId.set(requestId, {\n\t\tresponse,\n\t\ttimeoutHandle,\n\t});\n}\n\nexport async function handleClineMcpOauthCallback(requestUrl: URL): Promise<ClineMcpOauthCallbackResponse | null> {\n\tif (requestUrl.pathname !== OAUTH_CALLBACK_PATH) {\n\t\treturn null;\n\t}\n\n\tconst requestId = requestUrl.searchParams.get(OAUTH_CALLBACK_REQUEST_ID_PARAM)?.trim();\n\tif (!requestId) {\n\t\treturn {\n\t\t\tstatusCode: 400,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.missingRequestId,\n\t\t};\n\t}\n\n\tconst completed = completedOauthCallbacksByRequestId.get(requestId);\n\tif (completed) {\n\t\treturn completed.response;\n\t}\n\n\tconst pending = pendingOauthCallbacksByRequestId.get(requestId);\n\tif (!pending) {\n\t\treturn {\n\t\t\tstatusCode: 410,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.expired,\n\t\t};\n\t}\n\n\tpendingOauthCallbacksByRequestId.delete(requestId);\n\tclearTimeout(pending.timeoutHandle);\n\n\tconst errorValue = requestUrl.searchParams.get(\"error\")?.trim();\n\tconst errorDescription = requestUrl.searchParams.get(\"error_description\")?.trim();\n\tconst code = requestUrl.searchParams.get(\"code\")?.trim();\n\n\tif (errorValue) {\n\t\tconst response = {\n\t\t\tstatusCode: 400,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.failure,\n\t\t} as const;\n\t\trememberCompletedOauthCallback(requestId, response);\n\t\tpending.rejectCode(\n\t\t\tnew Error(\n\t\t\t\terrorDescription\n\t\t\t\t\t? `OAuth authorization failed: ${errorValue} (${errorDescription})`\n\t\t\t\t\t: `OAuth authorization failed: ${errorValue}`,\n\t\t\t),\n\t\t);\n\t\treturn response;\n\t}\n\n\tif (!code) {\n\t\tconst response = {\n\t\t\tstatusCode: 400,\n\t\t\tbody: CALLBACK_RESPONSE_HTML.missingCode,\n\t\t} as const;\n\t\trememberCompletedOauthCallback(requestId, response);\n\t\tpending.rejectCode(new Error(\"OAuth callback did not include an authorization code.\"));\n\t\treturn response;\n\t}\n\n\tconst response = {\n\t\tstatusCode: 200,\n\t\tbody: CALLBACK_RESPONSE_HTML.success,\n\t} as const;\n\trememberCompletedOauthCallback(requestId, response);\n\tpending.resolveCode(code);\n\treturn response;\n}\n\nexport async function startOauthCallbackListener(timeoutMs: number): Promise<{\n\tredirectUrl: string;\n\tawaitAuthorizationCode: () => Promise<string>;\n\tclose: () => Promise<void>;\n}> {\n\tlet resolveCode: ((code: string) => void) | null = null;\n\tlet rejectCode: ((error: Error) => void) | null = null;\n\tlet timeoutHandle: NodeJS.Timeout | null = null;\n\tconst requestId = randomUUID();\n\n\tconst codePromise = new Promise<string>((resolve, reject) => {\n\t\tresolveCode = resolve;\n\t\trejectCode = (error: Error) => {\n\t\t\treject(error);\n\t\t};\n\t});\n\n\ttimeoutHandle = setTimeout(() => {\n\t\tif (!pendingOauthCallbacksByRequestId.delete(requestId)) {\n\t\t\treturn;\n\t\t}\n\t\trejectCode?.(new Error(\"Timed out waiting for MCP OAuth authorization callback.\"));\n\t}, timeoutMs);\n\tpendingOauthCallbacksByRequestId.set(requestId, {\n\t\tresolveCode: (code) => {\n\t\t\tresolveCode?.(code);\n\t\t},\n\t\trejectCode: (error) => {\n\t\t\trejectCode?.(error);\n\t\t},\n\t\ttimeoutHandle,\n\t});\n\n\tlet closed = false;\n\tconst close = async () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tclosed = true;\n\t\tif (timeoutHandle) {\n\t\t\tclearTimeout(timeoutHandle);\n\t\t\ttimeoutHandle = null;\n\t\t}\n\t\tpendingOauthCallbacksByRequestId.delete(requestId);\n\t};\n\n\treturn {\n\t\tredirectUrl: buildMcpOauthCallbackUrl(requestId),\n\t\tawaitAuthorizationCode: async () => await codePromise,\n\t\tclose,\n\t};\n}\n\nexport function createClineMcpRuntimeService(\n\toptions: CreateClineMcpRuntimeServiceOptions = {},\n): ClineMcpRuntimeService {\n\tconst settingsService = createClineMcpSettingsService();\n\tconst oauthSettingsPath = resolveMcpOauthSettingsPath();\n\n\tconst createMcpClient = (registration: SdkMcpServerRegistration): SdkMcpServerClient => {\n\t\tconst loaded = settingsService.loadSettings().servers.find((server) => server.name === registration.name);\n\t\tif (!loaded) {\n\t\t\tthrow new Error(`Unknown MCP server \"${registration.name}\".`);\n\t\t}\n\t\treturn new RuntimeMcpServerClient(loaded, oauthSettingsPath);\n\t};\n\n\tconst collectAuthStatuses = (): ClineMcpServerAuthStatus[] => {\n\t\tconst loadedSettings = settingsService.loadSettings();\n\t\tconst oauthSettings = parseOauthSettings(oauthSettingsPath);\n\n\t\treturn loadedSettings.servers\n\t\t\t.map((server) => {\n\t\t\t\tconst authState = oauthSettings.servers[server.name];\n\t\t\t\tconst oauthSupported = server.type !== \"stdio\";\n\t\t\t\treturn {\n\t\t\t\t\tserverName: server.name,\n\t\t\t\t\toauthSupported,\n\t\t\t\t\toauthConfigured: oauthSupported ? hasAccessToken(authState?.tokens) : false,\n\t\t\t\t\tlastError: authState?.lastError ?? null,\n\t\t\t\t\tlastAuthenticatedAt: authState?.lastAuthenticatedAt ?? null,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.sort((left, right) => left.serverName.localeCompare(right.serverName));\n\t};\n\n\tconst broadcastAuthStatuses = async () => {\n\t\tawait options.onAuthStatusesChanged?.(collectAuthStatuses());\n\t};\n\n\treturn {\n\t\tasync createToolBundle(): Promise<ClineMcpToolBundle> {\n\t\t\tconst loadedSettings = settingsService.loadSettings();\n\t\t\tif (loadedSettings.servers.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\ttools: [],\n\t\t\t\t\twarnings: [],\n\t\t\t\t\tdispose: async () => {},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst manager: SdkMcpManager = createSdkInMemoryMcpManager({\n\t\t\t\tclientFactory: createMcpClient,\n\t\t\t});\n\n\t\t\tfor (const server of loadedSettings.servers) {\n\t\t\t\tawait manager.registerServer(toMcpRegistration(server));\n\t\t\t}\n\n\t\t\tconst tools: SdkMcpTool[] = [];\n\t\t\tconst warnings: string[] = [];\n\n\t\t\tfor (const server of loadedSettings.servers) {\n\t\t\t\tif (server.disabled) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst serverTools = await createSdkMcpTools({\n\t\t\t\t\t\tserverName: server.name,\n\t\t\t\t\t\tprovider: manager,\n\t\t\t\t\t});\n\t\t\t\t\ttools.push(...serverTools);\n\t\t\t\t} catch (error) {\n\t\t\t\t\twarnings.push(`Failed to load MCP server \"${server.name}\": ${toErrorMessage(error)}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttools,\n\t\t\t\twarnings,\n\t\t\t\tdispose: async () => {\n\t\t\t\t\tawait manager.dispose();\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tasync getAuthStatuses(): Promise<ClineMcpServerAuthStatus[]> {\n\t\t\treturn collectAuthStatuses();\n\t\t},\n\n\t\tasync authorizeServer(input): Promise<ClineMcpServerAuthResult> {\n\t\t\tconst serverName = input.serverName.trim();\n\t\t\tif (!serverName) {\n\t\t\t\tthrow new Error(\"MCP server name cannot be empty.\");\n\t\t\t}\n\n\t\t\tconst loadedSettings = settingsService.loadSettings();\n\t\t\tconst server = loadedSettings.servers.find((entry) => entry.name === serverName);\n\t\t\tif (!server) {\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" is not configured.`);\n\t\t\t}\n\t\t\tif (server.disabled) {\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" is disabled. Enable it before running OAuth.`);\n\t\t\t}\n\t\t\tif (server.type === \"stdio\") {\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" uses stdio transport and does not support OAuth browser flow.`);\n\t\t\t}\n\n\t\t\tconst callbackListener = await startOauthCallbackListener(input.timeoutMs ?? DEFAULT_AUTH_TIMEOUT_MS);\n\t\t\tconst oauthContext = await createOauthProviderContext({\n\t\t\t\tsettingsPath: oauthSettingsPath,\n\t\t\t\tserverName,\n\t\t\t\tredirectUrl: callbackListener.redirectUrl,\n\t\t\t\tonAuthorizationUrl: (url) => {\n\t\t\t\t\tinput.onAuthorizationUrl?.(url);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait oauthContext.resetInteractiveState();\n\n\t\t\tconst transport = createTransport({\n\t\t\t\tserver,\n\t\t\t\toauthProvider: oauthContext.provider,\n\t\t\t});\n\t\t\tif (!isAuthCapableTransport(transport)) {\n\t\t\t\tawait callbackListener.close();\n\t\t\t\tthrow new Error(`MCP server \"${serverName}\" transport does not support OAuth.`);\n\t\t\t}\n\n\t\t\tconst client = new Client({\n\t\t\t\tname: \"kanban-mcp-oauth-client\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t});\n\t\t\tlet retryClient: Client | null = null;\n\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tawait client.connect(transport);\n\t\t\t\t\tawait client.listTools();\n\t\t\t\t\tawait oauthContext.clearError();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tserverName,\n\t\t\t\t\t\tauthorized: true,\n\t\t\t\t\t\tmessage: `MCP server \"${serverName}\" is already authorized.`,\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof UnauthorizedError)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authUrl = oauthContext.getLastAuthorizationUrl();\n\t\t\t\t\tif (!authUrl) {\n\t\t\t\t\t\tthrow new Error(`MCP server \"${serverName}\" did not provide an authorization URL.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authorizationCode = await callbackListener.awaitAuthorizationCode();\n\t\t\t\t\tawait transport.finishAuth(authorizationCode);\n\t\t\t\t\tawait broadcastAuthStatuses();\n\n\t\t\t\t\tretryClient = new Client({\n\t\t\t\t\t\tname: \"kanban-mcp-oauth-client\",\n\t\t\t\t\t\tversion: \"1.0.0\",\n\t\t\t\t\t});\n\t\t\t\t\tconst retryTransport = createTransport({\n\t\t\t\t\t\tserver,\n\t\t\t\t\t\toauthProvider: oauthContext.provider,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isAuthCapableTransport(retryTransport)) {\n\t\t\t\t\t\tthrow new Error(`MCP server \"${serverName}\" transport does not support OAuth.`);\n\t\t\t\t\t}\n\t\t\t\t\tawait retryClient.connect(retryTransport);\n\t\t\t\t\tawait retryClient.listTools();\n\t\t\t\t\tawait oauthContext.clearError();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tserverName,\n\t\t\t\t\t\tauthorized: true,\n\t\t\t\t\t\tmessage: `MCP server \"${serverName}\" OAuth authorization completed.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = toErrorMessage(error);\n\t\t\t\tawait oauthContext.markError(message);\n\t\t\t\tawait broadcastAuthStatuses().catch(() => undefined);\n\t\t\t\tthrow new Error(message);\n\t\t\t} finally {\n\t\t\t\tawait client.close().catch(() => undefined);\n\t\t\t\tawait retryClient?.close().catch(() => undefined);\n\t\t\t\tawait callbackListener.close();\n\t\t\t}\n\t\t},\n\t};\n}\n"],"names":[],"mappings":"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","debugId":"0bee55d2-c64b-532c-8380-d425ee1f779a"}
|
|
@@ -5,6 +5,7 @@ export interface StartClineSessionRuntimeRequest {
|
|
|
5
5
|
taskId: string;
|
|
6
6
|
cwd: string;
|
|
7
7
|
prompt: string;
|
|
8
|
+
initialMessages?: ClineSdkPersistedMessage[];
|
|
8
9
|
images?: RuntimeTaskImage[];
|
|
9
10
|
providerId: string;
|
|
10
11
|
modelId: string;
|
|
@@ -26,7 +27,14 @@ export interface ClinePersistedTaskSessionSnapshot {
|
|
|
26
27
|
}
|
|
27
28
|
export interface ClineSessionRuntime {
|
|
28
29
|
startTaskSession(request: StartClineSessionRuntimeRequest): Promise<StartClineSessionRuntimeResult>;
|
|
29
|
-
|
|
30
|
+
restartTaskSession(input: {
|
|
31
|
+
taskId: string;
|
|
32
|
+
prompt: string;
|
|
33
|
+
initialMessages?: ClineSdkPersistedMessage[];
|
|
34
|
+
images?: RuntimeTaskImage[];
|
|
35
|
+
mode?: RuntimeTaskSessionMode;
|
|
36
|
+
}): Promise<StartClineSessionRuntimeResult>;
|
|
37
|
+
sendTaskSessionInput(taskId: string, prompt: string, mode?: RuntimeTaskSessionMode, images?: RuntimeTaskImage[], delivery?: "queue" | "steer"): Promise<unknown>;
|
|
30
38
|
resumeTaskSession(taskId: string): Promise<ClinePersistedTaskSessionSnapshot | null>;
|
|
31
39
|
stopTaskSession(taskId: string): Promise<void>;
|
|
32
40
|
abortTaskSession(taskId: string): Promise<void>;
|
|
@@ -45,11 +53,19 @@ export declare class InMemoryClineSessionRuntime implements ClineSessionRuntime
|
|
|
45
53
|
private readonly clineMcpRuntimeService;
|
|
46
54
|
private readonly sessionIdByTaskId;
|
|
47
55
|
private readonly taskIdBySessionId;
|
|
56
|
+
private readonly lastStartRequestByTaskId;
|
|
48
57
|
private readonly mcpToolBundleByTaskId;
|
|
49
58
|
private sessionHostPromise;
|
|
50
59
|
constructor(options?: CreateInMemoryClineSessionRuntimeOptions);
|
|
51
60
|
startTaskSession(request: StartClineSessionRuntimeRequest): Promise<StartClineSessionRuntimeResult>;
|
|
52
|
-
|
|
61
|
+
restartTaskSession(input: {
|
|
62
|
+
taskId: string;
|
|
63
|
+
prompt: string;
|
|
64
|
+
initialMessages?: ClineSdkPersistedMessage[];
|
|
65
|
+
images?: RuntimeTaskImage[];
|
|
66
|
+
mode?: RuntimeTaskSessionMode;
|
|
67
|
+
}): Promise<StartClineSessionRuntimeResult>;
|
|
68
|
+
sendTaskSessionInput(taskId: string, prompt: string, mode?: RuntimeTaskSessionMode, images?: RuntimeTaskImage[], delivery?: "queue" | "steer"): Promise<unknown>;
|
|
53
69
|
resumeTaskSession(taskId: string): Promise<ClinePersistedTaskSessionSnapshot | null>;
|
|
54
70
|
stopTaskSession(taskId: string): Promise<void>;
|
|
55
71
|
abortTaskSession(taskId: string): Promise<void>;
|
|
@@ -59,9 +75,11 @@ export declare class InMemoryClineSessionRuntime implements ClineSessionRuntime
|
|
|
59
75
|
private replaceTaskMcpToolBundle;
|
|
60
76
|
private releaseTaskMcpToolBundle;
|
|
61
77
|
private bindTaskSession;
|
|
78
|
+
private clearTaskSessionBinding;
|
|
62
79
|
private findPersistedTaskSessionRecord;
|
|
63
80
|
private ensureSessionHost;
|
|
64
81
|
private updateActiveSessionMode;
|
|
82
|
+
private updateLastStartRequestMode;
|
|
65
83
|
private handleSessionEvent;
|
|
66
84
|
}
|
|
67
85
|
export declare function createInMemoryClineSessionRuntime(options?: CreateInMemoryClineSessionRuntimeOptions): ClineSessionRuntime;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cline-session-runtime.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-session-runtime.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAEN,KAAK,sBAAsB,EAE3B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACN,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EAEnC,MAAM,2BAA2B,CAAC;AAqBnC,MAAM,WAAW,+BAA+B;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,8BAA8B,CAAC;IACxD,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,8BAA8B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iCAAiC;IACjD,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IACnC,gBAAgB,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACpG,
|
|
1
|
+
{"version":3,"file":"cline-session-runtime.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-session-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="61b3decb-d642-570f-84d6-088fcd51b7a2")}catch(e){}}();
|
|
3
3
|
import { createClineMcpRuntimeService, } from "./cline-mcp-runtime-service.js";
|
|
4
4
|
import { extractClineSessionId } from "./cline-event-adapter.js";
|
|
5
|
-
import { createSessionId } from "./cline-session-state.js";
|
|
5
|
+
import { buildSessionIdPrefix, createSessionId } from "./cline-session-state.js";
|
|
6
6
|
import { createClineSdkSessionHost, } from "./sdk-runtime-boundary.js";
|
|
7
|
-
const DEFAULT_CLINE_MAX_CONSECUTIVE_MISTAKES =
|
|
7
|
+
const DEFAULT_CLINE_MAX_CONSECUTIVE_MISTAKES = 6;
|
|
8
8
|
function toSdkUserImages(images) {
|
|
9
9
|
if (!images || images.length === 0) {
|
|
10
10
|
return undefined;
|
|
@@ -28,6 +28,7 @@ export class InMemoryClineSessionRuntime {
|
|
|
28
28
|
clineMcpRuntimeService;
|
|
29
29
|
sessionIdByTaskId = new Map();
|
|
30
30
|
taskIdBySessionId = new Map();
|
|
31
|
+
lastStartRequestByTaskId = new Map();
|
|
31
32
|
mcpToolBundleByTaskId = new Map();
|
|
32
33
|
sessionHostPromise = null;
|
|
33
34
|
constructor(options = {}) {
|
|
@@ -38,6 +39,19 @@ export class InMemoryClineSessionRuntime {
|
|
|
38
39
|
}
|
|
39
40
|
async startTaskSession(request) {
|
|
40
41
|
const requestedSessionId = createSessionId(request.taskId);
|
|
42
|
+
const resolvedMode = request.mode ?? "act";
|
|
43
|
+
this.lastStartRequestByTaskId.set(request.taskId, {
|
|
44
|
+
taskId: request.taskId,
|
|
45
|
+
cwd: request.cwd,
|
|
46
|
+
providerId: request.providerId,
|
|
47
|
+
modelId: request.modelId,
|
|
48
|
+
mode: resolvedMode,
|
|
49
|
+
apiKey: request.apiKey,
|
|
50
|
+
baseUrl: request.baseUrl,
|
|
51
|
+
systemPrompt: request.systemPrompt,
|
|
52
|
+
userInstructionWatcher: request.userInstructionWatcher,
|
|
53
|
+
requestToolApproval: request.requestToolApproval,
|
|
54
|
+
});
|
|
41
55
|
this.bindTaskSession(request.taskId, requestedSessionId);
|
|
42
56
|
let mcpToolBundle = null;
|
|
43
57
|
let startWarnings = [];
|
|
@@ -64,7 +78,7 @@ export class InMemoryClineSessionRuntime {
|
|
|
64
78
|
apiKey: request.apiKey?.trim() || undefined,
|
|
65
79
|
baseUrl: request.baseUrl?.trim() || undefined,
|
|
66
80
|
cwd: request.cwd,
|
|
67
|
-
mode:
|
|
81
|
+
mode: resolvedMode,
|
|
68
82
|
enableTools: true,
|
|
69
83
|
enableSpawnAgent: false,
|
|
70
84
|
enableAgentTeams: false,
|
|
@@ -73,6 +87,7 @@ export class InMemoryClineSessionRuntime {
|
|
|
73
87
|
...(mcpToolBundle && mcpToolBundle.tools.length > 0 ? { extraTools: mcpToolBundle.tools } : {}),
|
|
74
88
|
},
|
|
75
89
|
prompt: request.prompt,
|
|
90
|
+
initialMessages: request.initialMessages,
|
|
76
91
|
interactive: true,
|
|
77
92
|
userImages: toSdkUserImages(request.images),
|
|
78
93
|
userInstructionWatcher: request.userInstructionWatcher,
|
|
@@ -80,6 +95,7 @@ export class InMemoryClineSessionRuntime {
|
|
|
80
95
|
});
|
|
81
96
|
}
|
|
82
97
|
catch (error) {
|
|
98
|
+
this.clearTaskSessionBinding(request.taskId, requestedSessionId);
|
|
83
99
|
await this.releaseTaskMcpToolBundle(request.taskId);
|
|
84
100
|
throw error;
|
|
85
101
|
}
|
|
@@ -92,7 +108,20 @@ export class InMemoryClineSessionRuntime {
|
|
|
92
108
|
...(startWarnings.length > 0 ? { warnings: startWarnings } : {}),
|
|
93
109
|
};
|
|
94
110
|
}
|
|
95
|
-
async
|
|
111
|
+
async restartTaskSession(input) {
|
|
112
|
+
const lastStartRequest = this.lastStartRequestByTaskId.get(input.taskId);
|
|
113
|
+
if (!lastStartRequest) {
|
|
114
|
+
throw new Error(`No previous Cline session config is available for task ${input.taskId}.`);
|
|
115
|
+
}
|
|
116
|
+
return await this.startTaskSession({
|
|
117
|
+
...lastStartRequest,
|
|
118
|
+
prompt: input.prompt,
|
|
119
|
+
initialMessages: input.initialMessages,
|
|
120
|
+
images: input.images,
|
|
121
|
+
mode: input.mode ?? lastStartRequest.mode,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async sendTaskSessionInput(taskId, prompt, mode, images, delivery) {
|
|
96
125
|
const sessionId = this.sessionIdByTaskId.get(taskId);
|
|
97
126
|
if (!sessionId) {
|
|
98
127
|
throw new Error(`No active Cline session for task ${taskId}.`);
|
|
@@ -100,11 +129,13 @@ export class InMemoryClineSessionRuntime {
|
|
|
100
129
|
const sessionHost = await this.ensureSessionHost();
|
|
101
130
|
if (mode) {
|
|
102
131
|
this.updateActiveSessionMode(sessionHost, sessionId, mode);
|
|
132
|
+
this.updateLastStartRequestMode(taskId, mode);
|
|
103
133
|
}
|
|
104
134
|
return await sessionHost.send({
|
|
105
135
|
sessionId,
|
|
106
136
|
prompt,
|
|
107
137
|
userImages: toSdkUserImages(images),
|
|
138
|
+
...(delivery ? { delivery } : {}),
|
|
108
139
|
});
|
|
109
140
|
}
|
|
110
141
|
async resumeTaskSession(taskId) {
|
|
@@ -169,6 +200,7 @@ export class InMemoryClineSessionRuntime {
|
|
|
169
200
|
}
|
|
170
201
|
this.sessionIdByTaskId.clear();
|
|
171
202
|
this.taskIdBySessionId.clear();
|
|
203
|
+
this.lastStartRequestByTaskId.clear();
|
|
172
204
|
const mcpBundles = [...this.mcpToolBundleByTaskId.values()];
|
|
173
205
|
this.mcpToolBundleByTaskId.clear();
|
|
174
206
|
await Promise.all(mcpBundles.map(async (bundle) => {
|
|
@@ -201,6 +233,17 @@ export class InMemoryClineSessionRuntime {
|
|
|
201
233
|
this.sessionIdByTaskId.set(taskId, sessionId);
|
|
202
234
|
this.taskIdBySessionId.set(sessionId, taskId);
|
|
203
235
|
}
|
|
236
|
+
clearTaskSessionBinding(taskId, sessionId) {
|
|
237
|
+
const activeSessionId = this.sessionIdByTaskId.get(taskId);
|
|
238
|
+
if (!activeSessionId) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (sessionId && activeSessionId !== sessionId) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
this.sessionIdByTaskId.delete(taskId);
|
|
245
|
+
this.taskIdBySessionId.delete(activeSessionId);
|
|
246
|
+
}
|
|
204
247
|
async findPersistedTaskSessionRecord(taskId, sessionHost) {
|
|
205
248
|
const activeSessionId = this.sessionIdByTaskId.get(taskId);
|
|
206
249
|
if (activeSessionId) {
|
|
@@ -209,7 +252,7 @@ export class InMemoryClineSessionRuntime {
|
|
|
209
252
|
return activeRecord;
|
|
210
253
|
}
|
|
211
254
|
}
|
|
212
|
-
const sessionIdPrefix =
|
|
255
|
+
const sessionIdPrefix = buildSessionIdPrefix(taskId);
|
|
213
256
|
const records = await sessionHost.list();
|
|
214
257
|
const matchingRecord = records
|
|
215
258
|
.filter((record) => record.sessionId.startsWith(sessionIdPrefix))
|
|
@@ -238,10 +281,17 @@ export class InMemoryClineSessionRuntime {
|
|
|
238
281
|
activeSession.config.mode = mode;
|
|
239
282
|
}
|
|
240
283
|
}
|
|
241
|
-
|
|
242
|
-
|
|
284
|
+
updateLastStartRequestMode(taskId, mode) {
|
|
285
|
+
const lastStartRequest = this.lastStartRequestByTaskId.get(taskId);
|
|
286
|
+
if (!lastStartRequest) {
|
|
243
287
|
return;
|
|
244
288
|
}
|
|
289
|
+
this.lastStartRequestByTaskId.set(taskId, {
|
|
290
|
+
...lastStartRequest,
|
|
291
|
+
mode,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
handleSessionEvent(event) {
|
|
245
295
|
const sessionId = extractClineSessionId(event);
|
|
246
296
|
if (!sessionId) {
|
|
247
297
|
return;
|
|
@@ -250,11 +300,19 @@ export class InMemoryClineSessionRuntime {
|
|
|
250
300
|
if (!taskId) {
|
|
251
301
|
return;
|
|
252
302
|
}
|
|
253
|
-
|
|
303
|
+
const eventRecord = event && typeof event === "object" ? event : null;
|
|
304
|
+
const ended = eventRecord?.type === "ended";
|
|
305
|
+
if (this.onTaskEvent) {
|
|
306
|
+
this.onTaskEvent(taskId, event);
|
|
307
|
+
}
|
|
308
|
+
if (ended) {
|
|
309
|
+
this.clearTaskSessionBinding(taskId, sessionId);
|
|
310
|
+
void this.releaseTaskMcpToolBundle(taskId);
|
|
311
|
+
}
|
|
254
312
|
}
|
|
255
313
|
}
|
|
256
314
|
export function createInMemoryClineSessionRuntime(options = {}) {
|
|
257
315
|
return new InMemoryClineSessionRuntime(options);
|
|
258
316
|
}
|
|
259
317
|
//# sourceMappingURL=cline-session-runtime.js.map
|
|
260
|
-
//# debugId=
|
|
318
|
+
//# debugId=61b3decb-d642-570f-84d6-088fcd51b7a2
|