import { Type, type Static } from "typebox";
export const DeduplicationConfigSchema = Type.Object({
enabled: Type.Boolean({
default: true,
description: "Enable deduplication strategy",
}),
protectedTools: Type.Array(Type.String(), {
default: [],
description: "Tool names excluded from deduplication (glob patterns)",
}),
turnProtection: Type.Number({
default: 0,
minimum: 0,
description:
"Protect duplicate tool outputs from pruning for N turns after invocation. 0 disables.",
}),
});
export const PurgeErrorsConfigSchema = Type.Object({
enabled: Type.Boolean({
default: true,
description: "Enable error purging strategy",
}),
turns: Type.Number({
default: 4,
minimum: 1,
description: "Prune failed tool results after this many turns",
}),
protectedTools: Type.Array(Type.String(), {
default: [],
description: "Tool names excluded from error purging (glob patterns)",
}),
});
export const CompressConfigSchema = Type.Object({
mode: Type.Union([Type.Literal("range"), Type.Literal("message")], {
default: "range",
description:
"Compression mode: range (compress spans) or message (compress individual messages)",
}),
permission: Type.Union([Type.Literal("allow"), Type.Literal("deny")], {
default: "allow",
description: "Whether the compress tool is allowed to run",
}),
showCompression: Type.Boolean({
default: false,
description:
"Include compression summary text in user notifications (does not affect model context)",
}),
maxContextPercent: Type.Number({
default: 80,
description: "Legacy: max context percentage threshold",
}),
minContextPercent: Type.Number({
default: 50,
description: "Legacy: min context percentage threshold",
}),
maxContextLimit: Type.Optional(
Type.Union([Type.Number(), Type.String()], {
description:
"Max context limit (absolute token count or percentage string like '80%'). Default: 200000",
}),
),
minContextLimit: Type.Optional(
Type.Union([Type.Number(), Type.String()], {
description:
"Min context limit (absolute token count or percentage string like '50%'). Default: 100000",
}),
),
modelMaxLimits: Type.Optional(
Type.Record(Type.String(), Type.Union([Type.Number(), Type.String()]), {
description: "Per-model max context limits keyed by 'provider/modelId'",
}),
),
modelMinLimits: Type.Optional(
Type.Record(Type.String(), Type.Union([Type.Number(), Type.String()]), {
description: "Per-model min context limits keyed by 'provider/modelId'",
}),
),
nudgeFrequency: Type.Number({
default: 5,
minimum: 1,
description: "Minimum turns between non-urgent nudges",
}),
iterationNudgeThreshold: Type.Number({
default: 15,
minimum: 1,
description:
"Number of assistant iterations without user input before nudging",
}),
nudgeForce: Type.Union([Type.Literal("strong"), Type.Literal("soft")], {
default: "soft",
description: "Nudge urgency: strong (imperative) or soft (suggestion)",
}),
protectedTools: Type.Array(Type.String(), {
default: [],
description: "Tool outputs to preserve during compression (glob patterns)",
}),
protectUserMessages: Type.Boolean({
default: false,
description: "Append user message text to compression summaries",
}),
protectTags: Type.Boolean({
default: false,
description:
"Preserve ... tag content in summaries",
}),
summaryBuffer: Type.Boolean({
default: true,
description:
"Exclude active summary tokens from threshold comparison to prevent cascading",
}),
});
export const ManualModeConfigSchema = Type.Object({
default: Type.Union([Type.Literal(false), Type.Literal("active")], {
default: false,
description: "Initial manual mode state",
}),
automaticStrategies: Type.Boolean({
default: true,
description: "Run automatic strategies even in manual mode",
}),
});
export const ExperimentalConfigSchema = Type.Object({
allowSubAgents: Type.Boolean({
default: false,
description: "Enable DCP in sub-agent child sessions",
}),
customPrompts: Type.Boolean({
default: false,
description: "Enable filesystem-based prompt overrides",
}),
});
export const StrategiesConfigSchema = Type.Object({
deduplication: DeduplicationConfigSchema,
purgeErrors: PurgeErrorsConfigSchema,
});
export const DcpConfigSchema = Type.Object({
enabled: Type.Boolean({
default: true,
description: "Enable the DCP extension",
}),
debug: Type.Boolean({
default: false,
description: "Enable debug logging to session directory",
}),
nudgeNotification: Type.Union(
[Type.Literal("off"), Type.Literal("minimal"), Type.Literal("detailed")],
{
default: "minimal",
description: "Notification verbosity for pruning events",
},
),
nudgeNotificationType: Type.Union(
[Type.Literal("toast"), Type.Literal("status")],
{
default: "status",
description:
"Notification delivery: toast (ephemeral) or status (persistent)",
},
),
protectedFilePatterns: Type.Array(Type.String(), {
default: [],
description: "Glob patterns for file paths to protect from pruning",
}),
compress: CompressConfigSchema,
manualMode: ManualModeConfigSchema,
strategies: StrategiesConfigSchema,
experimental: ExperimentalConfigSchema,
});
export type DcpConfig = Static;
export type CompressConfig = Static;
export type DeduplicationConfig = Static;
export type PurgeErrorsConfig = Static;
export type ManualModeConfig = Static;
export type ExperimentalConfig = Static;
export type StrategiesConfig = Static;