feat(02-02): enhance agent prompts for non-code task deliverables

- Add deliverable requirement sections for research and content tasks in prompt-builder
- Research tasks instruct agents to produce knowledge entries, documents, or substantial comments
- Content tasks instruct agents to produce documents, social media drafts, or substantial comments
- Auto-infer task_type from assignee department on task creation in api-server
- Import inferTaskType in both prompt-builder and api-server
This commit is contained in:
ZacharyZhang-NY committed 2026-03-22 03:59:09 -04:00
1 parent 9a1671981a
commit 51dbeb0cac
2 files changed
+40 -1

No files matched your search

+10
View File
@@ -7,6 +7,7 @@ import { validateAgentToken, type TokenPayload } from "./agent-auth";
import { canAssignTask, canControlAgent, canManageGoal, canManageOrganization, canManageProject, canUpdateTask } from "./agent-permissions";
import { resolveApprovalDecision, shouldAutoApproveApproval } from "./approval-policy";
import type { AppDatabase } from "./database";
import { inferTaskType } from "./connector-matching";
import { dispatchAgentMessage } from "./message-dispatch";
import type { DesktopEvent } from "@shared/types";
@@ -537,6 +538,15 @@ export class AgentApiServer {
return;
}
// Auto-infer task_type from assignee's department
if (input.assigneeAgentId) {
try {
const assignee = this.db.getAgent(input.assigneeAgentId);
const inferredType = inferTaskType(assignee.department);
this.db.setTaskType(id, inferredType);
} catch { /* best effort -- agent may not exist or setTaskType may fail */ }
}
this.db.addActivity({
companyId,
actor: token.agentId,
+30 -1
View File
@@ -2,7 +2,7 @@ import type { AgentRecord, AgentMessageRecord, ApprovalRecord, ConnectorId, Docu
import type { AppLocale } from "@shared/locale";
import { DEPARTMENT_LABELS } from "@shared/constants";
import { getLocalePromptInstruction } from "@shared/localization";
import { getConnectorStrengths } from "./connector-matching";
import { getConnectorStrengths, inferTaskType } from "./connector-matching";
interface PromptContext {
agent: AgentRecord;
@@ -205,6 +205,35 @@ ${relevantProjects.map((p) => `- [${p.id}] ${p.name}: ${p.description || ""} (st
${ctx.task.projectId ? `- Project: ${ctx.projects.find((p) => p.id === ctx.task!.projectId)?.name ?? ctx.task.projectId}` : ""}
${ctx.task.goalId ? `- Goal: ${ctx.goals.find((g) => g.id === ctx.task!.goalId)?.title ?? ctx.task.goalId}` : ""}
`);
// Add deliverable requirements based on task type for non-code tasks
const taskType = ((ctx.task as unknown as Record<string, unknown>).task_type as string) ?? inferTaskType(ctx.agent.department);
if (taskType === "research") {
sections.push(`# Deliverable Requirements (Research Task)
This is a research task. You MUST produce a tangible deliverable before marking it complete:
**Required:** Create at least ONE of:
1. A knowledge entry via POST /api/companies/${ctx.agent.companyId}/knowledge with your findings
2. A document via POST /api/companies/${ctx.agent.companyId}/documents with a structured report
3. A detailed comment on the task via PATCH /api/issues/${ctx.task.id} with body containing your analysis (minimum 100 words)
Do NOT mark the task as done or in_review without producing one of these artifacts.
Your manager will reject the task if no deliverable is found.
`);
} else if (taskType === "content") {
sections.push(`# Deliverable Requirements (Content Task)
This is a content creation task. You MUST produce a tangible deliverable before marking it complete:
**Required:** Create at least ONE of:
1. A document via POST /api/companies/${ctx.agent.companyId}/documents with the content draft
2. A social media draft via the social media queue
3. A detailed comment on the task via PATCH /api/issues/${ctx.task.id} with the content (minimum 100 words)
Do NOT mark the task as done or in_review without producing one of these artifacts.
Your manager will reject the task if no deliverable is found.
`);
}
}
if (ctx.assignedTasks.length > 0) {