kanban 0.1.28 → 0.1.29

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.
@@ -35,4 +35,5 @@ export declare function saveRuntimeConfig(cwd: string, config: {
35
35
  openPrPromptTemplate: string;
36
36
  }): Promise<RuntimeConfigState>;
37
37
  export declare function updateRuntimeConfig(cwd: string, updates: RuntimeConfigUpdateInput): Promise<RuntimeConfigState>;
38
+ export declare function updateGlobalRuntimeConfig(current: RuntimeConfigState, updates: RuntimeConfigUpdateInput): Promise<RuntimeConfigState>;
38
39
  //# sourceMappingURL=runtime-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-config.d.ts","sourceRoot":"","sources":["../../src/config/runtime-config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAqBtF,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,cAAc,CAAC;IAChC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,EAAE,OAAO,CAAC;IACpC,kCAAkC,EAAE,OAAO,CAAC;IAC5C,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,2BAA2B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACxC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,SAAS,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAuDD,wBAAgB,oCAAoC,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,GAAG,IAAI,CAQ/G;AAyFD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/D;AAmOD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAShF;AAED,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;IACP,eAAe,EAAE,cAAc,CAAC;IAChC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,EAAE,OAAO,CAAC;IACpC,kCAAkC,EAAE,OAAO,CAAC;IAC5C,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;CAC7B,GACC,OAAO,CAAC,kBAAkB,CAAC,CAyB7B;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqDrH"}
1
+ {"version":3,"file":"runtime-config.d.ts","sourceRoot":"","sources":["../../src/config/runtime-config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAqBtF,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,cAAc,CAAC;IAChC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,EAAE,OAAO,CAAC;IACpC,kCAAkC,EAAE,OAAO,CAAC;IAC5C,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,2BAA2B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACxC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,SAAS,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAuDD,wBAAgB,oCAAoC,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,GAAG,IAAI,CAQ/G;AAyFD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/D;AAmOD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAShF;AAED,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;IACP,eAAe,EAAE,cAAc,CAAC;IAChC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,EAAE,OAAO,CAAC;IACpC,kCAAkC,EAAE,OAAO,CAAC;IAC5C,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;CAC7B,GACC,OAAO,CAAC,kBAAkB,CAAC,CAyB7B;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqDrH;AAED,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAwD7B"}
@@ -380,4 +380,51 @@ export async function updateRuntimeConfig(cwd, updates) {
380
380
  });
381
381
  });
382
382
  }
