From db0b19bf9d369565251a88ec3ce5be10254583b0 Mon Sep 17 00:00:00 2001 From: Forgotten Date: Thu, 19 Feb 2026 13:02:25 -0600 Subject: [PATCH] Add shared types for agent hiring, config revisions, costs breakdown, and sidebar badges Add AgentConfigRevision, CostByAgent, SidebarBadges types. Add createAgentHireSchema with source issue linking and linkIssueApprovalSchema. Extend approval validator with issueIds. Update cost summary to generic period naming. Add sidebar badges API path. Co-Authored-By: Claude Opus 4.6 --- packages/shared/src/api.ts | 1 + packages/shared/src/index.ts | 7 +++++++ packages/shared/src/types/agent.ts | 14 ++++++++++++++ packages/shared/src/types/cost.ts | 15 ++++++++++++--- packages/shared/src/types/index.ts | 5 +++-- packages/shared/src/types/sidebar-badges.ts | 4 ++++ packages/shared/src/validators/agent.ts | 9 +++++++++ packages/shared/src/validators/approval.ts | 1 + packages/shared/src/validators/index.ts | 4 ++++ packages/shared/src/validators/issue.ts | 6 ++++++ 10 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 packages/shared/src/types/sidebar-badges.ts diff --git a/packages/shared/src/api.ts b/packages/shared/src/api.ts index fbd59c84a5..e86fc6bf55 100644 --- a/packages/shared/src/api.ts +++ b/packages/shared/src/api.ts @@ -11,4 +11,5 @@ export const API = { costs: `${API_PREFIX}/costs`, activity: `${API_PREFIX}/activity`, dashboard: `${API_PREFIX}/dashboard`, + sidebarBadges: `${API_PREFIX}/sidebar-badges`, } as const; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 84d3099635..500d4ddffd 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -38,6 +38,7 @@ export type { Agent, AgentPermissions, AgentKeyCreated, + AgentConfigRevision, Project, Issue, IssueComment, @@ -46,6 +47,7 @@ export type { ApprovalComment, CostEvent, CostSummary, + CostByAgent, HeartbeatRun, HeartbeatRunEvent, AgentRuntimeState, @@ -53,6 +55,7 @@ export type { LiveEvent, DashboardSummary, ActivityEvent, + SidebarBadges, } from "./types/index.js"; export { @@ -61,12 +64,14 @@ export { type CreateCompany, type UpdateCompany, createAgentSchema, + createAgentHireSchema, updateAgentSchema, createAgentKeySchema, wakeAgentSchema, agentPermissionsSchema, updateAgentPermissionsSchema, type CreateAgent, + type CreateAgentHire, type UpdateAgent, type CreateAgentKey, type WakeAgent, @@ -79,10 +84,12 @@ export { updateIssueSchema, checkoutIssueSchema, addIssueCommentSchema, + linkIssueApprovalSchema, type CreateIssue, type UpdateIssue, type CheckoutIssue, type AddIssueComment, + type LinkIssueApproval, createGoalSchema, updateGoalSchema, type CreateGoal, diff --git a/packages/shared/src/types/agent.ts b/packages/shared/src/types/agent.ts index 7f4daefe21..816d6cc0e8 100644 --- a/packages/shared/src/types/agent.ts +++ b/packages/shared/src/types/agent.ts @@ -35,3 +35,17 @@ export interface AgentKeyCreated { token: string; createdAt: Date; } + +export interface AgentConfigRevision { + id: string; + companyId: string; + agentId: string; + createdByAgentId: string | null; + createdByUserId: string | null; + source: string; + rolledBackFromRevisionId: string | null; + changedKeys: string[]; + beforeConfig: Record; + afterConfig: Record; + createdAt: Date; +} diff --git a/packages/shared/src/types/cost.ts b/packages/shared/src/types/cost.ts index 73ac2db7d2..303745caab 100644 --- a/packages/shared/src/types/cost.ts +++ b/packages/shared/src/types/cost.ts @@ -17,7 +17,16 @@ export interface CostEvent { export interface CostSummary { companyId: string; - monthSpendCents: number; - monthBudgetCents: number; - monthUtilizationPercent: number; + spendCents: number; + budgetCents: number; + utilizationPercent: number; +} + +export interface CostByAgent { + agentId: string; + agentName: string | null; + agentStatus: string | null; + costCents: number; + inputTokens: number; + outputTokens: number; } diff --git a/packages/shared/src/types/index.ts b/packages/shared/src/types/index.ts index 4e404b5f7d..4d54686727 100644 --- a/packages/shared/src/types/index.ts +++ b/packages/shared/src/types/index.ts @@ -1,10 +1,10 @@ export type { Company } from "./company.js"; -export type { Agent, AgentKeyCreated } from "./agent.js"; +export type { Agent, AgentPermissions, AgentKeyCreated, AgentConfigRevision } from "./agent.js"; export type { Project } from "./project.js"; export type { Issue, IssueComment, IssueAncestor } from "./issue.js"; export type { Goal } from "./goal.js"; export type { Approval, ApprovalComment } from "./approval.js"; -export type { CostEvent, CostSummary } from "./cost.js"; +export type { CostEvent, CostSummary, CostByAgent } from "./cost.js"; export type { HeartbeatRun, HeartbeatRunEvent, @@ -14,3 +14,4 @@ export type { export type { LiveEvent } from "./live.js"; export type { DashboardSummary } from "./dashboard.js"; export type { ActivityEvent } from "./activity.js"; +export type { SidebarBadges } from "./sidebar-badges.js"; diff --git a/packages/shared/src/types/sidebar-badges.ts b/packages/shared/src/types/sidebar-badges.ts new file mode 100644 index 0000000000..18c0610b44 --- /dev/null +++ b/packages/shared/src/types/sidebar-badges.ts @@ -0,0 +1,4 @@ +export interface SidebarBadges { + inbox: number; + approvals: number; +} diff --git a/packages/shared/src/validators/agent.ts b/packages/shared/src/validators/agent.ts index 10d2bd0450..8665538c75 100644 --- a/packages/shared/src/validators/agent.ts +++ b/packages/shared/src/validators/agent.ts @@ -25,9 +25,18 @@ export const createAgentSchema = z.object({ export type CreateAgent = z.infer; +export const createAgentHireSchema = createAgentSchema.extend({ + sourceIssueId: z.string().uuid().optional().nullable(), + sourceIssueIds: z.array(z.string().uuid()).optional(), +}); + +export type CreateAgentHire = z.infer; + export const updateAgentSchema = createAgentSchema + .omit({ permissions: true }) .partial() .extend({ + permissions: z.never().optional(), status: z.enum(AGENT_STATUSES).optional(), spentMonthlyCents: z.number().int().nonnegative().optional(), }); diff --git a/packages/shared/src/validators/approval.ts b/packages/shared/src/validators/approval.ts index f922800045..d6a6cf0d57 100644 --- a/packages/shared/src/validators/approval.ts +++ b/packages/shared/src/validators/approval.ts @@ -5,6 +5,7 @@ export const createApprovalSchema = z.object({ type: z.enum(APPROVAL_TYPES), requestedByAgentId: z.string().uuid().optional().nullable(), payload: z.record(z.unknown()), + issueIds: z.array(z.string().uuid()).optional(), }); export type CreateApproval = z.infer; diff --git a/packages/shared/src/validators/index.ts b/packages/shared/src/validators/index.ts index 7e498f800e..40589392bc 100644 --- a/packages/shared/src/validators/index.ts +++ b/packages/shared/src/validators/index.ts @@ -7,12 +7,14 @@ export { export { createAgentSchema, + createAgentHireSchema, updateAgentSchema, createAgentKeySchema, wakeAgentSchema, agentPermissionsSchema, updateAgentPermissionsSchema, type CreateAgent, + type CreateAgentHire, type UpdateAgent, type CreateAgentKey, type WakeAgent, @@ -31,10 +33,12 @@ export { updateIssueSchema, checkoutIssueSchema, addIssueCommentSchema, + linkIssueApprovalSchema, type CreateIssue, type UpdateIssue, type CheckoutIssue, type AddIssueComment, + type LinkIssueApproval, } from "./issue.js"; export { diff --git a/packages/shared/src/validators/issue.ts b/packages/shared/src/validators/issue.ts index 2776b74261..ef373dc15c 100644 --- a/packages/shared/src/validators/issue.ts +++ b/packages/shared/src/validators/issue.ts @@ -35,3 +35,9 @@ export const addIssueCommentSchema = z.object({ }); export type AddIssueComment = z.infer; + +export const linkIssueApprovalSchema = z.object({ + approvalId: z.string().uuid(), +}); + +export type LinkIssueApproval = z.infer;