alanbox 0.1.1

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.
Files changed (41) hide show
  1. package/0commondflowv1/AGENTS.md +51 -0
  2. package/0commondflowv1/res/three-lens-review.js +124 -0
  3. package/0commondflowv1/src/AGENTS.md +26 -0
  4. package/0commondflowv1/src/args.js +75 -0
  5. package/0commondflowv1/src/cli.js +121 -0
  6. package/0commondflowv1/src/commands/AGENTS.md +29 -0
  7. package/0commondflowv1/src/commands/doctor.js +17 -0
  8. package/0commondflowv1/src/commands/info.js +33 -0
  9. package/0commondflowv1/src/commands/install.js +247 -0
  10. package/0commondflowv1/src/commands/swarm/auto.js +270 -0
  11. package/0commondflowv1/src/commands/swarm/custom.js +60 -0
  12. package/0commondflowv1/src/commands/swarm/index.js +20 -0
  13. package/0commondflowv1/src/core/AGENTS.md +31 -0
  14. package/0commondflowv1/src/core/handoff.js +100 -0
  15. package/0commondflowv1/src/core/prompt-builder.js +93 -0
  16. package/0commondflowv1/src/core/prompt-templates.js +92 -0
  17. package/0commondflowv1/src/core/storage.js +98 -0
  18. package/0commondflowv1/src/core/swarm-executor.js +167 -0
  19. package/0commondflowv1/src/core/workers.js +172 -0
  20. package/0commondflowv1/src/core/workflow-planner.js +366 -0
  21. package/0commondflowv1/src/core/workflow-storage.js +123 -0
  22. package/0commondflowv1/src/prompt/AGENTS.md +16 -0
  23. package/0commondflowv1/src/prompt/default.md +30 -0
  24. package/0commondflowv1/src/prompt/reviewer.md +59 -0
  25. package/0commondflowv1/src/prompt/synthesizer.md +31 -0
  26. package/0commondflowv1/src/prompt/verifier.md +31 -0
  27. package/0commondflowv1/src/runner/AGENTS.md +24 -0
  28. package/0commondflowv1/src/runner/codex-runner.js +519 -0
  29. package/0commondflowv1/src/runner/config.json +16 -0
  30. package/README.md +31 -0
  31. package/bin/multirunagent.js +15 -0
  32. package/hooks/hooks.json +18 -0
  33. package/mcp/README.md +5 -0
  34. package/package.json +45 -0
  35. package/plugin/AGENTS.md +14 -0
  36. package/plugin/plugin.json +36 -0
  37. package/scripts/sub-codex-hook.ps1 +15 -0
  38. package/skills/AGENTS.md +17 -0
  39. package/skills/aibox-swam/SKILL.md +77 -0
  40. package/skills/sub-codex-doctor/SKILL.md +27 -0
  41. package/skills/sub-codex-swarm/SKILL.md +56 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * handoff 辅助函数。
