refactor(sense-generator): inject provider from index.ts, roles are now sync

Provider resolved once at top level, injected into each build*Role().
Role builders no longer async — they're pure factory calls.

小橘 🍊(NEKO Team)
This commit is contained in:
小橘 2026-04-28 03:56:02 +00:00
parent 21237e19a0
commit 6d3313223f
4 changed files with 18 additions and 21 deletions

View File

@ -3,14 +3,20 @@ import { buildPlannerRole } from "./roles/planner/index.js";
import { buildCoderRole } from "./roles/coder/index.js";
import { buildTesterRole } from "./roles/tester/index.js";
import { moderator } from "./moderator.js";
import { resolveDashScopeProvider } from "./roles/shared.js";
import type { SenseMeta } from "./roles/types.js";
const provider = await resolveDashScopeProvider();
if (provider === null) {
throw new Error("Cannot build workflow: set DASHSCOPE_API_KEY and DASHSCOPE_BASE_URL");
}
const workflow: WorkflowDefinition<SenseMeta> = {
name: "sense-generator",
roles: {
planner: await buildPlannerRole(),
coder: await buildCoderRole(),
tester: await buildTesterRole(),
planner: buildPlannerRole(provider),
coder: buildCoderRole(provider),
tester: buildTesterRole(provider),
},
moderator,
};

View File

@ -1,14 +1,11 @@
import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
import { createCursorRole } from "@uncaged/nerve-workflow-utils";
import { resolveDashScopeProvider, NERVE_ROOT, SENSES_DIR } from "../shared.js";
import { NERVE_ROOT, SENSES_DIR } from "../shared.js";
import { coderMetaSchema } from "../types.js";
import type { SenseMeta } from "../types.js";
import { coderPrompt } from "./prompt.js";
export async function buildCoderRole() {
const provider = await resolveDashScopeProvider();
if (provider === null) {
throw new Error("Cannot create coder: set DASHSCOPE_API_KEY and DASHSCOPE_BASE_URL");
}
export function buildCoderRole(provider: LlmProvider) {
return createCursorRole<SenseMeta["coder"]>({
cwd: NERVE_ROOT,
mode: "default",

View File

@ -1,5 +1,6 @@
import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
import { createCursorRole } from "@uncaged/nerve-workflow-utils";
import { resolveDashScopeProvider, buildSenseExamples, getNerveYaml, NERVE_ROOT } from "../shared.js";
import { buildSenseExamples, getNerveYaml, NERVE_ROOT } from "../shared.js";
import { plannerMetaSchema } from "../types.js";
import type { SenseMeta } from "../types.js";
import { plannerPrompt } from "./prompt.js";
@ -7,11 +8,7 @@ import { plannerPrompt } from "./prompt.js";
const senseExamples = buildSenseExamples();
const nerveYaml = getNerveYaml();
export async function buildPlannerRole() {
const provider = await resolveDashScopeProvider();
if (provider === null) {
throw new Error("Cannot create planner: set DASHSCOPE_API_KEY and DASHSCOPE_BASE_URL");
}
export function buildPlannerRole(provider: LlmProvider) {
return createCursorRole<SenseMeta["planner"]>({
cwd: NERVE_ROOT,
mode: "ask",

View File

@ -1,14 +1,11 @@
import type { LlmProvider } from "@uncaged/nerve-workflow-utils";
import { createHermesRole } from "@uncaged/nerve-workflow-utils";
import { resolveDashScopeProvider, NERVE_ROOT, SENSES_DIR } from "../shared.js";
import { NERVE_ROOT, SENSES_DIR } from "../shared.js";
import { testerMetaSchema } from "../types.js";
import type { SenseMeta } from "../types.js";
import { testerPrompt } from "./prompt.js";
export async function buildTesterRole() {
const provider = await resolveDashScopeProvider();
if (provider === null) {
throw new Error("Cannot create tester: set DASHSCOPE_API_KEY and DASHSCOPE_BASE_URL");
}
export function buildTesterRole(provider: LlmProvider) {
return createHermesRole<SenseMeta["tester"]>({
prompt: async (threadId) => testerPrompt({ threadId, sensesDir: SENSES_DIR, nerveRoot: NERVE_ROOT }),
extract: { provider, schema: testerMetaSchema },