383
+ export async function updateGlobalRuntimeConfig(current, updates) {
384
+ const globalConfigPath = getRuntimeGlobalConfigPath();
385
+ return await lockedFileSystem.withLocks([
386
+ {
387
+ path: globalConfigPath,
388
+ type: "file",
389
+ },
390
+ ], async () => {
391
+ const nextConfig = {
392
+ selectedAgentId: updates.selectedAgentId ?? current.selectedAgentId,
393
+ selectedShortcutLabel: updates.selectedShortcutLabel === undefined ? current.selectedShortcutLabel : updates.selectedShortcutLabel,
394
+ agentAutonomousModeEnabled: updates.agentAutonomousModeEnabled ?? current.agentAutonomousModeEnabled,
395
+ readyForReviewNotificationsEnabled: updates.readyForReviewNotificationsEnabled ?? current.readyForReviewNotificationsEnabled,
396
+ shortcuts: current.shortcuts,
397
+ commitPromptTemplate: updates.commitPromptTemplate ?? current.commitPromptTemplate,
398
+ openPrPromptTemplate: updates.openPrPromptTemplate ?? current.openPrPromptTemplate,
399
+ };
400
+ const hasChanges = nextConfig.selectedAgentId !== current.selectedAgentId ||
401
+ nextConfig.selectedShortcutLabel !== current.selectedShortcutLabel ||
402
+ nextConfig.agentAutonomousModeEnabled !== current.agentAutonomousModeEnabled ||
403
+ nextConfig.readyForReviewNotificationsEnabled !== current.readyForReviewNotificationsEnabled ||
404
+ nextConfig.commitPromptTemplate !== current.commitPromptTemplate ||
405
+ nextConfig.openPrPromptTemplate !== current.openPrPromptTemplate;
406
+ if (!hasChanges) {
407
+ return current;
408
+ }
409
+ await writeRuntimeGlobalConfigFile(globalConfigPath, {
410
+ selectedAgentId: nextConfig.selectedAgentId,
411
+ selectedShortcutLabel: nextConfig.selectedShortcutLabel,
412
+ agentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,
413
+ readyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,
414
+ commitPromptTemplate: nextConfig.commitPromptTemplate,
415
+ openPrPromptTemplate: nextConfig.openPrPromptTemplate,
416
+ });
417
+ return createRuntimeConfigStateFromValues({
418
+ globalConfigPath,
419
+ projectConfigPath: current.projectConfigPath,
420
+ selectedAgentId: nextConfig.selectedAgentId,
421
+ selectedShortcutLabel: nextConfig.selectedShortcutLabel,
422
+ agentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,
423
+ readyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,
424
+ shortcuts: nextConfig.shortcuts,
425
+ commitPromptTemplate: nextConfig.commitPromptTemplate,
426
+ openPrPromptTemplate: nextConfig.openPrPromptTemplate,
427
+ });
428
+ });
429
+ }
383
430
  //# sourceMappingURL=runtime-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-config.js","sourceRoot":"","sources":["../../src/config/runtime-config.ts"],"names":[],"mappings":"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","sourcesContent":["// Persists Kanban-owned runtime preferences on disk.\n// This module should store Kanban settings such as selected agents,\n// shortcuts, and prompt templates, not SDK-owned Cline secrets or OAuth data.\nimport { readFile, rm } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport type { RuntimeAgentId, RuntimeProjectShortcut } from \"../core/api-contract.js\";\nimport {\n\tisRuntimeAgentLaunchSupported,\n} from \"../core/agent-catalog.js\";\nimport { type LockRequest, lockedFileSystem } from \"../fs/locked-file-system.js\";\nimport { detectInstalledCommands } from \"../terminal/agent-registry.js\";\nimport { areRuntimeProjectShortcutsEqual } from \"./shortcut-utils.js\";\n\ninterface RuntimeGlobalConfigFileShape {\n\tselectedAgentId?: RuntimeAgentId;\n\tselectedShortcutLabel?: string;\n\tagentAutonomousModeEnabled?: boolean;\n\treadyForReviewNotificationsEnabled?: boolean;\n\tcommitPromptTemplate?: string;\n\topenPrPromptTemplate?: string;\n}\n\ninterface RuntimeProjectConfigFileShape {\n\tshortcuts?: RuntimeProjectShortcut[];\n}\n\nexport interface RuntimeConfigState {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tselectedAgentId: RuntimeAgentId;\n\tselectedShortcutLabel: string | null;\n\tagentAutonomousModeEnabled: boolean;\n\treadyForReviewNotificationsEnabled: boolean;\n\tshortcuts: RuntimeProjectShortcut[];\n\tcommitPromptTemplate: string;\n\topenPrPromptTemplate: string;\n\tcommitPromptTemplateDefault: string;\n\topenPrPromptTemplateDefault: string;\n}\n\nexport interface RuntimeConfigUpdateInput {\n\tselectedAgentId?: RuntimeAgentId;\n\tselectedShortcutLabel?: string | null;\n\tagentAutonomousModeEnabled?: boolean;\n\treadyForReviewNotificationsEnabled?: boolean;\n\tshortcuts?: RuntimeProjectShortcut[];\n\tcommitPromptTemplate?: string;\n\topenPrPromptTemplate?: string;\n}\n\nconst RUNTIME_HOME_PARENT_DIR = \".cline\";\nconst RUNTIME_HOME_DIR = \"kanban\";\nconst CONFIG_FILENAME = \"config.json\";\nconst PROJECT_CONFIG_PARENT_DIR = \".cline\";\nconst PROJECT_CONFIG_DIR = \"kanban\";\nconst PROJECT_CONFIG_FILENAME = \"config.json\";\nconst DEFAULT_AGENT_ID: RuntimeAgentId = \"cline\";\nconst AUTO_SELECT_AGENT_PRIORITY: readonly RuntimeAgentId[] = [\"claude\", \"codex\"];\nconst DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED = true;\nconst DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED = true;\nconst DEFAULT_COMMIT_PROMPT_TEMPLATE = `You are in a worktree on a detached HEAD. When you are finished with the task, commit the working changes onto {{base_ref}}.\n\n- Do not run destructive commands: git reset --hard, git clean -fdx, git worktree remove, rm/mv on repository paths.\n- Do not edit files outside git workflows unless required for conflict resolution.\n- Preserve any pre-existing user uncommitted changes in the base worktree.\n\nSteps:\n1. In the current task worktree, stage and create a commit for the pending task changes.\n2. Find where {{base_ref}} is checked out:\n - Run: git worktree list --porcelain\n - If branch {{base_ref}} is checked out in path P, use that P.\n - If not checked out anywhere, use current worktree as P by checking out {{base_ref}} there.\n3. In P, verify current branch is {{base_ref}}.\n4. If P has uncommitted changes, stash them: git -C P stash push -u -m \"kanban-pre-cherry-pick\"\n5. Cherry-pick the task commit into P.\n6. If cherry-pick conflicts, resolve carefully, preserving both the intended task changes and existing user edits.\n7. If a stash was created, restore it with: git -C P stash pop\n8. If stash pop conflicts, resolve them while preserving pre-existing user edits.\n9. Report:\n - Final commit hash\n - Final commit message\n - Whether stash was used\n - Whether conflicts were resolved\n - Any remaining manual follow-up needed`;\nconst DEFAULT_OPEN_PR_PROMPT_TEMPLATE = `You are in a worktree on a detached HEAD. When you are finished with the task, open a pull request against {{base_ref}}.\n\n- Do not run destructive commands: git reset --hard, git clean -fdx, git worktree remove, rm/mv on repository paths.\n- Do not modify the base worktree.\n- Keep all PR preparation in the current task worktree.\n\nSteps:\n1. Ensure all intended changes are committed in the current task worktree.\n2. If currently on detached HEAD, create a branch at the current commit in this worktree.\n3. Push the branch to origin and set upstream.\n4. Create a pull request with base {{base_ref}} and head as the pushed branch (use gh CLI if available).\n5. If a pull request already exists for the same head and base, return that existing PR URL instead of creating a duplicate.\n6. If PR creation is blocked, explain exactly why and provide the exact commands to complete it manually.\n7. Report:\n - PR title: PR URL\n - Base branch\n - Head branch\n - Any follow-up needed`;\n\nexport function pickBestInstalledAgentIdFromDetected(detectedCommands: readonly string[]): RuntimeAgentId | null {\n\tconst detected = new Set(detectedCommands);\n\tfor (const agentId of AUTO_SELECT_AGENT_PRIORITY) {\n\t\tif (detected.has(agentId)) {\n\t\t\treturn agentId;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction getRuntimeHomePath(): string {\n\treturn join(homedir(), RUNTIME_HOME_PARENT_DIR, RUNTIME_HOME_DIR);\n}\n\nfunction normalizeAgentId(agentId: RuntimeAgentId | string | null | undefined): RuntimeAgentId {\n\tif (\n\t\t(agentId === \"claude\" ||\n\t\t\tagentId === \"codex\" ||\n\t\t\tagentId === \"gemini\" ||\n\t\t\tagentId === \"opencode\" ||\n\t\t\tagentId === \"droid\" ||\n\t\t\tagentId === \"cline\") &&\n\t\tisRuntimeAgentLaunchSupported(agentId)\n\t) {\n\t\treturn agentId;\n\t}\n\treturn DEFAULT_AGENT_ID;\n}\n\nfunction pickBestInstalledAgentId(): RuntimeAgentId | null {\n\treturn pickBestInstalledAgentIdFromDetected(detectInstalledCommands());\n}\n\nfunction normalizeShortcut(shortcut: RuntimeProjectShortcut): RuntimeProjectShortcut | null {\n\tif (!shortcut || typeof shortcut !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst label = typeof shortcut.label === \"string\" ? shortcut.label.trim() : \"\";\n\tconst command = typeof shortcut.command === \"string\" ? shortcut.command.trim() : \"\";\n\tconst icon = typeof shortcut.icon === \"string\" ? shortcut.icon.trim() : \"\";\n\n\tif (!label || !command) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tlabel,\n\t\tcommand,\n\t\ticon: icon || undefined,\n\t};\n}\n\nfunction normalizeShortcuts(shortcuts: RuntimeProjectShortcut[] | null | undefined): RuntimeProjectShortcut[] {\n\tif (!Array.isArray(shortcuts)) {\n\t\treturn [];\n\t}\n\tconst normalized: RuntimeProjectShortcut[] = [];\n\tfor (const shortcut of shortcuts) {\n\t\tconst parsed = normalizeShortcut(shortcut);\n\t\tif (parsed) {\n\t\t\tnormalized.push(parsed);\n\t\t}\n\t}\n\treturn normalized;\n}\n\nfunction normalizePromptTemplate(value: unknown, fallback: string): string {\n\tif (typeof value !== \"string\") {\n\t\treturn fallback;\n\t}\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? value : fallback;\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n\tif (typeof value === \"boolean\") {\n\t\treturn value;\n\t}\n\treturn fallback;\n}\n\nfunction normalizeShortcutLabel(value: unknown): string | null {\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction hasOwnKey<T extends object>(value: T | null, key: keyof T): boolean {\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn Object.hasOwn(value, key);\n}\n\nexport function getRuntimeGlobalConfigPath(): string {\n\treturn join(getRuntimeHomePath(), CONFIG_FILENAME);\n}\n\nexport function getRuntimeProjectConfigPath(cwd: string): string {\n\treturn join(resolve(cwd), PROJECT_CONFIG_PARENT_DIR, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILENAME);\n}\n\nfunction getRuntimeConfigLockRequests(cwd: string): LockRequest[] {\n\treturn [\n\t\t{\n\t\t\tpath: getRuntimeGlobalConfigPath(),\n\t\t\ttype: \"file\",\n\t\t},\n\t\t{\n\t\t\tpath: getRuntimeProjectConfigPath(cwd),\n\t\t\ttype: \"file\",\n\t\t},\n\t];\n}\n\nfunction toRuntimeConfigState({\n\tglobalConfigPath,\n\tprojectConfigPath,\n\tglobalConfig,\n\tprojectConfig,\n}: {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tglobalConfig: RuntimeGlobalConfigFileShape | null;\n\tprojectConfig: RuntimeProjectConfigFileShape | null;\n}): RuntimeConfigState {\n\treturn {\n\t\tglobalConfigPath,\n\t\tprojectConfigPath,\n\t\tselectedAgentId: normalizeAgentId(globalConfig?.selectedAgentId),\n\t\tselectedShortcutLabel: normalizeShortcutLabel(globalConfig?.selectedShortcutLabel),\n\t\tagentAutonomousModeEnabled: normalizeBoolean(\n\t\t\tglobalConfig?.agentAutonomousModeEnabled,\n\t\t\tDEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED,\n\t\t),\n\t\treadyForReviewNotificationsEnabled: normalizeBoolean(\n\t\t\tglobalConfig?.readyForReviewNotificationsEnabled,\n\t\t\tDEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED,\n\t\t),\n\t\tshortcuts: normalizeShortcuts(projectConfig?.shortcuts),\n\t\tcommitPromptTemplate: normalizePromptTemplate(globalConfig?.commitPromptTemplate, DEFAULT_COMMIT_PROMPT_TEMPLATE),\n\t\topenPrPromptTemplate: normalizePromptTemplate(\n\t\t\tglobalConfig?.openPrPromptTemplate,\n\t\t\tDEFAULT_OPEN_PR_PROMPT_TEMPLATE,\n\t\t),\n\t\tcommitPromptTemplateDefault: DEFAULT_COMMIT_PROMPT_TEMPLATE,\n\t\topenPrPromptTemplateDefault: DEFAULT_OPEN_PR_PROMPT_TEMPLATE,\n\t};\n}\n\nasync function readRuntimeConfigFile<T>(configPath: string): Promise<T | null> {\n\ttry {\n\t\tconst raw = await readFile(configPath, \"utf8\");\n\t\treturn JSON.parse(raw) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeRuntimeGlobalConfigFile(\n\tconfigPath: string,\n\tconfig: {\n\t\tselectedAgentId?: RuntimeAgentId;\n\t\tselectedShortcutLabel?: string | null;\n\t\tagentAutonomousModeEnabled?: boolean;\n\t\treadyForReviewNotificationsEnabled?: boolean;\n\t\tcommitPromptTemplate?: string;\n\t\topenPrPromptTemplate?: string;\n\t},\n): Promise<void> {\n\tconst existing = await readRuntimeConfigFile<RuntimeGlobalConfigFileShape>(configPath);\n\tconst selectedAgentId = config.selectedAgentId === undefined ? undefined : normalizeAgentId(config.selectedAgentId);\n\tconst existingSelectedAgentId = hasOwnKey(existing, \"selectedAgentId\")\n\t\t? normalizeAgentId(existing?.selectedAgentId)\n\t\t: undefined;\n\tconst selectedShortcutLabel =\n\t\tconfig.selectedShortcutLabel === undefined ? undefined : normalizeShortcutLabel(config.selectedShortcutLabel);\n\tconst existingSelectedShortcutLabel = hasOwnKey(existing, \"selectedShortcutLabel\")\n\t\t? normalizeShortcutLabel(existing?.selectedShortcutLabel)\n\t\t: undefined;\n\tconst agentAutonomousModeEnabled =\n\t\tconfig.agentAutonomousModeEnabled === undefined\n\t\t\t? DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED\n\t\t\t: normalizeBoolean(config.agentAutonomousModeEnabled, DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED);\n\tconst readyForReviewNotificationsEnabled =\n\t\tconfig.readyForReviewNotificationsEnabled === undefined\n\t\t\t? DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED\n\t\t\t: normalizeBoolean(config.readyForReviewNotificationsEnabled, DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED);\n\tconst commitPromptTemplate =\n\t\tconfig.commitPromptTemplate === undefined\n\t\t\t? DEFAULT_COMMIT_PROMPT_TEMPLATE\n\t\t\t: normalizePromptTemplate(config.commitPromptTemplate, DEFAULT_COMMIT_PROMPT_TEMPLATE);\n\tconst openPrPromptTemplate =\n\t\tconfig.openPrPromptTemplate === undefined\n\t\t\t? DEFAULT_OPEN_PR_PROMPT_TEMPLATE\n\t\t\t: normalizePromptTemplate(config.openPrPromptTemplate, DEFAULT_OPEN_PR_PROMPT_TEMPLATE);\n\n\tconst payload: RuntimeGlobalConfigFileShape = {};\n\tif (selectedAgentId !== undefined) {\n\t\tif (hasOwnKey(existing, \"selectedAgentId\") || selectedAgentId !== DEFAULT_AGENT_ID) {\n\t\t\tpayload.selectedAgentId = selectedAgentId;\n\t\t}\n\t} else if (existingSelectedAgentId !== undefined) {\n\t\tpayload.selectedAgentId = existingSelectedAgentId;\n\t}\n\tif (selectedShortcutLabel !== undefined) {\n\t\tif (selectedShortcutLabel) {\n\t\t\tpayload.selectedShortcutLabel = selectedShortcutLabel;\n\t\t}\n\t} else if (existingSelectedShortcutLabel) {\n\t\tpayload.selectedShortcutLabel = existingSelectedShortcutLabel;\n\t}\n\tif (\n\t\thasOwnKey(existing, \"agentAutonomousModeEnabled\") ||\n\t\tagentAutonomousModeEnabled !== DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED\n\t) {\n\t\tpayload.agentAutonomousModeEnabled = agentAutonomousModeEnabled;\n\t}\n\tif (\n\t\thasOwnKey(existing, \"readyForReviewNotificationsEnabled\") ||\n\t\treadyForReviewNotificationsEnabled !== DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED\n\t) {\n\t\tpayload.readyForReviewNotificationsEnabled = readyForReviewNotificationsEnabled;\n\t}\n\tif (hasOwnKey(existing, \"commitPromptTemplate\") || commitPromptTemplate !== DEFAULT_COMMIT_PROMPT_TEMPLATE) {\n\t\tpayload.commitPromptTemplate = commitPromptTemplate;\n\t}\n\tif (hasOwnKey(existing, \"openPrPromptTemplate\") || openPrPromptTemplate !== DEFAULT_OPEN_PR_PROMPT_TEMPLATE) {\n\t\tpayload.openPrPromptTemplate = openPrPromptTemplate;\n\t}\n\n\tawait lockedFileSystem.writeJsonFileAtomic(configPath, payload, {\n\t\tlock: null,\n\t});\n}\n\nasync function writeRuntimeProjectConfigFile(\n\tconfigPath: string,\n\tconfig: { shortcuts: RuntimeProjectShortcut[] },\n): Promise<void> {\n\tconst normalizedShortcuts = normalizeShortcuts(config.shortcuts);\n\tif (normalizedShortcuts.length === 0) {\n\t\tawait rm(configPath, { force: true });\n\t\ttry {\n\t\t\tawait rm(dirname(configPath));\n\t\t} catch {\n\t\t\t// Ignore missing or non-empty project config directories.\n\t\t}\n\t\treturn;\n\t}\n\tawait lockedFileSystem.writeJsonFileAtomic(\n\t\tconfigPath,\n\t\t{\n\t\t\tshortcuts: normalizedShortcuts,\n\t\t} satisfies RuntimeProjectConfigFileShape,\n\t\t{\n\t\t\tlock: null,\n\t\t},\n\t);\n}\n\ninterface RuntimeConfigFiles {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tglobalConfig: RuntimeGlobalConfigFileShape | null;\n\tprojectConfig: RuntimeProjectConfigFileShape | null;\n}\n\nasync function readRuntimeConfigFiles(cwd: string): Promise<RuntimeConfigFiles> {\n\tconst globalConfigPath = getRuntimeGlobalConfigPath();\n\tconst projectConfigPath = getRuntimeProjectConfigPath(cwd);\n\treturn {\n\t\tglobalConfigPath,\n\t\tprojectConfigPath,\n\t\tglobalConfig: await readRuntimeConfigFile<RuntimeGlobalConfigFileShape>(globalConfigPath),\n\t\tprojectConfig: await readRuntimeConfigFile<RuntimeProjectConfigFileShape>(projectConfigPath),\n\t};\n}\n\nasync function loadRuntimeConfigLocked(cwd: string): Promise<RuntimeConfigState> {\n\tconst configFiles = await readRuntimeConfigFiles(cwd);\n\tif (configFiles.globalConfig === null) {\n\t\tconst autoSelectedAgentId = pickBestInstalledAgentId();\n\t\tif (autoSelectedAgentId) {\n\t\t\tawait writeRuntimeGlobalConfigFile(configFiles.globalConfigPath, {\n\t\t\t\tselectedAgentId: autoSelectedAgentId,\n\t\t\t});\n\t\t\tconfigFiles.globalConfig = {\n\t\t\t\tselectedAgentId: autoSelectedAgentId,\n\t\t\t};\n\t\t}\n\t}\n\treturn toRuntimeConfigState(configFiles);\n}\n\nfunction createRuntimeConfigStateFromValues(input: {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tselectedAgentId: RuntimeAgentId;\n\tselectedShortcutLabel: string | null;\n\tagentAutonomousModeEnabled: boolean;\n\treadyForReviewNotificationsEnabled: boolean;\n\tshortcuts: RuntimeProjectShortcut[];\n\tcommitPromptTemplate: string;\n\topenPrPromptTemplate: string;\n}): RuntimeConfigState {\n\treturn {\n\t\tglobalConfigPath: input.globalConfigPath,\n\t\tprojectConfigPath: input.projectConfigPath,\n\t\tselectedAgentId: normalizeAgentId(input.selectedAgentId),\n\t\tselectedShortcutLabel: normalizeShortcutLabel(input.selectedShortcutLabel),\n\t\tagentAutonomousModeEnabled: normalizeBoolean(\n\t\t\tinput.agentAutonomousModeEnabled,\n\t\t\tDEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED,\n\t\t),\n\t\treadyForReviewNotificationsEnabled: normalizeBoolean(\n\t\t\tinput.readyForReviewNotificationsEnabled,\n\t\t\tDEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED,\n\t\t),\n\t\tshortcuts: normalizeShortcuts(input.shortcuts),\n\t\tcommitPromptTemplate: normalizePromptTemplate(input.commitPromptTemplate, DEFAULT_COMMIT_PROMPT_TEMPLATE),\n\t\topenPrPromptTemplate: normalizePromptTemplate(input.openPrPromptTemplate, DEFAULT_OPEN_PR_PROMPT_TEMPLATE),\n\t\tcommitPromptTemplateDefault: DEFAULT_COMMIT_PROMPT_TEMPLATE,\n\t\topenPrPromptTemplateDefault: DEFAULT_OPEN_PR_PROMPT_TEMPLATE,\n\t};\n}\n\nexport async function loadRuntimeConfig(cwd: string): Promise<RuntimeConfigState> {\n\tconst configFiles = await readRuntimeConfigFiles(cwd);\n\tif (configFiles.globalConfig !== null) {\n\t\treturn toRuntimeConfigState(configFiles);\n\t}\n\treturn await lockedFileSystem.withLocks(\n\t\tgetRuntimeConfigLockRequests(cwd),\n\t\tasync () => await loadRuntimeConfigLocked(cwd),\n\t);\n}\n\nexport async function saveRuntimeConfig(\n\tcwd: string,\n\tconfig: {\n\t\tselectedAgentId: RuntimeAgentId;\n\t\tselectedShortcutLabel: string | null;\n\t\tagentAutonomousModeEnabled: boolean;\n\t\treadyForReviewNotificationsEnabled: boolean;\n\t\tshortcuts: RuntimeProjectShortcut[];\n\t\tcommitPromptTemplate: string;\n\t\topenPrPromptTemplate: string;\n\t},\n): Promise<RuntimeConfigState> {\n\tconst globalConfigPath = getRuntimeGlobalConfigPath();\n\tconst projectConfigPath = getRuntimeProjectConfigPath(cwd);\n\treturn await lockedFileSystem.withLocks(getRuntimeConfigLockRequests(cwd), async () => {\n\t\tawait writeRuntimeGlobalConfigFile(globalConfigPath, {\n\t\t\tselectedAgentId: config.selectedAgentId,\n\t\t\tselectedShortcutLabel: config.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: config.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: config.readyForReviewNotificationsEnabled,\n\t\t\tcommitPromptTemplate: config.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: config.openPrPromptTemplate,\n\t\t});\n\t\tawait writeRuntimeProjectConfigFile(projectConfigPath, { shortcuts: config.shortcuts });\n\t\treturn createRuntimeConfigStateFromValues({\n\t\t\tglobalConfigPath,\n\t\t\tprojectConfigPath,\n\t\t\tselectedAgentId: config.selectedAgentId,\n\t\t\tselectedShortcutLabel: config.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: config.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: config.readyForReviewNotificationsEnabled,\n\t\t\tshortcuts: config.shortcuts,\n\t\t\tcommitPromptTemplate: config.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: config.openPrPromptTemplate,\n\t\t});\n\t});\n}\n\nexport async function updateRuntimeConfig(cwd: string, updates: RuntimeConfigUpdateInput): Promise<RuntimeConfigState> {\n\tconst globalConfigPath = getRuntimeGlobalConfigPath();\n\tconst projectConfigPath = getRuntimeProjectConfigPath(cwd);\n\treturn await lockedFileSystem.withLocks(getRuntimeConfigLockRequests(cwd), async () => {\n\t\tconst current = await loadRuntimeConfigLocked(cwd);\n\t\tconst nextConfig = {\n\t\t\tselectedAgentId: updates.selectedAgentId ?? current.selectedAgentId,\n\t\t\tselectedShortcutLabel:\n\t\t\t\tupdates.selectedShortcutLabel === undefined ? current.selectedShortcutLabel : updates.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: updates.agentAutonomousModeEnabled ?? current.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled:\n\t\t\t\tupdates.readyForReviewNotificationsEnabled ?? current.readyForReviewNotificationsEnabled,\n\t\t\tshortcuts: updates.shortcuts ?? current.shortcuts,\n\t\t\tcommitPromptTemplate: updates.commitPromptTemplate ?? current.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: updates.openPrPromptTemplate ?? current.openPrPromptTemplate,\n\t\t};\n\n\t\tconst hasChanges =\n\t\t\tnextConfig.selectedAgentId !== current.selectedAgentId ||\n\t\t\tnextConfig.selectedShortcutLabel !== current.selectedShortcutLabel ||\n\t\t\tnextConfig.agentAutonomousModeEnabled !== current.agentAutonomousModeEnabled ||\n\t\t\tnextConfig.readyForReviewNotificationsEnabled !== current.readyForReviewNotificationsEnabled ||\n\t\t\tnextConfig.commitPromptTemplate !== current.commitPromptTemplate ||\n\t\t\tnextConfig.openPrPromptTemplate !== current.openPrPromptTemplate ||\n\t\t\t!areRuntimeProjectShortcutsEqual(nextConfig.shortcuts, current.shortcuts);\n\n\t\tif (!hasChanges) {\n\t\t\treturn current;\n\t\t}\n\n\t\tawait writeRuntimeGlobalConfigFile(globalConfigPath, {\n\t\t\tselectedAgentId: nextConfig.selectedAgentId,\n\t\t\tselectedShortcutLabel: nextConfig.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,\n\t\t\tcommitPromptTemplate: nextConfig.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: nextConfig.openPrPromptTemplate,\n\t\t});\n\t\tawait writeRuntimeProjectConfigFile(projectConfigPath, {\n\t\t\tshortcuts: nextConfig.shortcuts,\n\t\t});\n\t\treturn createRuntimeConfigStateFromValues({\n\t\t\tglobalConfigPath,\n\t\t\tprojectConfigPath,\n\t\t\tselectedAgentId: nextConfig.selectedAgentId,\n\t\t\tselectedShortcutLabel: nextConfig.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,\n\t\t\tshortcuts: nextConfig.shortcuts,\n\t\t\tcommitPromptTemplate: nextConfig.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: nextConfig.openPrPromptTemplate,\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"runtime-config.js","sourceRoot":"","sources":["../../src/config/runtime-config.ts"],"names":[],"mappings":"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","sourcesContent":["// Persists Kanban-owned runtime preferences on disk.\n// This module should store Kanban settings such as selected agents,\n// shortcuts, and prompt templates, not SDK-owned Cline secrets or OAuth data.\nimport { readFile, rm } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport type { RuntimeAgentId, RuntimeProjectShortcut } from \"../core/api-contract.js\";\nimport {\n\tisRuntimeAgentLaunchSupported,\n} from \"../core/agent-catalog.js\";\nimport { type LockRequest, lockedFileSystem } from \"../fs/locked-file-system.js\";\nimport { detectInstalledCommands } from \"../terminal/agent-registry.js\";\nimport { areRuntimeProjectShortcutsEqual } from \"./shortcut-utils.js\";\n\ninterface RuntimeGlobalConfigFileShape {\n\tselectedAgentId?: RuntimeAgentId;\n\tselectedShortcutLabel?: string;\n\tagentAutonomousModeEnabled?: boolean;\n\treadyForReviewNotificationsEnabled?: boolean;\n\tcommitPromptTemplate?: string;\n\topenPrPromptTemplate?: string;\n}\n\ninterface RuntimeProjectConfigFileShape {\n\tshortcuts?: RuntimeProjectShortcut[];\n}\n\nexport interface RuntimeConfigState {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tselectedAgentId: RuntimeAgentId;\n\tselectedShortcutLabel: string | null;\n\tagentAutonomousModeEnabled: boolean;\n\treadyForReviewNotificationsEnabled: boolean;\n\tshortcuts: RuntimeProjectShortcut[];\n\tcommitPromptTemplate: string;\n\topenPrPromptTemplate: string;\n\tcommitPromptTemplateDefault: string;\n\topenPrPromptTemplateDefault: string;\n}\n\nexport interface RuntimeConfigUpdateInput {\n\tselectedAgentId?: RuntimeAgentId;\n\tselectedShortcutLabel?: string | null;\n\tagentAutonomousModeEnabled?: boolean;\n\treadyForReviewNotificationsEnabled?: boolean;\n\tshortcuts?: RuntimeProjectShortcut[];\n\tcommitPromptTemplate?: string;\n\topenPrPromptTemplate?: string;\n}\n\nconst RUNTIME_HOME_PARENT_DIR = \".cline\";\nconst RUNTIME_HOME_DIR = \"kanban\";\nconst CONFIG_FILENAME = \"config.json\";\nconst PROJECT_CONFIG_PARENT_DIR = \".cline\";\nconst PROJECT_CONFIG_DIR = \"kanban\";\nconst PROJECT_CONFIG_FILENAME = \"config.json\";\nconst DEFAULT_AGENT_ID: RuntimeAgentId = \"cline\";\nconst AUTO_SELECT_AGENT_PRIORITY: readonly RuntimeAgentId[] = [\"claude\", \"codex\"];\nconst DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED = true;\nconst DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED = true;\nconst DEFAULT_COMMIT_PROMPT_TEMPLATE = `You are in a worktree on a detached HEAD. When you are finished with the task, commit the working changes onto {{base_ref}}.\n\n- Do not run destructive commands: git reset --hard, git clean -fdx, git worktree remove, rm/mv on repository paths.\n- Do not edit files outside git workflows unless required for conflict resolution.\n- Preserve any pre-existing user uncommitted changes in the base worktree.\n\nSteps:\n1. In the current task worktree, stage and create a commit for the pending task changes.\n2. Find where {{base_ref}} is checked out:\n - Run: git worktree list --porcelain\n - If branch {{base_ref}} is checked out in path P, use that P.\n - If not checked out anywhere, use current worktree as P by checking out {{base_ref}} there.\n3. In P, verify current branch is {{base_ref}}.\n4. If P has uncommitted changes, stash them: git -C P stash push -u -m \"kanban-pre-cherry-pick\"\n5. Cherry-pick the task commit into P.\n6. If cherry-pick conflicts, resolve carefully, preserving both the intended task changes and existing user edits.\n7. If a stash was created, restore it with: git -C P stash pop\n8. If stash pop conflicts, resolve them while preserving pre-existing user edits.\n9. Report:\n - Final commit hash\n - Final commit message\n - Whether stash was used\n - Whether conflicts were resolved\n - Any remaining manual follow-up needed`;\nconst DEFAULT_OPEN_PR_PROMPT_TEMPLATE = `You are in a worktree on a detached HEAD. When you are finished with the task, open a pull request against {{base_ref}}.\n\n- Do not run destructive commands: git reset --hard, git clean -fdx, git worktree remove, rm/mv on repository paths.\n- Do not modify the base worktree.\n- Keep all PR preparation in the current task worktree.\n\nSteps:\n1. Ensure all intended changes are committed in the current task worktree.\n2. If currently on detached HEAD, create a branch at the current commit in this worktree.\n3. Push the branch to origin and set upstream.\n4. Create a pull request with base {{base_ref}} and head as the pushed branch (use gh CLI if available).\n5. If a pull request already exists for the same head and base, return that existing PR URL instead of creating a duplicate.\n6. If PR creation is blocked, explain exactly why and provide the exact commands to complete it manually.\n7. Report:\n - PR title: PR URL\n - Base branch\n - Head branch\n - Any follow-up needed`;\n\nexport function pickBestInstalledAgentIdFromDetected(detectedCommands: readonly string[]): RuntimeAgentId | null {\n\tconst detected = new Set(detectedCommands);\n\tfor (const agentId of AUTO_SELECT_AGENT_PRIORITY) {\n\t\tif (detected.has(agentId)) {\n\t\t\treturn agentId;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction getRuntimeHomePath(): string {\n\treturn join(homedir(), RUNTIME_HOME_PARENT_DIR, RUNTIME_HOME_DIR);\n}\n\nfunction normalizeAgentId(agentId: RuntimeAgentId | string | null | undefined): RuntimeAgentId {\n\tif (\n\t\t(agentId === \"claude\" ||\n\t\t\tagentId === \"codex\" ||\n\t\t\tagentId === \"gemini\" ||\n\t\t\tagentId === \"opencode\" ||\n\t\t\tagentId === \"droid\" ||\n\t\t\tagentId === \"cline\") &&\n\t\tisRuntimeAgentLaunchSupported(agentId)\n\t) {\n\t\treturn agentId;\n\t}\n\treturn DEFAULT_AGENT_ID;\n}\n\nfunction pickBestInstalledAgentId(): RuntimeAgentId | null {\n\treturn pickBestInstalledAgentIdFromDetected(detectInstalledCommands());\n}\n\nfunction normalizeShortcut(shortcut: RuntimeProjectShortcut): RuntimeProjectShortcut | null {\n\tif (!shortcut || typeof shortcut !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst label = typeof shortcut.label === \"string\" ? shortcut.label.trim() : \"\";\n\tconst command = typeof shortcut.command === \"string\" ? shortcut.command.trim() : \"\";\n\tconst icon = typeof shortcut.icon === \"string\" ? shortcut.icon.trim() : \"\";\n\n\tif (!label || !command) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tlabel,\n\t\tcommand,\n\t\ticon: icon || undefined,\n\t};\n}\n\nfunction normalizeShortcuts(shortcuts: RuntimeProjectShortcut[] | null | undefined): RuntimeProjectShortcut[] {\n\tif (!Array.isArray(shortcuts)) {\n\t\treturn [];\n\t}\n\tconst normalized: RuntimeProjectShortcut[] = [];\n\tfor (const shortcut of shortcuts) {\n\t\tconst parsed = normalizeShortcut(shortcut);\n\t\tif (parsed) {\n\t\t\tnormalized.push(parsed);\n\t\t}\n\t}\n\treturn normalized;\n}\n\nfunction normalizePromptTemplate(value: unknown, fallback: string): string {\n\tif (typeof value !== \"string\") {\n\t\treturn fallback;\n\t}\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? value : fallback;\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n\tif (typeof value === \"boolean\") {\n\t\treturn value;\n\t}\n\treturn fallback;\n}\n\nfunction normalizeShortcutLabel(value: unknown): string | null {\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction hasOwnKey<T extends object>(value: T | null, key: keyof T): boolean {\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn Object.hasOwn(value, key);\n}\n\nexport function getRuntimeGlobalConfigPath(): string {\n\treturn join(getRuntimeHomePath(), CONFIG_FILENAME);\n}\n\nexport function getRuntimeProjectConfigPath(cwd: string): string {\n\treturn join(resolve(cwd), PROJECT_CONFIG_PARENT_DIR, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILENAME);\n}\n\nfunction getRuntimeConfigLockRequests(cwd: string): LockRequest[] {\n\treturn [\n\t\t{\n\t\t\tpath: getRuntimeGlobalConfigPath(),\n\t\t\ttype: \"file\",\n\t\t},\n\t\t{\n\t\t\tpath: getRuntimeProjectConfigPath(cwd),\n\t\t\ttype: \"file\",\n\t\t},\n\t];\n}\n\nfunction toRuntimeConfigState({\n\tglobalConfigPath,\n\tprojectConfigPath,\n\tglobalConfig,\n\tprojectConfig,\n}: {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tglobalConfig: RuntimeGlobalConfigFileShape | null;\n\tprojectConfig: RuntimeProjectConfigFileShape | null;\n}): RuntimeConfigState {\n\treturn {\n\t\tglobalConfigPath,\n\t\tprojectConfigPath,\n\t\tselectedAgentId: normalizeAgentId(globalConfig?.selectedAgentId),\n\t\tselectedShortcutLabel: normalizeShortcutLabel(globalConfig?.selectedShortcutLabel),\n\t\tagentAutonomousModeEnabled: normalizeBoolean(\n\t\t\tglobalConfig?.agentAutonomousModeEnabled,\n\t\t\tDEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED,\n\t\t),\n\t\treadyForReviewNotificationsEnabled: normalizeBoolean(\n\t\t\tglobalConfig?.readyForReviewNotificationsEnabled,\n\t\t\tDEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED,\n\t\t),\n\t\tshortcuts: normalizeShortcuts(projectConfig?.shortcuts),\n\t\tcommitPromptTemplate: normalizePromptTemplate(globalConfig?.commitPromptTemplate, DEFAULT_COMMIT_PROMPT_TEMPLATE),\n\t\topenPrPromptTemplate: normalizePromptTemplate(\n\t\t\tglobalConfig?.openPrPromptTemplate,\n\t\t\tDEFAULT_OPEN_PR_PROMPT_TEMPLATE,\n\t\t),\n\t\tcommitPromptTemplateDefault: DEFAULT_COMMIT_PROMPT_TEMPLATE,\n\t\topenPrPromptTemplateDefault: DEFAULT_OPEN_PR_PROMPT_TEMPLATE,\n\t};\n}\n\nasync function readRuntimeConfigFile<T>(configPath: string): Promise<T | null> {\n\ttry {\n\t\tconst raw = await readFile(configPath, \"utf8\");\n\t\treturn JSON.parse(raw) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeRuntimeGlobalConfigFile(\n\tconfigPath: string,\n\tconfig: {\n\t\tselectedAgentId?: RuntimeAgentId;\n\t\tselectedShortcutLabel?: string | null;\n\t\tagentAutonomousModeEnabled?: boolean;\n\t\treadyForReviewNotificationsEnabled?: boolean;\n\t\tcommitPromptTemplate?: string;\n\t\topenPrPromptTemplate?: string;\n\t},\n): Promise<void> {\n\tconst existing = await readRuntimeConfigFile<RuntimeGlobalConfigFileShape>(configPath);\n\tconst selectedAgentId = config.selectedAgentId === undefined ? undefined : normalizeAgentId(config.selectedAgentId);\n\tconst existingSelectedAgentId = hasOwnKey(existing, \"selectedAgentId\")\n\t\t? normalizeAgentId(existing?.selectedAgentId)\n\t\t: undefined;\n\tconst selectedShortcutLabel =\n\t\tconfig.selectedShortcutLabel === undefined ? undefined : normalizeShortcutLabel(config.selectedShortcutLabel);\n\tconst existingSelectedShortcutLabel = hasOwnKey(existing, \"selectedShortcutLabel\")\n\t\t? normalizeShortcutLabel(existing?.selectedShortcutLabel)\n\t\t: undefined;\n\tconst agentAutonomousModeEnabled =\n\t\tconfig.agentAutonomousModeEnabled === undefined\n\t\t\t? DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED\n\t\t\t: normalizeBoolean(config.agentAutonomousModeEnabled, DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED);\n\tconst readyForReviewNotificationsEnabled =\n\t\tconfig.readyForReviewNotificationsEnabled === undefined\n\t\t\t? DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED\n\t\t\t: normalizeBoolean(config.readyForReviewNotificationsEnabled, DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED);\n\tconst commitPromptTemplate =\n\t\tconfig.commitPromptTemplate === undefined\n\t\t\t? DEFAULT_COMMIT_PROMPT_TEMPLATE\n\t\t\t: normalizePromptTemplate(config.commitPromptTemplate, DEFAULT_COMMIT_PROMPT_TEMPLATE);\n\tconst openPrPromptTemplate =\n\t\tconfig.openPrPromptTemplate === undefined\n\t\t\t? DEFAULT_OPEN_PR_PROMPT_TEMPLATE\n\t\t\t: normalizePromptTemplate(config.openPrPromptTemplate, DEFAULT_OPEN_PR_PROMPT_TEMPLATE);\n\n\tconst payload: RuntimeGlobalConfigFileShape = {};\n\tif (selectedAgentId !== undefined) {\n\t\tif (hasOwnKey(existing, \"selectedAgentId\") || selectedAgentId !== DEFAULT_AGENT_ID) {\n\t\t\tpayload.selectedAgentId = selectedAgentId;\n\t\t}\n\t} else if (existingSelectedAgentId !== undefined) {\n\t\tpayload.selectedAgentId = existingSelectedAgentId;\n\t}\n\tif (selectedShortcutLabel !== undefined) {\n\t\tif (selectedShortcutLabel) {\n\t\t\tpayload.selectedShortcutLabel = selectedShortcutLabel;\n\t\t}\n\t} else if (existingSelectedShortcutLabel) {\n\t\tpayload.selectedShortcutLabel = existingSelectedShortcutLabel;\n\t}\n\tif (\n\t\thasOwnKey(existing, \"agentAutonomousModeEnabled\") ||\n\t\tagentAutonomousModeEnabled !== DEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED\n\t) {\n\t\tpayload.agentAutonomousModeEnabled = agentAutonomousModeEnabled;\n\t}\n\tif (\n\t\thasOwnKey(existing, \"readyForReviewNotificationsEnabled\") ||\n\t\treadyForReviewNotificationsEnabled !== DEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED\n\t) {\n\t\tpayload.readyForReviewNotificationsEnabled = readyForReviewNotificationsEnabled;\n\t}\n\tif (hasOwnKey(existing, \"commitPromptTemplate\") || commitPromptTemplate !== DEFAULT_COMMIT_PROMPT_TEMPLATE) {\n\t\tpayload.commitPromptTemplate = commitPromptTemplate;\n\t}\n\tif (hasOwnKey(existing, \"openPrPromptTemplate\") || openPrPromptTemplate !== DEFAULT_OPEN_PR_PROMPT_TEMPLATE) {\n\t\tpayload.openPrPromptTemplate = openPrPromptTemplate;\n\t}\n\n\tawait lockedFileSystem.writeJsonFileAtomic(configPath, payload, {\n\t\tlock: null,\n\t});\n}\n\nasync function writeRuntimeProjectConfigFile(\n\tconfigPath: string,\n\tconfig: { shortcuts: RuntimeProjectShortcut[] },\n): Promise<void> {\n\tconst normalizedShortcuts = normalizeShortcuts(config.shortcuts);\n\tif (normalizedShortcuts.length === 0) {\n\t\tawait rm(configPath, { force: true });\n\t\ttry {\n\t\t\tawait rm(dirname(configPath));\n\t\t} catch {\n\t\t\t// Ignore missing or non-empty project config directories.\n\t\t}\n\t\treturn;\n\t}\n\tawait lockedFileSystem.writeJsonFileAtomic(\n\t\tconfigPath,\n\t\t{\n\t\t\tshortcuts: normalizedShortcuts,\n\t\t} satisfies RuntimeProjectConfigFileShape,\n\t\t{\n\t\t\tlock: null,\n\t\t},\n\t);\n}\n\ninterface RuntimeConfigFiles {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tglobalConfig: RuntimeGlobalConfigFileShape | null;\n\tprojectConfig: RuntimeProjectConfigFileShape | null;\n}\n\nasync function readRuntimeConfigFiles(cwd: string): Promise<RuntimeConfigFiles> {\n\tconst globalConfigPath = getRuntimeGlobalConfigPath();\n\tconst projectConfigPath = getRuntimeProjectConfigPath(cwd);\n\treturn {\n\t\tglobalConfigPath,\n\t\tprojectConfigPath,\n\t\tglobalConfig: await readRuntimeConfigFile<RuntimeGlobalConfigFileShape>(globalConfigPath),\n\t\tprojectConfig: await readRuntimeConfigFile<RuntimeProjectConfigFileShape>(projectConfigPath),\n\t};\n}\n\nasync function loadRuntimeConfigLocked(cwd: string): Promise<RuntimeConfigState> {\n\tconst configFiles = await readRuntimeConfigFiles(cwd);\n\tif (configFiles.globalConfig === null) {\n\t\tconst autoSelectedAgentId = pickBestInstalledAgentId();\n\t\tif (autoSelectedAgentId) {\n\t\t\tawait writeRuntimeGlobalConfigFile(configFiles.globalConfigPath, {\n\t\t\t\tselectedAgentId: autoSelectedAgentId,\n\t\t\t});\n\t\t\tconfigFiles.globalConfig = {\n\t\t\t\tselectedAgentId: autoSelectedAgentId,\n\t\t\t};\n\t\t}\n\t}\n\treturn toRuntimeConfigState(configFiles);\n}\n\nfunction createRuntimeConfigStateFromValues(input: {\n\tglobalConfigPath: string;\n\tprojectConfigPath: string;\n\tselectedAgentId: RuntimeAgentId;\n\tselectedShortcutLabel: string | null;\n\tagentAutonomousModeEnabled: boolean;\n\treadyForReviewNotificationsEnabled: boolean;\n\tshortcuts: RuntimeProjectShortcut[];\n\tcommitPromptTemplate: string;\n\topenPrPromptTemplate: string;\n}): RuntimeConfigState {\n\treturn {\n\t\tglobalConfigPath: input.globalConfigPath,\n\t\tprojectConfigPath: input.projectConfigPath,\n\t\tselectedAgentId: normalizeAgentId(input.selectedAgentId),\n\t\tselectedShortcutLabel: normalizeShortcutLabel(input.selectedShortcutLabel),\n\t\tagentAutonomousModeEnabled: normalizeBoolean(\n\t\t\tinput.agentAutonomousModeEnabled,\n\t\t\tDEFAULT_AGENT_AUTONOMOUS_MODE_ENABLED,\n\t\t),\n\t\treadyForReviewNotificationsEnabled: normalizeBoolean(\n\t\t\tinput.readyForReviewNotificationsEnabled,\n\t\t\tDEFAULT_READY_FOR_REVIEW_NOTIFICATIONS_ENABLED,\n\t\t),\n\t\tshortcuts: normalizeShortcuts(input.shortcuts),\n\t\tcommitPromptTemplate: normalizePromptTemplate(input.commitPromptTemplate, DEFAULT_COMMIT_PROMPT_TEMPLATE),\n\t\topenPrPromptTemplate: normalizePromptTemplate(input.openPrPromptTemplate, DEFAULT_OPEN_PR_PROMPT_TEMPLATE),\n\t\tcommitPromptTemplateDefault: DEFAULT_COMMIT_PROMPT_TEMPLATE,\n\t\topenPrPromptTemplateDefault: DEFAULT_OPEN_PR_PROMPT_TEMPLATE,\n\t};\n}\n\nexport async function loadRuntimeConfig(cwd: string): Promise<RuntimeConfigState> {\n\tconst configFiles = await readRuntimeConfigFiles(cwd);\n\tif (configFiles.globalConfig !== null) {\n\t\treturn toRuntimeConfigState(configFiles);\n\t}\n\treturn await lockedFileSystem.withLocks(\n\t\tgetRuntimeConfigLockRequests(cwd),\n\t\tasync () => await loadRuntimeConfigLocked(cwd),\n\t);\n}\n\nexport async function saveRuntimeConfig(\n\tcwd: string,\n\tconfig: {\n\t\tselectedAgentId: RuntimeAgentId;\n\t\tselectedShortcutLabel: string | null;\n\t\tagentAutonomousModeEnabled: boolean;\n\t\treadyForReviewNotificationsEnabled: boolean;\n\t\tshortcuts: RuntimeProjectShortcut[];\n\t\tcommitPromptTemplate: string;\n\t\topenPrPromptTemplate: string;\n\t},\n): Promise<RuntimeConfigState> {\n\tconst globalConfigPath = getRuntimeGlobalConfigPath();\n\tconst projectConfigPath = getRuntimeProjectConfigPath(cwd);\n\treturn await lockedFileSystem.withLocks(getRuntimeConfigLockRequests(cwd), async () => {\n\t\tawait writeRuntimeGlobalConfigFile(globalConfigPath, {\n\t\t\tselectedAgentId: config.selectedAgentId,\n\t\t\tselectedShortcutLabel: config.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: config.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: config.readyForReviewNotificationsEnabled,\n\t\t\tcommitPromptTemplate: config.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: config.openPrPromptTemplate,\n\t\t});\n\t\tawait writeRuntimeProjectConfigFile(projectConfigPath, { shortcuts: config.shortcuts });\n\t\treturn createRuntimeConfigStateFromValues({\n\t\t\tglobalConfigPath,\n\t\t\tprojectConfigPath,\n\t\t\tselectedAgentId: config.selectedAgentId,\n\t\t\tselectedShortcutLabel: config.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: config.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: config.readyForReviewNotificationsEnabled,\n\t\t\tshortcuts: config.shortcuts,\n\t\t\tcommitPromptTemplate: config.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: config.openPrPromptTemplate,\n\t\t});\n\t});\n}\n\nexport async function updateRuntimeConfig(cwd: string, updates: RuntimeConfigUpdateInput): Promise<RuntimeConfigState> {\n\tconst globalConfigPath = getRuntimeGlobalConfigPath();\n\tconst projectConfigPath = getRuntimeProjectConfigPath(cwd);\n\treturn await lockedFileSystem.withLocks(getRuntimeConfigLockRequests(cwd), async () => {\n\t\tconst current = await loadRuntimeConfigLocked(cwd);\n\t\tconst nextConfig = {\n\t\t\tselectedAgentId: updates.selectedAgentId ?? current.selectedAgentId,\n\t\t\tselectedShortcutLabel:\n\t\t\t\tupdates.selectedShortcutLabel === undefined ? current.selectedShortcutLabel : updates.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: updates.agentAutonomousModeEnabled ?? current.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled:\n\t\t\t\tupdates.readyForReviewNotificationsEnabled ?? current.readyForReviewNotificationsEnabled,\n\t\t\tshortcuts: updates.shortcuts ?? current.shortcuts,\n\t\t\tcommitPromptTemplate: updates.commitPromptTemplate ?? current.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: updates.openPrPromptTemplate ?? current.openPrPromptTemplate,\n\t\t};\n\n\t\tconst hasChanges =\n\t\t\tnextConfig.selectedAgentId !== current.selectedAgentId ||\n\t\t\tnextConfig.selectedShortcutLabel !== current.selectedShortcutLabel ||\n\t\t\tnextConfig.agentAutonomousModeEnabled !== current.agentAutonomousModeEnabled ||\n\t\t\tnextConfig.readyForReviewNotificationsEnabled !== current.readyForReviewNotificationsEnabled ||\n\t\t\tnextConfig.commitPromptTemplate !== current.commitPromptTemplate ||\n\t\t\tnextConfig.openPrPromptTemplate !== current.openPrPromptTemplate ||\n\t\t\t!areRuntimeProjectShortcutsEqual(nextConfig.shortcuts, current.shortcuts);\n\n\t\tif (!hasChanges) {\n\t\t\treturn current;\n\t\t}\n\n\t\tawait writeRuntimeGlobalConfigFile(globalConfigPath, {\n\t\t\tselectedAgentId: nextConfig.selectedAgentId,\n\t\t\tselectedShortcutLabel: nextConfig.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,\n\t\t\tcommitPromptTemplate: nextConfig.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: nextConfig.openPrPromptTemplate,\n\t\t});\n\t\tawait writeRuntimeProjectConfigFile(projectConfigPath, {\n\t\t\tshortcuts: nextConfig.shortcuts,\n\t\t});\n\t\treturn createRuntimeConfigStateFromValues({\n\t\t\tglobalConfigPath,\n\t\t\tprojectConfigPath,\n\t\t\tselectedAgentId: nextConfig.selectedAgentId,\n\t\t\tselectedShortcutLabel: nextConfig.selectedShortcutLabel,\n\t\t\tagentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,\n\t\t\treadyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,\n\t\t\tshortcuts: nextConfig.shortcuts,\n\t\t\tcommitPromptTemplate: nextConfig.commitPromptTemplate,\n\t\t\topenPrPromptTemplate: nextConfig.openPrPromptTemplate,\n\t\t});\n\t});\n}\n\nexport async function updateGlobalRuntimeConfig(\n\tcurrent: RuntimeConfigState,\n\tupdates: RuntimeConfigUpdateInput,\n): Promise<RuntimeConfigState> {\n\tconst globalConfigPath = getRuntimeGlobalConfigPath();\n\treturn await lockedFileSystem.withLocks(\n\t\t[\n\t\t\t{\n\t\t\t\tpath: globalConfigPath,\n\t\t\t\ttype: \"file\",\n\t\t\t},\n\t\t],\n\t\tasync () => {\n\t\t\tconst nextConfig = {\n\t\t\t\tselectedAgentId: updates.selectedAgentId ?? current.selectedAgentId,\n\t\t\t\tselectedShortcutLabel:\n\t\t\t\t\tupdates.selectedShortcutLabel === undefined ? current.selectedShortcutLabel : updates.selectedShortcutLabel,\n\t\t\t\tagentAutonomousModeEnabled: updates.agentAutonomousModeEnabled ?? current.agentAutonomousModeEnabled,\n\t\t\t\treadyForReviewNotificationsEnabled:\n\t\t\t\t\tupdates.readyForReviewNotificationsEnabled ?? current.readyForReviewNotificationsEnabled,\n\t\t\t\tshortcuts: current.shortcuts,\n\t\t\t\tcommitPromptTemplate: updates.commitPromptTemplate ?? current.commitPromptTemplate,\n\t\t\t\topenPrPromptTemplate: updates.openPrPromptTemplate ?? current.openPrPromptTemplate,\n\t\t\t};\n\n\t\t\tconst hasChanges =\n\t\t\t\tnextConfig.selectedAgentId !== current.selectedAgentId ||\n\t\t\t\tnextConfig.selectedShortcutLabel !== current.selectedShortcutLabel ||\n\t\t\t\tnextConfig.agentAutonomousModeEnabled !== current.agentAutonomousModeEnabled ||\n\t\t\t\tnextConfig.readyForReviewNotificationsEnabled !== current.readyForReviewNotificationsEnabled ||\n\t\t\t\tnextConfig.commitPromptTemplate !== current.commitPromptTemplate ||\n\t\t\t\tnextConfig.openPrPromptTemplate !== current.openPrPromptTemplate;\n\n\t\t\tif (!hasChanges) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tawait writeRuntimeGlobalConfigFile(globalConfigPath, {\n\t\t\t\tselectedAgentId: nextConfig.selectedAgentId,\n\t\t\t\tselectedShortcutLabel: nextConfig.selectedShortcutLabel,\n\t\t\t\tagentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,\n\t\t\t\treadyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,\n\t\t\t\tcommitPromptTemplate: nextConfig.commitPromptTemplate,\n\t\t\t\topenPrPromptTemplate: nextConfig.openPrPromptTemplate,\n\t\t\t});\n\n\t\t\treturn createRuntimeConfigStateFromValues({\n\t\t\t\tglobalConfigPath,\n\t\t\t\tprojectConfigPath: current.projectConfigPath,\n\t\t\t\tselectedAgentId: nextConfig.selectedAgentId,\n\t\t\t\tselectedShortcutLabel: nextConfig.selectedShortcutLabel,\n\t\t\t\tagentAutonomousModeEnabled: nextConfig.agentAutonomousModeEnabled,\n\t\t\t\treadyForReviewNotificationsEnabled: nextConfig.readyForReviewNotificationsEnabled,\n\t\t\t\tshortcuts: nextConfig.shortcuts,\n\t\t\t\tcommitPromptTemplate: nextConfig.commitPromptTemplate,\n\t\t\t\topenPrPromptTemplate: nextConfig.openPrPromptTemplate,\n\t\t\t});\n\t\t},\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-server.d.ts","sourceRoot":"","sources":["../../src/server/runtime-server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAQxG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAQ7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,UAAU,6BAA6B;IACtC,eAAe,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,+BAA+B;IAC/C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,iCAAiC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC9G,8BAA8B,EAAE,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjF,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACzE,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,gBAAgB,EAAE,CACjB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QACT,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAC/B,KACG,6BAA6B,CAAC;IACnC,uCAAuC,EAAE,CAAC,KAAK,EAAE,6BAA6B,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACxG,iCAAiC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAqBD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,+BAA+B,GAAG,OAAO,CAAC,aAAa,CAAC,CAsNvG"}
