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 fbd59c84a5f..e86fc6bf550 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 84d3099635b..500d4ddffdc 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 7f4daefe213..816d6cc0e8d 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 73ac2db7d25..303745caab0 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 4e404b5f7dc..4d546867276 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 00000000000..18c0610b443 --- /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 10d2bd04509..8665538c752 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 f922800045d..d6a6cf0d575 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 7e498f800eb..40589392bc1 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 2776b742613..ef373dc15c2 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;