Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e86d282
Show workflow hand-offs under a chat answer in V2 (Phase 7b)
paullizer Oct 7, 2026
2b91249
Document the V2 workflow hand-off card (Phase 7b)
paullizer Oct 7, 2026
14fccd1
Bump version to 0.261.256 for the V2 workflow hand-off card (Phase 7b)
paullizer Oct 7, 2026
6faf728
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
f41c26c
docs: only an all-matches hand-off query pauses over its limit
paullizer Oct 7, 2026
9ec0d24
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
bee0515
Restore the agent delegation harness_build.py helper for V2 UI tests
paullizer Oct 7, 2026
82377db
Bump version to 0.261.277 for the 7b hand-off card
paullizer Oct 7, 2026
26e1ccb
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
304b915
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
92dc0e1
Bump version to 0.261.279 for the 7b hand-off card
paullizer Oct 7, 2026
f7e4033
Clear the inherited run-links list instead of reassigning it
paullizer Oct 7, 2026
fdd3334
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
ba4706b
Bump version to 0.261.281 for the 7b hand-off card
paullizer Oct 7, 2026
260a044
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
e17426b
Bump version to 0.261.282 for the 7b hand-off card
paullizer Oct 7, 2026
d4f506c
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
bd4e774
Bump version to 0.261.287 for the 7b hand-off card
paullizer Oct 7, 2026
ae2ee7c
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
aa6632c
Bump version to 0.261.288 for the 7b hand-off card
paullizer Oct 7, 2026
041b966
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
b8b49f1
Bump version to 0.261.290 for the 7b hand-off card
paullizer Oct 7, 2026
991a388
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
3c9adb7
Bump version to 0.261.291 for the 7b hand-off card
paullizer Oct 7, 2026
79092ac
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
e21bb75
Bump version to 0.261.293 for the 7b hand-off card
paullizer Oct 7, 2026
cd68803
Merge V2 (paullizer-react-v2-ui) into the 7b hand-off card branch
paullizer Oct 7, 2026
4417d28
Bump version to 0.261.294 for the 7b hand-off card
paullizer Oct 7, 2026
0e8222f
Ignore all foundry_consent harness build outputs
paullizer Oct 7, 2026
1b2598f
Bump version to 0.261.295 for the 7b hand-off card
paullizer Oct 7, 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
2 changes: 1 addition & 1 deletion application/single_app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@
EXECUTOR_TYPE = 'thread'
EXECUTOR_MAX_WORKERS = 30
SESSION_TYPE = 'filesystem'
VERSION = "0.261.293"
VERSION = "0.261.295"
IS_DEVELOPMENT = is_development_env_enabled()

