diff --git a/cli/src/commands/configure.ts b/cli/src/commands/configure.ts index aef663ae..4d817f93 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 69e1cba6..1f11c723 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 404182d9..fe1d910e 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 243a4c58..d725fa46 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 326d6feb..c50117b6 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 b3667505..9c020613 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 d1fd02ea..7464ea9b 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 55e413f0..4f1384f1 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 83675459..a6642d86 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 a569c243..a4c4d58b 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 c2050193..94e12a93 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 09a4d97a..56059919 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 9e9003dc..97de4d92 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.", };