1
+ {"version":3,"file":"runtime-server.d.ts","sourceRoot":"","sources":["../../src/server/runtime-server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAQxG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAQ7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,UAAU,6BAA6B;IACtC,eAAe,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,+BAA+B;IAC/C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,iCAAiC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC9G,8BAA8B,EAAE,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjF,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACzE,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,gBAAgB,EAAE,CACjB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QACT,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAC/B,KACG,6BAA6B,CAAC;IACnC,uCAAuC,EAAE,CAAC,KAAK,EAAE,6BAA6B,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACxG,iCAAiC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAqBD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,+BAA+B,GAAG,OAAO,CAAC,aAAa,CAAC,CAuNvG"}
@@ -88,6 +88,7 @@ export async function createRuntimeServer(deps) {
88
88
  workspaceScope: scope.workspaceScope,
89
89
  runtimeApi: createRuntimeApi({
90
90
  getActiveWorkspaceId: deps.workspaceRegistry.getActiveWorkspaceId,
91
+ getActiveRuntimeConfig: deps.workspaceRegistry.getActiveRuntimeConfig,
91
92
  loadScopedRuntimeConfig: deps.workspaceRegistry.loadScopedRuntimeConfig,
92
93
  setActiveRuntimeConfig: deps.workspaceRegistry.setActiveRuntimeConfig,
93
94
  getScopedTerminalManager,
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-server.js","sourceRoot":"","sources":["../../src/server/runtime-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage } from \"node:http\";\nimport { join } from \"node:path\";\n\nimport { createHTTPHandler } from \"@trpc/server/adapters/standalone\";\n\nimport {\n\tcreateInMemoryClineTaskSessionService,\n\ttype ClineTaskSessionService,\n} from \"../cline-sdk/cline-task-session-service.js\";\nimport type { RuntimeCommandRunResponse, RuntimeWorkspaceStateResponse } from \"../core/api-contract.js\";\nimport {\n\tbuildKanbanRuntimeUrl,\n\tgetKanbanRuntimeOrigin,\n\tgetKanbanRuntimePort,\n\tgetKanbanRuntimeHost,\n} from \"../core/runtime-endpoint.js\";\nimport { loadWorkspaceContextById } from \"../state/workspace-state.js\";\nimport type { TerminalSessionManager } from \"../terminal/session-manager.js\";\nimport { createTerminalWebSocketBridge } from \"../terminal/ws-server.js\";\nimport { type RuntimeTrpcContext, type RuntimeTrpcWorkspaceScope, runtimeAppRouter } from \"../trpc/app-router.js\";\nimport { createHooksApi } from \"../trpc/hooks-api.js\";\nimport { createProjectsApi } from \"../trpc/projects-api.js\";\nimport { createRuntimeApi } from \"../trpc/runtime-api.js\";\nimport { createWorkspaceApi } from \"../trpc/workspace-api.js\";\nimport { getWebUiDir, normalizeRequestPath, readAsset } from \"./assets.js\";\nimport type { RuntimeStateHub } from \"./runtime-state-hub.js\";\nimport type { WorkspaceRegistry } from \"./workspace-registry.js\";\n\ninterface DisposeTrackedWorkspaceResult {\n\tterminalManager: TerminalSessionManager | null;\n\tworkspacePath: string | null;\n}\n\nexport interface CreateRuntimeServerDependencies {\n\tworkspaceRegistry: WorkspaceRegistry;\n\truntimeStateHub: RuntimeStateHub;\n\twarn: (message: string) => void;\n\tensureTerminalManagerForWorkspace: (workspaceId: string, repoPath: string) => Promise<TerminalSessionManager>;\n\tresolveInteractiveShellCommand: () => { binary: string; args: string[] };\n\trunCommand: (command: string, cwd: string) => Promise<RuntimeCommandRunResponse>;\n\tresolveProjectInputPath: (inputPath: string, basePath: string) => string;\n\tassertPathIsDirectory: (targetPath: string) => Promise<void>;\n\thasGitRepository: (path: string) => boolean;\n\tdisposeWorkspace: (\n\t\tworkspaceId: string,\n\t\toptions?: {\n\t\t\tstopTerminalSessions?: boolean;\n\t\t},\n\t) => DisposeTrackedWorkspaceResult;\n\tcollectProjectWorktreeTaskIdsForRemoval: (board: RuntimeWorkspaceStateResponse[\"board\"]) => Set<string>;\n\tpickDirectoryPathFromSystemDialog: () => string | null;\n}\n\nexport interface RuntimeServer {\n\turl: string;\n\tclose: () => Promise<void>;\n}\n\nfunction readWorkspaceIdFromRequest(request: IncomingMessage, requestUrl: URL): string | null {\n\tconst headerValue = request.headers[\"x-kanban-workspace-id\"];\n\tconst headerWorkspaceId = Array.isArray(headerValue) ? headerValue[0] : headerValue;\n\tif (typeof headerWorkspaceId === \"string\") {\n\t\tconst normalized = headerWorkspaceId.trim();\n\t\tif (normalized) {\n\t\t\treturn normalized;\n\t\t}\n\t}\n\tconst queryWorkspaceId = requestUrl.searchParams.get(\"workspaceId\");\n\tif (typeof queryWorkspaceId === \"string\") {\n\t\tconst normalized = queryWorkspaceId.trim();\n\t\tif (normalized) {\n\t\t\treturn normalized;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport async function createRuntimeServer(deps: CreateRuntimeServerDependencies): Promise<RuntimeServer> {\n\tconst webUiDir = getWebUiDir();\n\n\ttry {\n\t\tawait readFile(join(webUiDir, \"index.html\"));\n\t} catch {\n\t\tthrow new Error(\"Could not find web UI assets. Run `npm run build` to generate and package the web UI.\");\n\t}\n\n\tconst resolveWorkspaceScopeFromRequest = async (\n\t\trequest: IncomingMessage,\n\t\trequestUrl: URL,\n\t): Promise<{\n\t\trequestedWorkspaceId: string | null;\n\t\tworkspaceScope: RuntimeTrpcWorkspaceScope | null;\n\t}> => {\n\t\tconst requestedWorkspaceId = readWorkspaceIdFromRequest(request, requestUrl);\n\t\tif (!requestedWorkspaceId) {\n\t\t\treturn {\n\t\t\t\trequestedWorkspaceId: null,\n\t\t\t\tworkspaceScope: null,\n\t\t\t};\n\t\t}\n\t\tconst requestedWorkspaceContext = await loadWorkspaceContextById(requestedWorkspaceId);\n\t\tif (!requestedWorkspaceContext) {\n\t\t\treturn {\n\t\t\t\trequestedWorkspaceId,\n\t\t\t\tworkspaceScope: null,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\trequestedWorkspaceId,\n\t\t\tworkspaceScope: {\n\t\t\t\tworkspaceId: requestedWorkspaceContext.workspaceId,\n\t\t\t\tworkspacePath: requestedWorkspaceContext.repoPath,\n\t\t\t},\n\t\t};\n\t};\n\n\tconst getScopedTerminalManager = async (scope: RuntimeTrpcWorkspaceScope): Promise<TerminalSessionManager> =>\n\t\tawait deps.ensureTerminalManagerForWorkspace(scope.workspaceId, scope.workspacePath);\n\tconst clineTaskSessionServiceByWorkspaceId = new Map<string, ClineTaskSessionService>();\n\tconst getScopedClineTaskSessionService = async (\n\t\tscope: RuntimeTrpcWorkspaceScope,\n\t): Promise<ClineTaskSessionService> => {\n\t\tlet service = clineTaskSessionServiceByWorkspaceId.get(scope.workspaceId);\n\t\tif (!service) {\n\t\t\tservice = createInMemoryClineTaskSessionService();\n\t\t\tclineTaskSessionServiceByWorkspaceId.set(scope.workspaceId, service);\n\t\t\tdeps.runtimeStateHub.trackClineTaskSessionService(scope.workspaceId, scope.workspacePath, service);\n\t\t}\n\t\treturn service;\n\t};\n\tconst disposeClineTaskSessionService = (workspaceId: string): void => {\n\t\tconst service = clineTaskSessionServiceByWorkspaceId.get(workspaceId);\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\t\tclineTaskSessionServiceByWorkspaceId.delete(workspaceId);\n\t\tvoid service.dispose();\n\t};\n\n\tconst createTrpcContext = async (req: IncomingMessage): Promise<RuntimeTrpcContext> => {\n\t\tconst requestUrl = new URL(req.url ?? \"/\", \"http://localhost\");\n\t\tconst scope = await resolveWorkspaceScopeFromRequest(req, requestUrl);\n\t\treturn {\n\t\t\trequestedWorkspaceId: scope.requestedWorkspaceId,\n\t\t\tworkspaceScope: scope.workspaceScope,\n\t\t\truntimeApi: createRuntimeApi({\n\t\t\t\tgetActiveWorkspaceId: deps.workspaceRegistry.getActiveWorkspaceId,\n\t\t\t\tloadScopedRuntimeConfig: deps.workspaceRegistry.loadScopedRuntimeConfig,\n\t\t\t\tsetActiveRuntimeConfig: deps.workspaceRegistry.setActiveRuntimeConfig,\n\t\t\t\tgetScopedTerminalManager,\n\t\t\t\t\tgetScopedClineTaskSessionService,\n\t\t\t\tresolveInteractiveShellCommand: deps.resolveInteractiveShellCommand,\n\t\t\t\trunCommand: deps.runCommand,\n\t\t\t}),\n\t\t\tworkspaceApi: createWorkspaceApi({\n\t\t\t\tensureTerminalManagerForWorkspace: deps.ensureTerminalManagerForWorkspace,\n\t\t\t\tgetScopedClineTaskSessionService,\n\t\t\t\tbroadcastRuntimeWorkspaceStateUpdated: deps.runtimeStateHub.broadcastRuntimeWorkspaceStateUpdated,\n\t\t\t\tbroadcastRuntimeProjectsUpdated: deps.runtimeStateHub.broadcastRuntimeProjectsUpdated,\n\t\t\t\tbuildWorkspaceStateSnapshot: deps.workspaceRegistry.buildWorkspaceStateSnapshot,\n\t\t\t}),\n\t\t\tprojectsApi: createProjectsApi({\n\t\t\t\tgetActiveWorkspacePath: deps.workspaceRegistry.getActiveWorkspacePath,\n\t\t\t\tgetActiveWorkspaceId: deps.workspaceRegistry.getActiveWorkspaceId,\n\t\t\t\trememberWorkspace: deps.workspaceRegistry.rememberWorkspace,\n\t\t\t\tsetActiveWorkspace: deps.workspaceRegistry.setActiveWorkspace,\n\t\t\t\tclearActiveWorkspace: deps.workspaceRegistry.clearActiveWorkspace,\n\t\t\t\tresolveProjectInputPath: deps.resolveProjectInputPath,\n\t\t\t\tassertPathIsDirectory: deps.assertPathIsDirectory,\n\t\t\t\thasGitRepository: deps.hasGitRepository,\n\t\t\t\tsummarizeProjectTaskCounts: deps.workspaceRegistry.summarizeProjectTaskCounts,\n\t\t\t\tcreateProjectSummary: deps.workspaceRegistry.createProjectSummary,\n\t\t\t\tbroadcastRuntimeProjectsUpdated: deps.runtimeStateHub.broadcastRuntimeProjectsUpdated,\n\t\t\t\tgetTerminalManagerForWorkspace: deps.workspaceRegistry.getTerminalManagerForWorkspace,\n\t\t\t\tdisposeWorkspace: (workspaceId, options) => {\n\t\t\t\t\tdisposeClineTaskSessionService(workspaceId);\n\t\t\t\t\treturn deps.disposeWorkspace(workspaceId, options);\n\t\t\t\t},\n\t\t\t\tcollectProjectWorktreeTaskIdsForRemoval: deps.collectProjectWorktreeTaskIdsForRemoval,\n\t\t\t\twarn: deps.warn,\n\t\t\t\tbuildProjectsPayload: deps.workspaceRegistry.buildProjectsPayload,\n\t\t\t\tpickDirectoryPathFromSystemDialog: deps.pickDirectoryPathFromSystemDialog,\n\t\t\t}),\n\t\t\thooksApi: createHooksApi({\n\t\t\t\tgetWorkspacePathById: deps.workspaceRegistry.getWorkspacePathById,\n\t\t\t\tensureTerminalManagerForWorkspace: deps.ensureTerminalManagerForWorkspace,\n\t\t\t\tbroadcastRuntimeWorkspaceStateUpdated: deps.runtimeStateHub.broadcastRuntimeWorkspaceStateUpdated,\n\t\t\t\tbroadcastTaskReadyForReview: deps.runtimeStateHub.broadcastTaskReadyForReview,\n\t\t\t}),\n\t\t};\n\t};\n\n\tconst trpcHttpHandler = createHTTPHandler({\n\t\tbasePath: \"/api/trpc/\",\n\t\trouter: runtimeAppRouter,\n\t\tcreateContext: async ({ req }) => await createTrpcContext(req),\n\t});\n\n\tconst server = createServer(async (req, res) => {\n\t\ttry {\n\t\t\tconst requestUrl = new URL(req.url ?? \"/\", \"http://localhost\");\n\t\t\tconst pathname = normalizeRequestPath(requestUrl.pathname);\n\t\t\tif (pathname.startsWith(\"/api/trpc\")) {\n\t\t\t\tawait trpcHttpHandler(req, res);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (pathname.startsWith(\"/api/\")) {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"application/json; charset=utf-8\" });\n\t\t\t\tres.end('{\"error\":\"Not found\"}');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst asset = await readAsset(webUiDir, pathname);\n\t\t\tres.writeHead(200, {\n\t\t\t\t\"Content-Type\": asset.contentType,\n\t\t\t\t\"Cache-Control\": \"no-store\",\n\t\t\t});\n\t\t\tres.end(asset.content);\n\t\t} catch {\n\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n\t\t\tres.end(\"Not Found\");\n\t\t}\n\t});\n\tserver.on(\"upgrade\", (request, socket, head) => {\n\t\tlet requestUrl: URL;\n\t\ttry {\n\t\t\trequestUrl = new URL(request.url ?? \"/\", getKanbanRuntimeOrigin());\n\t\t} catch {\n\t\t\tsocket.destroy();\n\t\t\treturn;\n\t\t}\n\t\tif (normalizeRequestPath(requestUrl.pathname) !== \"/api/runtime/ws\") {\n\t\t\treturn;\n\t\t}\n\t\t(request as IncomingMessage & { __kanbanUpgradeHandled?: boolean }).__kanbanUpgradeHandled = true;\n\t\tconst requestedWorkspaceId = requestUrl.searchParams.get(\"workspaceId\")?.trim() || null;\n\t\tdeps.runtimeStateHub.handleUpgrade(request, socket, head, { requestedWorkspaceId });\n\t});\n\tconst terminalWebSocketBridge = createTerminalWebSocketBridge({\n\t\tserver,\n\t\tresolveTerminalManager: (workspaceId) => deps.workspaceRegistry.getTerminalManagerForWorkspace(workspaceId),\n\t\tisTerminalIoWebSocketPath: (pathname) => normalizeRequestPath(pathname) === \"/api/terminal/io\",\n\t\tisTerminalControlWebSocketPath: (pathname) => normalizeRequestPath(pathname) === \"/api/terminal/control\",\n\t});\n\tserver.on(\"upgrade\", (request, socket) => {\n\t\tconst handled = (request as IncomingMessage & { __kanbanUpgradeHandled?: boolean }).__kanbanUpgradeHandled;\n\t\tif (handled) {\n\t\t\treturn;\n\t\t}\n\t\tsocket.destroy();\n\t});\n\n\tawait new Promise<void>((resolveListen, rejectListen) => {\n\t\tserver.once(\"error\", rejectListen);\n\t\tserver.listen(getKanbanRuntimePort(), getKanbanRuntimeHost(), () => {\n\t\t\tserver.off(\"error\", rejectListen);\n\t\t\tresolveListen();\n\t\t});\n\t});\n\n\tconst address = server.address();\n\tif (!address || typeof address === \"string\") {\n\t\tthrow new Error(\"Failed to start local server.\");\n\t}\n\tconst activeWorkspaceId = deps.workspaceRegistry.getActiveWorkspaceId();\n\tconst url = activeWorkspaceId\n\t\t? buildKanbanRuntimeUrl(`/${encodeURIComponent(activeWorkspaceId)}`)\n\t\t: getKanbanRuntimeOrigin();\n\n\treturn {\n\t\turl,\n\t\tclose: async () => {\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from(clineTaskSessionServiceByWorkspaceId.values()).map(async (service) => {\n\t\t\t\t\tawait service.dispose();\n\t\t\t\t}),\n\t\t\t);\n\t\t\tclineTaskSessionServiceByWorkspaceId.clear();\n\t\t\tawait deps.runtimeStateHub.close();\n\t\t\tawait terminalWebSocketBridge.close();\n\t\t\tawait new Promise<void>((resolveClose, rejectClose) => {\n\t\t\t\tserver.close((error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\trejectClose(error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolveClose();\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"runtime-server.js","sourceRoot":"","sources":["../../src/server/runtime-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage } from \"node:http\";\nimport { join } from \"node:path\";\n\nimport { createHTTPHandler } from \"@trpc/server/adapters/standalone\";\n\nimport {\n\tcreateInMemoryClineTaskSessionService,\n\ttype ClineTaskSessionService,\n} from \"../cline-sdk/cline-task-session-service.js\";\nimport type { RuntimeCommandRunResponse, RuntimeWorkspaceStateResponse } from \"../core/api-contract.js\";\nimport {\n\tbuildKanbanRuntimeUrl,\n\tgetKanbanRuntimeOrigin,\n\tgetKanbanRuntimePort,\n\tgetKanbanRuntimeHost,\n} from \"../core/runtime-endpoint.js\";\nimport { loadWorkspaceContextById } from \"../state/workspace-state.js\";\nimport type { TerminalSessionManager } from \"../terminal/session-manager.js\";\nimport { createTerminalWebSocketBridge } from \"../terminal/ws-server.js\";\nimport { type RuntimeTrpcContext, type RuntimeTrpcWorkspaceScope, runtimeAppRouter } from \"../trpc/app-router.js\";\nimport { createHooksApi } from \"../trpc/hooks-api.js\";\nimport { createProjectsApi } from \"../trpc/projects-api.js\";\nimport { createRuntimeApi } from \"../trpc/runtime-api.js\";\nimport { createWorkspaceApi } from \"../trpc/workspace-api.js\";\nimport { getWebUiDir, normalizeRequestPath, readAsset } from \"./assets.js\";\nimport type { RuntimeStateHub } from \"./runtime-state-hub.js\";\nimport type { WorkspaceRegistry } from \"./workspace-registry.js\";\n\ninterface DisposeTrackedWorkspaceResult {\n\tterminalManager: TerminalSessionManager | null;\n\tworkspacePath: string | null;\n}\n\nexport interface CreateRuntimeServerDependencies {\n\tworkspaceRegistry: WorkspaceRegistry;\n\truntimeStateHub: RuntimeStateHub;\n\twarn: (message: string) => void;\n\tensureTerminalManagerForWorkspace: (workspaceId: string, repoPath: string) => Promise<TerminalSessionManager>;\n\tresolveInteractiveShellCommand: () => { binary: string; args: string[] };\n\trunCommand: (command: string, cwd: string) => Promise<RuntimeCommandRunResponse>;\n\tresolveProjectInputPath: (inputPath: string, basePath: string) => string;\n\tassertPathIsDirectory: (targetPath: string) => Promise<void>;\n\thasGitRepository: (path: string) => boolean;\n\tdisposeWorkspace: (\n\t\tworkspaceId: string,\n\t\toptions?: {\n\t\t\tstopTerminalSessions?: boolean;\n\t\t},\n\t) => DisposeTrackedWorkspaceResult;\n\tcollectProjectWorktreeTaskIdsForRemoval: (board: RuntimeWorkspaceStateResponse[\"board\"]) => Set<string>;\n\tpickDirectoryPathFromSystemDialog: () => string | null;\n}\n\nexport interface RuntimeServer {\n\turl: string;\n\tclose: () => Promise<void>;\n}\n\nfunction readWorkspaceIdFromRequest(request: IncomingMessage, requestUrl: URL): string | null {\n\tconst headerValue = request.headers[\"x-kanban-workspace-id\"];\n\tconst headerWorkspaceId = Array.isArray(headerValue) ? headerValue[0] : headerValue;\n\tif (typeof headerWorkspaceId === \"string\") {\n\t\tconst normalized = headerWorkspaceId.trim();\n\t\tif (normalized) {\n\t\t\treturn normalized;\n\t\t}\n\t}\n\tconst queryWorkspaceId = requestUrl.searchParams.get(\"workspaceId\");\n\tif (typeof queryWorkspaceId === \"string\") {\n\t\tconst normalized = queryWorkspaceId.trim();\n\t\tif (normalized) {\n\t\t\treturn normalized;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport async function createRuntimeServer(deps: CreateRuntimeServerDependencies): Promise<RuntimeServer> {\n\tconst webUiDir = getWebUiDir();\n\n\ttry {\n\t\tawait readFile(join(webUiDir, \"index.html\"));\n\t} catch {\n\t\tthrow new Error(\"Could not find web UI assets. Run `npm run build` to generate and package the web UI.\");\n\t}\n\n\tconst resolveWorkspaceScopeFromRequest = async (\n\t\trequest: IncomingMessage,\n\t\trequestUrl: URL,\n\t): Promise<{\n\t\trequestedWorkspaceId: string | null;\n\t\tworkspaceScope: RuntimeTrpcWorkspaceScope | null;\n\t}> => {\n\t\tconst requestedWorkspaceId = readWorkspaceIdFromRequest(request, requestUrl);\n\t\tif (!requestedWorkspaceId) {\n\t\t\treturn {\n\t\t\t\trequestedWorkspaceId: null,\n\t\t\t\tworkspaceScope: null,\n\t\t\t};\n\t\t}\n\t\tconst requestedWorkspaceContext = await loadWorkspaceContextById(requestedWorkspaceId);\n\t\tif (!requestedWorkspaceContext) {\n\t\t\treturn {\n\t\t\t\trequestedWorkspaceId,\n\t\t\t\tworkspaceScope: null,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\trequestedWorkspaceId,\n\t\t\tworkspaceScope: {\n\t\t\t\tworkspaceId: requestedWorkspaceContext.workspaceId,\n\t\t\t\tworkspacePath: requestedWorkspaceContext.repoPath,\n\t\t\t},\n\t\t};\n\t};\n\n\tconst getScopedTerminalManager = async (scope: RuntimeTrpcWorkspaceScope): Promise<TerminalSessionManager> =>\n\t\tawait deps.ensureTerminalManagerForWorkspace(scope.workspaceId, scope.workspacePath);\n\tconst clineTaskSessionServiceByWorkspaceId = new Map<string, ClineTaskSessionService>();\n\tconst getScopedClineTaskSessionService = async (\n\t\tscope: RuntimeTrpcWorkspaceScope,\n\t): Promise<ClineTaskSessionService> => {\n\t\tlet service = clineTaskSessionServiceByWorkspaceId.get(scope.workspaceId);\n\t\tif (!service) {\n\t\t\tservice = createInMemoryClineTaskSessionService();\n\t\t\tclineTaskSessionServiceByWorkspaceId.set(scope.workspaceId, service);\n\t\t\tdeps.runtimeStateHub.trackClineTaskSessionService(scope.workspaceId, scope.workspacePath, service);\n\t\t}\n\t\treturn service;\n\t};\n\tconst disposeClineTaskSessionService = (workspaceId: string): void => {\n\t\tconst service = clineTaskSessionServiceByWorkspaceId.get(workspaceId);\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\t\tclineTaskSessionServiceByWorkspaceId.delete(workspaceId);\n\t\tvoid service.dispose();\n\t};\n\n\tconst createTrpcContext = async (req: IncomingMessage): Promise<RuntimeTrpcContext> => {\n\t\tconst requestUrl = new URL(req.url ?? \"/\", \"http://localhost\");\n\t\tconst scope = await resolveWorkspaceScopeFromRequest(req, requestUrl);\n\t\treturn {\n\t\t\trequestedWorkspaceId: scope.requestedWorkspaceId,\n\t\t\tworkspaceScope: scope.workspaceScope,\n\t\t\truntimeApi: createRuntimeApi({\n\t\t\t\tgetActiveWorkspaceId: deps.workspaceRegistry.getActiveWorkspaceId,\n\t\t\t\tgetActiveRuntimeConfig: deps.workspaceRegistry.getActiveRuntimeConfig,\n\t\t\t\tloadScopedRuntimeConfig: deps.workspaceRegistry.loadScopedRuntimeConfig,\n\t\t\t\tsetActiveRuntimeConfig: deps.workspaceRegistry.setActiveRuntimeConfig,\n\t\t\t\tgetScopedTerminalManager,\n\t\t\t\tgetScopedClineTaskSessionService,\n\t\t\t\tresolveInteractiveShellCommand: deps.resolveInteractiveShellCommand,\n\t\t\t\trunCommand: deps.runCommand,\n\t\t\t}),\n\t\t\tworkspaceApi: createWorkspaceApi({\n\t\t\t\tensureTerminalManagerForWorkspace: deps.ensureTerminalManagerForWorkspace,\n\t\t\t\tgetScopedClineTaskSessionService,\n\t\t\t\tbroadcastRuntimeWorkspaceStateUpdated: deps.runtimeStateHub.broadcastRuntimeWorkspaceStateUpdated,\n\t\t\t\tbroadcastRuntimeProjectsUpdated: deps.runtimeStateHub.broadcastRuntimeProjectsUpdated,\n\t\t\t\tbuildWorkspaceStateSnapshot: deps.workspaceRegistry.buildWorkspaceStateSnapshot,\n\t\t\t}),\n\t\t\tprojectsApi: createProjectsApi({\n\t\t\t\tgetActiveWorkspacePath: deps.workspaceRegistry.getActiveWorkspacePath,\n\t\t\t\tgetActiveWorkspaceId: deps.workspaceRegistry.getActiveWorkspaceId,\n\t\t\t\trememberWorkspace: deps.workspaceRegistry.rememberWorkspace,\n\t\t\t\tsetActiveWorkspace: deps.workspaceRegistry.setActiveWorkspace,\n\t\t\t\tclearActiveWorkspace: deps.workspaceRegistry.clearActiveWorkspace,\n\t\t\t\tresolveProjectInputPath: deps.resolveProjectInputPath,\n\t\t\t\tassertPathIsDirectory: deps.assertPathIsDirectory,\n\t\t\t\thasGitRepository: deps.hasGitRepository,\n\t\t\t\tsummarizeProjectTaskCounts: deps.workspaceRegistry.summarizeProjectTaskCounts,\n\t\t\t\tcreateProjectSummary: deps.workspaceRegistry.createProjectSummary,\n\t\t\t\tbroadcastRuntimeProjectsUpdated: deps.runtimeStateHub.broadcastRuntimeProjectsUpdated,\n\t\t\t\tgetTerminalManagerForWorkspace: deps.workspaceRegistry.getTerminalManagerForWorkspace,\n\t\t\t\tdisposeWorkspace: (workspaceId, options) => {\n\t\t\t\t\tdisposeClineTaskSessionService(workspaceId);\n\t\t\t\t\treturn deps.disposeWorkspace(workspaceId, options);\n\t\t\t\t},\n\t\t\t\tcollectProjectWorktreeTaskIdsForRemoval: deps.collectProjectWorktreeTaskIdsForRemoval,\n\t\t\t\twarn: deps.warn,\n\t\t\t\tbuildProjectsPayload: deps.workspaceRegistry.buildProjectsPayload,\n\t\t\t\tpickDirectoryPathFromSystemDialog: deps.pickDirectoryPathFromSystemDialog,\n\t\t\t}),\n\t\t\thooksApi: createHooksApi({\n\t\t\t\tgetWorkspacePathById: deps.workspaceRegistry.getWorkspacePathById,\n\t\t\t\tensureTerminalManagerForWorkspace: deps.ensureTerminalManagerForWorkspace,\n\t\t\t\tbroadcastRuntimeWorkspaceStateUpdated: deps.runtimeStateHub.broadcastRuntimeWorkspaceStateUpdated,\n\t\t\t\tbroadcastTaskReadyForReview: deps.runtimeStateHub.broadcastTaskReadyForReview,\n\t\t\t}),\n\t\t};\n\t};\n\n\tconst trpcHttpHandler = createHTTPHandler({\n\t\tbasePath: \"/api/trpc/\",\n\t\trouter: runtimeAppRouter,\n\t\tcreateContext: async ({ req }) => await createTrpcContext(req),\n\t});\n\n\tconst server = createServer(async (req, res) => {\n\t\ttry {\n\t\t\tconst requestUrl = new URL(req.url ?? \"/\", \"http://localhost\");\n\t\t\tconst pathname = normalizeRequestPath(requestUrl.pathname);\n\t\t\tif (pathname.startsWith(\"/api/trpc\")) {\n\t\t\t\tawait trpcHttpHandler(req, res);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (pathname.startsWith(\"/api/\")) {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"application/json; charset=utf-8\" });\n\t\t\t\tres.end('{\"error\":\"Not found\"}');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst asset = await readAsset(webUiDir, pathname);\n\t\t\tres.writeHead(200, {\n\t\t\t\t\"Content-Type\": asset.contentType,\n\t\t\t\t\"Cache-Control\": \"no-store\",\n\t\t\t});\n\t\t\tres.end(asset.content);\n\t\t} catch {\n\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n\t\t\tres.end(\"Not Found\");\n\t\t}\n\t});\n\tserver.on(\"upgrade\", (request, socket, head) => {\n\t\tlet requestUrl: URL;\n\t\ttry {\n\t\t\trequestUrl = new URL(request.url ?? \"/\", getKanbanRuntimeOrigin());\n\t\t} catch {\n\t\t\tsocket.destroy();\n\t\t\treturn;\n\t\t}\n\t\tif (normalizeRequestPath(requestUrl.pathname) !== \"/api/runtime/ws\") {\n\t\t\treturn;\n\t\t}\n\t\t(request as IncomingMessage & { __kanbanUpgradeHandled?: boolean }).__kanbanUpgradeHandled = true;\n\t\tconst requestedWorkspaceId = requestUrl.searchParams.get(\"workspaceId\")?.trim() || null;\n\t\tdeps.runtimeStateHub.handleUpgrade(request, socket, head, { requestedWorkspaceId });\n\t});\n\tconst terminalWebSocketBridge = createTerminalWebSocketBridge({\n\t\tserver,\n\t\tresolveTerminalManager: (workspaceId) => deps.workspaceRegistry.getTerminalManagerForWorkspace(workspaceId),\n\t\tisTerminalIoWebSocketPath: (pathname) => normalizeRequestPath(pathname) === \"/api/terminal/io\",\n\t\tisTerminalControlWebSocketPath: (pathname) => normalizeRequestPath(pathname) === \"/api/terminal/control\",\n\t});\n\tserver.on(\"upgrade\", (request, socket) => {\n\t\tconst handled = (request as IncomingMessage & { __kanbanUpgradeHandled?: boolean }).__kanbanUpgradeHandled;\n\t\tif (handled) {\n\t\t\treturn;\n\t\t}\n\t\tsocket.destroy();\n\t});\n\n\tawait new Promise<void>((resolveListen, rejectListen) => {\n\t\tserver.once(\"error\", rejectListen);\n\t\tserver.listen(getKanbanRuntimePort(), getKanbanRuntimeHost(), () => {\n\t\t\tserver.off(\"error\", rejectListen);\n\t\t\tresolveListen();\n\t\t});\n\t});\n\n\tconst address = server.address();\n\tif (!address || typeof address === \"string\") {\n\t\tthrow new Error(\"Failed to start local server.\");\n\t}\n\tconst activeWorkspaceId = deps.workspaceRegistry.getActiveWorkspaceId();\n\tconst url = activeWorkspaceId\n\t\t? buildKanbanRuntimeUrl(`/${encodeURIComponent(activeWorkspaceId)}`)\n\t\t: getKanbanRuntimeOrigin();\n\n\treturn {\n\t\turl,\n\t\tclose: async () => {\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from(clineTaskSessionServiceByWorkspaceId.values()).map(async (service) => {\n\t\t\t\t\tawait service.dispose();\n\t\t\t\t}),\n\t\t\t);\n\t\t\tclineTaskSessionServiceByWorkspaceId.clear();\n\t\t\tawait deps.runtimeStateHub.close();\n\t\t\tawait terminalWebSocketBridge.close();\n\t\t\tawait new Promise<void>((resolveClose, rejectClose) => {\n\t\t\t\tserver.close((error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\trejectClose(error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolveClose();\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
@@ -8,9 +8,9 @@ export interface RuntimeTrpcContext {
8
8
  requestedWorkspaceId: string | null;
9
9
  workspaceScope: RuntimeTrpcWorkspaceScope | null;
10
10
  runtimeApi: {
11
- loadConfig: (scope: RuntimeTrpcWorkspaceScope) => Promise<RuntimeConfigResponse>;
12
- saveConfig: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeConfigSaveRequest) => Promise<RuntimeConfigResponse>;
13
- saveClineProviderSettings: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeClineProviderSettingsSaveRequest) => Promise<RuntimeClineProviderSettingsSaveResponse>;
11
+ loadConfig: (scope: RuntimeTrpcWorkspaceScope | null) => Promise<RuntimeConfigResponse>;
12
+ saveConfig: (scope: RuntimeTrpcWorkspaceScope | null, input: RuntimeConfigSaveRequest) => Promise<RuntimeConfigResponse>;
13
+ saveClineProviderSettings: (scope: RuntimeTrpcWorkspaceScope | null, input: RuntimeClineProviderSettingsSaveRequest) => Promise<RuntimeClineProviderSettingsSaveResponse>;
14
14
  startTaskSession: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeTaskSessionStartRequest) => Promise<RuntimeTaskSessionStartResponse>;
15
15
  stopTaskSession: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeTaskSessionStopRequest) => Promise<RuntimeTaskSessionStopResponse>;
