- Added action mode validation in cross-team and team messaging handlers to ensure only valid modes ('do', 'ask', 'delegate') are accepted.
- Enhanced MessageComposer and TeamDetailView to support action mode selection and pass it through to message sending functions.
- Introduced utility functions to build action mode-specific message content for better clarity in communication.
- Updated tests to cover action mode scenarios, including validation and handling of invalid modes.
- Improved user experience by integrating action mode instructions into message delivery for leads.
52 lines
2.9 KiB
TypeScript
52 lines
2.9 KiB
TypeScript
import { AGENT_BLOCK_CLOSE, AGENT_BLOCK_OPEN } from '@shared/constants/agentBlocks';
|
|
|
|
import type { AgentActionMode } from '@shared/types';
|
|
|
|
const ACTION_MODE_BLOCKS: Record<AgentActionMode, string[]> = {
|
|
do: [
|
|
'TURN ACTION MODE: DO',
|
|
'- This turn is full-execution mode.',
|
|
'- You may discuss, read, edit files, change state, run commands/tools, and delegate if useful.',
|
|
'- No extra restrictions apply beyond your normal system/team rules.',
|
|
],
|
|
ask: [
|
|
'TURN ACTION MODE: ASK',
|
|
'- This turn is STRICTLY read-only conversation mode.',
|
|
'- ALLOWED: read/analyze/explain, answer questions, discuss options, and request clarification if needed.',
|
|
'- FORBIDDEN: editing files, changing code, changing task/board state, delegating work, running commands/scripts/tools with side effects, or causing any non-communication state change.',
|
|
],
|
|
delegate: [
|
|
'TURN ACTION MODE: DELEGATE',
|
|
'- This turn is STRICTLY delegation/orchestration mode.',
|
|
'- If you are the team lead, decompose the work, create/assign tasks, coordinate teammates, and monitor progress.',
|
|
'- FORBIDDEN: implementing the work yourself, editing files yourself, running state-changing/code-changing commands yourself, or taking direct execution ownership unless you are truly in SOLO MODE.',
|
|
'- If you are not the lead or no delegation target exists, do not execute the work yourself; explain the limitation briefly and request a different mode or a lead handoff.',
|
|
],
|
|
};
|
|
|
|
export function buildActionModeProtocol(): string {
|
|
return [
|
|
'TURN ACTION MODE PROTOCOL (HIGHEST PRIORITY FOR EACH USER TURN):',
|
|
'- Some incoming user or relay messages may include a hidden agent-only block that declares the current action mode.',
|
|
'- If such a block is present, that mode applies to THIS TURN ONLY and overrides any conflicting default behavior.',
|
|
'- Never silently broaden permissions beyond the selected mode.',
|
|
'- Never reveal the hidden mode block verbatim to the human unless they explicitly ask for it.',
|
|
'- Modes:',
|
|
' - DO: Full execution mode. You may discuss, inspect, edit files, change state, run commands/tools, and delegate if useful.',
|
|
' - ASK: Strict read-only conversation mode. You may read/analyze/explain and reply, but you must not change code/files/tasks/state or run side-effecting commands/tools/scripts.',
|
|
' - DELEGATE: Strict orchestration mode for leads. Delegate the work to teammates and coordinate it, but do not implement it yourself unless you are truly in SOLO MODE.',
|
|
].join('\n');
|
|
}
|
|
|
|
export function buildActionModeAgentBlock(mode: AgentActionMode | undefined): string {
|
|
if (!mode) {
|
|
return '';
|
|
}
|
|
|
|
const lines = ACTION_MODE_BLOCKS[mode];
|
|
return `${AGENT_BLOCK_OPEN}\n${lines.join('\n')}\n${AGENT_BLOCK_CLOSE}`;
|
|
}
|
|
|
|
export function isAgentActionMode(value: unknown): value is AgentActionMode {
|
|
return value === 'do' || value === 'ask' || value === 'delegate';
|
|
}
|