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 fbd59c84a..e86fc6bf5 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 84d309963..500d4ddff 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 7f4daefe2..816d6cc0e 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 73ac2db7d..303745caa 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 4e404b5f7..4d5468672 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 000000000..18c0610b4 --- /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 10d2bd045..8665538c7 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 f92280004..d6a6cf0d5 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 7e498f800..40589392b 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 2776b7426..ef373dc15 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;