Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
511101a
feat(task-orchestration): add OpenAI Chat console flow
awsldev Jun 27, 2026
906100c
fix(task-orchestration): align precompiled web render with ci
awsldev Jun 27, 2026
ffeeb58
fix(task-orchestration): align vue compiler locks
awsldev Jun 27, 2026
e45b9f6
fix(task-orchestration): close review edge cases
awsldev Jun 27, 2026
2aadac7
feat(task-orchestration): simplify console layout
awsldev Jun 28, 2026
75d9417
fix(task-orchestration): materialize chat artifacts
awsldev Jun 28, 2026
268130c
fix(task-orchestration): preserve web workspace threads
awsldev Jun 28, 2026
0d5a772
fix(task-orchestration): harden artifact run state
awsldev Jun 28, 2026
1c434ac
test(task-orchestration): align e2e assertions
awsldev Jun 28, 2026
d756bc5
feat(task-orchestration): make composer chat-first
awsldev Jun 28, 2026
f986fdb
fix(task-orchestration): close review edge cases
awsldev Jun 28, 2026
ddbb4ea
fix(task-orchestration): render sequential chat context
awsldev Jun 28, 2026
050dac8
fix(task-orchestration): surface sequential request state
awsldev Jun 28, 2026
e20c747
fix(task-orchestration): calm chat panel visuals
awsldev Jun 28, 2026
ab1b573
fix(task-orchestration): expose AI execution details
awsldev Jun 28, 2026
d2359cf
fix(task-orchestration): use semantic active state hook
awsldev Jun 28, 2026
2dc0aa5
feat(task-orchestration): simplify chat composer surface
awsldev Jun 28, 2026
ec560c8
fix(task-orchestration): preserve main background gradient
awsldev Jun 28, 2026
b407cfa
fix(task-orchestration): widen chat composer surface
awsldev Jun 28, 2026
1fa8211
fix(task-orchestration): add compact material context rail
awsldev Jun 28, 2026
fde0af6
feat(task-orchestration): make orchestration panel chat-first
awsldev Jun 28, 2026
e37ac3f
fix(task-orchestration): clear stale quick plans
awsldev Jun 28, 2026
38bf864
fix(task-orchestration): remove preview-only action
awsldev Jun 28, 2026
93f86c9
style(task-orchestration): tighten chat-first transcript
awsldev Jun 28, 2026
c27de8a
style(task-orchestration): widen chat composer gutters
awsldev Jun 28, 2026
a66b7f1
fix(task-orchestration): keep chat controls reachable
awsldev Jun 28, 2026
62b67da
fix(task-orchestration): gate orchestration tab by default
awsldev Jun 28, 2026
9193e28
fix(task-orchestration): prevent composer from covering task thread
awsldev Jun 28, 2026
5374637
fix(task-orchestration): preserve opt-in query on web ui redirect
awsldev Jun 28, 2026
ba2ceb3
style(task-orchestration): align orchestration panel with chat thread
awsldev Jun 28, 2026
16022b0
fix(task-orchestration): make plan preview a chat command
awsldev Jun 28, 2026
1102ece
fix(task-orchestration): align OpenAI chat copy
awsldev Jun 28, 2026
6cb2795
fix(task-orchestration): center composer send action
awsldev Jun 28, 2026
b231913
fix(task-orchestration): keep plan preview dependency-free
awsldev Jun 29, 2026
712b3a6
fix(task-orchestration): show orchestration tab by default
awsldev Jun 29, 2026
ee201a2
fix(task-orchestration): hide stale failed runs from plan previews
awsldev Jun 29, 2026
7be51fa
fix(task-orchestration): keep history details out of chat
awsldev Jun 29, 2026
d61918f
fix(task-orchestration): move config toolbar out of chat
awsldev Jun 29, 2026
2b19c22
fix(task-orchestration): keep settings out of main chat
awsldev Jun 29, 2026
419acce
fix(task-orchestration): remove default chat templates
awsldev Jun 29, 2026
87df246
feat(task-orchestration): add workspace session rail
awsldev Jun 29, 2026
b3e5758
fix(task-orchestration): expose start work action
awsldev Jun 29, 2026
e0b578f
feat(task-orchestration): add web agent cockpit
awsldev Jun 29, 2026
dd6d952
fix(task-orchestration): address cockpit review accessibility
awsldev Jun 29, 2026
d3f7a1d
fix(task-orchestration): surface execution receipts
awsldev Jun 30, 2026
8fa0a53
Revert "fix(task-orchestration): surface execution receipts"
awsldev Jun 30, 2026
edb2f1f
fix(task-orchestration): honor chat provider temperature
awsldev Jun 30, 2026
ce1fc3e
fix(task-orchestration): decouple chat provider from codex config
awsldev Jun 30, 2026
f619b79
fix(orchestration): surface chat results and retry workspace runs
awsldev Jun 30, 2026
c451e1d
fix(orchestration): simplify codex-style chat composer
awsldev Jun 30, 2026
2c045b2
test(orchestration): isolate workspace escape assertions
awsldev Jun 30, 2026
ae043db
fix(orchestration): protect workspace chat context
awsldev Jun 30, 2026
89e5cb6
chore(orchestration): refine tab copy
awsldev Jun 30, 2026
521555d
fix(orchestration): mask private tab context
awsldev Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
327 changes: 203 additions & 124 deletions cli.js

Large diffs are not rendered by default.

46 changes: 31 additions & 15 deletions lib/task-orchestrator.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,22 @@ function buildTaskTitle(target, explicitTitle = '') {
return truncateText(normalizedTarget.replace(/\s+/g, ' '), 96);
}


