diff --git a/src/reinject.ts b/src/reinject.ts index 67761eb..fdec78a 100644 --- a/src/reinject.ts +++ b/src/reinject.ts @@ -1,5 +1,6 @@ import type { BeforeAgentStartEventResult, + ExtensionAPI, ExtensionContext, SessionCompactEvent, Skill, @@ -59,16 +60,16 @@ export function enqueueDeferredReinjectFromCompact( ); } -/** Combined skill-block user text for pending names in queue order (SPEC §5.3). */ -export function buildDeferredReinjectContent( - pendingNames: readonly string[], +/** Expanded skill-block messages in queue order (SPEC §5.3). */ +export function buildReinjectBlocks( + skillNames: readonly string[], state: ExtensionState, settings: SkillReinjectSettings, registeredSkills: readonly Pick[], -): string { +): string[] { const registeredByName = new Map(registeredSkills.map((skill) => [skill.name, skill])); const blocks: string[] = []; - for (const name of pendingNames) { + for (const name of skillNames) { const tracked = state.skills.find((skill) => skill.name === name); const registered = registeredByName.get(name); if (!tracked || !registered) { @@ -85,7 +86,31 @@ export function buildDeferredReinjectContent( ), ); } - return blocks.join("\n\n"); + return blocks; +} + +/** Combined skill-block user text for pending names in queue order (SPEC §5.3). */ +export function buildDeferredReinjectContent( + pendingNames: readonly string[], + state: ExtensionState, + settings: SkillReinjectSettings, + registeredSkills: readonly Pick[], +): string { + return buildReinjectBlocks(pendingNames, state, settings, registeredSkills).join("\n\n"); +} + +/** Immediate path when agent is idle: first block triggers turn, rest queue as followUp (SPEC §6.5.2). */ +export function sendImmediateReinjectIdle( + pi: ExtensionAPI, + skillNames: readonly string[], + state: ExtensionState, + settings: SkillReinjectSettings, + registeredSkills: readonly Pick[], +): void { + const blocks = buildReinjectBlocks(skillNames, state, settings, registeredSkills); + blocks.forEach((block, index) => { + pi.sendUserMessage(block, index === 0 ? undefined : { deliverAs: "followUp" }); + }); } /**