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 fbd59c8..e86fc6b 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 84d3099..500d4dd 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 7f4daef..816d6cc 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 73ac2db..303745c 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 4e404b5..4d54686 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 0000000..18c0610 --- /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 10d2bd0..8665538 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 f922800..d6a6cf0 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 7e498f8..4058939 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 2776b74..ef373dc 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;