function normalizeTaskEngine(value) {
const normalized = normalizeId(value, 'openai-chat');
if (normalized === 'workflow') return 'workflow';
// Legacy plans used the name `codex`; the execution base is now OpenAI Chat compatible.
return 'openai-chat';
}

function normalizeTaskNodeKind(value) {
const normalized = normalizeId(value, 'openai-chat');
if (normalized === 'workflow') return 'workflow';
if (normalized === 'codex') return 'openai-chat';
if (normalized === 'openai' || normalized === 'openai-chat' || normalized === 'chat') return 'openai-chat';
return normalized;
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

function normalizeDependencyIds(value = []) {
return uniqueStringList(value)
.map((depId) => normalizeId(depId, ''))
Expand Down Expand Up @@ -193,7 +209,7 @@ function detectDependencyCycle(nodes = []) {
return false;
}

function buildCodexNodePrompt(kind, context = {}) {
function buildOpenAiChatNodePrompt(kind, context = {}) {
const title = normalizeText(context.title, 160);
const target = normalizeText(context.target, 4000);
const item = normalizeText(context.item, 1200);
Expand Down Expand Up @@ -267,7 +283,7 @@ function buildTaskPlan(request = {}, options = {}) {
const workflowMap = normalizeWorkflowCatalog(options.workflowCatalog || []);
const target = normalizeText(request.target, 4000);
const title = buildTaskTitle(target, request.title);
const engine = normalizeId(request.engine, 'codex') === 'workflow' ? 'workflow' : 'codex';
const engine = normalizeTaskEngine(request.engine);
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
const allowWrite = request.allowWrite === true;
const dryRun = request.dryRun === true;
const concurrency = normalizePositiveInteger(request.concurrency, 2, 1, 8);
Expand Down Expand Up @@ -313,8 +329,8 @@ function buildTaskPlan(request = {}, options = {}) {
nodes.push({
id: analysisId,
title: '现状分析',
kind: 'codex',
prompt: buildCodexNodePrompt('analysis', {
kind: 'openai-chat',
prompt: buildOpenAiChatNodePrompt('analysis', {
title,
target,
allowWrite: false
Expand All @@ -333,8 +349,8 @@ function buildTaskPlan(request = {}, options = {}) {
nodes.push({
id: nodeId,
title: truncateText(item, 72) || `执行 ${executionNodeIds.length}`,
kind: 'codex',
prompt: buildCodexNodePrompt('work', {
kind: 'openai-chat',
prompt: buildOpenAiChatNodePrompt('work', {
title,
target,
item,
Expand All @@ -351,8 +367,8 @@ function buildTaskPlan(request = {}, options = {}) {
nodes.push({
id: verifyId,
title: '验证与总结',
kind: 'codex',
prompt: buildCodexNodePrompt('verify', {
kind: 'openai-chat',
prompt: buildOpenAiChatNodePrompt('verify', {
title,
target,
allowWrite: false
Expand All @@ -371,8 +387,8 @@ function buildTaskPlan(request = {}, options = {}) {
nodes.push({
id: nodeId,
title: truncateText(followUp, 72) || `Follow-up ${nodes.length + 1}`,
kind: 'codex',
prompt: buildCodexNodePrompt('follow-up', {
kind: 'openai-chat',
prompt: buildOpenAiChatNodePrompt('follow-up', {
title,
target,
allowWrite,
Expand Down Expand Up @@ -417,7 +433,7 @@ function validateTaskPlan(plan, options = {}) {
}

const workflowMap = normalizeWorkflowCatalog(options.workflowCatalog || []);
const engine = normalizeId(plan.engine, 'codex') === 'workflow' ? 'workflow' : 'codex';
const engine = normalizeTaskEngine(plan.engine);
const workflowIds = uniqueStringList(plan.workflowIds || []).map((id) => normalizeId(id, '')).filter(Boolean);
const nodes = Array.isArray(plan.nodes) ? plan.nodes : [];
if (engine === 'workflow' && workflowIds.length === 0) {
Expand Down Expand Up @@ -445,8 +461,8 @@ function validateTaskPlan(plan, options = {}) {
continue;
}
nodeIds.add(id);
const kind = normalizeId(node.kind, '');
if (kind !== 'workflow' && kind !== 'codex') {
const kind = normalizeTaskNodeKind(node.kind);
if (kind !== 'workflow' && kind !== 'openai-chat') {
issues.push({ code: 'task-node-kind-invalid', message: `task node ${id} has unsupported kind: ${node.kind || ''}` });
}
if (kind === 'workflow') {
Expand All @@ -457,7 +473,7 @@ function validateTaskPlan(plan, options = {}) {
issues.push({ code: 'task-node-workflow-unknown', message: `task node ${id} references unknown workflow: ${workflowId}` });
}
}
if (kind === 'codex' && !normalizeText(node.prompt, 12000)) {
if (kind === 'openai-chat' && !normalizeText(node.prompt, 12000)) {
issues.push({ code: 'task-node-prompt-required', message: `task node ${id} missing prompt` });
}
}
Expand Down Expand Up @@ -492,7 +508,7 @@ function createNodeRunRecord(node, dependencyNodeIds = []) {
return {
id: normalizeId(node && node.id, ''),
title: normalizeText(node && node.title, 160),
kind: normalizeId(node && node.kind, ''),
kind: normalizeTaskNodeKind(node && node.kind),
workflowId: normalizeId(node && node.workflowId, ''),
dependsOn: normalizeDependencyIds(node && node.dependsOn),
dependencyNodeIds: uniqueStringList(dependencyNodeIds),
Expand Down
14 changes: 11 additions & 3 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading