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.
Files changed (38) hide show
  1. package/dist/cline-sdk/cline-mcp-runtime-service.d.ts.map +1 -1
  2. package/dist/cline-sdk/cline-mcp-runtime-service.js +35 -10
  3. package/dist/cline-sdk/cline-mcp-runtime-service.js.map +1 -1
  4. package/dist/cline-sdk/cline-session-runtime.d.ts +20 -2
  5. package/dist/cline-sdk/cline-session-runtime.d.ts.map +1 -1
  6. package/dist/cline-sdk/cline-session-runtime.js +68 -10
  7. package/dist/cline-sdk/cline-session-runtime.js.map +1 -1
  8. package/dist/cline-sdk/cline-session-state.d.ts +1 -0
  9. package/dist/cline-sdk/cline-session-state.d.ts.map +1 -1
  10. package/dist/cline-sdk/cline-session-state.js +12 -3
  11. package/dist/cline-sdk/cline-session-state.js.map +1 -1
  12. package/dist/cline-sdk/cline-task-session-service.d.ts +1 -0
  13. package/dist/cline-sdk/cline-task-session-service.d.ts.map +1 -1
  14. package/dist/cline-sdk/cline-task-session-service.js +76 -23
  15. package/dist/cline-sdk/cline-task-session-service.js.map +1 -1
  16. package/dist/cline-sdk/sdk-provider-boundary.d.ts.map +1 -1
  17. package/dist/cline-sdk/sdk-provider-boundary.js +5 -8
  18. package/dist/cline-sdk/sdk-provider-boundary.js.map +1 -1
  19. package/dist/core/api-contract.d.ts +72 -0
  20. package/dist/core/api-contract.d.ts.map +1 -1
  21. package/dist/core/api-contract.js +3 -2
  22. package/dist/core/api-contract.js.map +1 -1
  23. package/dist/server/browser.d.ts +1 -4
  24. package/dist/server/browser.d.ts.map +1 -1
  25. package/dist/server/browser.js +13 -53
  26. package/dist/server/browser.js.map +1 -1
  27. package/dist/trpc/app-router.d.ts +10 -0
  28. package/dist/trpc/app-router.d.ts.map +1 -1
  29. package/dist/trpc/runtime-api.js +3 -3
  30. package/dist/trpc/runtime-api.js.map +1 -1
  31. package/dist/web-ui/assets/{index-WG8Dagzd.css → index-CuBw4lTr.css} +30 -0
  32. package/dist/web-ui/assets/{index-BX9vGYEO.js → index-OpsLqYwc.js} +6104 -6101
  33. package/dist/web-ui/assets/{index-BX9vGYEO.js.map → index-OpsLqYwc.js.map} +1 -1
  34. package/dist/web-ui/index.html +2 -2
  35. package/dist/workspace/git-utils.d.ts.map +1 -1
  36. package/dist/workspace/git-utils.js +17 -4
  37. package/dist/workspace/git-utils.js.map +1 -1
  38. 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;AA8CpC,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;AAsbD,wBAAsB,2BAA2B,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,6BAA6B,GAAG,IAAI,CAAC,CAuDhH;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
+ {"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]="aa9ef6d7-5e15-520c-a7d1-fd18b80f07e0")}catch(e){}}();
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
- pending.rejectCode(new Error(errorDescription
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
- pending.rejectCode(new Error("OAuth callback did not include an authorization code."));
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
- pending.resolveCode(code);
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=aa9ef6d7-5e15-520c-a7d1-fd18b80f07e0
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
- sendTaskSessionInput(taskId: string, prompt: string, mode?: RuntimeTaskSessionMode, images?: RuntimeTaskImage[]): Promise<unknown>;
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
- sendTaskSessionInput(taskId: string, prompt: string, mode?: RuntimeTaskSessionMode, images?: RuntimeTaskImage[]): Promise<unknown>;
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":"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"}
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]="273a8d56-0caf-5898-a5fe-60e95ff9dfbc")}catch(e){}}();
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 = 3;
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: request.mode ?? "act",
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 sendTaskSessionInput(taskId, prompt, mode, images) {
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 = `${taskId}-`;
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
- handleSessionEvent(event) {
242
- if (!this.onTaskEvent) {
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
- this.onTaskEvent(taskId, event);
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=273a8d56-0caf-5898-a5fe-60e95ff9dfbc
318
+ //# debugId=61b3decb-d642-570f-84d6-088fcd51b7a2