16
16
  sendTaskSessionInput: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeTaskSessionInputRequest) => Promise<RuntimeTaskSessionInputResponse>;
@@ -18,9 +18,9 @@ export interface RuntimeTrpcContext {
18
18
  sendTaskChatMessage: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeTaskChatSendRequest) => Promise<RuntimeTaskChatSendResponse>;
19
19
  abortTaskChatTurn: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeTaskChatAbortRequest) => Promise<RuntimeTaskChatAbortResponse>;
20
20
  cancelTaskChatTurn: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeTaskChatCancelRequest) => Promise<RuntimeTaskChatCancelResponse>;
21
- getClineProviderCatalog: (scope: RuntimeTrpcWorkspaceScope) => Promise<RuntimeClineProviderCatalogResponse>;
22
- getClineProviderModels: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeClineProviderModelsRequest) => Promise<RuntimeClineProviderModelsResponse>;
23
- runClineProviderOAuthLogin: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeClineOauthLoginRequest) => Promise<RuntimeClineOauthLoginResponse>;
21
+ getClineProviderCatalog: (scope: RuntimeTrpcWorkspaceScope | null) => Promise<RuntimeClineProviderCatalogResponse>;
22
+ getClineProviderModels: (scope: RuntimeTrpcWorkspaceScope | null, input: RuntimeClineProviderModelsRequest) => Promise<RuntimeClineProviderModelsResponse>;
23
+ runClineProviderOAuthLogin: (scope: RuntimeTrpcWorkspaceScope | null, input: RuntimeClineOauthLoginRequest) => Promise<RuntimeClineOauthLoginResponse>;
24
24
  startShellSession: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeShellSessionStartRequest) => Promise<RuntimeShellSessionStartResponse>;
