kanban 0.1.40 → 0.1.42
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/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- 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/update/auto-update.d.ts +1 -0
- package/dist/update/auto-update.d.ts.map +1 -1
- package/dist/update/auto-update.js +12 -3
- package/dist/update/auto-update.js.map +1 -1
- package/dist/web-ui/assets/{index-BX9vGYEO.js → index-CJ3nLkj0.js} +6104 -6101
- package/dist/web-ui/assets/{index-BX9vGYEO.js.map → index-CJ3nLkj0.js.map} +1 -1
- package/dist/web-ui/assets/{index-WG8Dagzd.css → index-CuBw4lTr.css} +30 -0
- 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
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
!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]="
|
|
3
|
+
!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]="461d1b47-e68d-5084-b1e0-e90ad020250e")}catch(e){}}();
|
|
4
4
|
import { captureNodeException, flushNodeTelemetry } from "./telemetry/sentry-node.js";
|
|
5
5
|
import { spawn, spawnSync } from "node:child_process";
|
|
6
6
|
import { stat } from "node:fs/promises";
|
|
@@ -359,7 +359,7 @@ async function runMainCommand(options, shouldAutoOpenBrowser) {
|
|
|
359
359
|
}
|
|
360
360
|
throw error;
|
|
361
361
|
}
|
|
362
|
-
console.log(`Kanban running at ${runtime.url}`);
|
|
362
|
+
console.log(`Cline Kanban running at ${runtime.url}`);
|
|
363
363
|
if (!options.noOpen && shouldAutoOpenBrowser) {
|
|
364
364
|
try {
|
|
365
365
|
openInBrowser(runtime.url, {
|
|
@@ -456,4 +456,4 @@ void run().catch(async (error) => {
|
|
|
456
456
|
process.exit(1);
|
|
457
457
|
});
|
|
458
458
|
//# sourceMappingURL=cli.js.map
|
|
459
|
-
//# debugId=
|
|
459
|
+
//# debugId=461d1b47-e68d-5084-b1e0-e90ad020250e
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourceRoot":"","sourcesContent":["#!/usr/bin/env node\n\nimport { captureNodeException, flushNodeTelemetry } from \"./telemetry/sentry-node.js\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { Command, Option } from \"commander\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\nimport { registerHooksCommand } from \"./commands/hooks.js\";\nimport { registerTaskCommand } from \"./commands/task.js\";\nimport { loadGlobalRuntimeConfig, loadRuntimeConfig } from \"./config/runtime-config.js\";\nimport type { RuntimeCommandRunResponse } from \"./core/api-contract.js\";\nimport { createGitProcessEnv } from \"./core/git-process-env.js\";\nimport {\n\tinstallGracefulShutdownHandlers,\n\tshouldSuppressImmediateDuplicateShutdownSignals,\n} from \"./core/graceful-shutdown.js\";\nimport {\n\tbuildKanbanRuntimeUrl,\n\tDEFAULT_KANBAN_RUNTIME_PORT,\n\tgetKanbanRuntimeHost,\n\tgetKanbanRuntimeOrigin,\n\tgetKanbanRuntimePort,\n\tparseRuntimePort,\n\tsetKanbanRuntimeHost,\n\tsetKanbanRuntimePort,\n} from \"./core/runtime-endpoint.js\";\nimport { terminateProcessForTimeout } from \"./server/process-termination.js\";\nimport type { RuntimeStateHub } from \"./server/runtime-state-hub.js\";\nimport type { TerminalSessionManager } from \"./terminal/session-manager.js\";\n\ninterface CliOptions {\n\tnoOpen: boolean;\n\tskipShutdownCleanup: boolean;\n\thost: string | null;\n\tport: { mode: \"fixed\"; value: number } | { mode: \"auto\" } | null;\n}\n\nconst KANBAN_VERSION = typeof packageJson.version === \"string\" ? packageJson.version : \"0.1.0\";\n\nfunction parseCliPortValue(rawValue: string): { mode: \"fixed\"; value: number } | { mode: \"auto\" } {\n\tconst normalized = rawValue.trim().toLowerCase();\n\tif (!normalized) {\n\t\tthrow new Error(\"Missing value for --port.\");\n\t}\n\tif (normalized === \"auto\") {\n\t\treturn { mode: \"auto\" };\n\t}\n\ttry {\n\t\treturn { mode: \"fixed\", value: parseRuntimePort(normalized) };\n\t} catch {\n\t\tthrow new Error(`Invalid port value: ${rawValue}. Expected an integer from 1-65535 or \"auto\".`);\n\t}\n}\n\ninterface RootCommandOptions {\n\thost?: string;\n\tport?: { mode: \"fixed\"; value: number } | { mode: \"auto\" };\n\topen?: boolean;\n\tskipShutdownCleanup?: boolean;\n}\n\n/**\n * Decide whether this CLI invocation should auto-open a browser tab.\n *\n * This uses a positive allowlist for app-launch shapes like `kanban`,\n * `kanban --agent codex`, and `kanban --port 3484`. Any subcommand or\n * unexpected argument is treated as a command-style invocation instead.\n */\nfunction shouldAutoOpenBrowserTabForInvocation(argv: string[]): boolean {\n\tconst launchFlags = new Set([\"--open\", \"--no-open\", \"--skip-shutdown-cleanup\"]);\n\tconst launchOptionsWithValues = new Set([\"--host\", \"--port\", \"--agent\"]);\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index];\n\t\tif (!arg) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!arg.startsWith(\"-\")) {\n\t\t\treturn false;\n\t\t}\n\t\tif (launchFlags.has(arg)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst optionName = arg.split(\"=\", 1)[0] ?? arg;\n\t\tif (!launchOptionsWithValues.has(optionName)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (arg.includes(\"=\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst optionValue = argv[index + 1];\n\t\tif (!optionValue) {\n\t\t\treturn false;\n\t\t}\n\t\tindex += 1;\n\t}\n\n\treturn true;\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n\treturn await new Promise<boolean>((resolve) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t\tprobe.listen(port, getKanbanRuntimeHost(), () => {\n\t\t\tprobe.close(() => {\n\t\t\t\tresolve(true);\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function findAvailableRuntimePort(startPort: number): Promise<number> {\n\tfor (let candidate = startPort; candidate <= 65535; candidate += 1) {\n\t\tif (await isPortAvailable(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\tthrow new Error(\"No available runtime port found.\");\n}\n\nasync function applyRuntimePortOption(portOption: CliOptions[\"port\"]): Promise<number | null> {\n\tif (!portOption) {\n\t\treturn null;\n\t}\n\tif (portOption.mode === \"fixed\") {\n\t\tsetKanbanRuntimePort(portOption.value);\n\t\treturn portOption.value;\n\t}\n\tconst autoPort = await findAvailableRuntimePort(DEFAULT_KANBAN_RUNTIME_PORT);\n\tsetKanbanRuntimePort(autoPort);\n\treturn autoPort;\n}\n\nasync function assertPathIsDirectory(path: string): Promise<void> {\n\tconst info = await stat(path);\n\tif (!info.isDirectory()) {\n\t\tthrow new Error(`Project path is not a directory: ${path}`);\n\t}\n}\n\nasync function pathIsDirectory(path: string): Promise<boolean> {\n\ttry {\n\t\tconst info = await stat(path);\n\t\treturn info.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasGitRepository(path: string): boolean {\n\tconst result = spawnSync(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n\t\tcwd: path,\n\t\tencoding: \"utf8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\tenv: createGitProcessEnv(),\n\t});\n\treturn result.status === 0 && result.stdout.trim() === \"true\";\n}\n\nfunction isAddressInUseError(error: unknown): error is NodeJS.ErrnoException {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error as NodeJS.ErrnoException).code === \"EADDRINUSE\"\n\t);\n}\n\nasync function canReachKanbanServer(workspaceId: string | null): Promise<boolean> {\n\ttry {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (workspaceId) {\n\t\t\theaders[\"x-kanban-workspace-id\"] = workspaceId;\n\t\t}\n\t\tconst response = await fetch(buildKanbanRuntimeUrl(\"/api/trpc/projects.list\"), {\n\t\t\tmethod: \"GET\",\n\t\t\theaders,\n\t\t\tsignal: AbortSignal.timeout(1_500),\n\t\t});\n\t\tif (response.status === 404) {\n\t\t\treturn false;\n\t\t}\n\t\tconst payload = (await response.json().catch(() => null)) as {\n\t\t\tresult?: { data?: unknown };\n\t\t\terror?: unknown;\n\t\t} | null;\n\t\treturn Boolean(payload && (payload.result || payload.error));\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function tryOpenExistingServer(options: { noOpen: boolean; shouldAutoOpenBrowser: boolean }): Promise<boolean> {\n\tlet workspaceId: string | null = null;\n\tif (hasGitRepository(process.cwd())) {\n\t\tconst { loadWorkspaceContext } = await import(\"./state/workspace-state.js\");\n\t\tconst context = await loadWorkspaceContext(process.cwd());\n\t\tworkspaceId = context.workspaceId;\n\t}\n\tconst running = await canReachKanbanServer(workspaceId);\n\tif (!running) {\n\t\treturn false;\n\t}\n\tconst projectUrl = workspaceId\n\t\t? buildKanbanRuntimeUrl(`/${encodeURIComponent(workspaceId)}`)\n\t\t: getKanbanRuntimeOrigin();\n\tconsole.log(`Kanban already running at ${getKanbanRuntimeOrigin()}`);\n\tif (!options.noOpen && options.shouldAutoOpenBrowser) {\n\t\ttry {\n\t\t\tconst { openInBrowser } = await import(\"./server/browser.js\");\n\t\t\topenInBrowser(projectUrl, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(`Project URL: ${projectUrl}`);\n\treturn true;\n}\n\nasync function runScopedCommand(command: string, cwd: string): Promise<RuntimeCommandRunResponse> {\n\tconst startedAt = Date.now();\n\tconst outputLimitBytes = 64 * 1024;\n\n\treturn await new Promise<RuntimeCommandRunResponse>((resolve, reject) => {\n\t\tconst child = spawn(command, {\n\t\t\tcwd,\n\t\t\tshell: true,\n\t\t\tenv: process.env,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tif (!child.stdout || !child.stderr) {\n\t\t\treject(new Error(\"Shortcut process did not expose stdout/stderr.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\n\t\tconst appendOutput = (current: string, chunk: string): string => {\n\t\t\tconst next = current + chunk;\n\t\t\tif (next.length <= outputLimitBytes) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t\treturn next.slice(0, outputLimitBytes);\n\t\t};\n\n\t\tchild.stdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstdout = appendOutput(stdout, String(chunk));\n\t\t});\n\n\t\tchild.stderr.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstderr = appendOutput(stderr, String(chunk));\n\t\t});\n\n\t\tchild.on(\"error\", (error) => {\n\t\t\treject(error);\n\t\t});\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tterminateProcessForTimeout(child);\n\t\t}, 60_000);\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tclearTimeout(timeout);\n\t\t\tconst exitCode = typeof code === \"number\" ? code : 1;\n\t\t\tconst combinedOutput = [stdout.trim(), stderr.trim()].filter(Boolean).join(\"\\n\");\n\t\t\tresolve({\n\t\t\t\texitCode,\n\t\t\t\tstdout: stdout.trim(),\n\t\t\t\tstderr: stderr.trim(),\n\t\t\t\tcombinedOutput,\n\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function startServer(): Promise<{\n\turl: string;\n\tclose: () => Promise<void>;\n\tshutdown: (options?: { skipSessionCleanup?: boolean }) => Promise<void>;\n}> {\n\t/*\n\t\tServer-only modules are loaded lazily because task-oriented subcommands like\n\t\t`kanban task create` and `kanban hooks ingest` do not need the runtime server.\n\n\t\tA regression in 25ba59f showed that eagerly importing the runtime stack here\n\t\tcould leave the source CLI process alive after the command had already printed\n\t\tits JSON result. The issue first appeared after the native Cline SDK runtime\n\t\twas added to the server import graph. We have not yet isolated the deepest\n\t\thandle creator inside that graph, so we keep command-style subcommands on the\n\t\tlightweight path and only load the server stack when we actually start Kanban.\n\t*/\n\tconst [\n\t\t{ resolveProjectInputPath },\n\t\t{ pickDirectoryPathFromSystemDialog },\n\t\t{ createRuntimeServer },\n\t\t{ createRuntimeStateHub },\n\t\t{ resolveInteractiveShellCommand },\n\t\t{ shutdownRuntimeServer },\n\t\t{ collectProjectWorktreeTaskIdsForRemoval, createWorkspaceRegistry },\n\t] = await Promise.all([\n\t\timport(\"./projects/project-path.js\"),\n\t\timport(\"./server/directory-picker.js\"),\n\t\timport(\"./server/runtime-server.js\"),\n\t\timport(\"./server/runtime-state-hub.js\"),\n\t\timport(\"./server/shell.js\"),\n\t\timport(\"./server/shutdown-coordinator.js\"),\n\t\timport(\"./server/workspace-registry.js\"),\n\t]);\n\tlet runtimeStateHub: RuntimeStateHub | undefined;\n\tconst workspaceRegistry = await createWorkspaceRegistry({\n\t\tcwd: process.cwd(),\n\t\tloadGlobalRuntimeConfig,\n\t\tloadRuntimeConfig,\n\t\thasGitRepository,\n\t\tpathIsDirectory,\n\t\tonTerminalManagerReady: (workspaceId, manager) => {\n\t\t\truntimeStateHub?.trackTerminalManager(workspaceId, manager);\n\t\t},\n\t});\n\truntimeStateHub = createRuntimeStateHub({\n\t\tworkspaceRegistry,\n\t});\n\tconst runtimeHub = runtimeStateHub;\n\tfor (const { workspaceId, terminalManager } of workspaceRegistry.listManagedWorkspaces()) {\n\t\truntimeHub.trackTerminalManager(workspaceId, terminalManager);\n\t}\n\n\tconst disposeTrackedWorkspace = (\n\t\tworkspaceId: string,\n\t\toptions?: {\n\t\t\tstopTerminalSessions?: boolean;\n\t\t},\n\t): { terminalManager: TerminalSessionManager | null; workspacePath: string | null } => {\n\t\tconst disposed = workspaceRegistry.disposeWorkspace(workspaceId, {\n\t\t\tstopTerminalSessions: options?.stopTerminalSessions,\n\t\t});\n\t\truntimeHub.disposeWorkspace(workspaceId);\n\t\treturn disposed;\n\t};\n\n\tconst runtimeServer = await createRuntimeServer({\n\t\tworkspaceRegistry,\n\t\truntimeStateHub: runtimeHub,\n\t\twarn: (message) => {\n\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t},\n\t\tensureTerminalManagerForWorkspace: workspaceRegistry.ensureTerminalManagerForWorkspace,\n\t\tresolveInteractiveShellCommand,\n\t\trunCommand: runScopedCommand,\n\t\tresolveProjectInputPath,\n\t\tassertPathIsDirectory,\n\t\thasGitRepository,\n\t\tdisposeWorkspace: disposeTrackedWorkspace,\n\t\tcollectProjectWorktreeTaskIdsForRemoval,\n\t\tpickDirectoryPathFromSystemDialog,\n\t});\n\n\tconst close = async () => {\n\t\tawait runtimeServer.close();\n\t};\n\n\tconst shutdown = async (options?: { skipSessionCleanup?: boolean }) => {\n\t\tawait shutdownRuntimeServer({\n\t\t\tworkspaceRegistry,\n\t\t\twarn: (message) => {\n\t\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t\t},\n\t\t\tcloseRuntimeServer: close,\n\t\t\tskipSessionCleanup: options?.skipSessionCleanup ?? false,\n\t\t});\n\t};\n\n\treturn {\n\t\turl: runtimeServer.url,\n\t\tclose,\n\t\tshutdown,\n\t};\n}\n\nasync function startServerWithAutoPortRetry(options: CliOptions): Promise<Awaited<ReturnType<typeof startServer>>> {\n\tif (options.port?.mode !== \"auto\") {\n\t\treturn await startServer();\n\t}\n\n\twhile (true) {\n\t\ttry {\n\t\t\treturn await startServer();\n\t\t} catch (error) {\n\t\t\tif (!isAddressInUseError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst currentPort = getKanbanRuntimePort();\n\t\t\tconst retryPort = await findAvailableRuntimePort(currentPort + 1);\n\t\t\tsetKanbanRuntimePort(retryPort);\n\t\t\tconsole.warn(`Runtime port ${currentPort} became busy during startup, retrying on ${retryPort}.`);\n\t\t}\n\t}\n}\n\nasync function runMainCommand(options: CliOptions, shouldAutoOpenBrowser: boolean): Promise<void> {\n\tif (options.host) {\n\t\tsetKanbanRuntimeHost(options.host);\n\t\tconsole.log(`Binding to host ${options.host}.`);\n\t}\n\n\tconst [{ openInBrowser }, { autoUpdateOnStartup, runPendingAutoUpdateOnShutdown }] = await Promise.all([\n\t\timport(\"./server/browser.js\"),\n\t\timport(\"./update/auto-update.js\"),\n\t]);\n\n\tconst selectedPort = await applyRuntimePortOption(options.port);\n\tif (selectedPort !== null) {\n\t\tconsole.log(`Using runtime port ${selectedPort}.`);\n\t}\n\n\tautoUpdateOnStartup({\n\t\tcurrentVersion: KANBAN_VERSION,\n\t});\n\n\tlet runtime: Awaited<ReturnType<typeof startServer>>;\n\ttry {\n\t\truntime = await startServerWithAutoPortRetry(options);\n\t} catch (error) {\n\t\tif (\n\t\t\toptions.port?.mode !== \"auto\" &&\n\t\t\tisAddressInUseError(error) &&\n\t\t\t(await tryOpenExistingServer({ noOpen: options.noOpen, shouldAutoOpenBrowser }))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthrow error;\n\t}\n\tconsole.log(`Kanban running at ${runtime.url}`);\n\tif (!options.noOpen && shouldAutoOpenBrowser) {\n\t\ttry {\n\t\t\topenInBrowser(runtime.url, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(\"Press Ctrl+C to stop.\");\n\n\tlet isShuttingDown = false;\n\tconst shutdown = async () => {\n\t\tif (isShuttingDown) {\n\t\t\treturn;\n\t\t}\n\t\tisShuttingDown = true;\n\t\trunPendingAutoUpdateOnShutdown();\n\t\tif (options.skipShutdownCleanup) {\n\t\t\tconsole.warn(\"Skipping shutdown task cleanup for this instance.\");\n\t\t}\n\t\tawait runtime.shutdown({\n\t\t\tskipSessionCleanup: options.skipShutdownCleanup,\n\t\t});\n\t};\n\n\tinstallGracefulShutdownHandlers({\n\t\tprocess,\n\t\tdelayMs: 10000,\n\t\texit: (code) => {\n\t\t\tprocess.exit(code);\n\t\t},\n\t\tonShutdown: async () => {\n\t\t\tawait shutdown();\n\t\t},\n\t\tonShutdownError: (error) => {\n\t\t\tcaptureNodeException(error, { area: \"shutdown\" });\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(`Shutdown failed: ${message}`);\n\t\t},\n\t\tonTimeout: (delayMs) => {\n\t\t\tconsole.error(`Forced exit after shutdown timeout (${delayMs}ms).`);\n\t\t},\n\t\tonSecondSignal: (signal) => {\n\t\t\tconsole.error(`Forced exit on second signal: ${signal}`);\n\t\t},\n\t\tsuppressImmediateDuplicateSignals: shouldSuppressImmediateDuplicateShutdownSignals(),\n\t});\n}\n\nfunction createProgram(invocationArgs: string[]): Command {\n\tconst shouldAutoOpenBrowser = shouldAutoOpenBrowserTabForInvocation(invocationArgs);\n\tconst program = new Command();\n\tprogram\n\t\t.name(\"kanban\")\n\t\t.description(\"Local orchestration board for coding agents.\")\n\t\t.version(KANBAN_VERSION, \"-v, --version\", \"Output the version number\")\n\t\t.option(\"--host <ip>\", \"Host IP to bind the server to (default: 127.0.0.1).\")\n\t\t.option(\"--port <number|auto>\", \"Runtime port (1-65535) or auto.\", parseCliPortValue)\n\t\t.option(\"--no-open\", \"Do not open browser automatically.\")\n\t\t.option(\"--skip-shutdown-cleanup\", \"Do not move sessions to trash or delete task worktrees on shutdown.\")\n\t\t.showHelpAfterError()\n\t\t.addHelpText(\"after\", `\\nRuntime URL: ${getKanbanRuntimeOrigin()}`);\n\n\tprogram.addOption(new Option(\"--agent <id>\", \"Deprecated compatibility flag. Ignored.\").hideHelp());\n\n\tregisterTaskCommand(program);\n\tregisterHooksCommand(program);\n\n\tprogram\n\t\t.command(\"mcp\")\n\t\t.description(\"Deprecated compatibility command.\")\n\t\t.action(() => {\n\t\t\tconsole.warn(\"Deprecated. Please uninstall Kanban MCP.\");\n\t\t});\n\n\tprogram.action(async (options: RootCommandOptions) => {\n\t\tawait runMainCommand(\n\t\t\t{\n\t\t\t\thost: options.host ?? null,\n\t\t\t\tport: options.port ?? null,\n\t\t\t\tnoOpen: options.open === false,\n\t\t\t\tskipShutdownCleanup: options.skipShutdownCleanup === true,\n\t\t\t},\n\t\t\tshouldAutoOpenBrowser,\n\t\t);\n\t});\n\n\treturn program;\n}\n\nasync function run(): Promise<void> {\n\tconst argv = process.argv.slice(2);\n\tconst program = createProgram(argv);\n\tawait program.parseAsync(argv, { from: \"user\" });\n}\n\nvoid run().catch(async (error) => {\n\tcaptureNodeException(error, { area: \"startup\" });\n\tawait flushNodeTelemetry();\n\tconst message = error instanceof Error ? error.message : String(error);\n\tconsole.error(`Failed to start Kanban: ${message}`);\n\tprocess.exit(1);\n});\n"],"names":[],"mappings":"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","debugId":"23b379fd-89d4-5835-be6c-dc8e7efcb530"}
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourceRoot":"","sourcesContent":["#!/usr/bin/env node\n\nimport { captureNodeException, flushNodeTelemetry } from \"./telemetry/sentry-node.js\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { Command, Option } from \"commander\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\nimport { registerHooksCommand } from \"./commands/hooks.js\";\nimport { registerTaskCommand } from \"./commands/task.js\";\nimport { loadGlobalRuntimeConfig, loadRuntimeConfig } from \"./config/runtime-config.js\";\nimport type { RuntimeCommandRunResponse } from \"./core/api-contract.js\";\nimport { createGitProcessEnv } from \"./core/git-process-env.js\";\nimport {\n\tinstallGracefulShutdownHandlers,\n\tshouldSuppressImmediateDuplicateShutdownSignals,\n} from \"./core/graceful-shutdown.js\";\nimport {\n\tbuildKanbanRuntimeUrl,\n\tDEFAULT_KANBAN_RUNTIME_PORT,\n\tgetKanbanRuntimeHost,\n\tgetKanbanRuntimeOrigin,\n\tgetKanbanRuntimePort,\n\tparseRuntimePort,\n\tsetKanbanRuntimeHost,\n\tsetKanbanRuntimePort,\n} from \"./core/runtime-endpoint.js\";\nimport { terminateProcessForTimeout } from \"./server/process-termination.js\";\nimport type { RuntimeStateHub } from \"./server/runtime-state-hub.js\";\nimport type { TerminalSessionManager } from \"./terminal/session-manager.js\";\n\ninterface CliOptions {\n\tnoOpen: boolean;\n\tskipShutdownCleanup: boolean;\n\thost: string | null;\n\tport: { mode: \"fixed\"; value: number } | { mode: \"auto\" } | null;\n}\n\nconst KANBAN_VERSION = typeof packageJson.version === \"string\" ? packageJson.version : \"0.1.0\";\n\nfunction parseCliPortValue(rawValue: string): { mode: \"fixed\"; value: number } | { mode: \"auto\" } {\n\tconst normalized = rawValue.trim().toLowerCase();\n\tif (!normalized) {\n\t\tthrow new Error(\"Missing value for --port.\");\n\t}\n\tif (normalized === \"auto\") {\n\t\treturn { mode: \"auto\" };\n\t}\n\ttry {\n\t\treturn { mode: \"fixed\", value: parseRuntimePort(normalized) };\n\t} catch {\n\t\tthrow new Error(`Invalid port value: ${rawValue}. Expected an integer from 1-65535 or \"auto\".`);\n\t}\n}\n\ninterface RootCommandOptions {\n\thost?: string;\n\tport?: { mode: \"fixed\"; value: number } | { mode: \"auto\" };\n\topen?: boolean;\n\tskipShutdownCleanup?: boolean;\n}\n\n/**\n * Decide whether this CLI invocation should auto-open a browser tab.\n *\n * This uses a positive allowlist for app-launch shapes like `kanban`,\n * `kanban --agent codex`, and `kanban --port 3484`. Any subcommand or\n * unexpected argument is treated as a command-style invocation instead.\n */\nfunction shouldAutoOpenBrowserTabForInvocation(argv: string[]): boolean {\n\tconst launchFlags = new Set([\"--open\", \"--no-open\", \"--skip-shutdown-cleanup\"]);\n\tconst launchOptionsWithValues = new Set([\"--host\", \"--port\", \"--agent\"]);\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index];\n\t\tif (!arg) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!arg.startsWith(\"-\")) {\n\t\t\treturn false;\n\t\t}\n\t\tif (launchFlags.has(arg)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst optionName = arg.split(\"=\", 1)[0] ?? arg;\n\t\tif (!launchOptionsWithValues.has(optionName)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (arg.includes(\"=\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst optionValue = argv[index + 1];\n\t\tif (!optionValue) {\n\t\t\treturn false;\n\t\t}\n\t\tindex += 1;\n\t}\n\n\treturn true;\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n\treturn await new Promise<boolean>((resolve) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t\tprobe.listen(port, getKanbanRuntimeHost(), () => {\n\t\t\tprobe.close(() => {\n\t\t\t\tresolve(true);\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function findAvailableRuntimePort(startPort: number): Promise<number> {\n\tfor (let candidate = startPort; candidate <= 65535; candidate += 1) {\n\t\tif (await isPortAvailable(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\tthrow new Error(\"No available runtime port found.\");\n}\n\nasync function applyRuntimePortOption(portOption: CliOptions[\"port\"]): Promise<number | null> {\n\tif (!portOption) {\n\t\treturn null;\n\t}\n\tif (portOption.mode === \"fixed\") {\n\t\tsetKanbanRuntimePort(portOption.value);\n\t\treturn portOption.value;\n\t}\n\tconst autoPort = await findAvailableRuntimePort(DEFAULT_KANBAN_RUNTIME_PORT);\n\tsetKanbanRuntimePort(autoPort);\n\treturn autoPort;\n}\n\nasync function assertPathIsDirectory(path: string): Promise<void> {\n\tconst info = await stat(path);\n\tif (!info.isDirectory()) {\n\t\tthrow new Error(`Project path is not a directory: ${path}`);\n\t}\n}\n\nasync function pathIsDirectory(path: string): Promise<boolean> {\n\ttry {\n\t\tconst info = await stat(path);\n\t\treturn info.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasGitRepository(path: string): boolean {\n\tconst result = spawnSync(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n\t\tcwd: path,\n\t\tencoding: \"utf8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\tenv: createGitProcessEnv(),\n\t});\n\treturn result.status === 0 && result.stdout.trim() === \"true\";\n}\n\nfunction isAddressInUseError(error: unknown): error is NodeJS.ErrnoException {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error as NodeJS.ErrnoException).code === \"EADDRINUSE\"\n\t);\n}\n\nasync function canReachKanbanServer(workspaceId: string | null): Promise<boolean> {\n\ttry {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (workspaceId) {\n\t\t\theaders[\"x-kanban-workspace-id\"] = workspaceId;\n\t\t}\n\t\tconst response = await fetch(buildKanbanRuntimeUrl(\"/api/trpc/projects.list\"), {\n\t\t\tmethod: \"GET\",\n\t\t\theaders,\n\t\t\tsignal: AbortSignal.timeout(1_500),\n\t\t});\n\t\tif (response.status === 404) {\n\t\t\treturn false;\n\t\t}\n\t\tconst payload = (await response.json().catch(() => null)) as {\n\t\t\tresult?: { data?: unknown };\n\t\t\terror?: unknown;\n\t\t} | null;\n\t\treturn Boolean(payload && (payload.result || payload.error));\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function tryOpenExistingServer(options: { noOpen: boolean; shouldAutoOpenBrowser: boolean }): Promise<boolean> {\n\tlet workspaceId: string | null = null;\n\tif (hasGitRepository(process.cwd())) {\n\t\tconst { loadWorkspaceContext } = await import(\"./state/workspace-state.js\");\n\t\tconst context = await loadWorkspaceContext(process.cwd());\n\t\tworkspaceId = context.workspaceId;\n\t}\n\tconst running = await canReachKanbanServer(workspaceId);\n\tif (!running) {\n\t\treturn false;\n\t}\n\tconst projectUrl = workspaceId\n\t\t? buildKanbanRuntimeUrl(`/${encodeURIComponent(workspaceId)}`)\n\t\t: getKanbanRuntimeOrigin();\n\tconsole.log(`Kanban already running at ${getKanbanRuntimeOrigin()}`);\n\tif (!options.noOpen && options.shouldAutoOpenBrowser) {\n\t\ttry {\n\t\t\tconst { openInBrowser } = await import(\"./server/browser.js\");\n\t\t\topenInBrowser(projectUrl, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(`Project URL: ${projectUrl}`);\n\treturn true;\n}\n\nasync function runScopedCommand(command: string, cwd: string): Promise<RuntimeCommandRunResponse> {\n\tconst startedAt = Date.now();\n\tconst outputLimitBytes = 64 * 1024;\n\n\treturn await new Promise<RuntimeCommandRunResponse>((resolve, reject) => {\n\t\tconst child = spawn(command, {\n\t\t\tcwd,\n\t\t\tshell: true,\n\t\t\tenv: process.env,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tif (!child.stdout || !child.stderr) {\n\t\t\treject(new Error(\"Shortcut process did not expose stdout/stderr.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\n\t\tconst appendOutput = (current: string, chunk: string): string => {\n\t\t\tconst next = current + chunk;\n\t\t\tif (next.length <= outputLimitBytes) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t\treturn next.slice(0, outputLimitBytes);\n\t\t};\n\n\t\tchild.stdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstdout = appendOutput(stdout, String(chunk));\n\t\t});\n\n\t\tchild.stderr.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstderr = appendOutput(stderr, String(chunk));\n\t\t});\n\n\t\tchild.on(\"error\", (error) => {\n\t\t\treject(error);\n\t\t});\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tterminateProcessForTimeout(child);\n\t\t}, 60_000);\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tclearTimeout(timeout);\n\t\t\tconst exitCode = typeof code === \"number\" ? code : 1;\n\t\t\tconst combinedOutput = [stdout.trim(), stderr.trim()].filter(Boolean).join(\"\\n\");\n\t\t\tresolve({\n\t\t\t\texitCode,\n\t\t\t\tstdout: stdout.trim(),\n\t\t\t\tstderr: stderr.trim(),\n\t\t\t\tcombinedOutput,\n\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function startServer(): Promise<{\n\turl: string;\n\tclose: () => Promise<void>;\n\tshutdown: (options?: { skipSessionCleanup?: boolean }) => Promise<void>;\n}> {\n\t/*\n\t\tServer-only modules are loaded lazily because task-oriented subcommands like\n\t\t`kanban task create` and `kanban hooks ingest` do not need the runtime server.\n\n\t\tA regression in 25ba59f showed that eagerly importing the runtime stack here\n\t\tcould leave the source CLI process alive after the command had already printed\n\t\tits JSON result. The issue first appeared after the native Cline SDK runtime\n\t\twas added to the server import graph. We have not yet isolated the deepest\n\t\thandle creator inside that graph, so we keep command-style subcommands on the\n\t\tlightweight path and only load the server stack when we actually start Kanban.\n\t*/\n\tconst [\n\t\t{ resolveProjectInputPath },\n\t\t{ pickDirectoryPathFromSystemDialog },\n\t\t{ createRuntimeServer },\n\t\t{ createRuntimeStateHub },\n\t\t{ resolveInteractiveShellCommand },\n\t\t{ shutdownRuntimeServer },\n\t\t{ collectProjectWorktreeTaskIdsForRemoval, createWorkspaceRegistry },\n\t] = await Promise.all([\n\t\timport(\"./projects/project-path.js\"),\n\t\timport(\"./server/directory-picker.js\"),\n\t\timport(\"./server/runtime-server.js\"),\n\t\timport(\"./server/runtime-state-hub.js\"),\n\t\timport(\"./server/shell.js\"),\n\t\timport(\"./server/shutdown-coordinator.js\"),\n\t\timport(\"./server/workspace-registry.js\"),\n\t]);\n\tlet runtimeStateHub: RuntimeStateHub | undefined;\n\tconst workspaceRegistry = await createWorkspaceRegistry({\n\t\tcwd: process.cwd(),\n\t\tloadGlobalRuntimeConfig,\n\t\tloadRuntimeConfig,\n\t\thasGitRepository,\n\t\tpathIsDirectory,\n\t\tonTerminalManagerReady: (workspaceId, manager) => {\n\t\t\truntimeStateHub?.trackTerminalManager(workspaceId, manager);\n\t\t},\n\t});\n\truntimeStateHub = createRuntimeStateHub({\n\t\tworkspaceRegistry,\n\t});\n\tconst runtimeHub = runtimeStateHub;\n\tfor (const { workspaceId, terminalManager } of workspaceRegistry.listManagedWorkspaces()) {\n\t\truntimeHub.trackTerminalManager(workspaceId, terminalManager);\n\t}\n\n\tconst disposeTrackedWorkspace = (\n\t\tworkspaceId: string,\n\t\toptions?: {\n\t\t\tstopTerminalSessions?: boolean;\n\t\t},\n\t): { terminalManager: TerminalSessionManager | null; workspacePath: string | null } => {\n\t\tconst disposed = workspaceRegistry.disposeWorkspace(workspaceId, {\n\t\t\tstopTerminalSessions: options?.stopTerminalSessions,\n\t\t});\n\t\truntimeHub.disposeWorkspace(workspaceId);\n\t\treturn disposed;\n\t};\n\n\tconst runtimeServer = await createRuntimeServer({\n\t\tworkspaceRegistry,\n\t\truntimeStateHub: runtimeHub,\n\t\twarn: (message) => {\n\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t},\n\t\tensureTerminalManagerForWorkspace: workspaceRegistry.ensureTerminalManagerForWorkspace,\n\t\tresolveInteractiveShellCommand,\n\t\trunCommand: runScopedCommand,\n\t\tresolveProjectInputPath,\n\t\tassertPathIsDirectory,\n\t\thasGitRepository,\n\t\tdisposeWorkspace: disposeTrackedWorkspace,\n\t\tcollectProjectWorktreeTaskIdsForRemoval,\n\t\tpickDirectoryPathFromSystemDialog,\n\t});\n\n\tconst close = async () => {\n\t\tawait runtimeServer.close();\n\t};\n\n\tconst shutdown = async (options?: { skipSessionCleanup?: boolean }) => {\n\t\tawait shutdownRuntimeServer({\n\t\t\tworkspaceRegistry,\n\t\t\twarn: (message) => {\n\t\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t\t},\n\t\t\tcloseRuntimeServer: close,\n\t\t\tskipSessionCleanup: options?.skipSessionCleanup ?? false,\n\t\t});\n\t};\n\n\treturn {\n\t\turl: runtimeServer.url,\n\t\tclose,\n\t\tshutdown,\n\t};\n}\n\nasync function startServerWithAutoPortRetry(options: CliOptions): Promise<Awaited<ReturnType<typeof startServer>>> {\n\tif (options.port?.mode !== \"auto\") {\n\t\treturn await startServer();\n\t}\n\n\twhile (true) {\n\t\ttry {\n\t\t\treturn await startServer();\n\t\t} catch (error) {\n\t\t\tif (!isAddressInUseError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst currentPort = getKanbanRuntimePort();\n\t\t\tconst retryPort = await findAvailableRuntimePort(currentPort + 1);\n\t\t\tsetKanbanRuntimePort(retryPort);\n\t\t\tconsole.warn(`Runtime port ${currentPort} became busy during startup, retrying on ${retryPort}.`);\n\t\t}\n\t}\n}\n\nasync function runMainCommand(options: CliOptions, shouldAutoOpenBrowser: boolean): Promise<void> {\n\tif (options.host) {\n\t\tsetKanbanRuntimeHost(options.host);\n\t\tconsole.log(`Binding to host ${options.host}.`);\n\t}\n\n\tconst [{ openInBrowser }, { autoUpdateOnStartup, runPendingAutoUpdateOnShutdown }] = await Promise.all([\n\t\timport(\"./server/browser.js\"),\n\t\timport(\"./update/auto-update.js\"),\n\t]);\n\n\tconst selectedPort = await applyRuntimePortOption(options.port);\n\tif (selectedPort !== null) {\n\t\tconsole.log(`Using runtime port ${selectedPort}.`);\n\t}\n\n\tautoUpdateOnStartup({\n\t\tcurrentVersion: KANBAN_VERSION,\n\t});\n\n\tlet runtime: Awaited<ReturnType<typeof startServer>>;\n\ttry {\n\t\truntime = await startServerWithAutoPortRetry(options);\n\t} catch (error) {\n\t\tif (\n\t\t\toptions.port?.mode !== \"auto\" &&\n\t\t\tisAddressInUseError(error) &&\n\t\t\t(await tryOpenExistingServer({ noOpen: options.noOpen, shouldAutoOpenBrowser }))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthrow error;\n\t}\n\tconsole.log(`Cline Kanban running at ${runtime.url}`);\n\tif (!options.noOpen && shouldAutoOpenBrowser) {\n\t\ttry {\n\t\t\topenInBrowser(runtime.url, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(\"Press Ctrl+C to stop.\");\n\n\tlet isShuttingDown = false;\n\tconst shutdown = async () => {\n\t\tif (isShuttingDown) {\n\t\t\treturn;\n\t\t}\n\t\tisShuttingDown = true;\n\t\trunPendingAutoUpdateOnShutdown();\n\t\tif (options.skipShutdownCleanup) {\n\t\t\tconsole.warn(\"Skipping shutdown task cleanup for this instance.\");\n\t\t}\n\t\tawait runtime.shutdown({\n\t\t\tskipSessionCleanup: options.skipShutdownCleanup,\n\t\t});\n\t};\n\n\tinstallGracefulShutdownHandlers({\n\t\tprocess,\n\t\tdelayMs: 10000,\n\t\texit: (code) => {\n\t\t\tprocess.exit(code);\n\t\t},\n\t\tonShutdown: async () => {\n\t\t\tawait shutdown();\n\t\t},\n\t\tonShutdownError: (error) => {\n\t\t\tcaptureNodeException(error, { area: \"shutdown\" });\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(`Shutdown failed: ${message}`);\n\t\t},\n\t\tonTimeout: (delayMs) => {\n\t\t\tconsole.error(`Forced exit after shutdown timeout (${delayMs}ms).`);\n\t\t},\n\t\tonSecondSignal: (signal) => {\n\t\t\tconsole.error(`Forced exit on second signal: ${signal}`);\n\t\t},\n\t\tsuppressImmediateDuplicateSignals: shouldSuppressImmediateDuplicateShutdownSignals(),\n\t});\n}\n\nfunction createProgram(invocationArgs: string[]): Command {\n\tconst shouldAutoOpenBrowser = shouldAutoOpenBrowserTabForInvocation(invocationArgs);\n\tconst program = new Command();\n\tprogram\n\t\t.name(\"kanban\")\n\t\t.description(\"Local orchestration board for coding agents.\")\n\t\t.version(KANBAN_VERSION, \"-v, --version\", \"Output the version number\")\n\t\t.option(\"--host <ip>\", \"Host IP to bind the server to (default: 127.0.0.1).\")\n\t\t.option(\"--port <number|auto>\", \"Runtime port (1-65535) or auto.\", parseCliPortValue)\n\t\t.option(\"--no-open\", \"Do not open browser automatically.\")\n\t\t.option(\"--skip-shutdown-cleanup\", \"Do not move sessions to trash or delete task worktrees on shutdown.\")\n\t\t.showHelpAfterError()\n\t\t.addHelpText(\"after\", `\\nRuntime URL: ${getKanbanRuntimeOrigin()}`);\n\n\tprogram.addOption(new Option(\"--agent <id>\", \"Deprecated compatibility flag. Ignored.\").hideHelp());\n\n\tregisterTaskCommand(program);\n\tregisterHooksCommand(program);\n\n\tprogram\n\t\t.command(\"mcp\")\n\t\t.description(\"Deprecated compatibility command.\")\n\t\t.action(() => {\n\t\t\tconsole.warn(\"Deprecated. Please uninstall Kanban MCP.\");\n\t\t});\n\n\tprogram.action(async (options: RootCommandOptions) => {\n\t\tawait runMainCommand(\n\t\t\t{\n\t\t\t\thost: options.host ?? null,\n\t\t\t\tport: options.port ?? null,\n\t\t\t\tnoOpen: options.open === false,\n\t\t\t\tskipShutdownCleanup: options.skipShutdownCleanup === true,\n\t\t\t},\n\t\t\tshouldAutoOpenBrowser,\n\t\t);\n\t});\n\n\treturn program;\n}\n\nasync function run(): Promise<void> {\n\tconst argv = process.argv.slice(2);\n\tconst program = createProgram(argv);\n\tawait program.parseAsync(argv, { from: \"user\" });\n}\n\nvoid run().catch(async (error) => {\n\tcaptureNodeException(error, { area: \"startup\" });\n\tawait flushNodeTelemetry();\n\tconst message = error instanceof Error ? error.message : String(error);\n\tconsole.error(`Failed to start Kanban: ${message}`);\n\tprocess.exit(1);\n});\n"],"names":[],"mappings":"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","debugId":"461d1b47-e68d-5084-b1e0-e90ad020250e"}
|
|
@@ -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;
|