(sdk: OpencodeClient, directory: string)
| 718 | } |
| 719 | |
| 720 | async function loadDirectorySnapshot(sdk: OpencodeClient, directory: string) { |
| 721 | return ACPProfile.measure("acp.directory.load", async () => { |
| 722 | const [providersResponse, agentsResponse, commandsResponse, skillsResponse, configResponse] = await Promise.all([ |
| 723 | ACPProfile.measure("acp.directory.provider.list", () => |
| 724 | sdk.config.providers({ directory }, { throwOnError: true }), |
| 725 | ), |
| 726 | ACPProfile.measure("acp.directory.mode.defaultAgent.load", () => |
| 727 | sdk.app.agents({ directory }, { throwOnError: true }), |
| 728 | ), |
| 729 | ACPProfile.measure("acp.directory.command.list", () => sdk.command.list({ directory }, { throwOnError: true })), |
| 730 | ACPProfile.measure("acp.directory.skill.list", () => sdk.app.skills({ directory }, { throwOnError: true })), |
| 731 | ACPProfile.measure("acp.directory.defaultModel.config", () => |
| 732 | sdk.config.get({ directory }, { throwOnError: true }).catch(() => undefined), |
| 733 | ), |
| 734 | ]) |
| 735 | const providersData = providersResponse.data! |
| 736 | const agents = agentsResponse.data! |
| 737 | const commandsData = commandsResponse.data! |
| 738 | const skills = skillsResponse.data! |
| 739 | const providers = Object.fromEntries(providersData.providers.map((provider) => [provider.id, provider])) as Record< |
| 740 | ProviderV2.ID, |
| 741 | Provider.Info |
| 742 | > |
| 743 | const defaultModelStarted = performance.now() |
| 744 | const defaultModel = defaultModelFromConfig(configResponse?.data?.model, providers) |
| 745 | ACPProfile.duration("acp.directory.defaultModel.resolve", defaultModelStarted, { configured: !!defaultModel }) |
| 746 | const modes = agents |
| 747 | .filter((agent) => agent.mode !== "subagent" && agent.hidden !== true) |
| 748 | .map((agent) => ({ |
| 749 | id: agent.name, |
| 750 | name: agent.name, |
| 751 | ...(agent.description ? { description: agent.description } : {}), |
| 752 | })) |
| 753 | const commands = [ |
| 754 | ...commandsData, |
| 755 | ...skills |
| 756 | .filter((skill) => !commandsData.some((command) => command.name === skill.name)) |
| 757 | .map((skill) => ({ |
| 758 | name: skill.name, |
| 759 | description: skill.description, |
| 760 | source: "skill" as const, |
| 761 | template: skill.content, |
| 762 | hints: [], |
| 763 | })), |
| 764 | ] as Command.Info[] |
| 765 | |
| 766 | return Directory.build({ |
| 767 | directory, |
| 768 | providers, |
| 769 | modes, |
| 770 | defaultModeID: agents.find((agent) => agent.mode === "primary" && agent.hidden !== true)?.name ?? "build", |
| 771 | commands: commands.toSorted((a, b) => a.name.localeCompare(b.name)), |
| 772 | ...(defaultModel ? { defaultModel } : {}), |
| 773 | }) |
| 774 | }) |
| 775 | } |
| 776 | |
| 777 | function defaultModelFromConfig( |
no test coverage detected