# Opt-out for deployments where App Service Easy Auth is active but the platform
Expand Down
16 changes: 14 additions & 2 deletions application/v2_ui/src/components/chat/MessageList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import { WorkflowProposalCards } from './WorkflowProposalCard';
import { WorkflowRunLinks } from './WorkflowRunLinks';
import { WorkflowRunCard } from './WorkflowRunCard';
import { WorkflowHandoffCards } from './WorkflowHandoffCard';
import { WorkflowDeliveryFooter } from './WorkflowDeliveryFooter';
import { MessageInspector, type InspectorSection } from './MessageInspector';
import { ThoughtsList, ThoughtsProgressCard } from './ThoughtsList';
Expand Down Expand Up @@ -93,6 +94,7 @@
import { isOrchestrationOutputArtifact } from '../../lib/orchestrationOutputs';
import { orchestrationProposedWorkflow } from '../../lib/workflowProposals';
import { orchestrationStartedWorkflow } from '../../lib/orchestrationWorkflowRuns';
import { orchestrationHandedOffWorkflow } from '../../lib/workflowHandoffs';
import { readWorkflowDelivery } from '../../lib/workflowDelivery';
import { workflowRunTrackerShouldRun } from '../../lib/workflowRunTracker';
import { analysisUnavailableMessage, readSavedAnalysis, sameAnalysis } from '../../lib/savedAnalysis';
Expand Down Expand Up @@ -1161,18 +1163,28 @@
{/* A proposed workflow is decided by the person who asked, in their own conversation. */}
{orchestration.run_id && masks.ranges.length === 0 && personalConversation
&& message.conversation_id === activeConversationId
&& orchestrationProposedWorkflow(message.metadata?.orchestration) ? (
&& orchestrationProposedWorkflow(message.metadata?.orchestration)
&& !orchestrationHandedOffWorkflow(message.metadata?.orchestration) ? (
<WorkflowProposalCards conversationId={message.conversation_id} runId={orchestration.run_id} />
) : null}
{/* A started workflow's runs only for the person who asked, in their own conversation:
live while the tab keeps a run tracker, else as they stood when the answer loaded. */}
{orchestration.run_id && masks.ranges.length === 0 && personalConversation
&& message.conversation_id === activeConversationId
&& orchestrationStartedWorkflow(message.metadata?.orchestration) ? (
&& orchestrationStartedWorkflow(message.metadata?.orchestration)
&& !orchestrationHandedOffWorkflow(message.metadata?.orchestration) ? (
liveRunStatus
? <WorkflowRunCard conversationId={message.conversation_id} runId={orchestration.run_id} />
: <WorkflowRunLinks conversationId={message.conversation_id} runId={orchestration.run_id} />
) : null}
{/* Work a plan handed off to a one-time workflow is decided by the person who asked, in
their own conversation. The server refuses a plan that also proposes or starts one. */}

Check warning on line 1181 in application/v2_ui/src/components/chat/MessageList.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Important - Changed line contains AI, plugin, agent, or workspace boundary marker. Recommendation%3A Check whether prompts, chat history, uploaded documents, embeddings, citations, settings, or identity can cross a new boundary.
{orchestration.run_id && masks.ranges.length === 0 && personalConversation

Check warning on line 1182 in application/v2_ui/src/components/chat/MessageList.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Important - Changed line contains AI, plugin, agent, or workspace boundary marker. Recommendation%3A Check whether prompts, chat history, uploaded documents, embeddings, citations, settings, or identity can cross a new boundary.

Check warning on line 1182 in application/v2_ui/src/components/chat/MessageList.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Important - Changed line contains security control, sanitization, or audit marker. Recommendation%3A Confirm the change does not weaken auth, CSRF, CSP, XSS defenses, settings sanitization, redaction, audit logging, or tests.
&& message.conversation_id === activeConversationId

Check warning on line 1183 in application/v2_ui/src/components/chat/MessageList.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Important - Changed line contains AI, plugin, agent, or workspace boundary marker. Recommendation%3A Check whether prompts, chat history, uploaded documents, embeddings, citations, settings, or identity can cross a new boundary.
&& orchestrationHandedOffWorkflow(message.metadata?.orchestration) ? (
<WorkflowHandoffCards conversationId={message.conversation_id} runId={orchestration.run_id}

Check warning on line 1185 in application/v2_ui/src/components/chat/MessageList.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Important - Changed line contains AI, plugin, agent, or workspace boundary marker. Recommendation%3A Check whether prompts, chat history, uploaded documents, embeddings, citations, settings, or identity can cross a new boundary.
liveRunStatus={liveRunStatus} />
) : null}
{/* Inside the bubble, because a generated file belongs to the reply
that produced it rather than sitting loose in the thread. */}
{hasSavedAnalysis && (masks.ranges.length > 0 ? (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { OrchestrationRecoveryNotice } from './OrchestrationRecoveryNotice';
import { OrchestrationOutputs } from './OrchestrationOutputs';
import { OrchestrationDeliverables } from './OrchestrationDeliverables';
import { OrchestrationWorkflowRunNotice } from './OrchestrationWorkflowRunNotice';
import { OrchestrationWorkflowHandoffNotice } from './OrchestrationWorkflowHandoffNotice';
// The plan, inline in the thread, kept deliberately small.
//
// Orchestration turns the composer inside out: instead of the user picking documents, a model and
Expand Down Expand Up @@ -350,6 +351,7 @@ export function OrchestrationPlanCard({
) : null}

<OrchestrationWorkflowRunNotice plan={editedPlan ?? plan} />
<OrchestrationWorkflowHandoffNotice plan={editedPlan ?? plan} />

{held ? (
<p className="mt-2 text-xs text-text-3" role="status">
Expand Down
10 changes: 9 additions & 1 deletion application/v2_ui/src/components/chat/OrchestrationRunView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
workflowResultsDisplayName,
workflowResultsSelection,
} from '../../lib/orchestrationWorkflowResults';
import { describeHandoffBlueprint, WORKFLOW_HANDOFF_CAPABILITY } from '../../lib/workflowHandoffs';

const PREVIEW_EDITS: PlanEdits = { disabled_step_ids: [], removed_document_ids: {} };
const PREVIEW_RUNTIME: StepRuntimeMap = {};
Expand Down Expand Up @@ -110,6 +111,11 @@
if (tabular) {
return tabular;
}
// A hand-off's blueprint carries request-local handles and each task's full instructions, none

Check warning on line 114 in application/v2_ui/src/components/chat/OrchestrationRunView.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Important - Changed line contains AI, plugin, agent, or workspace boundary marker. Recommendation%3A Check whether prompts, chat history, uploaded documents, embeddings, citations, settings, or identity can cross a new boundary.
// of which is for the reader. It is put in words: the workflow's name, what it covers, its tasks.
if (step.capability_id === WORKFLOW_HANDOFF_CAPABILITY) {
return describeHandoffBlueprint(step.arguments);
}
const hidden = new Set<string>([
'document_ids',
'right_document_ids',
Expand Down Expand Up @@ -357,7 +363,9 @@
{step.title}
</span>
<span className="rounded-full bg-surface-3 px-1.5 py-0.5 font-mono text-[11px] text-text-3">
{isAction ? 'Use an action' : step.capability_id}
{isAction ? 'Use an action'
: step.capability_id === WORKFLOW_HANDOFF_CAPABILITY ? 'Hand off large work'
: step.capability_id}
</span>
{roleLabel ? (
<span className="rounded-full border border-edge px-1.5 py-0.5 text-[11px] text-text-2">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// OrchestrationWorkflowHandoffNotice.tsx
// Why a plan that hands work off to a one-time workflow waits for the user, and what approving it does.
//
// A request too big for one plan can make the plan prepare a one-time workflow instead of doing
// the work itself. The server saves every such plan as manual approval whatever mode was asked
// for (the registry's approval floor), and approving it only prepares the workflow: nothing is
// created or run until the user accepts it on the hand-off card under the answer. This notice
// says both on the approval card, where a user who chose Timed or Auto would otherwise wonder why
// the plan is waiting, or think that approving it starts the work.

import { Workflow } from 'lucide-react';
import type { OrchestrationPlan } from '../../lib/orchestration';
import { WORKFLOW_HANDOFF_CAPABILITY } from '../../lib/workflowHandoffs';

export function OrchestrationWorkflowHandoffNotice({ plan }: { plan: OrchestrationPlan }) {
if (!plan.steps.some((step) => step.enabled && step.capability_id === WORKFLOW_HANDOFF_CAPABILITY)) {
return null;
}
return (
<div
role="note"

Check warning on line 21 in application/v2_ui/src/components/chat/OrchestrationWorkflowHandoffNotice.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Important - Changed line contains security control, sanitization, or audit marker. Recommendation%3A Confirm the change does not weaken auth, CSRF, CSP, XSS defenses, settings sanitization, redaction, audit logging, or tests.
aria-label="Workflow hand-off in this plan"
data-testid="orchestration-workflow-handoff-notice"
className="mt-2 flex items-start gap-2 rounded-xl border border-edge bg-surface-1 px-2.5 py-2 text-xs text-text-2"
>
<Workflow size={14} className="mt-0.5 shrink-0 text-accent" aria-hidden="true" />

Check warning on line 26 in application/v2_ui/src/components/chat/OrchestrationWorkflowHandoffNotice.tsx

View workflow job for this annotation

GitHub Actions / malicious-pr-security-review

Moderate - Changed line contains obfuscation, dynamic loading, or hidden payload marker. Recommendation%3A Confirm the changed code is not hiding behavior, decoding payloads, or bypassing normal review.
<div className="min-w-0 space-y-1">
<p className="font-medium text-text-1">
This plan hands work off to a one-time workflow, so it always waits for your approval.
</p>
<p>
Approving this plan prepares a one-time workflow. Nothing runs until you accept it on the
hand-off card that appears under the answer.
</p>
</div>
</div>
);
}
Loading
Loading