From 1d1a85f61832bcd763f6b2576d97062bbb1ccd6d Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Fri, 19 Jun 2026 14:39:27 -0600 Subject: [PATCH 1/2] Remove skill content max truncation --- packages/agents-runtime/src/skills/extract-meta.ts | 5 ----- packages/agents-runtime/src/skills/preamble.ts | 6 ------ packages/agents-runtime/src/skills/tools.ts | 14 +------------- packages/agents-runtime/src/skills/types.ts | 1 - .../test/skills/context-loader.test.ts | 4 ---- .../agents-runtime/test/skills/preamble.test.ts | 4 ---- packages/agents-runtime/test/skills/tools.test.ts | 14 ++++++-------- 7 files changed, 7 insertions(+), 41 deletions(-) diff --git a/packages/agents-runtime/src/skills/extract-meta.ts b/packages/agents-runtime/src/skills/extract-meta.ts index 05a69fac98..f5044f1c71 100644 --- a/packages/agents-runtime/src/skills/extract-meta.ts +++ b/packages/agents-runtime/src/skills/extract-meta.ts @@ -7,11 +7,8 @@ interface ExtractedMeta { arguments?: Array argumentHint?: string userInvocable?: boolean - max: number } -const DEFAULT_MAX = 10_000 - export async function extractSkillMeta( name: string, content: string @@ -26,7 +23,6 @@ export async function extractSkillMeta( ...(preamble.arguments && { arguments: preamble.arguments }), ...(preamble.argumentHint && { argumentHint: preamble.argumentHint }), ...(preamble.userInvocable && { userInvocable: true }), - max: preamble.max ?? DEFAULT_MAX, } } @@ -35,7 +31,6 @@ export async function extractSkillMeta( whenToUse: preamble.whenToUse ?? `User asks about ${humanize(name).toLowerCase()}`, keywords: preamble.keywords ?? [name], - max: preamble.max ?? DEFAULT_MAX, } } diff --git a/packages/agents-runtime/src/skills/preamble.ts b/packages/agents-runtime/src/skills/preamble.ts index 34c6335227..f6c2d84485 100644 --- a/packages/agents-runtime/src/skills/preamble.ts +++ b/packages/agents-runtime/src/skills/preamble.ts @@ -5,7 +5,6 @@ export interface PreambleFields { arguments?: Array argumentHint?: string userInvocable?: boolean - max?: number } export function parsePreamble(content: string): PreambleFields { @@ -82,11 +81,6 @@ export function parsePreamble(content: string): PreambleFields { case `user-invocable`: result.userInvocable = rawValue === `true` break - case `max`: { - const num = parseInt(rawValue, 10) - if (!Number.isNaN(num) && num > 0) result.max = num - break - } } } diff --git a/packages/agents-runtime/src/skills/tools.ts b/packages/agents-runtime/src/skills/tools.ts index fb512ea1a8..0c05d220f6 100644 --- a/packages/agents-runtime/src/skills/tools.ts +++ b/packages/agents-runtime/src/skills/tools.ts @@ -12,7 +12,6 @@ function skillContextId(name: string): string { export interface LoadSkillResult { loaded: boolean alreadyLoaded?: boolean - truncated?: boolean chars?: number message: string contextSource?: string @@ -50,12 +49,6 @@ export async function loadSkillIntoContext( } } - let truncated = false - if (content.length > meta.max) { - truncated = true - content = content.slice(0, meta.max) - } - if (args) { content = substituteArgs(content, args, meta.arguments) } @@ -67,9 +60,6 @@ export async function loadSkillIntoContext( }) const skillDir = path.join(path.dirname(meta.source), name) - const truncNote = truncated - ? `\n\nWARNING: Content was truncated from ${meta.charCount.toLocaleString()} to ${meta.max.toLocaleString()} chars. Inform the user.` - : `` const allRefFiles = listRefFiles(skillDir) const mdFiles = allRefFiles.filter((f) => f.endsWith(`.md`)) @@ -96,11 +86,10 @@ export async function loadSkillIntoContext( const dirNote = hasRefDir ? `\nSkill directory: ${skillDir}` : `` const refSection = refContents.length > 0 ? `\n\n${refContents.join(`\n\n`)}` : `` - const contextSource = `SKILL ACTIVATED: "${name}". The instructions below override your default behavior. Follow them exactly. Do not read any files to find this content — it is all here.\n${dirNote}${truncNote}\n\n${content}${refSection}` + const contextSource = `SKILL ACTIVATED: "${name}". The instructions below override your default behavior. Follow them exactly. Do not read any files to find this content — it is all here.\n${dirNote}\n\n${content}${refSection}` return { loaded: true, - truncated, chars: content.length, message: contextSource, contextSource, @@ -136,7 +125,6 @@ export function createSkillTools( ...(result.alreadyLoaded ? { alreadyLoaded: result.alreadyLoaded } : {}), - ...(result.truncated ? { truncated: result.truncated } : {}), ...(result.chars !== undefined ? { chars: result.chars } : {}), }, } diff --git a/packages/agents-runtime/src/skills/types.ts b/packages/agents-runtime/src/skills/types.ts index dcbc4ec1e1..0b94d7af39 100644 --- a/packages/agents-runtime/src/skills/types.ts +++ b/packages/agents-runtime/src/skills/types.ts @@ -6,7 +6,6 @@ export interface SkillMeta { arguments?: Array argumentHint?: string userInvocable?: boolean - max: number charCount: number contentHash: string source: string diff --git a/packages/agents-runtime/test/skills/context-loader.test.ts b/packages/agents-runtime/test/skills/context-loader.test.ts index e7e3e0b5a1..8deded9a00 100644 --- a/packages/agents-runtime/test/skills/context-loader.test.ts +++ b/packages/agents-runtime/test/skills/context-loader.test.ts @@ -17,7 +17,6 @@ function createRegistry(): SkillsRegistry { whenToUse: `User wants a tutorial`, keywords: [`quickstart`], userInvocable: true, - max: 1000, charCount: 100, contentHash: `hash-1`, source: `/skills/quickstart.md`, @@ -33,7 +32,6 @@ function createRegistry(): SkillsRegistry { arguments: [`project_name`, `Bad-Arg`], argumentHint: `[project-name]`, userInvocable: true, - max: 1000, charCount: 100, contentHash: `hash-2`, source: `/skills/init.md`, @@ -47,7 +45,6 @@ function createRegistry(): SkillsRegistry { whenToUse: `Never directly`, keywords: [], userInvocable: false, - max: 1000, charCount: 100, contentHash: `hash-3`, source: `/skills/internal.md`, @@ -61,7 +58,6 @@ function createRegistry(): SkillsRegistry { whenToUse: `Never directly`, keywords: [], userInvocable: true, - max: 1000, charCount: 100, contentHash: `hash-4`, source: `/skills/bad.md`, diff --git a/packages/agents-runtime/test/skills/preamble.test.ts b/packages/agents-runtime/test/skills/preamble.test.ts index 79cf4a2cb4..b6c6f7311f 100644 --- a/packages/agents-runtime/test/skills/preamble.test.ts +++ b/packages/agents-runtime/test/skills/preamble.test.ts @@ -7,7 +7,6 @@ describe(`parsePreamble`, () => { description: Interactive tutorial guide whenToUse: User asks about tutorials or getting started keywords: [tutorial, multi-agent, spawn] -max: 15000 --- # Tutorial content here` @@ -17,7 +16,6 @@ max: 15000 description: `Interactive tutorial guide`, whenToUse: `User asks about tutorials or getting started`, keywords: [`tutorial`, `multi-agent`, `spawn`], - max: 15000, }) }) @@ -69,7 +67,6 @@ keywords: - getting started - learn - multi-agent -max: 10000 --- # Content here` @@ -81,7 +78,6 @@ max: 10000 `learn`, `multi-agent`, ]) - expect(result.max).toBe(10000) }) it(`strips surrounding quotes from description and whenToUse`, () => { diff --git a/packages/agents-runtime/test/skills/tools.test.ts b/packages/agents-runtime/test/skills/tools.test.ts index 0bb3574543..ffe831a045 100644 --- a/packages/agents-runtime/test/skills/tools.test.ts +++ b/packages/agents-runtime/test/skills/tools.test.ts @@ -39,7 +39,6 @@ const QUICKSTART_META: SkillMeta = { description: `A quickstart`, whenToUse: `When learning`, keywords: [`quickstart`], - max: 10_000, charCount: 500, contentHash: `abc123`, source: `/skills/quickstart.md`, @@ -112,9 +111,9 @@ describe(`skill tools`, () => { }) }) - it(`use_skill truncates and warns when content exceeds max`, async () => { + it(`use_skill loads full content for large skills`, async () => { const bigContent = `x`.repeat(15_000) - const meta = { ...QUICKSTART_META, max: 10_000, charCount: 15_000 } + const meta = { ...QUICKSTART_META, charCount: 15_000 } const registry = createMockRegistry({ quickstart: { meta, content: bigContent }, }) @@ -125,13 +124,12 @@ describe(`skill tools`, () => { const result = await useTool.execute(`tc1`, { name: `quickstart` }) const insertedContent = ctx.insertContext.mock.calls[0]![1].content - // Content is truncated to max (10,000) — no wrapper prefix in insertContext - expect(insertedContent).toContain(`x`.repeat(100)) - expect(insertedContent.length).toBe(10_000) - // Tool result contains truncation warning + expect(insertedContent).toBe(bigContent) + expect(result.details).toMatchObject({ loaded: true, chars: 15_000 }) + expect(result.details).not.toHaveProperty(`truncated`) expect(result.content[0]).toMatchObject({ type: `text`, - text: expect.stringContaining(`truncated`), + text: expect.not.stringContaining(`truncated`), }) }) From 6ce6c446ba21fc6849c8e872c834eed618cf5406 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Fri, 19 Jun 2026 14:40:18 -0600 Subject: [PATCH 2/2] Add changeset for skill content truncation --- .changeset/remove-skill-content-max.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/remove-skill-content-max.md diff --git a/.changeset/remove-skill-content-max.md b/.changeset/remove-skill-content-max.md new file mode 100644 index 0000000000..807994964e --- /dev/null +++ b/.changeset/remove-skill-content-max.md @@ -0,0 +1,5 @@ +--- +'@electric-ax/agents-runtime': patch +--- + +Remove the skill content `max` cap so `use_skill` loads complete skill instructions instead of truncating them.