25
25
  runCommand: (scope: RuntimeTrpcWorkspaceScope, input: RuntimeCommandRunRequest) => Promise<RuntimeCommandRunResponse>;
26
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app-router.d.ts","sourceRoot":"","sources":["../../src/trpc/app-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-router.d.ts","sourceRoot":"","sources":["../../src/trpc/app-router.ts"],"names":[],"mappings":"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"}
@@ -49,16 +49,16 @@ const gitSyncActionInputSchema = z.object({
49
49
  });
50
50
  export const runtimeAppRouter = t.router({
51
51
  runtime: t.router({
52
- getConfig: workspaceProcedure.output(runtimeConfigResponseSchema).query(async ({ ctx }) => {
52
+ getConfig: t.procedure.output(runtimeConfigResponseSchema).query(async ({ ctx }) => {
53
53
  return await ctx.runtimeApi.loadConfig(ctx.workspaceScope);
54
54
  }),
55
- saveConfig: workspaceProcedure
55
+ saveConfig: t.procedure
56
56
  .input(runtimeConfigSaveRequestSchema)
57
57
  .output(runtimeConfigResponseSchema)
58
58
  .mutation(async ({ ctx, input }) => {
59
59
  return await ctx.runtimeApi.saveConfig(ctx.workspaceScope, input);
60
60
  }),
61
- saveClineProviderSettings: workspaceProcedure
61
+ saveClineProviderSettings: t.procedure
62
62
  .input(runtimeClineProviderSettingsSaveRequestSchema)
63
63
  .output(runtimeClineProviderSettingsSaveResponseSchema)
64
64
  .mutation(async ({ ctx, input }) => {
@@ -106,18 +106,18 @@ export const runtimeAppRouter = t.router({
106
106
  .mutation(async ({ ctx, input }) => {
107
107
  return await ctx.runtimeApi.cancelTaskChatTurn(ctx.workspaceScope, input);
108
108
  }),
109
- getClineProviderCatalog: workspaceProcedure
109
+ getClineProviderCatalog: t.procedure
110
110
  .output(runtimeClineProviderCatalogResponseSchema)
111
111
  .query(async ({ ctx }) => {
112
112
  return await ctx.runtimeApi.getClineProviderCatalog(ctx.workspaceScope);
113
113
  }),
114
- getClineProviderModels: workspaceProcedure
114
+ getClineProviderModels: t.procedure
115
115
  .input(runtimeClineProviderModelsRequestSchema)
116
116
  .output(runtimeClineProviderModelsResponseSchema)
117
117
  .query(async ({ ctx, input }) => {
118
118
  return await ctx.runtimeApi.getClineProviderModels(ctx.workspaceScope, input);
119
119
  }),
120
- runClineProviderOAuthLogin: workspaceProcedure
120
+ runClineProviderOAuthLogin: t.procedure
121
121
  .input(runtimeClineOauthLoginRequestSchema)
122
122
  .output(runtimeClineOauthLoginResponseSchema)
123
123
  .mutation(async ({ ctx, input }) => {