From 8c2bf0a2e676d823662c8c82298205ddbdbe9736 Mon Sep 17 00:00:00 2001 From: Forgotten Date: Wed, 18 Feb 2026 16:46:29 -0600 Subject: [PATCH] Remove contextMode, consolidate wake policies, and default serveUi to true Drop the unused contextMode field from the agent schema, shared types, validators, and all UI references. Merge wakeOnOnDemand and wakeOnAutomation into a single wakeOnDemand toggle. Default serveUi to true and remove the onboarding prompt for it. Co-Authored-By: Claude Opus 4.6 --- cli/src/commands/configure.ts | 2 +- cli/src/prompts/server.ts | 13 +------ packages/db/src/schema/agents.ts | 1 - packages/shared/src/config-schema.ts | 2 +- packages/shared/src/constants.ts | 3 -- packages/shared/src/index.ts | 2 -- packages/shared/src/types/agent.ts | 2 -- packages/shared/src/validators/agent.ts | 2 -- server/src/services/approvals.ts | 1 - ui/src/components/AgentConfigForm.tsx | 35 +++---------------- ui/src/components/AgentProperties.tsx | 3 -- ui/src/components/NewAgentDialog.tsx | 5 +-- ui/src/components/OnboardingWizard.tsx | 4 +-- ui/src/components/agent-config-primitives.tsx | 5 +-- 14 files changed, 11 insertions(+), 69 deletions(-) diff --git a/cli/src/commands/configure.ts b/cli/src/commands/configure.ts index aef663aea4..4d817f93b2 100644 --- a/cli/src/commands/configure.ts +++ b/cli/src/commands/configure.ts @@ -34,7 +34,7 @@ function defaultConfig(): PaperclipConfig { }, server: { port: 3100, - serveUi: false, + serveUi: true, }, }; } diff --git a/cli/src/prompts/server.ts b/cli/src/prompts/server.ts index 69e1cba6e9..1f11c72332 100644 --- a/cli/src/prompts/server.ts +++ b/cli/src/prompts/server.ts @@ -20,16 +20,5 @@ export async function promptServer(): Promise { } const port = Number(portStr) || 3100; - - const serveUi = await p.confirm({ - message: "Serve the UI from the server?", - initialValue: false, - }); - - if (p.isCancel(serveUi)) { - p.cancel("Setup cancelled."); - process.exit(0); - } - - return { port, serveUi }; + return { port, serveUi: true }; } diff --git a/packages/db/src/schema/agents.ts b/packages/db/src/schema/agents.ts index 404182d9f1..fe1d910e6f 100644 --- a/packages/db/src/schema/agents.ts +++ b/packages/db/src/schema/agents.ts @@ -24,7 +24,6 @@ export const agents = pgTable( adapterType: text("adapter_type").notNull().default("process"), adapterConfig: jsonb("adapter_config").$type>().notNull().default({}), runtimeConfig: jsonb("runtime_config").$type>().notNull().default({}), - contextMode: text("context_mode").notNull().default("thin"), budgetMonthlyCents: integer("budget_monthly_cents").notNull().default(0), spentMonthlyCents: integer("spent_monthly_cents").notNull().default(0), lastHeartbeatAt: timestamp("last_heartbeat_at", { withTimezone: true }), diff --git a/packages/shared/src/config-schema.ts b/packages/shared/src/config-schema.ts index 243a4c58b6..d725fa4651 100644 --- a/packages/shared/src/config-schema.ts +++ b/packages/shared/src/config-schema.ts @@ -25,7 +25,7 @@ export const loggingConfigSchema = z.object({ export const serverConfigSchema = z.object({ port: z.number().int().min(1).max(65535).default(3100), - serveUi: z.boolean().default(false), + serveUi: z.boolean().default(true), }); export const paperclipConfigSchema = z.object({ diff --git a/packages/shared/src/constants.ts b/packages/shared/src/constants.ts index 326d6feb9e..c50117b6a3 100644 --- a/packages/shared/src/constants.ts +++ b/packages/shared/src/constants.ts @@ -11,9 +11,6 @@ export const AGENT_STATUSES = [ ] as const; export type AgentStatus = (typeof AGENT_STATUSES)[number]; -export const AGENT_CONTEXT_MODES = ["thin", "fat"] as const; -export type AgentContextMode = (typeof AGENT_CONTEXT_MODES)[number]; - export const AGENT_ADAPTER_TYPES = ["process", "http", "claude_local", "codex_local"] as const; export type AgentAdapterType = (typeof AGENT_ADAPTER_TYPES)[number]; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index b36675058b..9c02061338 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,7 +1,6 @@ export { COMPANY_STATUSES, AGENT_STATUSES, - AGENT_CONTEXT_MODES, AGENT_ADAPTER_TYPES, AGENT_ROLES, ISSUE_STATUSES, @@ -18,7 +17,6 @@ export { LIVE_EVENT_TYPES, type CompanyStatus, type AgentStatus, - type AgentContextMode, type AgentAdapterType, type AgentRole, type IssueStatus, diff --git a/packages/shared/src/types/agent.ts b/packages/shared/src/types/agent.ts index d1fd02ea4a..7464ea9bc9 100644 --- a/packages/shared/src/types/agent.ts +++ b/packages/shared/src/types/agent.ts @@ -1,6 +1,5 @@ import type { AgentAdapterType, - AgentContextMode, AgentRole, AgentStatus, } from "../constants.js"; @@ -17,7 +16,6 @@ export interface Agent { adapterType: AgentAdapterType; adapterConfig: Record; runtimeConfig: Record; - contextMode: AgentContextMode; budgetMonthlyCents: number; spentMonthlyCents: number; lastHeartbeatAt: Date | null; diff --git a/packages/shared/src/validators/agent.ts b/packages/shared/src/validators/agent.ts index 55e413f021..4f1384f116 100644 --- a/packages/shared/src/validators/agent.ts +++ b/packages/shared/src/validators/agent.ts @@ -1,7 +1,6 @@ import { z } from "zod"; import { AGENT_ADAPTER_TYPES, - AGENT_CONTEXT_MODES, AGENT_ROLES, AGENT_STATUSES, } from "../constants.js"; @@ -15,7 +14,6 @@ export const createAgentSchema = z.object({ adapterType: z.enum(AGENT_ADAPTER_TYPES).optional().default("process"), adapterConfig: z.record(z.unknown()).optional().default({}), runtimeConfig: z.record(z.unknown()).optional().default({}), - contextMode: z.enum(AGENT_CONTEXT_MODES).optional().default("thin"), budgetMonthlyCents: z.number().int().nonnegative().optional().default(0), metadata: z.record(z.unknown()).optional().nullable(), }); diff --git a/server/src/services/approvals.ts b/server/src/services/approvals.ts index 836754591b..a6642d86f4 100644 --- a/server/src/services/approvals.ts +++ b/server/src/services/approvals.ts @@ -67,7 +67,6 @@ export function approvalService(db: Db) { typeof payload.adapterConfig === "object" && payload.adapterConfig !== null ? (payload.adapterConfig as Record) : {}, - contextMode: String(payload.contextMode ?? "thin"), budgetMonthlyCents: typeof payload.budgetMonthlyCents === "number" ? payload.budgetMonthlyCents : 0, metadata: diff --git a/ui/src/components/AgentConfigForm.tsx b/ui/src/components/AgentConfigForm.tsx index a569c2431e..a4c4d58b01 100644 --- a/ui/src/components/AgentConfigForm.tsx +++ b/ui/src/components/AgentConfigForm.tsx @@ -642,34 +642,14 @@ export function AgentConfigForm(props: AgentConfigFormProps) { Advanced mark("heartbeat", "wakeOnAssignment", v)} - /> - mark("heartbeat", "wakeOnOnDemand", v)} - /> - mark("heartbeat", "wakeOnAutomation", v)} + onChange={(v) => mark("heartbeat", "wakeOnDemand", v)} />
Runtime
- -
- {props.agent.contextMode} -
-
{adapterLabels[agent.adapterType] ?? agent.adapterType} - - {agent.contextMode} -
diff --git a/ui/src/components/NewAgentDialog.tsx b/ui/src/components/NewAgentDialog.tsx index c205019368..94e12a9395 100644 --- a/ui/src/components/NewAgentDialog.tsx +++ b/ui/src/components/NewAgentDialog.tsx @@ -112,13 +112,10 @@ export function NewAgentDialog() { heartbeat: { enabled: configValues.heartbeatEnabled, intervalSec: configValues.intervalSec, - wakeOnAssignment: true, - wakeOnOnDemand: true, - wakeOnAutomation: true, + wakeOnDemand: true, cooldownSec: 10, }, }, - contextMode: "thin", budgetMonthlyCents: 0, }); } diff --git a/ui/src/components/OnboardingWizard.tsx b/ui/src/components/OnboardingWizard.tsx index 09a4d97a16..5605991965 100644 --- a/ui/src/components/OnboardingWizard.tsx +++ b/ui/src/components/OnboardingWizard.tsx @@ -152,9 +152,7 @@ export function OnboardingWizard() { heartbeat: { enabled: true, intervalSec: 300, - wakeOnAssignment: true, - wakeOnOnDemand: true, - wakeOnAutomation: true, + wakeOnDemand: true, cooldownSec: 10, }, }, diff --git a/ui/src/components/agent-config-primitives.tsx b/ui/src/components/agent-config-primitives.tsx index 9e9003dc68..97de4d920f 100644 --- a/ui/src/components/agent-config-primitives.tsx +++ b/ui/src/components/agent-config-primitives.tsx @@ -33,11 +33,8 @@ export const help: Record = { intervalSec: "Seconds between automatic heartbeat invocations.", timeoutSec: "Maximum seconds a run can take before being terminated. 0 means no timeout.", graceSec: "Seconds to wait after sending interrupt before force-killing the process.", - wakeOnAssignment: "Automatically wake this agent when a new issue is assigned to it.", - wakeOnOnDemand: "Allow this agent to be woken on demand via the API or UI.", - wakeOnAutomation: "Allow automated systems to wake this agent.", + wakeOnDemand: "Allow this agent to be woken by assignments, API calls, UI actions, or automated systems.", cooldownSec: "Minimum seconds between consecutive heartbeat runs.", - contextMode: "How context is managed between runs (thin = fresh context each run).", budgetMonthlyCents: "Monthly spending limit in cents. 0 means no limit.", };