3
+ * 提取 HANDOFF_JSON,并为后续 worker 构造精简的上游上下文。
4
+ */
5
+
6
+ function buildPriorResultsContext(priorResults) {
7
+ if (priorResults.length === 0) return '';
8
+ return [
9
+ '上游 worker 已完成结果。以下内容来自结构化 handoff memory,请优先参考字段,不要解析完整 stdout:',
10
+ ...priorResults.map((item) => [
11
+ `- ${item.id} (${item.worker}/${item.role})`,
12
+ ` memory key: ${item.memoryKey}`,
13
+ ` memory file: ${item.memoryPath}`,
14
+ ` output file: ${item.outputPath}`,
15
+ ` status: ${item.handoff.value.status}`,
16
+ ` summary: ${item.handoff.value.summary}`,
17
+ item.handoff.value.files.length ? ` files: ${item.handoff.value.files.join(', ')}` : '',
18
+ item.handoff.value.findings.length ? ` findings: ${item.handoff.value.findings.join(';')}` : '',
19
+ item.handoff.value.nextSteps.length ? ` nextSteps: ${item.handoff.value.nextSteps.join(';')}` : '',
20
+ item.handoff.value.verification.length ? ` verification: ${item.handoff.value.verification.join(';')}` : '',
21
+ ].filter(Boolean).join('\n')),
22
+ ].join('\n');
23
+ }
24
+
25
+ function buildWorkerHandoff(task, result, outputPath) {
26
+ const parsed = extractHandoffJson(result.stdout || '');
27
+ const fallbackSummary = compactText(result.stdout || result.stderr).slice(0, 180);
28
+ const value = normalizeHandoff(parsed, {
29
+ status: result.code === 0 ? 'completed' : 'failed',
30
+ summary: fallbackSummary || `worker ${task.id} exited with code ${result.code}`,
31
+ artifacts: [outputPath],
32
+ });
33
+
34
+ if (!value.artifacts.includes(outputPath)) {
35
+ value.artifacts.push(outputPath);
36
+ }
37
+
38
+ return {
39
+ key: `${task.id}-result`,
40
+ namespace: task.namespace,
41
+ worker: task.worker,
42
+ role: task.role,
43
+ parsed: Boolean(parsed),
44
+ value,
45
+ };
46
+ }
47
+
48
+ function extractHandoffJson(text) {
49
+ const source = String(text || '');
50
+ const patterns = [
51
+ /```HANDOFF_JSON\s*([\s\S]*?)```/i,
52
+ /```json\s*([\s\S]*?"status"[\s\S]*?)```/i,
53
+ ];
54
+
55
+ for (const pattern of patterns) {
56
+ const match = source.match(pattern);
57
+ if (!match) continue;
58
+ try {
59
+ return JSON.parse(match[1].trim());
60
+ } catch {
61
+ return null;
62
+ }
63
+ }
64
+
65
+ return null;
66
+ }
67
+
68
+ function normalizeHandoff(value, fallback) {
69
+ const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
70
+ const status = ['completed', 'blocked', 'failed'].includes(source.status) ? source.status : fallback.status;
71
+ return {
72
+ status,
73
+ summary: compactText(source.summary || fallback.summary).slice(0, 240),
74
+ files: normalizeStringArray(source.files),
75
+ findings: normalizeStringArray(source.findings),
76
+ nextSteps: normalizeStringArray(source.nextSteps),
77
+ artifacts: normalizeStringArray(source.artifacts || fallback.artifacts),
78
+ verification: normalizeStringArray(source.verification),
79
+ };
80
+ }
81
+
82
+ function normalizeStringArray(value) {
83
+ if (!Array.isArray(value)) return [];
84
+ return value.map((item) => compactText(item)).filter(Boolean);
85
+ }
86
+
87
+ function compactText(text) {
88
+ return String(text || '').replace(/\s+/g, ' ').trim();
89
+ }
90
+
91
+ module.exports = {
92
+ buildPriorResultsContext,
93
+ buildWorkerHandoff,
94
+ extractHandoffJson,
95
+ normalizeHandoff,
96
+ normalizeStringArray,
97
+ compactText,
98
+ };
99
+
100
+
@@ -0,0 +1,93 @@
1
+ /**
2
+ * prompt 构造辅助函数。
3
+ * 读取共享 context / skill 文件,并生成注入后的 multi-agent prompt。
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+
9
+ function readOptionalFile(filePath, cwd = process.cwd()) {
10
+ if (!filePath) return '';
11
+ const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);
12
+ return fs.readFileSync(resolved, 'utf8').trim();
13
+ }
14
+
15
+ function buildInjectedPrompt(input = {}) {
16
+ const {
17
+ role = 'worker',
18
+ worker = '',
19
+ platform = 'OpenAI Codex',
20
+ cwd = '',
21
+ namespace = 'sub-codex',
22
+ context = '',
23
+ task = '',
24
+ skill = '',
25
+ resultKey = '',
26
+ primary = false,
27
+ } = input;
28
+ const label = worker ? `${worker}/${role}` : role;
29
+ const handoffKey = resultKey || `${namespace}/${label}`;
30
+
31
+ const parts = [
32
+ `你是协作式 multi-agent swarm 中的 ${role.toUpperCase()} agent。`,
33
+ `平台:${platform}`,
34
+ worker ? `当前 worker:${worker}` : '',
35
+ cwd ? `工作目录:${cwd}` : '',
36
+ `共享命名空间:${namespace}`,
37
+ `结果键:${handoffKey}`,
38
+ primary
39
+ ? '职责:主 worker,负责形成可整合的主结论或主实现。'
40
+ : '职责:辅助 worker,负责独立完成分配的子任务,并输出可合并结果。',
41
+ '',
42
+ '协作协议:',
43
+ `1. 关键阶段可以输出短日志,格式为:[${label}][阶段] 内容。`,
44
+ '2. 阶段名称只使用:启动、读取、分析、修改、验证、完成、问题。',
45
+ '3. 只完成 YOUR TASK 分配给你的工作,不扩展到其他 worker 的职责。',
46
+ '4. 如果修改文件,只修改与子任务直接相关的文件。',
47
+ '5. 不要依赖长篇自然语言作为交接结果;最终必须输出结构化交接块。',
48
+ '6. 最终交接块必须是一个 fenced JSON 代码块,代码块标签固定为 HANDOFF_JSON。',
49
+ '7. JSON 必须是单个对象,稳定字段为:status、summary、files、findings、nextSteps、artifacts;可选字段 verification 用来记录验证证据。',
50
+ '8. status 只能是 completed、blocked、failed;files/findings/nextSteps/artifacts/verification 必须是数组。',
51
+ '9. summary 控制在 120 个中文字符以内;findings、nextSteps 和 verification 每项控制在 80 个中文字符以内。',
52
+ '10. 用中文输出。',
53
+ '',
54
+ '最终输出示例:',
55
+ '```HANDOFF_JSON',
56
+ JSON.stringify({
57
+ status: 'completed',
58
+ summary: '完成了指定检查,并记录关键风险。',
59
+ files: ['path/to/file.ts'],
60
+ findings: ['发现的关键问题'],
61
+ nextSteps: ['建议下一步动作'],
62
+ artifacts: ['%USERPROFILE%/.multirunagent/namespace/results/lead.md'],
63
+ verification: ['运行或检查过的证据'],
64
+ }, null, 2),
65
+ '```',
66
+ '',
67
+ context ? `共享背景:\n${context}` : '',
68
+ skill ? `注入 skill / 能力说明:\n${skill}` : '',
69
+ '',
70
+ `YOUR TASK:\n${task}`,
71
+ '',
72
+ '提醒:其他 agent 或主进程会优先读取你的 HANDOFF_JSON。自然语言说明可以有,但必须简短。',
73
+ ];
74
+
75
+ return parts.filter((part) => part !== '').join('\n');
76
+ }
77
+
78
+ function buildContext({ context, contextFile, skillFile, cwd }) {
79
+ const contextFromFile = readOptionalFile(contextFile, cwd);
80
+ const skill = readOptionalFile(skillFile, cwd);
81
+ return {
82
+ context: [context, contextFromFile].filter(Boolean).join('\n\n').trim(),
83
+ skill,
84
+ };
85
+ }
86
+
87
+ module.exports = {
88
+ buildInjectedPrompt,
89
+ buildContext,
90
+ readOptionalFile,
91
+ };
92
+
93
+
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Auto workflow prompt 模板辅助函数。
3
+ * 模板位于 0commondflowv1/src/prompt/<role>.md,role 会先清洗,找不到时回退到 default.md 或内联模板。
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const { sanitizePathPart } = require('./storage');
9
+
10
+ const PROMPT_ROOT = path.resolve(__dirname, '..', 'prompt');
11
+
12
+ function renderRoleTemplate({ role, goal, task, cwd, constraints, expectedState }) {
13
+ const resolution = resolveRoleTemplate(role);
14
+ const variables = {
15
+ role: role || 'worker',
16
+ goal: goal || '',
17
+ task: task || '',
18
+ cwd: cwd || '',
19
+ constraints: constraints || '',
20
+ expectedState: expectedState || '',
21
+ };
22
+ const rendered = applyVariables(resolution.content, variables);
23
+ if (resolution.hasPlaceholders) {
24
+ return { text: rendered, resolution };
25
+ }
26
+
27
+ const text = [
28
+ rendered,
29
+ '',
30
+ '## 本次任务',
31
+ task || goal || '',
32
+ '',
33
+ cwd ? `工作目录:${cwd}` : '',
34
+ constraints ? `补充约束:${constraints}` : '',
35
+ expectedState ? `预期状态变化:${expectedState}` : '',
36
+ ].filter(Boolean).join('\n');
37
+ return { text, resolution };
38
+ }
39
+
40
+ function resolveRoleTemplate(role) {
41
+ const safeRole = sanitizePathPart(String(role || 'default').toLowerCase());
42
+ const candidates = [
43
+ { name: safeRole, path: path.join(PROMPT_ROOT, `${safeRole}.md`) },
44
+ { name: 'default', path: path.join(PROMPT_ROOT, 'default.md') },
45
+ ];
46
+
47
+ for (const candidate of candidates) {
48
+ if (!fs.existsSync(candidate.path)) continue;
49
+ const content = fs.readFileSync(candidate.path, 'utf8').trim();
50
+ return {
51
+ role,
52
+ template: candidate.name,
53
+ path: candidate.path,
54
+ fallback: candidate.name !== safeRole,
55
+ inline: false,
56
+ hasPlaceholders: /{{\s*[A-Za-z]+\s*}}/.test(content),
57
+ content,
58
+ };
59
+ }
60
+
61
+ const content = [
62
+ `你是 {{role}} agent。`,
63
+ '目标:{{goal}}',
64
+ '任务:{{task}}',
65
+ '工作目录:{{cwd}}',
66
+ '约束:{{constraints}}',
67
+ '预期状态变化:{{expectedState}}',
68
+ '请用中文输出,并在最后给出 HANDOFF_JSON。',
69
+ ].join('\n');
70
+ return {
71
+ role,
72
+ template: 'inline-default',
73
+ path: '',
74
+ fallback: true,
75
+ inline: true,
76
+ hasPlaceholders: true,
77
+ content,
78
+ };
79
+ }
80
+
81
+ function applyVariables(template, variables) {
82
+ return String(template || '').replace(/{{\s*([A-Za-z]+)\s*}}/g, (match, key) => {
83
+ if (!Object.prototype.hasOwnProperty.call(variables, key)) return match;
84
+ return String(variables[key] || '');
85
+ });
86
+ }
87
+
88
+ module.exports = {
89
+ PROMPT_ROOT,
90
+ renderRoleTemplate,
91
+ resolveRoleTemplate,
92
+ };
@@ -0,0 +1,98 @@
1
+ /**
2
+ * 本地运行结果存储辅助函数。
3
+ * 把 worker 输出和结构化 handoff memory 写入用户级 .multirunagent。
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+
9
+ function writeWorkerResult(resultDir, task, result) {
10
+ fs.mkdirSync(resultDir, { recursive: true });
11
+ const fileName = `${sanitizePathPart(task.id)}.md`;
12
+ const outputPath = path.join(resultDir, fileName);
13
+ const body = [
14
+ `# ${task.id}`,
15
+ '',
16
+ `worker: ${task.worker}`,
17
+ `role: ${task.role}`,
18
+ `code: ${result.code}`,
19
+ '',
20
+ '## stdout',
21
+ '',
22
+ result.stdout || '',
23
+ '',
24
+ '## stderr',
25
+ '',
26
+ result.stderr || '',
27
+ ].join('\n');
28
+ fs.writeFileSync(outputPath, body, 'utf8');
29
+ return outputPath;
30
+ }
31
+
32
+ function writeMemoryEntry(memoryDir, task, handoff) {
33
+ fs.mkdirSync(memoryDir, { recursive: true });
34
+ const fileName = `${sanitizePathPart(handoff.key)}.json`;
35
+ const memoryPath = path.join(memoryDir, fileName);
36
+ const body = {
37
+ namespace: handoff.namespace,
38
+ key: handoff.key,
39
+ worker: handoff.worker,
40
+ role: handoff.role,
41
+ updatedAt: new Date().toISOString(),
42
+ value: handoff.value,
43
+ };
44
+ fs.writeFileSync(memoryPath, JSON.stringify(body, null, 2), 'utf8');
45
+ updateMemoryIndex(memoryDir, body);
46
+ return memoryPath;
47
+ }
48
+
49
+ function updateMemoryIndex(memoryDir, entry) {
50
+ const indexPath = path.join(memoryDir, 'index.json');
51
+ let index = { entries: [] };
52
+ if (fs.existsSync(indexPath)) {
53
+ try {
54
+ index = JSON.parse(fs.readFileSync(indexPath, 'utf8'));
55
+ } catch {
56
+ index = { entries: [] };
57
+ }
58
+ }
59
+
60
+ const entries = Array.isArray(index.entries) ? index.entries : [];
61
+ const nextEntries = entries.filter((item) => item.key !== entry.key);
62
+ nextEntries.push({
63
+ key: entry.key,
64
+ worker: entry.worker,
65
+ role: entry.role,
66
+ status: entry.value.status,
67
+ summary: entry.value.summary,
68
+ updatedAt: entry.updatedAt,
69
+ });
70
+ fs.writeFileSync(indexPath, JSON.stringify({ entries: nextEntries }, null, 2), 'utf8');
71
+ }
72
+
73
+ function getUserStateRoot() {
74
+ const homeDir = process.env.USERPROFILE || process.env.HOME;
75
+ if (!homeDir) {
76
+ throw new Error('cannot resolve user home directory for multirunagent state');
77
+ }
78
+ return path.join(homeDir, '.multirunagent');
79
+ }
80
+
81
+ function resolveRunDir(namespace) {
82
+ return path.join(getUserStateRoot(), sanitizePathPart(namespace));
83
+ }
84
+
85
+ function sanitizePathPart(value) {
86
+ return String(value || 'default').replace(/[^a-zA-Z0-9_.-]/g, '-').replace(/^-+|-+$/g, '') || 'default';
87
+ }
88
+
89
+ module.exports = {
90
+ writeWorkerResult,
91
+ writeMemoryEntry,
92
+ updateMemoryIndex,
93
+ getUserStateRoot,
94
+ resolveRunDir,
95
+ sanitizePathPart,
96
+ };
97
+
98
+
@@ -0,0 +1,167 @@
1
+ /**
2
+ * 共享 swarm 执行器。
3
+ * 普通 swarm 和 auto workflow 都通过这里执行 task graph,避免复制 runner / handoff / storage 协议。
4
+ */
5
+
6
+ const path = require('path');
7
+ const {
8
+ accountNameForWorker,
9
+ resolveProvider,
10
+ execPrompt,
11
+ } = require('../runner/codex-runner');
12
+ const { buildInjectedPrompt } = require('./prompt-builder');
13
+ const { buildDependencyLevels } = require('./workers');
14
+ const { buildPriorResultsContext, buildWorkerHandoff } = require('./handoff');
15
+ const { writeWorkerResult, writeMemoryEntry } = require('./storage');
16
+
17
+ function buildCommonOptions(args, config) {
18
+ return {
19
+ config,
20
+ model: args.model || args.m,
21
+ profile: args.profile || (!args.auto ? args.p : ''),
22
+ sandbox: args.sandbox || args.s,
23
+ stream: false,
24
+ };
25
+ }
26
+
27
+ async function executeTaskGraph({
28
+ args,
29
+ config,
30
+ cwd,
31
+ tasks,
32
+ namespace,
33
+ runDir,
34
+ resultDir,
35
+ memoryDir,
36
+ injected,
37
+ failOnHandoffStatus = false,
38
+ onTaskStart,
39
+ onTaskFinish,
40
+ }) {
41
+ const commonOptions = buildCommonOptions(args, config);
42
+ const levels = buildDependencyLevels(tasks);
43
+ const startedAt = Date.now();
44
+ const results = [];
45
+ const errors = [];
46
+ const priorResults = [];
47
+
48
+ for (const level of levels) {
49
+ const runs = level.map((task) => {
50
+ const promptContext = [injected.context, buildPriorResultsContext(priorResults)].filter(Boolean).join('\n\n').trim();
51
+ const providerName = task.provider || config.workers?.[task.worker]?.provider || config.defaultProvider || 'codex';
52
+ const prompt = buildInjectedPrompt({
53
+ role: task.role,
54
+ worker: task.worker,
55
+ platform: providerName === 'claude' ? 'Anthropic Claude Code' : 'OpenAI Codex',
56
+ cwd,
57
+ namespace,
58
+ context: promptContext,
59
+ skill: injected.skill,
60
+ task: task.prompt,
61
+ resultKey: `${namespace}/${task.worker}/${task.role}`,
62
+ primary: task.worker === config.primaryWorker,
63
+ });
64
+
65
+ if (typeof onTaskStart === 'function') {
66
+ onTaskStart(task, { priorResults: priorResults.slice() });
67
+ }
68
+ console.error(`[swarm] start ${task.worker}/${task.role}`);
69
+
70
+ return execPrompt(prompt, {
71
+ ...commonOptions,
72
+ worker: task.worker,
73
+ provider: task.provider,
74
+ account: resolveTaskAccount(config, task),
75
+ cwd,
76
+ }).then((result) => ({ task, result }));
77
+ });
78
+
79
+ const settled = await Promise.allSettled(runs);
80
+ for (const item of settled) {
81
+ if (item.status === 'rejected') {
82
+ const message = item.reason?.message || String(item.reason);
83
+ errors.push(message);
84
+ const entry = { ok: false, error: message };
85
+ results.push(entry);
86
+ if (typeof onTaskFinish === 'function') onTaskFinish(null, entry);
87
+ continue;
88
+ }
89
+
90
+ const task = item.value.task;
91
+ const result = item.value.result;
92
+ const okByExit = result.code === 0;
93
+ const outputPath = writeWorkerResult(resultDir, task, result);
94
+ const handoff = buildWorkerHandoff(task, result, outputPath);
95
+ const memoryPath = writeMemoryEntry(memoryDir, task, handoff);
96
+ const handoffParsedOk = !failOnHandoffStatus || handoff.parsed;
97
+ const handoffStatusOk = !failOnHandoffStatus || handoff.value.status === 'completed';
98
+ const handoffOk = handoffParsedOk && handoffStatusOk;
99
+ const ok = okByExit && handoffOk;
100
+ const priorResult = {
101
+ id: task.id,
102
+ worker: task.worker,
103
+ role: task.role,
104
+ outputPath,
105
+ memoryKey: handoff.key,
106
+ memoryPath,
107
+ handoff,
108
+ };
109
+ priorResults.push(priorResult);
110
+
111
+ if (!okByExit) {
112
+ errors.push(`${task.id}: exited with code ${result.code}`);
113
+ } else if (!handoffParsedOk) {
114
+ errors.push(`${task.id}: missing valid HANDOFF_JSON`);
115
+ } else if (!handoffStatusOk) {
116
+ errors.push(`${task.id}: handoff status ${handoff.value.status}`);
117
+ }
118
+
119
+ const entry = {
120
+ ok,
121
+ id: task.id,
122
+ worker: task.worker,
123
+ platform: task.platform,
124
+ role: task.role,
125
+ dependsOn: task.dependsOn,
126
+ code: result.code,
127
+ stdout: result.stdout,
128
+ stderr: result.stderr,
129
+ outputPath,
130
+ memoryKey: handoff.key,
131
+ memoryPath,
132
+ handoff: handoff.value,
133
+ handoffParsed: handoff.parsed,
134
+ };
135
+ results.push(entry);
136
+ if (typeof onTaskFinish === 'function') onTaskFinish(task, entry);
137
+ }
138
+ }
139
+
140
+ return {
141
+ success: errors.length === 0,
142
+ namespace,
143
+ runDir,
144
+ resultDir,
145
+ memoryDir,
146
+ totalDuration: Date.now() - startedAt,
147
+ pipeline: levels.map((level) => level.map((task) => task.id)),
148
+ errors,
149
+ results,
150
+ };
151
+ }
152
+
153
+ function resolveTaskAccount(config, task, workerConfig, provider, providerOverridden) {
154
+ const resolvedWorkerConfig = workerConfig === undefined ? config.workers?.[task.worker] || null : workerConfig;
155
+ const resolvedProvider = provider || resolveProvider(config, task.provider ? { ...(resolvedWorkerConfig || {}), provider: task.provider } : resolvedWorkerConfig);
156
+ const overridden = providerOverridden === undefined
157
+ ? Boolean(task.provider && task.provider !== resolvedWorkerConfig?.provider)
158
+ : providerOverridden;
159
+ return (!overridden && resolvedProvider.name === resolvedWorkerConfig?.provider ? resolvedWorkerConfig?.account : '')
160
+ || (config.accountsDir ? accountNameForWorker(task.worker, resolvedProvider.name) : '')
161
+ || config.defaultAccount;
162
+ }
163
+
164
+ module.exports = {
165
+ buildCommonOptions,
166
+ executeTaskGraph,
167
+ };