mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-11 12:09:03 +00:00
Phases 5+6 of #1165. Final big extraction: collapses the 6-branch profileInfo.type switch in main() into a single dispatchProfile call. - src/dispatcher/dispatcher-context.ts (40 LOC): ProfileDispatchContext type - src/dispatcher/flows/cliproxy-flow.ts (211 LOC) - src/dispatcher/flows/copilot-flow.ts (66 LOC) - src/dispatcher/flows/cursor-flow.ts (54 LOC) - src/dispatcher/flows/settings-flow.ts (400 LOC) - src/dispatcher/flows/settings-image-analysis-prep.ts (126 LOC): split out per plan to keep settings-flow control flow whole - src/dispatcher/flows/account-flow.ts (63 LOC) - src/dispatcher/flows/default-flow.ts (136 LOC) - src/dispatcher/target-executor.ts (+38 LOC): dispatchProfile switch settings-flow stays at 400 LOC — flow control (3 pre-flight blocks + env construction + 2 dispatch paths) is maximally cohesive. Further splitting would fragment dispatch logic per plan note. process.exit parity preserved exactly (cliproxy non-claude path uses process.exitCode=1; return; others use process.exit(1)). ccs.ts: 1040 -> 170 LOC (-870). Full reduction across phases 1-6: 1775 -> 170 (-1605, -90%). main() body now ~100 LOC of awaited phase calls. Behavior unchanged; full suite passes 1824/1824. Refs #1165
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
/**
|
|
* Copilot dispatch flow — GitHub Copilot subscription via copilot-api proxy.
|
|
*
|
|
* Extracted from src/ccs.ts main() profileInfo.type === 'copilot' branch.
|
|
*/
|
|
|
|
import { fail, info } from '../../utils/ui';
|
|
import { ensureWebSearchMcpOrThrow } from '../../utils/websearch-manager';
|
|
import { ensureImageAnalysisMcpOrThrow } from '../../utils/image-analysis';
|
|
import {
|
|
ensureProfileHooks as ensureImageAnalyzerHooks,
|
|
removeImageAnalysisProfileHook,
|
|
} from '../../utils/hooks/image-analyzer-profile-hook-injector';
|
|
import { prepareImageAnalysisFallbackHook } from '../../utils/hooks';
|
|
import type { ProfileDispatchContext } from '../dispatcher-context';
|
|
|
|
export async function runCopilotFlow(ctx: ProfileDispatchContext): Promise<void> {
|
|
const {
|
|
profileInfo,
|
|
resolvedTarget,
|
|
claudeCli,
|
|
remainingArgs,
|
|
resolveProfileContinuityInheritance,
|
|
} = ctx;
|
|
|
|
ensureWebSearchMcpOrThrow();
|
|
const imageAnalysisMcpReady = ensureImageAnalysisMcpOrThrow();
|
|
if (resolvedTarget === 'claude') {
|
|
if (imageAnalysisMcpReady) {
|
|
removeImageAnalysisProfileHook(profileInfo.name);
|
|
} else {
|
|
const imageAnalysisFallbackHookReady = prepareImageAnalysisFallbackHook();
|
|
ensureImageAnalyzerHooks({
|
|
profileName: profileInfo.name,
|
|
profileType: profileInfo.type,
|
|
sharedHookInstalled: imageAnalysisFallbackHookReady,
|
|
});
|
|
}
|
|
}
|
|
|
|
const { executeCopilotProfile } = await import('../../copilot');
|
|
const copilotConfig = profileInfo.copilotConfig;
|
|
if (!copilotConfig) {
|
|
console.error(fail('Copilot configuration not found'));
|
|
process.exit(1);
|
|
}
|
|
const continuityInheritance = await resolveProfileContinuityInheritance({
|
|
profileName: profileInfo.name,
|
|
profileType: profileInfo.type,
|
|
target: resolvedTarget,
|
|
});
|
|
if (continuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
|
|
console.error(
|
|
info(
|
|
`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`
|
|
)
|
|
);
|
|
}
|
|
const exitCode = await executeCopilotProfile(
|
|
copilotConfig,
|
|
remainingArgs,
|
|
continuityInheritance.claudeConfigDir,
|
|
claudeCli
|
|
);
|
|
process.exit(exitCode);
|
|
}
|